@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.
- package/README.md +39 -3
- package/package.json +1 -1
- package/skills/backlog/SKILL.md +12 -6
- package/skills/backlog/references/graphql.md +2 -1
- package/skills/crap-gate/SKILL.md +38 -11
- package/skills/crap-gate/crap.py +13 -1
- package/skills/crap-gate/run.sh +87 -0
- package/skills/crap-gate/test_launcher.py +116 -0
- package/skills/prototype/LICENSE +21 -0
- package/skills/prototype/LOGIC.md +67 -0
- package/skills/prototype/SKILL.md +39 -0
- package/skills/prototype/UI.md +99 -0
- package/skills/to-spec/LICENSE +21 -0
- package/skills/to-spec/SKILL.md +119 -0
- package/skills/to-tickets/LICENSE +21 -0
- package/skills/to-tickets/SKILL.md +95 -0
- package/skills/wizard/LICENSE +21 -0
- package/skills/wizard/SKILL.md +65 -0
- package/skills/wizard/template.sh +229 -0
- package/skills-manifest.json +30 -6
|
@@ -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
|
package/skills-manifest.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"generatedAt": "2026-09-
|
|
3
|
+
"generatedAt": "2026-09-13T13:58:48.949Z",
|
|
4
4
|
"skills": [
|
|
5
5
|
{
|
|
6
6
|
"name": "backlog",
|
|
7
|
-
"version": "0.1.
|
|
8
|
-
"hash": "sha256-
|
|
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.
|
|
26
|
-
"hash": "sha256-
|
|
27
|
-
"description": "Score every function a branch changed with CRAP (cyclomatic complexity × untested fraction), fail on existing functions
|
|
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
|
}
|