/ de-omarchy / bin / omarchy-plugin-add
swadhinbiswas Plugin marketplace: omarchyplugins.com catalog, Plugin Manager/Library windows, registry.json with bundled plugins · 8/24/2026
12362d0
169 lines · 3.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#!/bin/bash

# omarchy:summary=Add a shell plugin from git
# omarchy:group=plugin
# omarchy:args=[git-url] [--enable] [--yes]
# omarchy:examples=omarchy plugin add https://github.com/acme/omarchy-weather.git --enable
# omarchy:alias=omarchy plugin install

set -euo pipefail

export GIT_TERMINAL_PROMPT=0
export GIT_SSH_COMMAND="${GIT_SSH_COMMAND:-ssh -oBatchMode=yes}"

PLUGINS_DIR="$HOME/.config/omarchy/plugins"
ASSUME_YES=0

fail() {
  echo "omarchy-plugin-add: $*" >&2
  exit 1
}

interactive() {
  [[ -t 0 && -t 1 ]]
}

confirm() {
  local prompt="$1"
  (( ASSUME_YES )) && return 0
  if interactive; then
    gum confirm "$prompt"
  else
    fail "refusing to continue without confirmation; pass --yes"
  fi
}

ENABLE_PLACEMENT=()

select_bar_widget_placement() {
  local id="$1"
  local section
  local default_section
  interactive || return 0
  (( ASSUME_YES )) && return 0

  jq -e '(.kinds // []) | (index("bar") | not) and (index("bar-widget") != null)' \
    "$PLUGINS_DIR/$id/manifest.json" >/dev/null 2>&1 || return 0

  default_section=$(jq -r '.barWidget.defaultSection // "center"' "$PLUGINS_DIR/$id/manifest.json")
  section=$(printf '%s\n' left center right |
    gum choose --header="Place $id in which bar section?" --selected "$default_section") || return 0
  [[ -n $section ]] || return 0
  ENABLE_PLACEMENT=(--section "$section")
}

plugin_id_manifest() {
  omarchy-plugin-catalog | jq -r --arg id "$1" '
    map(select(.id == $id))[0].manifestPath // empty
  '
}

url=""
enable_after=""

while (( $# > 0 )); do
  case "$1" in
  --enable)
    enable_after=true
    shift
    ;;
  --yes | -y)
    ASSUME_YES=1
    shift
    ;;
  -h | --help)
    echo "Usage: omarchy plugin add [git-url] [--enable] [--yes]"
    exit 0
    ;;
  -*)
    fail "unknown add option: $1"
    ;;
  *)
    [[ -z $url ]] || fail "unexpected argument: $1"
    url="$1"
    shift
    ;;
  esac
done

if [[ -z $url ]]; then
  interactive ||
    fail "a git URL is required (e.g. omarchy plugin add https://github.com/acme/omarchy-weather.git)"
  url=$(gum input --prompt "Git URL of the plugin repo: ") || fail "cancelled"
  [[ -n $url ]] || fail "a git URL is required"
fi

if (( ! ASSUME_YES )); then
  cat >&2 <<WARN

⚠️  Plugins run as arbitrary, unsandboxed code inside your long-lived
  omarchy-shell process. Only add repos you trust, and review the code
  before you enable it.

      URL: $url

WARN
  confirm "Clone and add this plugin?" || fail "aborted"
fi

mkdir -p "$PLUGINS_DIR"

stage="$PLUGINS_DIR/.add.tmp.$$"
rm -rf "$stage"
if ! git clone -- "$url" "$stage"; then
  rm -rf "$stage"
  fail "failed to clone $url"
fi

if ! omarchy-plugin-validate "$stage"; then
  rm -rf "$stage"
  fail "refusing to add: validation failed"
fi

id=$(jq -r '.id' "$stage/manifest.json")
existing_manifest=$(plugin_id_manifest "$id") || {
  rm -rf "$stage"
  fail "could not inspect installed plugin ids"
}
if [[ -n $existing_manifest ]]; then
  rm -rf "$stage"
  fail "plugin id '$id' is already used by $existing_manifest"
fi

target="$PLUGINS_DIR/$id"
if [[ -e $target || -L $target ]]; then
  rm -rf "$stage"
  fail "plugin '$id' is already installed; update it with: omarchy plugin update $id"
fi

mv "$stage" "$target"
echo "Added $id into $target"

omarchy-shell shell rescanPlugins >/dev/null 2>&1 || true

if [[ -z $enable_after ]]; then
  if (( ASSUME_YES )) || ! interactive; then
    enable_after=false
  elif confirm "Enable '$id' now?"; then
    enable_after=true
  else
    enable_after=false
  fi
fi

if [[ $enable_after == true ]]; then
  select_bar_widget_placement "$id"
  discovered=0
  for (( attempt = 0; attempt < 40; attempt++ )); do
    if omarchy-plugin-list --json | jq -e --arg id "$id" 'any(.[]; .id == $id)' >/dev/null; then
      discovered=1
      break
    fi
    sleep 0.05
  done
  (( discovered )) || fail "plugin '$id' is not known"
  omarchy-plugin-enable "$id" "${ENABLE_PLACEMENT[@]}"
else
  echo "Enable it later with: omarchy plugin enable $id"
fi