mirror of
https://github.com/arthur-pbty/arthur-os.git
synced 2026-08-01 20:28:16 +02:00
Let users add trusted plugin source repos and add/update/remove plugins from them, alongside the existing in-shell plugin commands: omarchy plugin source <add|list|remove|refresh> omarchy plugin available omarchy plugin add | update | remove | validate Each command is interactive (gum/fzf pickers, confirmation, an update diff) in a TTY and fully flag-driven with --yes for scripts and agents. Sources live in ~/.config/omarchy/plugins/sources.json and clone into ~/.cache/omarchy/plugin-sources/. The installer only copies files, validates manifests against the shell's schema, and toggles enabled state over IPC -- it never runs plugin code, hooks, or sudo. Also guard 'plugin bar add' so only known bar-widget ids enter the layout (rejecting typos/non-widgets like a stray '--help').
99 lines
3.2 KiB
Bash
Executable File
99 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# omarchy:summary=List plugins available across trusted sources and their install status
|
|
# omarchy:group=plugin
|
|
# omarchy:args=[--json] [--no-refresh]
|
|
# omarchy:examples=omarchy plugin available | omarchy plugin available --json
|
|
|
|
set -o pipefail
|
|
|
|
PLUGINS_DIR="$HOME/.config/omarchy/plugins"
|
|
|
|
fail() {
|
|
echo "omarchy-plugin-available: $*" >&2
|
|
exit 1
|
|
}
|
|
|
|
command -v jq >/dev/null 2>&1 || fail "jq is required"
|
|
|
|
JSON=0
|
|
NO_REFRESH=0
|
|
while (($# > 0)); do
|
|
case "$1" in
|
|
--json) JSON=1; shift ;;
|
|
--no-refresh) NO_REFRESH=1; shift ;;
|
|
-h | --help)
|
|
cat <<USAGE
|
|
Usage: omarchy plugin available [--json] [--no-refresh]
|
|
|
|
Lists every plugin found across your trusted sources, with whether it is
|
|
installed and whether an update is available. Add one with:
|
|
omarchy plugin add <plugin-id>
|
|
USAGE
|
|
exit 0
|
|
;;
|
|
*) fail "unknown option: $1" ;;
|
|
esac
|
|
done
|
|
|
|
if ((!NO_REFRESH)); then
|
|
omarchy-plugin-source refresh >/dev/null 2>&1 || true
|
|
fi
|
|
|
|
CATALOG=$(omarchy-plugin-scan)
|
|
|
|
# Annotate each catalogue entry with a stable status token (available |
|
|
# installed | update-available | local-newer, matching omarchy-plugin-update's
|
|
# vocabulary) plus the installed version, by comparing the installed manifest
|
|
# version (if any) against the upstream version. Entries are read as compact
|
|
# JSON objects so an empty version field never shifts the parse.
|
|
rows='[]'
|
|
while IFS= read -r row; do
|
|
[[ -n $row ]] || continue
|
|
id=$(jq -r '.id' <<<"$row")
|
|
name=$(jq -r '.name' <<<"$row")
|
|
version=$(jq -r '.version' <<<"$row")
|
|
source=$(jq -r '.source' <<<"$row")
|
|
|
|
installed=""
|
|
[[ -f "$PLUGINS_DIR/$id/manifest.json" ]] && installed=$(jq -r '.version // ""' "$PLUGINS_DIR/$id/manifest.json" 2>/dev/null)
|
|
if [[ -z $installed ]]; then
|
|
status="available"
|
|
elif [[ $installed == "$version" ]]; then
|
|
status="installed"
|
|
elif [[ $(printf '%s\n%s\n' "$installed" "$version" | sort -V | tail -n1) == "$version" ]]; then
|
|
status="update-available"
|
|
else
|
|
status="local-newer"
|
|
fi
|
|
|
|
entry=$(jq -n --arg id "$id" --arg name "$name" --arg version "$version" \
|
|
--arg installed "$installed" --arg source "$source" --arg status "$status" \
|
|
'{id:$id, name:$name, version:$version, installedVersion:$installed, source:$source, status:$status}')
|
|
rows=$(jq --argjson e "$entry" '. + [$e]' <<<"$rows")
|
|
done < <(jq -c '.[] | {id: .manifest.id, name: (.manifest.name // .manifest.id), version: (.manifest.version // ""), source: .sourceId}' <<<"$CATALOG")
|
|
|
|
if ((JSON)); then
|
|
echo "$rows"
|
|
exit 0
|
|
fi
|
|
|
|
if [[ $(jq 'length' <<<"$rows") -eq 0 ]]; then
|
|
echo "No plugins available. Add a source with: omarchy plugin source add <git-url>"
|
|
exit 0
|
|
fi
|
|
|
|
# Render the human status from the token + versions (ASCII arrow, matching update).
|
|
jq -r '.[] | [.id, .name, .version, .source, .status, .installedVersion] | @tsv' <<<"$rows" |
|
|
awk -F '\t' '
|
|
function human(st, inst, ver) {
|
|
if (st == "update-available") return "update (" inst " -> " ver ")"
|
|
if (st == "local-newer") return "local-newer (" inst ")"
|
|
return st
|
|
}
|
|
BEGIN { printf "%-26s %-26s %-10s %-30s %s\n", "ID", "NAME", "VERSION", "SOURCE", "STATUS" }
|
|
{ printf "%-26s %-26s %-10s %-30s %s\n", $1, $2, ("v" ($3=="" ? "?" : $3)), $4, human($5, $6, $3) }'
|
|
|
|
echo
|
|
echo "Add with: omarchy plugin add <id>"
|