@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 +57 -0
- package/package.json +32 -0
- package/skills/branch-audit/SKILL.md +63 -0
- package/skills/branch-audit/scripts/branch-audit.sh +235 -0
- package/skills/ceo-review/SKILL.md +67 -0
- package/skills/file-bug-issue/SKILL.md +199 -0
- package/skills/file-bug-issue/evals/evals.json +23 -0
- package/skills/hello-world/SKILL.md +9 -0
- package/skills-manifest.json +30 -0
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
|
+
}
|