@jesdi/skills 0.0.13 → 0.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,229 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # A wizard walks a human through a manual procedure, step by step.
4
+ # Generated by the /wizard skill.
5
+ #
6
+ # Modified copy of mattpocock/skills skills/engineering/wizard/template.sh
7
+ # @ 3cca18b (v1.2.3). Copyright (c) 2026 Matt Pocock, MIT. Change: box_ref
8
+ # records values the agent-ops box reads from 1Password, and finish prints
9
+ # the template lines that make them visible to it.
10
+ #
11
+ # Everything above the "STAGES" marker is the wizard library: do not hand-edit
12
+ # it. Author the per-step stages below the marker.
13
+
14
+ set -euo pipefail
15
+
16
+ # ──────────────────────────────────────────────────────────────────────────
17
+ # Wizard library: delightful, consistent UX, identical across every wizard.
18
+ # ──────────────────────────────────────────────────────────────────────────
19
+
20
+ if [[ -t 1 ]] && command -v tput >/dev/null 2>&1 && [[ "$(tput colors 2>/dev/null || echo 0)" -ge 8 ]]; then
21
+ BOLD=$(tput bold); DIM=$(tput dim); RESET=$(tput sgr0)
22
+ BLUE=$(tput setaf 4); GREEN=$(tput setaf 2); YELLOW=$(tput setaf 3); RED=$(tput setaf 1)
23
+ else
24
+ BOLD=""; DIM=""; RESET=""; BLUE=""; GREEN=""; YELLOW=""; RED=""
25
+ fi
26
+
27
+ # Author sets this at the top of the stages section.
28
+ TOTAL_STAGES=0
29
+
30
+ _STAGE_INDEX=0
31
+ ENV_FILE="${ENV_FILE:-.env}"
32
+ BOX_ENV_TEMPLATE="${BOX_ENV_TEMPLATE:-provision/op.env.tpl}" # in agent-ops
33
+ WRITTEN_ENV=() # KEYs written to ENV_FILE this run
34
+ WRITTEN_SECRET=() # secret NAMEs set this run
35
+ BOX_REFS=() # "KEY=op://vault/item/FIELD" lines the box's env template needs
36
+ SKIPPED=() # things we couldn't do (e.g. gh missing)
37
+
38
+ # _clear wipes the terminal so only the current step is on screen. No-op when
39
+ # output isn't a terminal, so piped logs stay readable.
40
+ _clear() {
41
+ [[ -t 1 ]] || return 0
42
+ if command -v tput >/dev/null 2>&1; then tput clear; else printf '\033[2J\033[3J\033[H'; fi
43
+ }
44
+
45
+ # banner "Title" shows the opening frame: what this wizard does.
46
+ banner() {
47
+ _clear
48
+ printf '\n%s%s %s%s\n' "$BOLD" "$BLUE" "$1" "$RESET"
49
+ printf '%s %s stages%s\n\n' "$DIM" "$TOTAL_STAGES" "$RESET"
50
+ printf '%s You drive the browser; this wizard tells you exactly what to do and\n' "$DIM"
51
+ printf ' captures the values you copy back. Stop any time with Ctrl-C and re-run\n'
52
+ printf ' later, since it remembers values already saved.%s\n' "$RESET"
53
+ pause "Ready to start?"
54
+ }
55
+
56
+ # stage "Name" clears the screen, then announces a stage and shows progress.
57
+ # Clearing keeps only the current step on screen.
58
+ stage() {
59
+ _clear
60
+ _STAGE_INDEX=$((_STAGE_INDEX + 1))
61
+ printf '\n%s%s▸ Stage %s/%s · %s%s\n' \
62
+ "$BOLD" "$BLUE" "$_STAGE_INDEX" "$TOTAL_STAGES" "$1" "$RESET"
63
+ }
64
+
65
+ # say "..." prints a plain instruction line.
66
+ say() { printf ' %s\n' "$1"; }
67
+ # step "..." is a numbered-feeling action the human takes in the browser.
68
+ step() { printf ' %s•%s %s\n' "$BLUE" "$RESET" "$1"; }
69
+ note() { printf ' %s%s%s\n' "$DIM" "$1" "$RESET"; }
70
+ warn() { printf ' %s⚠ %s%s\n' "$YELLOW" "$1" "$RESET"; }
71
+
72
+ # open_url URL opens it in the human's browser, cross-platform incl. WSL.
73
+ open_url() {
74
+ local url="$1"
75
+ printf ' %s↗ opening%s %s\n' "$GREEN" "$RESET" "$url"
76
+ { if command -v wslview >/dev/null 2>&1; then wslview "$url"
77
+ elif command -v explorer.exe >/dev/null 2>&1; then explorer.exe "$url"
78
+ elif command -v xdg-open >/dev/null 2>&1; then xdg-open "$url"
79
+ elif command -v open >/dev/null 2>&1; then open "$url"
80
+ else warn "couldn't open a browser; visit it manually: $url"; fi
81
+ } >/dev/null 2>&1 || warn "couldn't open a browser, so visit it manually: $url"
82
+ }
83
+
84
+ # pause "msg" waits for the human to confirm they've done the manual part.
85
+ pause() {
86
+ printf ' %s%s%s ' "$DIM" "${1:-Press Enter to continue}" "$RESET"
87
+ read -r _ || true
88
+ }
89
+
90
+ # confirm "question" is a y/N gate; returns success on yes.
91
+ confirm() {
92
+ local reply=""
93
+ printf ' %s? %s [y/N] ' "$YELLOW" "$1"
94
+ read -r reply || true
95
+ [[ "$reply" =~ ^[Yy] ]]
96
+ }
97
+
98
+ # _existing KEY: current value of KEY in ENV_FILE, if any.
99
+ _existing() {
100
+ [[ -f "$ENV_FILE" ]] || return 1
101
+ local line; line=$(grep -E "^${1}=" "$ENV_FILE" | tail -n1) || return 1
102
+ printf '%s' "${line#*=}"
103
+ }
104
+
105
+ # ask KEY "Prompt" reads a value into $KEY. Offers the existing .env value as
106
+ # a default on re-runs (Enter keeps it). Visible input (non-secret).
107
+ ask() {
108
+ local key="$1" prompt="$2" current input
109
+ current=$(_existing "$key" || true)
110
+ if [[ -n "$current" ]]; then
111
+ printf ' %s%s%s %s[Enter keeps current]%s ' "$BOLD" "$prompt" "$RESET" "$DIM" "$RESET"
112
+ else
113
+ printf ' %s%s%s ' "$BOLD" "$prompt" "$RESET"
114
+ fi
115
+ read -r input || true
116
+ [[ -z "$input" && -n "$current" ]] && input="$current"
117
+ printf -v "$key" '%s' "$input"
118
+ }
119
+
120
+ # ask_secret KEY "Prompt" is like ask, but input is hidden.
121
+ ask_secret() {
122
+ local key="$1" prompt="$2" current input
123
+ current=$(_existing "$key" || true)
124
+ if [[ -n "$current" ]]; then
125
+ printf ' %s%s%s %s[Enter keeps current]%s ' "$BOLD" "$prompt" "$RESET" "$DIM" "$RESET"
126
+ else
127
+ printf ' %s%s%s ' "$BOLD" "$prompt" "$RESET"
128
+ fi
129
+ read -rs input || true
130
+ printf '\n'
131
+ [[ -z "$input" && -n "$current" ]] && input="$current"
132
+ printf -v "$key" '%s' "$input"
133
+ }
134
+
135
+ # write_env KEY VALUE upserts KEY=VALUE into ENV_FILE (creates it; replaces
136
+ # any existing line). Idempotent.
137
+ write_env() {
138
+ local key="$1" value="$2" tmp
139
+ touch "$ENV_FILE"
140
+ tmp=$(mktemp)
141
+ grep -vE "^${key}=" "$ENV_FILE" > "$tmp" || true
142
+ printf '%s=%s\n' "$key" "$value" >> "$tmp"
143
+ mv "$tmp" "$ENV_FILE"
144
+ WRITTEN_ENV+=("$key")
145
+ printf ' %s✓ wrote%s %s → %s\n' "$GREEN" "$RESET" "$key" "$ENV_FILE"
146
+ }
147
+
148
+ # set_secret NAME VALUE sets a GitHub Actions repo secret via gh. Falls back
149
+ # to a warning (and records it) if gh is unavailable or unauthenticated.
150
+ set_secret() {
151
+ local name="$1" value="$2"
152
+ if command -v gh >/dev/null 2>&1 && gh auth status >/dev/null 2>&1; then
153
+ if printf '%s' "$value" | gh secret set "$name" >/dev/null 2>&1; then
154
+ WRITTEN_SECRET+=("$name")
155
+ printf ' %s✓ set%s GitHub secret %s\n' "$GREEN" "$RESET" "$name"
156
+ return
157
+ fi
158
+ fi
159
+ SKIPPED+=("GitHub secret $name (set it manually: gh secret set $name)")
160
+ warn "skipped GitHub secret $name: gh not ready; set it later"
161
+ }
162
+
163
+ # set_var NAME VALUE sets a GitHub Actions repo variable (non-secret).
164
+ set_var() {
165
+ local name="$1" value="$2"
166
+ if command -v gh >/dev/null 2>&1 && gh auth status >/dev/null 2>&1; then
167
+ if gh variable set "$name" --body "$value" >/dev/null 2>&1; then
168
+ printf ' %s✓ set%s GitHub variable %s\n' "$GREEN" "$RESET" "$name"
169
+ return
170
+ fi
171
+ fi
172
+ SKIPPED+=("GitHub variable $name")
173
+ warn "skipped GitHub variable $name, gh not ready; set it later"
174
+ }
175
+
176
+ # box_ref KEY "op://vault/item/FIELD" records that the agent-ops box must read
177
+ # KEY from that 1Password reference. The wizard never writes to 1Password; the
178
+ # stage tells the human to store the value there, and finish prints the exact
179
+ # line the box's env template needs.
180
+ box_ref() {
181
+ BOX_REFS+=("$1=$2")
182
+ printf ' %s✓ box%s %s → %s\n' "$GREEN" "$RESET" "$1" "$2"
183
+ }
184
+
185
+ # finish clears, then shows a closing summary of everything configured.
186
+ finish() {
187
+ _clear
188
+ printf '\n%s%s ✓ Setup complete%s\n' "$BOLD" "$GREEN" "$RESET"
189
+ (( ${#WRITTEN_ENV[@]} )) && note "wrote ${#WRITTEN_ENV[@]} value(s) to $ENV_FILE: ${WRITTEN_ENV[*]}"
190
+ (( ${#WRITTEN_SECRET[@]} )) && note "set ${#WRITTEN_SECRET[@]} GitHub secret(s): ${WRITTEN_SECRET[*]}"
191
+ if (( ${#BOX_REFS[@]} )); then
192
+ printf '\n'; warn "box credentials: add these lines to $BOX_ENV_TEMPLATE in agent-ops"
193
+ for r in "${BOX_REFS[@]}"; do printf ' %s\n' "$r"; done
194
+ note "Each value must exist in 1Password at the reference shown."
195
+ note "The box cannot see these until that change is merged and the box has converged."
196
+ fi
197
+ if (( ${#SKIPPED[@]} )); then
198
+ printf '\n'; warn "still to do by hand:"
199
+ for s in "${SKIPPED[@]}"; do note " - $s"; done
200
+ fi
201
+ printf '\n'
202
+ }
203
+
204
+ # ──────────────────────────────────────────────────────────────────────────
205
+ # STAGES: author this section. One stage() per step the human takes.
206
+ # Replace the example below. Set TOTAL_STAGES to match the stages you write.
207
+ # ──────────────────────────────────────────────────────────────────────────
208
+
209
+ TOTAL_STAGES=1
210
+
211
+ banner "Stripe setup"
212
+
213
+ # ── Example stage: replace with your real steps ───────────────────────────
214
+ stage "Stripe: API keys"
215
+ say "We'll grab your Stripe test keys and store them for local dev, CI and the box."
216
+ open_url "https://dashboard.stripe.com/test/apikeys"
217
+ step "On the API keys page, copy the Publishable key (starts pk_test_)."
218
+ ask STRIPE_PUBLISHABLE_KEY "Paste the publishable key:"
219
+ step "Click 'Reveal test key' on the Secret key row, then copy it."
220
+ ask_secret STRIPE_SECRET_KEY "Paste the secret key:"
221
+ write_env STRIPE_PUBLISHABLE_KEY "$STRIPE_PUBLISHABLE_KEY" # local only
222
+ write_env STRIPE_SECRET_KEY "$STRIPE_SECRET_KEY"
223
+ set_secret STRIPE_SECRET_KEY "$STRIPE_SECRET_KEY" # CI needs this one
224
+ step "In 1Password, vault agent-ops, item agent-ops-stripe: add field STRIPE_SECRET_KEY with the same value."
225
+ pause "Stored in 1Password?"
226
+ box_ref STRIPE_SECRET_KEY "op://agent-ops/agent-ops-stripe/STRIPE_SECRET_KEY" # the box needs this one
227
+ # ──────────────────────────────────────────────────────────────────────────
228
+
229
+ finish
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "generatedAt": "2026-09-03T09:39:52.864Z",
3
+ "generatedAt": "2026-09-13T13:58:48.949Z",
4
4
  "skills": [
5
5
  {
6
6
  "name": "backlog",
7
- "version": "0.1.6",
8
- "hash": "sha256-89423260dd0d35ceb16f536c1c3bd0e5fc43a30f36861e301a7a807351645582",
7
+ "version": "0.1.7",
8
+ "hash": "sha256-652964aebeadbd2a4ecafd5a588f0bd0c31b90442f3133f64d7d663893a1f7a0",
9
9
  "description": "Manage a GitHub-Issues-backed backlog and a Projects-v2 work graph via five verbs. Use when the user wants to CAPTURE an idea/research thread (\"add to backlog\", \"capture this\", \"note this idea\", \"log a task\"), TRIAGE the inbox (\"triage the backlog\", \"score the inbox\"), see what to work on NEXT (\"what's next\", \"what should I work on\", \"ranked backlog\", \"next actionable task\"), LAND a finished item (\"mark done\", \"close out #N\"), or SETUP the board the first time. Ranks open issues by impact÷effort, respecting `Blocked by:` edges, so only actionable work surfaces."
10
10
  },
11
11
  {
@@ -22,9 +22,9 @@
22
22
  },
23
23
  {
24
24
  "name": "crap-gate",
25
- "version": "0.1.2",
26
- "hash": "sha256-6f1e0de08917f0b0166959dd25328ed098ce1185cf52996093f2b18b151a9c0a",
27
- "description": "Score every function a branch changed with CRAP (cyclomatic complexity × untested fraction), fail on existing functions > 15 and new functions > 9, and drive a fixer + independent reviewer loop until the gate passes. Use when implementation is done and before pushing, when the user says \"run the crap gate\", \"check CRAP\", \"is this change tested enough\", or when a push gate reports CRAP violations."
25
+ "version": "0.1.3",
26
+ "hash": "sha256-39041927a985061599a39bb287232b83655ecbac61b7de52486f485991a99d30",
27
+ "description": "Score every function a branch changed with CRAP (cyclomatic complexity × untested fraction), fail on existing functions above 15 and new functions above 9, and drive a fixer + independent reviewer loop until the gate passes. Use when implementation is done and before pushing, when the user says \"run the crap gate\", \"check CRAP\", \"is this change tested enough\", or when a push gate reports CRAP violations."
28
28
  },
29
29
  {
30
30
  "name": "deep-quality-review",
@@ -49,6 +49,30 @@
49
49
  "version": "0.1.0",
50
50
  "hash": "sha256-4e386dd175a34e55e89e0e29e37f5d0afd927560b7e3ba4c5f3ef482fb73f722",
51
51
  "description": "Capture before/after screenshots of UI views with Playwright and embed them in a PR. Use this skill whenever creating or preparing a pull request that touches frontend code (components, views, styles, layout, Tailwind classes) — even if the user just says \"open a PR\" or \"create the PR\" after UI work, and especially if they mention screenshots, visual diff, before/after, or \"show what changed\". Also use when the user asks to add screenshots to an existing PR."
52
+ },
53
+ {
54
+ "name": "prototype",
55
+ "version": "0.1.0",
56
+ "hash": "sha256-211e0e116ff6efbc4589ea7264835855b9495ba535f242733af913903fe7707d",
57
+ "description": "Build a throwaway prototype to answer a design question, delivered as one self-contained HTML file. Use when the user wants to sanity-check whether a state model or logic feels right, or explore what a UI should look like."
58
+ },
59
+ {
60
+ "name": "to-spec",
61
+ "version": "0.1.0",
62
+ "hash": "sha256-146048bc0d698b92c330e860dc5c052b4645e1ba69f5b094270632daec82e40b",
63
+ "description": "Turn the current conversation into a design spec and write it where the next stage reads it: a GitHub issue body labelled spec-ready (after a grilling session), or a dated design file on the current branch (an unattended spec stage). No interview, just synthesis of what you've already discussed."
64
+ },
65
+ {
66
+ "name": "to-tickets",
67
+ "version": "0.1.0",
68
+ "hash": "sha256-23e1381b40dd4ffa151a2f89dcb82462464ea424228b45a31e6656406d34fedc",
69
+ "description": "Break a spec, plan, or the current conversation into numbered tracer-bullet ticket files under .agent/tickets/, each declaring its blocking edges and acceptance criteria phrased as observable behavior. Use after a spec is approved and before implementation starts."
70
+ },
71
+ {
72
+ "name": "wizard",
73
+ "version": "0.1.0",
74
+ "hash": "sha256-ebcd06573861f575707717ef65218b52436256c33a8cb1da12484c5b58ce9294",
75
+ "description": "Generate an interactive bash wizard that walks a human through steps only they can perform, and that says for every captured value whether it ends up in CI, on the agent-ops box (1Password), or local only. Use when provisioning infrastructure, setting up credentials or CI secrets, walking an unfamiliar third-party dashboard, or running a one-off migration or cutover. Don't invoke this for steps the agent can perform itself."
52
76
  }
53
77
  ]
54
78
  }