Files
omarchycn/bin/omarchy-plugin-catalog
T
David Heinemeier HanssonandGitHub f8835df644 Plugin cloning via menu (#6433)
* Add plugin cloning via menu

* Split plugin commands by action

* Keep plugin enablement in action commands

* Remove unused plugin edit command

* Simplify plugin rescan arguments

* Assume Omarchy shell is running for plugin commands

* Remove plugin compatibility dispatcher

* Flatten plugin clone command

* Keep only shared plugin helpers

* Remove plugin rescan wrapper

* Keep plugin commands self-contained

* Simplify plugin clone lifecycle
2026-07-29 21:34:47 -04:00

65 lines
2.1 KiB
Bash
Executable File

#!/bin/bash
# omarchy:summary=Emit every first-party and user plugin manifest as JSON
# omarchy:group=plugin
# omarchy:hidden=true
# Walks $OMARCHY_PATH/shell/plugins and ~/.config/omarchy/plugins, reads every
# manifest.json / *.manifest.json, and emits one JSON object per plugin with
# computed fields (sourceDir, barWidgetPath, barPath, firstParty). This is the
# single source of truth that omarchy-bar (widget/option enumeration),
# omarchy-bar-plugin (add validation), and omarchy-plugin-clone (source
# enumeration) read, so the bar and plugin commands never re-implement
# manifest walking.
set -o pipefail
paths=()
while IFS= read -r manifest; do
paths+=("$manifest")
done < <(find "$OMARCHY_PATH/shell/plugins" -mindepth 2 -maxdepth 4 -type f \( -name manifest.json -o -name '*.manifest.json' \) | sort)
user_dir="$HOME/.config/omarchy/plugins"
if [[ -d $user_dir ]]; then
while IFS= read -r manifest; do
paths+=("$manifest")
done < <(find -L "$user_dir" -mindepth 2 -maxdepth 2 -type f -name manifest.json \
! -path "$user_dir/.*/*" 2>/dev/null | sort)
fi
if (( ${#paths[@]} == 0 )); then
echo "[]"
exit 0
fi
jq -n '
[ inputs
| . as $manifest
| input_filename as $manifestPath
| ($manifestPath | sub("/manifest.json$"; "") | sub("/[^/]+\\.manifest\\.json$"; "")) as $sourceDir
| {
id: ($manifest.id // ""),
name: ($manifest.name // $manifest.id // ""),
description: ($manifest.description // ""),
kinds: ($manifest.kinds // []),
firstParty: (($manifest.id // "") | startswith("omarchy.")),
manifestPath: $manifestPath,
sourceDir: $sourceDir,
entryPoints: ($manifest.entryPoints // {}),
barWidget: ($manifest.barWidget // null),
bar: ($manifest.bar // null)
}
| .barWidgetPath = (
if (.entryPoints.barWidget // null) != null
then (.sourceDir + "/" + .entryPoints.barWidget)
else null end)
| .barPath = (
if (.entryPoints.bar // null) != null
then (.sourceDir + "/" + .entryPoints.bar)
else null end)
| select(.id != "")
]
| unique_by(.id)
' "${paths[@]}"