@jesdi/skills 0.0.1

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 ADDED
@@ -0,0 +1,57 @@
1
+ # @jesdi/skills
2
+
3
+ Personal agent skills, installable into Claude Code and OpenCode.
4
+
5
+ ## Install skills
6
+
7
+ ```bash
8
+ npx @jesdi/skills-cli
9
+ ```
10
+
11
+ Pick skills → pick agents → pick project-local or global. Skills are stored
12
+ in `.my-skills/` (or `~/.my-skills/`) and symlinked into each agent's skills
13
+ directory.
14
+
15
+ ## Team sync
16
+
17
+ `.my-skills.json` is meant to be committed. Teammates run:
18
+
19
+ ```bash
20
+ npx @jesdi/skills-cli sync
21
+ ```
22
+
23
+ ## Commands
24
+
25
+ ```
26
+ npx @jesdi/skills-cli # interactive wizard
27
+ npx @jesdi/skills-cli install <skill...> [--agent claude,opencode] [--global]
28
+ npx @jesdi/skills-cli update [skill] [--all] [--global]
29
+ npx @jesdi/skills-cli sync
30
+ npx @jesdi/skills-cli list
31
+ npx @jesdi/skills-cli uninstall <skill> [--global]
32
+ ```
33
+
34
+ ## Third-party skills (not vendored)
35
+
36
+ Skills authored by other people are **not** copied into this repo — they keep
37
+ their own authors, upstreams, and licenses. `external-skills.json` records
38
+ which ones are part of the standard setup and where they come from. Install
39
+ them from upstream with the [skills.sh](https://skills.sh/) CLI:
40
+
41
+ ```bash
42
+ npx skills add mattpocock/skills # grill-me, grill-with-docs, improve-codebase-architecture
43
+ npx skills add JuliusBrussee/caveman # caveman suite
44
+ npx skills add vercel-labs/skills # find-skills
45
+ npx skills add vercel-labs/agent-skills # vercel-react-best-practices
46
+ npx skills add anthropics/skills # frontend-design (skip if using the Claude Code plugin)
47
+ ```
48
+
49
+ The skills.sh lockfile (`~/.agents/.skill-lock.json`) tracks installed
50
+ versions; `npx skills update` refreshes them.
51
+
52
+ ## Authoring skills
53
+
54
+ Add `skills/<name>/SKILL.md` (frontmatter `name` must match the directory,
55
+ `description` required). Push to `main` — CI hashes the skill, bumps its
56
+ version in `skills-manifest.json`, and publishes `@jesdi/skills`. See
57
+ `DESIGN.md` for the full architecture.
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@jesdi/skills",
3
+ "version": "0.0.1",
4
+ "description": "jesdi's agent skills (content package consumed by @jesdi/skills-cli)",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/jesdi/general-skills.git"
9
+ },
10
+ "type": "module",
11
+ "files": [
12
+ "skills",
13
+ "skills-manifest.json"
14
+ ],
15
+ "workspaces": [
16
+ "cli"
17
+ ],
18
+ "scripts": {
19
+ "test": "vitest run",
20
+ "generate-manifest": "tsx scripts/generate-manifest.ts"
21
+ },
22
+ "devDependencies": {
23
+ "@types/node": "^22.0.0",
24
+ "gray-matter": "^4.0.3",
25
+ "tsx": "^4.19.0",
26
+ "typescript": "^5.5.0",
27
+ "vitest": "^2.1.0"
28
+ },
29
+ "engines": {
30
+ "node": ">=20"
31
+ }
32
+ }
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: branch-audit
3
+ description: >
4
+ Audit local and remote git branches to see which are merged into main, which have
5
+ unpushed commits, which have diverged, and which have stale worktrees. Use this skill
6
+ whenever the user asks: "is this branch already pushed?", "can I delete this branch?",
7
+ "which branches are stale?", "clean up merged branches", "remove old worktrees",
8
+ "what branches haven't been pushed yet?", or anything related to branch hygiene,
9
+ branch status, or pruning local/remote branches. Also use it when the user wants to
10
+ delete branches in bulk, either locally or on the remote.
11
+ ---
12
+
13
+ # Branch Audit
14
+
15
+ This skill bundles `scripts/branch-audit.sh` (in this skill's directory) that categorises
16
+ every local branch and identifies stale remote branches. Always use it rather than
17
+ running one-off `git branch` commands. Run it from the repo root of the repository being
18
+ audited. If the target repo has its own `scripts/branch-audit.sh`, prefer that copy.
19
+
20
+ The default branch is auto-detected from `origin/HEAD` (falling back to `main`);
21
+ override with `MAIN=<branch>` or `REMOTE=<remote>` env vars if needed.
22
+
23
+ ## When to use each flag
24
+
25
+ Below, `branch-audit.sh` means the bundled script — invoke it by its path inside this
26
+ skill's directory, e.g. `bash <skill-dir>/scripts/branch-audit.sh`.
27
+
28
+ | Goal | Command |
29
+ |------|---------|
30
+ | See branch status (read-only) | `bash branch-audit.sh` |
31
+ | Preview what cleanup would do | `bash branch-audit.sh --clean-all --dry-run` |
32
+ | Remove stale worktrees + delete merged local branches | `bash branch-audit.sh --clean-local` |
33
+ | Delete merged branches on `origin` | `bash branch-audit.sh --clean-remote` |
34
+ | Do both at once | `bash branch-audit.sh --clean-all` |
35
+
36
+ Always run `--dry-run` first when the user hasn't explicitly said "go ahead and delete".
37
+
38
+ ## Output categories
39
+
40
+ - **Green — merged into main**: safe to delete locally. Branches with an associated
41
+ worktree show the worktree path; clean-local removes both.
42
+ - **Purple — remote merged into main**: the remote counterpart is also merged; clean-remote
43
+ deletes them from `origin`.
44
+ - **Red — unmerged / dirty**: has commits not in main and is in sync with remote. Needs
45
+ manual review before deletion.
46
+ - **Yellow — unpushed**: has local commits not yet pushed to remote, or no remote branch
47
+ at all.
48
+ - **Cyan — diverged**: local and remote have both moved on; requires manual reconciliation.
49
+
50
+ ## Workflow
51
+
52
+ 1. Run the audit (no flags) and share the output with the user.
53
+ 2. If the user wants to clean up, run `--dry-run` first so they can confirm.
54
+ 3. Once confirmed, run without `--dry-run`.
55
+ 4. For remote deletion, remind the user this pushes a delete to `origin` — make sure
56
+ they're OK with that before proceeding.
57
+
58
+ ## Answering "is branch X already pushed?"
59
+
60
+ Look at the Yellow section. If the branch appears there with "no remote branch" or
61
+ "N unpushed", it is **not fully pushed**. If it's in Green or not listed at all
62
+ (it may already be gone), it is pushed and merged. If it's in Red, it's pushed but
63
+ not yet merged into main.
@@ -0,0 +1,235 @@
1
+ #!/usr/bin/env bash
2
+ # Audits local branches: merged, unpushed commits, diverged, and unmerged dirty branches.
3
+ # Also detects stale worktrees and remote branches merged into main.
4
+ #
5
+ # Usage:
6
+ # branch-audit.sh # report only
7
+ # branch-audit.sh --clean-local # remove stale worktrees + delete merged local branches
8
+ # branch-audit.sh --clean-remote # delete merged remote branches on origin
9
+ # branch-audit.sh --clean-all # both of the above
10
+ # branch-audit.sh --clean-* --dry-run # show what would be done without executing
11
+
12
+ set -euo pipefail
13
+
14
+ # MAIN/REMOTE overridable via env; MAIN falls back to the remote's HEAD branch, then "main".
15
+ REMOTE="${REMOTE:-origin}"
16
+ MAIN="${MAIN:-$(git symbolic-ref --short "refs/remotes/$REMOTE/HEAD" 2>/dev/null | sed "s|^$REMOTE/||")}"
17
+ MAIN="${MAIN:-main}"
18
+
19
+ RED='\033[0;31m'
20
+ YEL='\033[1;33m'
21
+ CYA='\033[0;36m'
22
+ GRN='\033[0;32m'
23
+ MAG='\033[0;35m'
24
+ BLD='\033[1m'
25
+ DIM='\033[2m'
26
+ RST='\033[0m'
27
+
28
+ clean_local=false
29
+ clean_remote=false
30
+ dry_run=false
31
+
32
+ for arg in "$@"; do
33
+ case "$arg" in
34
+ --clean-local) clean_local=true ;;
35
+ --clean-remote) clean_remote=true ;;
36
+ --clean-all) clean_local=true; clean_remote=true ;;
37
+ --dry-run) dry_run=true ;;
38
+ *) echo "Unknown option: $arg" >&2; exit 1 ;;
39
+ esac
40
+ done
41
+
42
+ # run_cmd: prints the command, executes only when not in dry-run mode
43
+ run_cmd() {
44
+ if $dry_run; then
45
+ echo -e " ${DIM}[dry-run]${RST} $*"
46
+ else
47
+ echo -e " $*"
48
+ "$@"
49
+ fi
50
+ }
51
+
52
+ # Fetch quietly to get up-to-date remote state
53
+ git fetch --prune "$REMOTE" 2>/dev/null
54
+
55
+ main_tip=$(git rev-parse "$MAIN")
56
+ current=$(git rev-parse --abbrev-ref HEAD)
57
+
58
+ # ── Build worktree index: "branch\tpath" lines (bash 3.2 compatible) ─────────
59
+ worktree_index=""
60
+ while IFS= read -r line; do
61
+ wt_path=$(echo "$line" | awk '{print $1}')
62
+ wt_branch=$(echo "$line" | sed -n 's/.*\[\(.*\)\].*/\1/p')
63
+ [[ -n "$wt_branch" ]] && worktree_index+="${wt_branch} ${wt_path}"$'\n'
64
+ done < <(git worktree list)
65
+
66
+ worktree_for() {
67
+ echo "$worktree_index" | awk -F'\t' -v b="$1" '$1==b{print $2; exit}'
68
+ }
69
+
70
+ # ── Classify local branches ───────────────────────────────────────────────────
71
+ merged_into_main=() # "branch|worktree_path_or_empty"
72
+ dirty=() # "branch|remote_status|ahead_main"
73
+ unpushed=() # "branch|push_status|ahead_main"
74
+ diverged=() # "branch|divergence|ahead_main"
75
+
76
+ while IFS= read -r branch; do
77
+ [[ "$branch" == "$MAIN" ]] && continue
78
+ [[ "$branch" == "$current" ]] && continue
79
+
80
+ remote_ref="$REMOTE/$branch"
81
+ has_remote=false
82
+ git rev-parse --verify "$remote_ref" &>/dev/null && has_remote=true
83
+
84
+ branch_tip=$(git rev-parse "$branch")
85
+
86
+ if git merge-base --is-ancestor "$branch_tip" "$main_tip" 2>/dev/null; then
87
+ wt=$(worktree_for "$branch")
88
+ merged_into_main+=("$branch|$wt")
89
+ continue
90
+ fi
91
+
92
+ ahead_main=$(git rev-list --count "$MAIN".."$branch" 2>/dev/null || echo 0)
93
+
94
+ if $has_remote; then
95
+ ahead_remote=$(git rev-list --count "$remote_ref".."$branch" 2>/dev/null || echo 0)
96
+ behind_remote=$(git rev-list --count "$branch".."$remote_ref" 2>/dev/null || echo 0)
97
+
98
+ if [[ "$ahead_remote" -gt 0 && "$behind_remote" -gt 0 ]]; then
99
+ diverged+=("$branch|+${ahead_remote}/-${behind_remote} vs remote|+${ahead_main} vs main")
100
+ elif [[ "$ahead_remote" -gt 0 ]]; then
101
+ unpushed+=("$branch|${ahead_remote} unpushed|+${ahead_main} vs main")
102
+ else
103
+ dirty+=("$branch|in sync with remote|+${ahead_main} vs main")
104
+ fi
105
+ else
106
+ unpushed+=("$branch|no remote branch|+${ahead_main} vs main")
107
+ fi
108
+
109
+ done < <(git branch --format='%(refname:short)')
110
+
111
+ # ── Remote branches merged into main ─────────────────────────────────────────
112
+ remote_merged=()
113
+ while IFS= read -r ref; do
114
+ # Only process refs that genuinely start with "$REMOTE/" to avoid symrefs
115
+ [[ "$ref" != "$REMOTE/"* ]] && continue
116
+ branch="${ref#$REMOTE/}"
117
+ [[ "$branch" == "HEAD" || "$branch" == "$MAIN" ]] && continue
118
+
119
+ remote_tip=$(git rev-parse "$ref" 2>/dev/null || true)
120
+ [[ -z "$remote_tip" ]] && continue
121
+
122
+ if git merge-base --is-ancestor "$remote_tip" "$main_tip" 2>/dev/null; then
123
+ remote_merged+=("$branch")
124
+ fi
125
+ done < <(git branch -r --format='%(refname:short)')
126
+
127
+ # ── Print helpers ─────────────────────────────────────────────────────────────
128
+
129
+ print_table() {
130
+ local color="$1"; shift
131
+ local header1="$1"; shift
132
+ local header2="$1"; shift
133
+ local header3="$1"; shift
134
+ printf "${color}${BLD} %-42s %-28s %s${RST}\n" "$header1" "$header2" "$header3"
135
+ printf "${color} %-42s %-28s %s${RST}\n" "$(printf '%.0s─' {1..42})" "$(printf '%.0s─' {1..28})" "$(printf '%.0s─' {1..20})"
136
+ for entry in "$@"; do
137
+ IFS='|' read -r b c1 c2 <<< "$entry"
138
+ printf "${color} %-42s %-28s %s${RST}\n" "$b" "$c1" "$c2"
139
+ done
140
+ }
141
+
142
+ echo
143
+ echo -e "${BLD}Branch Audit — $(git rev-parse --abbrev-ref HEAD) @ $(git rev-parse --short HEAD)${RST}"
144
+ echo -e "Main branch: ${BLD}${MAIN}${RST} Remote: ${BLD}${REMOTE}${RST}"
145
+ echo
146
+
147
+ # ── Merged local branches ─────────────────────────────────────────────────────
148
+ if [[ ${#merged_into_main[@]} -gt 0 ]]; then
149
+ branches_to_delete=()
150
+ worktrees_to_remove=()
151
+
152
+ echo -e "${GRN}${BLD}✓ Merged into main (safe to delete locally)${RST}"
153
+ printf "${GRN}${BLD} %-42s %s${RST}\n" "Branch" "Worktree"
154
+ printf "${GRN} %-42s %s${RST}\n" "$(printf '%.0s─' {1..42})" "$(printf '%.0s─' {1..40})"
155
+
156
+ for entry in "${merged_into_main[@]}"; do
157
+ IFS='|' read -r b wt <<< "$entry"
158
+ branches_to_delete+=("$b")
159
+ if [[ -n "$wt" ]]; then
160
+ worktrees_to_remove+=("$wt")
161
+ printf "${GRN} %-42s ${DIM}%s${RST}\n" "$b" "$wt"
162
+ else
163
+ printf "${GRN} %s${RST}\n" "$b"
164
+ fi
165
+ done
166
+ echo
167
+
168
+ if $clean_local; then
169
+ $dry_run && echo -e " ${BLD}--clean-local --dry-run: showing commands that would run${RST}" \
170
+ || echo -e " ${BLD}--clean-local: removing worktrees and deleting branches...${RST}"
171
+ for wt in "${worktrees_to_remove[@]}"; do
172
+ run_cmd git worktree remove --force "$wt"
173
+ done
174
+ run_cmd git branch -d "${branches_to_delete[@]}"
175
+ $dry_run || echo -e " ${GRN}Done.${RST}"
176
+ else
177
+ if [[ ${#worktrees_to_remove[@]} -gt 0 ]]; then
178
+ echo -e " Remove worktrees first:"
179
+ for wt in "${worktrees_to_remove[@]}"; do
180
+ echo -e " ${BLD}git worktree remove --force \"$wt\"${RST}"
181
+ done
182
+ echo
183
+ fi
184
+ echo -e " Then delete branches: ${BLD}git branch -d ${branches_to_delete[*]}${RST}"
185
+ echo -e " Or run: ${BLD}$0 --clean-local${RST}"
186
+ fi
187
+ echo
188
+ fi
189
+
190
+ # ── Remote branches merged into main ─────────────────────────────────────────
191
+ if [[ ${#remote_merged[@]} -gt 0 ]]; then
192
+ echo -e "${MAG}${BLD}☁ Remote branches merged into main (safe to delete on remote)${RST}"
193
+ printf "${MAG} %-42s${RST}\n" "$(printf '%.0s─' {1..42})"
194
+ for b in "${remote_merged[@]}"; do
195
+ printf "${MAG} %s${RST}\n" "$b"
196
+ done
197
+ echo
198
+
199
+ if $clean_remote; then
200
+ $dry_run && echo -e " ${BLD}--clean-remote --dry-run: showing commands that would run${RST}" \
201
+ || echo -e " ${BLD}--clean-remote: deleting merged remote branches...${RST}"
202
+ run_cmd git push "$REMOTE" --delete "${remote_merged[@]}"
203
+ $dry_run || echo -e " ${GRN}Done.${RST}"
204
+ else
205
+ echo -e " Delete with: ${BLD}git push $REMOTE --delete ${remote_merged[*]}${RST}"
206
+ echo -e " Or run: ${BLD}$0 --clean-remote${RST}"
207
+ fi
208
+ echo
209
+ fi
210
+
211
+ # ── Dirty (not merged, up-to-date with remote) ────────────────────────────────
212
+ if [[ ${#dirty[@]} -gt 0 ]]; then
213
+ echo -e "${RED}${BLD}✗ Unmerged / dirty (not integrated into main)${RST}"
214
+ print_table "$RED" "Branch" "Remote status" "Ahead of main" "${dirty[@]}"
215
+ echo
216
+ fi
217
+
218
+ # ── Unpushed commits ──────────────────────────────────────────────────────────
219
+ if [[ ${#unpushed[@]} -gt 0 ]]; then
220
+ echo -e "${YEL}${BLD}↑ Unpushed commits (local-only work)${RST}"
221
+ print_table "$YEL" "Branch" "Push status" "Ahead of main" "${unpushed[@]}"
222
+ echo
223
+ fi
224
+
225
+ # ── Diverged ─────────────────────────────────────────────────────────────────
226
+ if [[ ${#diverged[@]} -gt 0 ]]; then
227
+ echo -e "${CYA}${BLD}⇅ Diverged from remote${RST}"
228
+ print_table "$CYA" "Branch" "Divergence" "Ahead of main" "${diverged[@]}"
229
+ echo
230
+ fi
231
+
232
+ if [[ ${#merged_into_main[@]} -eq 0 && ${#remote_merged[@]} -eq 0 && \
233
+ ${#dirty[@]} -eq 0 && ${#unpushed[@]} -eq 0 && ${#diverged[@]} -eq 0 ]]; then
234
+ echo -e "${GRN}All local branches (except current and main) are clean.${RST}"
235
+ fi
@@ -0,0 +1,67 @@
1
+ ---
2
+ name: ceo-review
3
+ description: |
4
+ CEO/founder-mode plan review. Rethink the problem, find the 10-star product,
5
+ challenge premises, expand scope when it creates a better product. Four modes:
6
+ SCOPE EXPANSION (dream big), SELECTIVE EXPANSION (hold scope + cherry-pick
7
+ expansions), HOLD SCOPE (maximum rigor), SCOPE REDUCTION (strip to essentials).
8
+ Use when asked to "think bigger", "expand scope", "strategy review", "rethink this",
9
+ "what would you do differently", or when reviewing project direction and goals.
10
+ Produces a structured review document with analysis and recommendations.
11
+ preamble-tier: 3
12
+ interactive: true
13
+ version: 1.0.0
14
+ ---
15
+
16
+ # CEO Review Skill
17
+
18
+ This skill helps you conduct CEO/founder-style reviews of projects, plans, or ideas.
19
+ It guides you through rethinking assumptions, challenging premises, and considering
20
+ different scoping approaches to find better solutions.
21
+
22
+ ## How to Use
23
+
24
+ When you want to perform a CEO-style review, invoke this skill and follow the prompts.
25
+ The skill will guide you through four different scoping modes:
26
+
27
+ 1. **SCOPE EXPANSION (dream big)** - What if we expanded scope significantly?
28
+ 2. **SELECTIVE EXPANSION (hold scope + cherry-pick)** - What specific expansions would add value?
29
+ 3. **HOLD SCOPE (maximum rigor)** - How can we execute current scope with excellence?
30
+ 4. **SCOPE REDUCTION (strip to essentials)** - What's absolutely essential?
31
+
32
+ ## Process
33
+
34
+ The skill will ask you to:
35
+ 1. Describe the current problem, plan, or idea you want to review
36
+ 2. Consider each scoping mode and what it would look like
37
+ 3. Identify premises that might be worth challenging
38
+ 4. Imagine what a 10-star product/service would look like
39
+ 5. Generate a structured review document with insights and recommendations
40
+
41
+ ## Output Format
42
+
43
+ The skill produces a structured review document containing:
44
+ - Current state assessment
45
+ - Analysis through each scoping mode
46
+ - Challenged premises and assumptions
47
+ - 10-star vision
48
+ - Recommended next steps and insights
49
+
50
+ ## When to Use
51
+
52
+ Use this skill when:
53
+ - You want to "think bigger" about a project or problem
54
+ - You're asked to do a "strategy review" or "rethink this"
55
+ - You want to challenge existing assumptions
56
+ - You're reviewing project direction and considering different approaches
57
+ - Someone mentions doing a "CEO review" or founder-style review
58
+
59
+ ## Example Invocations
60
+
61
+ - "Let's do a CEO review of our current roadmap"
62
+ - "Can we rethink this feature expansion?"
63
+ - "What would you do differently if you were the CEO?"
64
+ - "Help me think bigger about this project"
65
+ - "Let's challenge our premises on this initiative"
66
+
67
+ The skill works best when you have a specific project, plan, or idea to review and are open to rethinking assumptions and considering different scoping approaches.
@@ -0,0 +1,199 @@
1
+ ---
2
+ name: file-bug-issue
3
+ description: >-
4
+ Open (or update) a GitHub issue whenever a bug or misbehaviour is detected while
5
+ working in a repo. Use this PROACTIVELY — the moment you notice something broken
6
+ (a failing test that reveals a real defect, a crash, a stack trace, wrong output,
7
+ a UI glitch, a regression, an API returning the wrong thing, flaky behaviour, a
8
+ "that shouldn't happen") — not only when the user says "file a bug". It first
9
+ searches the repo's OPEN issues (filtered by the labels that fit the bug) and
10
+ judges whether the same defect is already tracked. If a real duplicate exists, it
11
+ adds your new reproduction/context as a comment; otherwise it creates a fresh,
12
+ well-structured issue with reproducible steps and the context a fixer will need.
13
+ Trigger phrases include "file an issue", "report this bug", "log this", "open a
14
+ ticket", "track this", "this is broken", "that's a bug" — and also fire with no
15
+ prompt at all when you stumble onto a defect mid-task.
16
+ ---
17
+
18
+ # File a Bug Issue on GitHub
19
+
20
+ When you detect a bug or misbehaviour, your job is to make sure it ends up tracked
21
+ on GitHub **without creating duplicates**. The flow is always: understand the bug →
22
+ find the right repo → search existing open issues → judge for duplicates → comment
23
+ on the existing one **or** create a new one.
24
+
25
+ The point of this skill is leverage: a future fixer (human or agent) should be able
26
+ to open the issue and reproduce the problem without re-deriving everything you
27
+ already know right now. Capture that context while it's fresh.
28
+
29
+ ## Preconditions
30
+
31
+ - `gh` must be authenticated for the repo. Verify quickly if unsure: `gh auth status`.
32
+ - Run from inside the git repo so `gh` auto-detects it, or pass `--repo owner/name`.
33
+ Confirm the target: `gh repo view --json nameWithOwner -q .nameWithOwner`.
34
+
35
+ If `gh` isn't available or authenticated, say so and stop — don't silently skip the
36
+ tracking step.
37
+
38
+ ## Step 1 — Pin down the bug
39
+
40
+ Before touching `gh`, get crisp on what actually went wrong. You usually already
41
+ have this in your working context; pull it together:
42
+
43
+ - **What you observed** — the actual wrong behaviour, in one sentence.
44
+ - **Where** — `file_path:line`, the route, the component, the endpoint, the command.
45
+ - **Reproduction** — the minimal sequence that triggers it. If you triggered it via
46
+ a test, a request, or a UI action, write the exact steps/commands.
47
+ - **Expected vs. actual** — what should have happened instead.
48
+ - **Evidence** — the stack trace, error message, failing assertion, log line, or
49
+ screenshot description. Trim noise but keep the diagnostic core.
50
+ - **Suspected cause / scope** — only if you genuinely have a lead. Don't guess
51
+ loudly; mark speculation as speculation.
52
+
53
+ If you can't actually describe a reproduction or concrete observation, you probably
54
+ don't have a bug worth filing yet — investigate first rather than logging a vague
55
+ "something seems off".
56
+
57
+ ## Step 2 — Choose the labels that fit
58
+
59
+ Labels are how you narrow the duplicate search, so pick them before searching. List
60
+ what the repo offers: `gh label list`.
61
+
62
+ Always include the repo's bug label if it has one (commonly `bug`). Then add any
63
+ labels that scope the area — language (`python`, `javascript`/`frontend`),
64
+ subsystem, or component — when the repo has matching ones. Only use labels that
65
+ already exist; don't invent new ones here.
66
+
67
+ ## Step 3 — Search open issues, filtered by those labels
68
+
69
+ The goal is a small, high-signal candidate set, not a keyword dragnet. Filter open
70
+ issues by the scoping labels, then look:
71
+
72
+ ```bash
73
+ # Candidates within the same area (repeat --label to AND them, or widen if empty)
74
+ gh issue list --state open --label bug --limit 50 \
75
+ --json number,title,labels,updatedAt
76
+
77
+ # Also do a focused text search on the distinctive terms of THIS bug
78
+ # (error class, function name, symptom) to catch issues labelled differently:
79
+ gh issue list --state open --search "TypeError serialize holdings" \
80
+ --json number,title --limit 20
81
+ ```
82
+
83
+ If the label-filtered list is empty or tiny, widen: drop the most specific label, or
84
+ fall back to a text search over all open issues. You want to be confident you didn't
85
+ miss an existing report.
86
+
87
+ ## Step 4 — Judge for a real duplicate
88
+
89
+ Don't dedup on title similarity alone — read the candidates. Open the few that look
90
+ plausible:
91
+
92
+ ```bash
93
+ gh issue view <number> --json title,body,labels,comments
94
+ ```
95
+
96
+ A candidate is the **same** bug only if it's the same defect: same symptom AND same
97
+ root area/trigger. Different symptoms that might share a cause are *not* automatic
98
+ duplicates — and two issues with similar words but different reproductions are
99
+ distinct. When genuinely unsure, prefer treating it as **new** but link to the
100
+ possibly-related issue in your write-up (cheaper to cross-link than to bury a real
101
+ bug as a false duplicate).
102
+
103
+ ## Step 5a — If it's a duplicate: comment with the new context
104
+
105
+ Add what the existing issue is missing — your fresh reproduction, the new
106
+ environment, an additional stack trace, "still happening as of <commit/date>", or a
107
+ narrower repro. Don't restate what's already there.
108
+
109
+ ```bash
110
+ gh issue comment <number> --body "$(cat <<'EOF'
111
+ Reproduced again on `<branch>` @ `<short-sha>` (<date>).
112
+
113
+ **Steps**
114
+ 1. …
115
+
116
+ **New context**
117
+ - …
118
+
119
+ **Evidence**
120
+ ```
121
+ <trimmed trace>
122
+ ```
123
+ EOF
124
+ )"
125
+ ```
126
+
127
+ Report back: the issue number/URL and that you commented (not created).
128
+
129
+ ## Step 5b — If it's new: create the issue
130
+
131
+ Create it directly (no confirmation needed) with the bug + scope labels and a
132
+ structured body. Use this template — keep headings, drop a section only if it
133
+ truly doesn't apply:
134
+
135
+ ```markdown
136
+ ## Summary
137
+ <one-sentence description of the wrong behaviour>
138
+
139
+ ## Where
140
+ <file:line / route / component / command>
141
+
142
+ ## Steps to reproduce
143
+ 1. …
144
+ 2. …
145
+ 3. …
146
+
147
+ ## Expected
148
+ <what should happen>
149
+
150
+ ## Actual
151
+ <what happens instead>
152
+
153
+ ## Evidence
154
+ ` ` `
155
+ <stack trace / error / failing assertion / log — trimmed to the diagnostic core>
156
+ ` ` `
157
+
158
+ ## Environment
159
+ <branch @ short-sha, OS, runtime/version, container, browser — whatever's relevant>
160
+
161
+ ## Notes
162
+ <suspected cause if you have a real lead; links to related issues #N; mark guesses as guesses>
163
+ ```
164
+
165
+ Create it:
166
+
167
+ ```bash
168
+ gh issue create \
169
+ --title "<concise, specific: symptom + where, not just 'bug'>" \
170
+ --label bug \
171
+ --body "$(cat <<'EOF'
172
+ ## Summary
173
+
174
+ EOF
175
+ )"
176
+ ```
177
+
178
+ Good titles name the symptom and locus: `Holdings serialize crashes with TypeError
179
+ when weight is null` beats `Bug in portfolio`. After creation, report the issue
180
+ URL back to the user.
181
+
182
+ ## After filing
183
+
184
+ Tell the user concisely what you did: created vs. commented, the issue number/URL,
185
+ and the labels applied. If you were mid-task when you spotted the bug, this is a
186
+ side-quest — log it, mention it, and return to the original task unless the user
187
+ redirects.
188
+
189
+ ## Guardrails
190
+
191
+ - **One issue per distinct defect.** Don't bundle unrelated bugs; don't split one
192
+ bug across several issues.
193
+ - **Don't fabricate reproductions.** If you couldn't actually reproduce it, say so
194
+ in the issue and label the steps as "observed once / not yet reproduced".
195
+ - **Respect the existing tracker.** Match the repo's label and title conventions
196
+ rather than imposing your own.
197
+ - **Creating/commenting is outward-facing.** It's authorized to do so without
198
+ asking here, but never delete or close others' issues, and never edit an existing
199
+ issue's body — only add comments.
@@ -0,0 +1,23 @@
1
+ {
2
+ "skill_name": "file-bug-issue",
3
+ "evals": [
4
+ {
5
+ "id": 1,
6
+ "prompt": "While testing the data table I noticed that when a row has a null quantity, the serialize step throws a TypeError and the whole report endpoint 500s. Steps: load a report, add a row with no quantity set, hit save, watch the backend crash. Can you make sure this is tracked?",
7
+ "expected_output": "Searches open issues filtered by bug/python labels, judges for duplicates, and either creates a structured issue (Summary/Where/Steps/Expected/Actual/Evidence/Environment) with the bug label or comments on a real existing duplicate. Reports the issue URL.",
8
+ "files": []
9
+ },
10
+ {
11
+ "id": 2,
12
+ "prompt": "The company logo in the footer attribution renders as a broken image when the third-party API token is missing — it should fall back to a placeholder instead. Log this so we don't forget.",
13
+ "expected_output": "Picks frontend/javascript + bug labels, searches open issues, and files (or comments on) an issue with a clear UI-bug repro and expected fallback behaviour.",
14
+ "files": []
15
+ },
16
+ {
17
+ "id": 3,
18
+ "prompt": "I think there's already an open issue about a background job double-firing when a record is superseded. I just hit it again on a fresh branch. Make sure the latest reproduction is captured.",
19
+ "expected_output": "Finds the existing open issue via label-filtered + text search, judges it as the same defect, and ADDS A COMMENT with the new reproduction/context rather than creating a duplicate.",
20
+ "files": []
21
+ }
22
+ ]
23
+ }
@@ -0,0 +1,9 @@
1
+ ---
2
+ name: hello-world
3
+ description: Minimal example skill proving the distribution pipeline works. Responds to "test my skills setup" by confirming the skill is loaded.
4
+ ---
5
+
6
+ # Hello World
7
+
8
+ When the user asks to test their skills setup, reply exactly:
9
+ "✅ hello-world skill is installed and loaded."
@@ -0,0 +1,30 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "generatedAt": "2026-07-14T10:05:20.198Z",
4
+ "skills": [
5
+ {
6
+ "name": "branch-audit",
7
+ "version": "0.1.0",
8
+ "hash": "sha256-d1983aa0577bd64e23d17cc4e91a7e214a72677b3d0d7bcdcf175a27449cc636",
9
+ "description": "Audit local and remote git branches to see which are merged into main, which have unpushed commits, which have diverged, and which have stale worktrees. Use this skill whenever the user asks: \"is this branch already pushed?\", \"can I delete this branch?\", \"which branches are stale?\", \"clean up merged branches\", \"remove old worktrees\", \"what branches haven't been pushed yet?\", or anything related to branch hygiene, branch status, or pruning local/remote branches. Also use it when the user wants to delete branches in bulk, either locally or on the remote.\n"
10
+ },
11
+ {
12
+ "name": "ceo-review",
13
+ "version": "0.1.0",
14
+ "hash": "sha256-5f239c09fd46ba4c1887da88374a75e12e3df31ff18e93ed9367bdd06f3b386c",
15
+ "description": "CEO/founder-mode plan review. Rethink the problem, find the 10-star product,\nchallenge premises, expand scope when it creates a better product. Four modes:\nSCOPE EXPANSION (dream big), SELECTIVE EXPANSION (hold scope + cherry-pick\nexpansions), HOLD SCOPE (maximum rigor), SCOPE REDUCTION (strip to essentials).\nUse when asked to \"think bigger\", \"expand scope\", \"strategy review\", \"rethink this\",\n\"what would you do differently\", or when reviewing project direction and goals.\nProduces a structured review document with analysis and recommendations.\n"
16
+ },
17
+ {
18
+ "name": "file-bug-issue",
19
+ "version": "0.1.0",
20
+ "hash": "sha256-6e1aae08cf08d2ef18b963c3600701aeddbac744db1d82ce9fb9ff75ca650651",
21
+ "description": "Open (or update) a GitHub issue whenever a bug or misbehaviour is detected while working in a repo. Use this PROACTIVELY — the moment you notice something broken (a failing test that reveals a real defect, a crash, a stack trace, wrong output, a UI glitch, a regression, an API returning the wrong thing, flaky behaviour, a \"that shouldn't happen\") — not only when the user says \"file a bug\". It first searches the repo's OPEN issues (filtered by the labels that fit the bug) and judges whether the same defect is already tracked. If a real duplicate exists, it adds your new reproduction/context as a comment; otherwise it creates a fresh, well-structured issue with reproducible steps and the context a fixer will need. Trigger phrases include \"file an issue\", \"report this bug\", \"log this\", \"open a ticket\", \"track this\", \"this is broken\", \"that's a bug\" — and also fire with no prompt at all when you stumble onto a defect mid-task."
22
+ },
23
+ {
24
+ "name": "hello-world",
25
+ "version": "0.1.0",
26
+ "hash": "sha256-916ea397cd74d91c4b6060672088b9c54353c915b98bcaef3514815694842e5a",
27
+ "description": "Minimal example skill proving the distribution pipeline works. Responds to \"test my skills setup\" by confirming the skill is loaded."
28
+ }
29
+ ]
30
+ }