@tamng0905/builder-essential-skills 0.1.0

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.
Files changed (66) hide show
  1. package/.claude/agents/lead-builder.md +55 -0
  2. package/.claude/agents/lead-reviewer.md +39 -0
  3. package/README.md +276 -0
  4. package/assets/readme-hero.png +0 -0
  5. package/assets/skill-cards/async-learning-teacher.svg +7 -0
  6. package/assets/skill-cards/code-standards.svg +7 -0
  7. package/assets/skill-cards/lead-research.svg +7 -0
  8. package/assets/skill-cards/lead.svg +7 -0
  9. package/assets/skill-cards/orwell-writing.svg +7 -0
  10. package/assets/skill-cards/session-profiler.svg +7 -0
  11. package/assets/skill-cards/validate-market.svg +7 -0
  12. package/assets/skill-cards/write-blog.svg +7 -0
  13. package/bin/builder-essential-skills.js +134 -0
  14. package/install.ps1 +58 -0
  15. package/install.sh +63 -0
  16. package/package.json +24 -0
  17. package/skills/async-learning-teacher/README.md +50 -0
  18. package/skills/async-learning-teacher/SKILL.md +192 -0
  19. package/skills/async-learning-teacher/agents/openai.yaml +4 -0
  20. package/skills/code-standards/README.md +27 -0
  21. package/skills/code-standards/SKILL.md +51 -0
  22. package/skills/lead/README.md +29 -0
  23. package/skills/lead/SKILL.md +222 -0
  24. package/skills/lead/config.py +359 -0
  25. package/skills/lead/dispatch.md +342 -0
  26. package/skills/lead/loop.md +103 -0
  27. package/skills/lead/models.json +34 -0
  28. package/skills/lead/research.md +76 -0
  29. package/skills/lead/status.ps1 +114 -0
  30. package/skills/lead/status.sh +110 -0
  31. package/skills/lead/watchdog.ps1 +90 -0
  32. package/skills/lead/watchdog.sh +88 -0
  33. package/skills/lead-research/README.md +27 -0
  34. package/skills/lead-research/SKILL.md +157 -0
  35. package/skills/lead-research/tactics.md +150 -0
  36. package/skills/orwell-writing/README.md +27 -0
  37. package/skills/orwell-writing/SKILL.md +44 -0
  38. package/skills/orwell-writing/agents/openai.yaml +4 -0
  39. package/skills/session-profiler/README.md +25 -0
  40. package/skills/session-profiler/SKILL.md +103 -0
  41. package/skills/session-profiler/agents/openai.yaml +4 -0
  42. package/skills/session-profiler/scripts/requirements.txt +2 -0
  43. package/skills/session-profiler/scripts/session_profiler/__init__.py +5 -0
  44. package/skills/session-profiler/scripts/session_profiler/analyses.py +246 -0
  45. package/skills/session-profiler/scripts/session_profiler/cli.py +77 -0
  46. package/skills/session-profiler/scripts/session_profiler/dataset.py +369 -0
  47. package/skills/session-profiler/scripts/session_profiler/discover.py +191 -0
  48. package/skills/session-profiler/scripts/session_profiler/toc.py +74 -0
  49. package/skills/session-profiler/scripts/session_profiler/trace.py +146 -0
  50. package/skills/session-profiler/scripts/sp +20 -0
  51. package/skills/session-profiler/scripts/tests/codex_home/sessions/2026/01/01/rollout-child.jsonl +7 -0
  52. package/skills/session-profiler/scripts/tests/codex_home/sessions/2026/01/01/rollout-root.jsonl +10 -0
  53. package/skills/session-profiler/scripts/tests/fixture/main/subagents/agent-abc.jsonl +2 -0
  54. package/skills/session-profiler/scripts/tests/fixture/main/subagents/agent-abc.meta.json +1 -0
  55. package/skills/session-profiler/scripts/tests/fixture/main.jsonl +7 -0
  56. package/skills/session-profiler/scripts/tests/test_fixture.py +58 -0
  57. package/skills/validate-market/README.md +27 -0
  58. package/skills/validate-market/SKILL.md +202 -0
  59. package/skills/write-blog/README.md +27 -0
  60. package/skills/write-blog/SKILL.md +142 -0
  61. package/skills/write-blog/check.sh +52 -0
  62. package/skills/write-blog/reference/angles.md +51 -0
  63. package/skills/write-blog/reference/craft.md +94 -0
  64. package/skills/write-blog/reference/seo.md +116 -0
  65. package/skills/write-blog/reference/voice.md +64 -0
  66. package/skills/write-blog/reference/wiring.md +113 -0
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: lead-builder
3
+ description: Runs one techlead-loop builder job from a frozen slice spec, respecting job boundaries, worktree isolation, raw-only reporting, and never committing or pushing.
4
+ tools: Glob, Read, Edit, Write, PowerShell, Bash, Grep
5
+ disallowedTools: Bash(git commit *), Bash(git push *), PowerShell(git commit *), PowerShell(git push *)
6
+ model: inherit
7
+ isolation: worktree
8
+ background: true
9
+ ---
10
+
11
+ You are a techlead-loop builder. Your task is: execute exactly one job from the
12
+ Lead's frozen slice spec.
13
+
14
+ Operating rules:
15
+
16
+ - PHASE 0 happens before code. Reply with your plan and every disagreement you
17
+ have with the spec, with reasons citing real files. Silent compliance is a
18
+ defect. If you have no disagreements, state what you checked.
19
+ - Obey the job shape. `ship` may change only the files in BOUNDARIES; `scout`
20
+ writes only the requested report and may not modify code.
21
+ - Build your job only. The Lead owns job splitting; files outside your BOUNDARIES
22
+ are out of scope even if they look related.
23
+ - The files under `docs/checks/` are read-only at all times.
24
+ - The files matching `docs/jobs/*-rulings.md` are also read-only — they are
25
+ Lead-owned, the same class as `docs/checks/`; creating or editing one fails the
26
+ job.
27
+ - No placeholder implementations. Search before implementing and keep the
28
+ existing voice of touched files.
29
+ - No silent fallbacks or success-shaped defaults; no unrequested
30
+ backwards-compatibility shims. Fail loudly, with context. Exception: only when
31
+ the spec explicitly requests them.
32
+ - Run the job's check commands sequentially with temp/cache paths inside
33
+ `.lead/tmp/<purpose>`.
34
+ - Write the job report exactly where requested — the convention is
35
+ `docs/jobs/<issue-slug>-01.md` — as the raw-evidence artifact: tables, command
36
+ output, exit codes, errors, and status claims backed by tool output from this
37
+ run.
38
+ - End the report with exactly one status line:
39
+ `STATUS: COMPLETE | COMPLETE_WITH_CONCERNS (list them) | BLOCKED (exact blocker + what you tried)`.
40
+ - Mirror duty: when the job's final STATUS is reached, post it plus a short
41
+ summary as a comment on the issue via `gh` when available. If the sandbox does
42
+ not allow `gh`/network, do not fake the post — write `MIRROR: LEAD` in the
43
+ report and let the Lead relay it.
44
+ - Blocker behavior: if you hit a blocker, post `BLOCKED: <exact blocker> + what I
45
+ tried` on the issue (or record it in the report if `gh` is unavailable), then
46
+ EXIT. Never idle waiting for an answer — a blocker is a completion event.
47
+ - Never commit, push, or mutate shared history. If git fails, record the exact
48
+ error and continue.
49
+ - Your `tools:` order pads Bash and Read away from the first and last slot because
50
+ some harnesses drop those two positions at subagent spawn.
51
+ - If Bash is absent at runtime (a desktop strip), run check commands via the
52
+ PowerShell tool instead and record which executor ran each command.
53
+
54
+ Verdicts belong to the reviewer, the Lead, and the human. Persist until the job is
55
+ complete or blocked by an exact, recorded blocker.
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: lead-reviewer
3
+ description: Runs frozen techlead-loop checks as a fresh read-only reviewer, verifies checks integrity and diff-vs-intent, and returns PASS/FAIL/INVALID verdicts with raw evidence only.
4
+ tools: Glob, Read, PowerShell, Bash, Grep
5
+ disallowedTools: Edit, Write, Bash(git add *), Bash(git commit *), Bash(git push *), Bash(git checkout *), Bash(git merge *), Bash(git rebase *), Bash(git reset *), Bash(git clean *), Bash(rm *), Bash(del *), Bash(Remove-Item *), PowerShell(git add *), PowerShell(git commit *), PowerShell(git push *), PowerShell(git checkout *), PowerShell(git merge *), PowerShell(git rebase *), PowerShell(git reset *), PowerShell(git clean *), PowerShell(rm *), PowerShell(del *), PowerShell(Remove-Item *)
6
+ model: inherit
7
+ ---
8
+
9
+ You are a techlead-loop reviewer. You inherit no builder context and no Lead
10
+ discussion. Use only the fixed reviewer template supplied by the Lead.
11
+
12
+ Duties:
13
+
14
+ - Read the frozen check file named in the prompt.
15
+ - Read `docs/jobs/<issue-slug>-rulings.md` when present. It is Lead-owned,
16
+ append-only, frozen post-freeze intent; read it alongside the frozen check
17
+ file, spec, and job report. If it is absent or empty, record that there are no
18
+ post-freeze rulings.
19
+ - Check checks integrity with the freeze commit SHA and branch to review.
20
+ - Run each check command exactly as written, unless it is impossible to execute
21
+ in this environment; then return INVALID with raw evidence.
22
+ - Read the diff against the frozen spec intent. Tests passing is necessary, not
23
+ sufficient.
24
+ - Return verdicts only: per-check PASS / FAIL / INVALID, checks-integrity
25
+ PASS / FAIL / INVALID, diff-vs-intent PASS / FAIL / INVALID, raw evidence, and a
26
+ slice verdict.
27
+ - Post the verdict as an issue comment when `gh` is available; if `gh`/network is
28
+ unavailable, record that in the verdict evidence instead of faking the post.
29
+ - Your `tools:` order pads Bash and Read away from the first and last slot with
30
+ read-only tools because some harnesses drop those two positions at subagent
31
+ spawn.
32
+ - If Bash is absent at runtime, run check commands via the PowerShell tool
33
+ instead and record which executor ran each command.
34
+ - Flag only gaps that affect correctness, the stated requirements, or documented
35
+ project invariants — cite file:line evidence for every finding. Do not report
36
+ stylistic preferences.
37
+
38
+ Do not edit files, do not fix failures, do not stage changes, do not commit, and
39
+ do not add advice beyond the requested verdict fields.
package/README.md ADDED
@@ -0,0 +1,276 @@
1
+ <p align="center">
2
+ <img src="assets/readme-hero.png" alt="Builder's Essential Skills, shown as an original dark atelier of connected creative tools" width="100%">
3
+ </p>
4
+ <p align="center">
5
+ <strong>Builder's Essential Skills</strong><br>
6
+ A considered collection of reusable workflows for planning, building, researching, learning, validating, writing, and reviewing with Claude Code and Codex.
7
+ </p>
8
+
9
+ <p align="center">
10
+ <a href="#pick-a-skill">Pick a skill</a> ·
11
+ <a href="#get-started">Get started</a> ·
12
+ <a href="#bring-your-own-workflow">Create a skill</a>
13
+ </p>
14
+
15
+ ## Pick a skill
16
+
17
+ <table>
18
+ <tr>
19
+ <td width="50%" valign="top">
20
+ <a href="skills/lead/SKILL.md"><img src="assets/skill-cards/lead.svg" alt="lead — build and delivery skill" width="100%"></a>
21
+ </td>
22
+ <td width="50%" valign="top">
23
+ <a href="skills/lead-research/SKILL.md"><img src="assets/skill-cards/lead-research.svg" alt="lead-research — research and strategy skill" width="100%"></a>
24
+ </td>
25
+ </tr>
26
+ <tr>
27
+ <td width="50%" valign="top">
28
+ <a href="skills/async-learning-teacher/SKILL.md"><img src="assets/skill-cards/async-learning-teacher.svg" alt="async-learning-teacher — learning skill" width="100%"></a>
29
+ </td>
30
+ <td width="50%" valign="top">
31
+ <a href="skills/validate-market/SKILL.md"><img src="assets/skill-cards/validate-market.svg" alt="validate-market — product and market skill" width="100%"></a>
32
+ </td>
33
+ </tr>
34
+ <tr>
35
+ <td width="50%" valign="top">
36
+ <a href="skills/write-blog/SKILL.md"><img src="assets/skill-cards/write-blog.svg" alt="write-blog — writing and growth skill" width="100%"></a>
37
+ </td>
38
+ <td width="50%" valign="top">
39
+ <a href="skills/orwell-writing/SKILL.md"><img src="assets/skill-cards/orwell-writing.svg" alt="orwell-writing — direct writing skill" width="100%"></a>
40
+ </td>
41
+ </tr>
42
+ <tr>
43
+ <td width="50%" valign="top">
44
+ <a href="skills/code-standards/SKILL.md"><img src="assets/skill-cards/code-standards.svg" alt="code-standards — engineering quality skill" width="100%"></a>
45
+ </td>
46
+ <td width="50%" valign="top">
47
+ <a href="skills/session-profiler/SKILL.md"><img src="assets/skill-cards/session-profiler.svg" alt="session-profiler — developer tools skill" width="100%"></a>
48
+ </td>
49
+ </tr>
50
+ </table>
51
+
52
+ Every skill lives in `skills/<name>/SKILL.md`. Some also ship scripts,
53
+ reference material, or agent definitions that support the workflow.
54
+
55
+ ## Why this exists
56
+
57
+ An AI agent is much more useful when it has a repeatable way to handle the
58
+ work. This collection packages practical workflows as portable skills: compact
59
+ instructions, scripts, references, and agent definitions that you can install,
60
+ adapt, and share.
61
+
62
+ Use the whole collection, or take only the skills your team needs.
63
+
64
+ ## Get started
65
+
66
+ From the repository root, install every skill for the current user:
67
+
68
+ ```bash
69
+ ./install.sh
70
+ ```
71
+
72
+ Once this repository is published to npm, install the collection from
73
+ anywhere with:
74
+
75
+ ```bash
76
+ npx @tamng0905/builder-essential-skills
77
+ ```
78
+
79
+ To install into the repository you are currently in:
80
+
81
+ ```bash
82
+ npx @tamng0905/builder-essential-skills --project
83
+ ```
84
+
85
+ To install only one skill:
86
+
87
+ ```bash
88
+ npx @tamng0905/builder-essential-skills --skill lead
89
+ ```
90
+
91
+ Add `--project` to that command to install the selected skill into the current
92
+ repository.
93
+
94
+ The `npx` command installs the same files as the scripts below. It supports
95
+ macOS, Linux, and Windows wherever Node.js 18 or newer is available.
96
+
97
+ On Windows:
98
+
99
+ ```powershell
100
+ ./install.ps1
101
+ ```
102
+
103
+ Restart Claude Code or Codex, then invoke a skill in plain English:
104
+
105
+ ```text
106
+ /lead Build the smallest version of this feature and open a PR.
107
+ $async-learning-teacher Teach me this paper step by step: https://arxiv.org/abs/...
108
+ ```
109
+
110
+ Want to try the collection inside one repository first? Install it locally
111
+ instead:
112
+
113
+ ```bash
114
+ ./install.sh --project
115
+ ```
116
+
117
+ ```powershell
118
+ ./install.ps1 -Project
119
+ ```
120
+
121
+ The project install uses `.claude/skills` and `.codex/skills`, so it stays
122
+ with that repository rather than changing your user-level setup.
123
+
124
+ ## What gets installed
125
+
126
+ The installers copy each folder in `skills/` to the right location for your
127
+ agent and install the `lead` builder and reviewer agents for Claude Code.
128
+
129
+ | Install mode | Claude Code | Codex |
130
+ | --- | --- | --- |
131
+ | User | `~/.claude/skills` | `${CODEX_HOME:-~/.codex}/skills` |
132
+ | Current project | `.claude/skills` | `.codex/skills` |
133
+
134
+ You will need Claude Code and/or Codex, depending on which agent you use.
135
+ Python 3 is required for the `lead` routing helper and the
136
+ `session-profiler` tools. The Codex CLI is optional, but `lead` can use it for
137
+ builder jobs:
138
+
139
+ ```bash
140
+ npm i -g @openai/codex@latest
141
+ ```
142
+
143
+ ## Go deeper
144
+
145
+ ### Route models for `lead`
146
+
147
+ `lead` and `lead-research` can assign different models to roles such as
148
+ lead, builder, reviewer, researcher, scout, and critic. Inspect the active
149
+ routing before a run:
150
+
151
+ ```bash
152
+ python skills/lead/config.py
153
+ python skills/lead/config.py --role builder
154
+ python skills/lead/config.py --check
155
+ ```
156
+
157
+ Defaults live in `skills/lead/config.py` and `skills/lead/models.json`. Use
158
+ `.lead/config` for a repository override or `~/.lead/config` for a personal
159
+ default.
160
+
161
+ ### Profile an agent session
162
+
163
+ After installation, point `SP` at the wrapper for your agent:
164
+
165
+ ```bash
166
+ # Claude Code install
167
+ SP="$HOME/.claude/skills/session-profiler/scripts/sp"
168
+
169
+ # Codex install
170
+ SP="${CODEX_HOME:-$HOME/.codex}/skills/session-profiler/scripts/sp"
171
+ ```
172
+
173
+ Then explore your sessions:
174
+
175
+ ```bash
176
+ $SP list --provider codex --n 20
177
+ $SP info <session-id-or-jsonl-path>
178
+ $SP parse <session-id-or-jsonl-path>
179
+ $SP brief
180
+ $SP agent-summary
181
+ $SP costs
182
+ $SP slowest-tools --n 20
183
+ $SP errors
184
+ $SP turns
185
+ ```
186
+
187
+ Generate richer artifacts:
188
+
189
+ ```bash
190
+ $SP toc
191
+ $SP review
192
+ $SP trace
193
+ ```
194
+
195
+ `brief` writes a scan-friendly `brief.md` with headline metrics, standout slow
196
+ paths or failures, a prompt trail or TOC storyline, and an agent scoreboard. The
197
+ Perfetto trace adds an overview lane, labeled TOC phases, per-agent work lanes,
198
+ prompt lanes, and cumulative token/cost counters.
199
+
200
+ Cost reports are estimates based on public model pricing, not billing records.
201
+ Session files and traces can include prompts, code, file paths, and other
202
+ sensitive project context. Review them before sharing.
203
+
204
+ ## Repository map
205
+
206
+ ```text
207
+ skills/ The skill collection
208
+ <skill>/SKILL.md Each skill's entry point and workflow
209
+ assets/readme-hero.png README banner
210
+ .claude/agents/ Builder and reviewer agents for lead
211
+ install.sh macOS/Linux installer
212
+ install.ps1 Windows installer
213
+ package.json npm package metadata and npx entrypoint
214
+ bin/builder-essential-skills.js cross-platform npx installer
215
+ ```
216
+
217
+ ### Publish the installer
218
+
219
+ Choose an available npm package name in `package.json`, authenticate with npm,
220
+ then publish from the repository root:
221
+
222
+ ```bash
223
+ npm login
224
+ npm publish --access public
225
+ ```
226
+
227
+ npm requires either 2FA enabled on the account, followed by the one-time code
228
+ requested by `npm publish`, or a granular access token with read/write access
229
+ and **Bypass two-factor authentication** enabled. For a local interactive
230
+ publish, enabling 2FA and running `npm login` again is the simplest option.
231
+ Never commit an access token; use npm's login flow or a secure CI secret.
232
+
233
+ After publishing, users can run `npx @tamng0905/builder-essential-skills` without cloning the
234
+ repository. Bump the version in `package.json` for each subsequent publish.
235
+
236
+ ## Bring your own workflow
237
+
238
+ Start with one folder:
239
+
240
+ ```text
241
+ skills/my-skill/
242
+ SKILL.md
243
+ ```
244
+
245
+ Give `SKILL.md` clear frontmatter and a focused workflow:
246
+
247
+ ```markdown
248
+ ---
249
+ name: my-skill
250
+ description: Explain when an agent should use this skill.
251
+ ---
252
+
253
+ # My Skill
254
+
255
+ Write the workflow, rules, examples, and expected output here.
256
+ ```
257
+
258
+ Keep skills easy to move between projects:
259
+
260
+ - Avoid hard-coding a company, repository, branch, or tool unless the skill is intentionally private.
261
+ - Put reusable scripts beside the skill instead of relying on global shell state.
262
+ - Include request examples that show exactly when the skill should run.
263
+ - Create `assets/skill-cards/<name>.svg` for each new skill and add it to the
264
+ README's "Pick a skill" table.
265
+ - Never put credentials, tokens, or private data in a skill folder.
266
+
267
+ Re-run the installer after adding or changing a skill:
268
+
269
+ ```bash
270
+ ./install.sh
271
+ ```
272
+
273
+ ## License
274
+
275
+ Add the license that matches how you want others to use this collection before
276
+ publishing it broadly.
Binary file
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 760" role="img" aria-labelledby="title desc">
2
+ <title id="title">async-learning-teacher skill card</title><desc id="desc">A Builder's Essential Skill for turning materials into clear learning.</desc>
3
+ <defs><linearGradient id="bg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#181519"/><stop offset="1" stop-color="#0b0b10"/></linearGradient><filter id="glow"><feGaussianBlur stdDeviation="16"/></filter></defs>
4
+ <rect width="1200" height="760" fill="#0b0a0d"/><rect x="24" y="24" width="1152" height="712" rx="28" fill="url(#bg)" stroke="#765d84" stroke-opacity=".6"/><circle cx="966" cy="164" r="120" fill="#9875b5" fill-opacity=".2" filter="url(#glow)"/><path d="M78 532C275 532 359 204 608 204s278 264 516 264" fill="none" stroke="#b292d4" stroke-opacity=".72" stroke-width="3"/>
5
+ <text x="78" y="106" fill="#c7b2d3" font-family="Arial, Helvetica, sans-serif" font-size="17" font-weight="700" letter-spacing="3">BUILDER'S ESSENTIAL SKILLS / 03</text><text x="78" y="204" fill="#f5eff7" font-family="Arial, Helvetica, sans-serif" font-size="55" font-weight="700">async-learning-teacher</text><text x="80" y="258" fill="#cbc4cf" font-family="Arial, Helvetica, sans-serif" font-size="28">Turn dense material into a paced lesson, study guide,</text><text x="80" y="296" fill="#cbc4cf" font-family="Arial, Helvetica, sans-serif" font-size="28">or interactive tutoring session.</text>
6
+ <g transform="translate(848 112)" fill="none" stroke="#c0a0dc" stroke-width="5"><path d="M12 38q80-30 160 0v126q-80-30-160 0zM92 24v144"/><path d="M38 76h40M38 104h40M106 76h40M106 104h40"/></g><rect x="78" y="376" width="1044" height="1" fill="#b79bc3" fill-opacity=".35"/><text x="78" y="432" fill="#b99cc5" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" letter-spacing="2">DISCIPLINE</text><text x="78" y="476" fill="#f3edf6" font-family="Arial, Helvetica, sans-serif" font-size="29">Learning</text><text x="520" y="432" fill="#b99cc5" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" letter-spacing="2">PROMISE</text><text x="520" y="476" fill="#f3edf6" font-family="Arial, Helvetica, sans-serif" font-size="29">Understanding that stays with you</text><rect x="78" y="554" width="780" height="66" rx="12" fill="#1a1620" stroke="#765a82"/><text x="104" y="596" fill="#dfc9ef" font-family="monospace" font-size="19">$async-learning-teacher Teach me this paper.</text><circle cx="1058" cy="586" r="30" fill="#a884bd"/><path d="m1048 586 8 8 15-17" fill="none" stroke="#1a1020" stroke-width="5"/>
7
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 760" role="img" aria-labelledby="title desc">
2
+ <title id="title">code-standards skill card</title><desc id="desc">A Builder's Essential Skill for disciplined engineering changes.</desc>
3
+ <defs><linearGradient id="bg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#11161d"/><stop offset="1" stop-color="#080b10"/></linearGradient><filter id="glow"><feGaussianBlur stdDeviation="16"/></filter></defs>
4
+ <rect width="1200" height="760" fill="#080a0d"/><rect x="24" y="24" width="1152" height="712" rx="28" fill="url(#bg)" stroke="#536f8a" stroke-opacity=".65"/><circle cx="971" cy="164" r="118" fill="#587daa" fill-opacity=".18" filter="url(#glow)"/><path d="M72 540C294 540 358 194 618 194s269 286 506 286" fill="none" stroke="#72a1cf" stroke-opacity=".76" stroke-width="3"/>
5
+ <text x="78" y="106" fill="#a7c2d8" font-family="Arial, Helvetica, sans-serif" font-size="17" font-weight="700" letter-spacing="3">BUILDER'S ESSENTIAL SKILLS / 07</text><text x="78" y="204" fill="#ecf4fa" font-family="Arial, Helvetica, sans-serif" font-size="64" font-weight="700">code-standards</text><text x="80" y="258" fill="#c1cbd3" font-family="Arial, Helvetica, sans-serif" font-size="28">Keep an engineering change focused: understand the code,</text><text x="80" y="296" fill="#c1cbd3" font-family="Arial, Helvetica, sans-serif" font-size="28">make the smallest change, then prove it.</text>
6
+ <g transform="translate(849 112)" fill="none" stroke="#83b3df" stroke-width="5"><path d="M55 29 10 92l45 63M125 29l45 63-45 63M73 166h54"/><path d="m83 92 17 17 35-41"/></g><rect x="78" y="376" width="1044" height="1" fill="#96b2c9" fill-opacity=".35"/><text x="78" y="432" fill="#9ebad0" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" letter-spacing="2">DISCIPLINE</text><text x="78" y="476" fill="#edf5fb" font-family="Arial, Helvetica, sans-serif" font-size="29">Engineering quality</text><text x="520" y="432" fill="#9ebad0" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" letter-spacing="2">PROMISE</text><text x="520" y="476" fill="#edf5fb" font-family="Arial, Helvetica, sans-serif" font-size="29">A reviewable change with proof</text><rect x="78" y="554" width="780" height="66" rx="12" fill="#101924" stroke="#4e718e"/><text x="104" y="596" fill="#c6ddf0" font-family="monospace" font-size="17">$code-standards Fix this bug using the project workflow.</text><circle cx="1058" cy="586" r="30" fill="#6393c0"/><path d="m1048 586 8 8 15-17" fill="none" stroke="#091521" stroke-width="5"/>
7
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 760" role="img" aria-labelledby="title desc">
2
+ <title id="title">lead-research skill card</title><desc id="desc">A Builder's Essential Skill for source-grounded strategic research.</desc>
3
+ <defs><linearGradient id="bg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#121719"/><stop offset="1" stop-color="#080b0c"/></linearGradient><filter id="glow"><feGaussianBlur stdDeviation="16"/></filter></defs>
4
+ <rect width="1200" height="760" fill="#080a0b"/><rect x="24" y="24" width="1152" height="712" rx="28" fill="url(#bg)" stroke="#587276" stroke-opacity=".55"/><circle cx="976" cy="166" r="118" fill="#5a9b94" fill-opacity=".18" filter="url(#glow)"/><path d="M74 540C305 540 350 182 620 182s277 294 504 294" fill="none" stroke="#78b4aa" stroke-opacity=".74" stroke-width="3"/>
5
+ <text x="78" y="106" fill="#a9c1bc" font-family="Arial, Helvetica, sans-serif" font-size="17" font-weight="700" letter-spacing="3">BUILDER'S ESSENTIAL SKILLS / 02</text><text x="78" y="204" fill="#eff6f1" font-family="Arial, Helvetica, sans-serif" font-size="64" font-weight="700">lead-research</text><text x="80" y="258" fill="#c1cac6" font-family="Arial, Helvetica, sans-serif" font-size="28">Map a decision, investigate the field, and make</text><text x="80" y="296" fill="#c1cac6" font-family="Arial, Helvetica, sans-serif" font-size="28">a source-grounded recommendation.</text>
6
+ <g transform="translate(848 116)" fill="none" stroke="#83c1b6" stroke-width="5"><circle cx="93" cy="93" r="64"/><path d="m140 140 52 52M93 45v96M45 93h96"/><circle cx="93" cy="93" r="10" fill="#83c1b6"/></g><rect x="78" y="376" width="1044" height="1" fill="#90b2a8" fill-opacity=".35"/><text x="78" y="432" fill="#89ada3" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" letter-spacing="2">DISCIPLINE</text><text x="78" y="476" fill="#edf5ef" font-family="Arial, Helvetica, sans-serif" font-size="29">Research &amp; strategy</text><text x="520" y="432" fill="#89ada3" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" letter-spacing="2">PROMISE</text><text x="520" y="476" fill="#edf5ef" font-family="Arial, Helvetica, sans-serif" font-size="29">Evidence you can act on</text><rect x="78" y="554" width="780" height="66" rx="12" fill="#131a1a" stroke="#50766d"/><text x="104" y="596" fill="#bfe0d6" font-family="monospace" font-size="20">/lead-research Research the best approach.</text><circle cx="1058" cy="586" r="30" fill="#6ca99d"/><path d="m1048 586 8 8 15-17" fill="none" stroke="#0d1715" stroke-width="5"/>
7
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 760" role="img" aria-labelledby="title desc">
2
+ <title id="title">lead skill card</title><desc id="desc">A Builder's Essential Skill for taking a product goal through delivery.</desc>
3
+ <defs><linearGradient id="bg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#171411"/><stop offset="1" stop-color="#090a0d"/></linearGradient><linearGradient id="line" x1="0" y1="0" x2="1" y2="0"><stop stop-color="#b87537" stop-opacity="0"/><stop offset=".5" stop-color="#e0b06e"/><stop offset="1" stop-color="#7162a2" stop-opacity=".2"/></linearGradient><filter id="glow"><feGaussianBlur stdDeviation="14"/></filter></defs>
4
+ <rect width="1200" height="760" fill="#0b0b0c"/><rect x="24" y="24" width="1152" height="712" rx="28" fill="url(#bg)" stroke="#6c5a40" stroke-opacity=".52"/><circle cx="985" cy="160" r="112" fill="#7d5eab" fill-opacity=".22" filter="url(#glow)"/><path d="M70 552C310 552 350 212 640 212s230 306 486 306" fill="none" stroke="url(#line)" stroke-width="3"/>
5
+ <text x="78" y="106" fill="#c4b79f" font-family="Arial, Helvetica, sans-serif" font-size="17" font-weight="700" letter-spacing="3">BUILDER'S ESSENTIAL SKILLS / 01</text><text x="78" y="204" fill="#f6f0e5" font-family="Arial, Helvetica, sans-serif" font-size="64" font-weight="700">lead</text><text x="80" y="258" fill="#c6c1b9" font-family="Arial, Helvetica, sans-serif" font-size="28">Turn a product goal into a planned, built,</text><text x="80" y="296" fill="#c6c1b9" font-family="Arial, Helvetica, sans-serif" font-size="28">reviewed, and verified pull request.</text>
6
+ <g transform="translate(844 150)" fill="none" stroke="#e0b06e" stroke-width="5"><path d="M0 152 84 0l84 152z"/><path d="M42 76h84"/><circle cx="84" cy="76" r="14" fill="#e0b06e"/></g><rect x="78" y="376" width="1044" height="1" fill="#9c896c" fill-opacity=".35"/><text x="78" y="432" fill="#b7a27d" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" letter-spacing="2">DISCIPLINE</text><text x="78" y="476" fill="#f3eee5" font-family="Arial, Helvetica, sans-serif" font-size="29">Build &amp; delivery</text><text x="520" y="432" fill="#b7a27d" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" letter-spacing="2">PROMISE</text><text x="520" y="476" fill="#f3eee5" font-family="Arial, Helvetica, sans-serif" font-size="29">A clear path from goal to proof</text><rect x="78" y="554" width="780" height="66" rx="12" fill="#191817" stroke="#806745"/><text x="104" y="596" fill="#e6d4b7" font-family="monospace" font-size="20">/lead Build this feature and prepare one PR.</text><circle cx="1058" cy="586" r="30" fill="#c18a4e"/><path d="m1048 586 8 8 15-17" fill="none" stroke="#14110e" stroke-width="5"/>
7
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 760" role="img" aria-labelledby="title desc">
2
+ <title id="title">orwell-writing skill card</title><desc id="desc">A Builder's Essential Skill for clear, direct writing.</desc>
3
+ <defs><linearGradient id="bg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#151917"/><stop offset="1" stop-color="#0a0d0c"/></linearGradient><filter id="glow"><feGaussianBlur stdDeviation="16"/></filter></defs>
4
+ <rect width="1200" height="760" fill="#090b0a"/><rect x="24" y="24" width="1152" height="712" rx="28" fill="url(#bg)" stroke="#5d7769" stroke-opacity=".6"/><circle cx="975" cy="165" r="118" fill="#6d9c80" fill-opacity=".17" filter="url(#glow)"/><path d="M72 540C300 540 358 197 620 197s267 287 504 287" fill="none" stroke="#83ae90" stroke-opacity=".72" stroke-width="3"/>
5
+ <text x="78" y="106" fill="#b0c9b6" font-family="Arial, Helvetica, sans-serif" font-size="17" font-weight="700" letter-spacing="3">BUILDER'S ESSENTIAL SKILLS / 06</text><text x="78" y="204" fill="#f0f7ef" font-family="Arial, Helvetica, sans-serif" font-size="64" font-weight="700">orwell-writing</text><text x="80" y="258" fill="#c2cec3" font-family="Arial, Helvetica, sans-serif" font-size="28">Edit prose until it says what it means: direct, specific,</text><text x="80" y="296" fill="#c2cec3" font-family="Arial, Helvetica, sans-serif" font-size="28">and free of filler.</text>
6
+ <g transform="translate(850 108)" fill="none" stroke="#99c5a5" stroke-width="5"><path d="M23 28h132v150H23zM52 68h75M52 98h75M52 128h45"/><path d="m61 172 18 18 43-51"/></g><rect x="78" y="376" width="1044" height="1" fill="#9bb9a0" fill-opacity=".35"/><text x="78" y="432" fill="#9fbda5" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" letter-spacing="2">DISCIPLINE</text><text x="78" y="476" fill="#eff6f0" font-family="Arial, Helvetica, sans-serif" font-size="29">Writing</text><text x="520" y="432" fill="#9fbda5" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" letter-spacing="2">PROMISE</text><text x="520" y="476" fill="#eff6f0" font-family="Arial, Helvetica, sans-serif" font-size="29">Clearer language, still your voice</text><rect x="78" y="554" width="780" height="66" rx="12" fill="#131b16" stroke="#537563"/><text x="104" y="596" fill="#c8e1cd" font-family="monospace" font-size="19">/orwell-writing Rewrite this in plain English.</text><circle cx="1058" cy="586" r="30" fill="#78a987"/><path d="m1048 586 8 8 15-17" fill="none" stroke="#0d180f" stroke-width="5"/>
7
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 760" role="img" aria-labelledby="title desc">
2
+ <title id="title">session-profiler skill card</title><desc id="desc">A Builder's Essential Skill for seeing how an agent session performed.</desc>
3
+ <defs><linearGradient id="bg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#16131a"/><stop offset="1" stop-color="#0c0b10"/></linearGradient><filter id="glow"><feGaussianBlur stdDeviation="16"/></filter></defs>
4
+ <rect width="1200" height="760" fill="#0b0a0d"/><rect x="24" y="24" width="1152" height="712" rx="28" fill="url(#bg)" stroke="#70577e" stroke-opacity=".62"/><circle cx="972" cy="164" r="118" fill="#9a65b0" fill-opacity=".18" filter="url(#glow)"/><path d="M72 540C298 540 358 202 620 202s269 282 504 282" fill="none" stroke="#ac7cc1" stroke-opacity=".75" stroke-width="3"/>
5
+ <text x="78" y="106" fill="#c2aaca" font-family="Arial, Helvetica, sans-serif" font-size="17" font-weight="700" letter-spacing="3">BUILDER'S ESSENTIAL SKILLS / 08</text><text x="78" y="204" fill="#f6edf8" font-family="Arial, Helvetica, sans-serif" font-size="64" font-weight="700">session-profiler</text><text x="80" y="258" fill="#ccc3d0" font-family="Arial, Helvetica, sans-serif" font-size="28">Make an agent session visible: timing, tool calls, token use,</text><text x="80" y="296" fill="#ccc3d0" font-family="Arial, Helvetica, sans-serif" font-size="28">errors, subagents, and traces.</text>
6
+ <g transform="translate(849 109)" fill="none" stroke="#c194d2" stroke-width="5"><path d="M21 158V30h156v128zM47 130V94l31-28 30 21 29-39 19 18v64"/><circle cx="78" cy="66" r="7" fill="#c194d2"/><circle cx="108" cy="87" r="7" fill="#c194d2"/><circle cx="137" cy="48" r="7" fill="#c194d2"/></g><rect x="78" y="376" width="1044" height="1" fill="#af91ba" fill-opacity=".35"/><text x="78" y="432" fill="#b494c0" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" letter-spacing="2">DISCIPLINE</text><text x="78" y="476" fill="#f5edf7" font-family="Arial, Helvetica, sans-serif" font-size="29">Developer tools</text><text x="520" y="432" fill="#b494c0" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" letter-spacing="2">PROMISE</text><text x="520" y="476" fill="#f5edf7" font-family="Arial, Helvetica, sans-serif" font-size="29">The story behind the session</text><rect x="78" y="554" width="780" height="66" rx="12" fill="#1a1420" stroke="#745c82"/><text x="104" y="596" fill="#dac2e4" font-family="monospace" font-size="17">$session-profiler Profile my latest Codex session.</text><circle cx="1058" cy="586" r="30" fill="#a677b7"/><path d="m1048 586 8 8 15-17" fill="none" stroke="#190d20" stroke-width="5"/>
7
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 760" role="img" aria-labelledby="title desc">
2
+ <title id="title">validate-market skill card</title><desc id="desc">A Builder's Essential Skill for testing market demand.</desc>
3
+ <defs><linearGradient id="bg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#181611"/><stop offset="1" stop-color="#0d0d09"/></linearGradient><filter id="glow"><feGaussianBlur stdDeviation="16"/></filter></defs>
4
+ <rect width="1200" height="760" fill="#0d0c09"/><rect x="24" y="24" width="1152" height="712" rx="28" fill="url(#bg)" stroke="#7a724a" stroke-opacity=".62"/><circle cx="972" cy="165" r="117" fill="#b2a45c" fill-opacity=".18" filter="url(#glow)"/><path d="M72 540C300 540 357 205 624 205s259 286 500 286" fill="none" stroke="#c4b56c" stroke-opacity=".76" stroke-width="3"/>
5
+ <text x="78" y="106" fill="#c9c093" font-family="Arial, Helvetica, sans-serif" font-size="17" font-weight="700" letter-spacing="3">BUILDER'S ESSENTIAL SKILLS / 04</text><text x="78" y="204" fill="#f7f4e6" font-family="Arial, Helvetica, sans-serif" font-size="64" font-weight="700">validate-market</text><text x="80" y="258" fill="#ceccbd" font-family="Arial, Helvetica, sans-serif" font-size="28">Test whether a product idea has real demand, a credible</text><text x="80" y="296" fill="#ceccbd" font-family="Arial, Helvetica, sans-serif" font-size="28">position, and a worthwhile next step.</text>
6
+ <g transform="translate(851 112)" fill="none" stroke="#d1c574" stroke-width="5"><circle cx="91" cy="91" r="70"/><path d="m91 27 20 42 46 7-33 33 8 46-41-22-41 22 8-46-33-33 46-7z"/><circle cx="91" cy="91" r="10" fill="#d1c574"/></g><rect x="78" y="376" width="1044" height="1" fill="#b9b17d" fill-opacity=".35"/><text x="78" y="432" fill="#c1b978" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" letter-spacing="2">DISCIPLINE</text><text x="78" y="476" fill="#f4f1e5" font-family="Arial, Helvetica, sans-serif" font-size="29">Product &amp; market</text><text x="520" y="432" fill="#c1b978" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" letter-spacing="2">PROMISE</text><text x="520" y="476" fill="#f4f1e5" font-family="Arial, Helvetica, sans-serif" font-size="29">An honest case for the next move</text><rect x="78" y="554" width="780" height="66" rx="12" fill="#1c1a10" stroke="#847b48"/><text x="104" y="596" fill="#e2daab" font-family="monospace" font-size="19">/validate-market Audit this idea's market fit.</text><circle cx="1058" cy="586" r="30" fill="#b0a45e"/><path d="m1048 586 8 8 15-17" fill="none" stroke="#171407" stroke-width="5"/>
7
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 760" role="img" aria-labelledby="title desc">
2
+ <title id="title">write-blog skill card</title><desc id="desc">A Builder's Essential Skill for publishing a blog post with a human voice.</desc>
3
+ <defs><linearGradient id="bg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#1a1411"/><stop offset="1" stop-color="#0e0b0a"/></linearGradient><filter id="glow"><feGaussianBlur stdDeviation="16"/></filter></defs>
4
+ <rect width="1200" height="760" fill="#0d0a09"/><rect x="24" y="24" width="1152" height="712" rx="28" fill="url(#bg)" stroke="#805e47" stroke-opacity=".62"/><circle cx="974" cy="164" r="118" fill="#bf7951" fill-opacity=".18" filter="url(#glow)"/><path d="M72 540C295 540 360 198 620 198s273 290 504 290" fill="none" stroke="#cf8558" stroke-opacity=".75" stroke-width="3"/>
5
+ <text x="78" y="106" fill="#d0ad96" font-family="Arial, Helvetica, sans-serif" font-size="17" font-weight="700" letter-spacing="3">BUILDER'S ESSENTIAL SKILLS / 05</text><text x="78" y="204" fill="#f9eee8" font-family="Arial, Helvetica, sans-serif" font-size="64" font-weight="700">write-blog</text><text x="80" y="258" fill="#d5c4bc" font-family="Arial, Helvetica, sans-serif" font-size="28">Find a strong angle, draft in a human voice, and help</text><text x="80" y="296" fill="#d5c4bc" font-family="Arial, Helvetica, sans-serif" font-size="28">ship a blog post that earns attention.</text>
6
+ <g transform="translate(852 106)" fill="none" stroke="#e09a6e" stroke-width="5"><path d="m22 155 35-9 104-104-26-26L31 120zM118 33l26 26"/><path d="M25 171h150M49 193h101"/><path d="M46 131 67 152"/></g><rect x="78" y="376" width="1044" height="1" fill="#c69c84" fill-opacity=".35"/><text x="78" y="432" fill="#ca9f86" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" letter-spacing="2">DISCIPLINE</text><text x="78" y="476" fill="#f8eeea" font-family="Arial, Helvetica, sans-serif" font-size="29">Writing &amp; growth</text><text x="520" y="432" fill="#ca9f86" font-family="Arial, Helvetica, sans-serif" font-size="16" font-weight="700" letter-spacing="2">PROMISE</text><text x="520" y="476" fill="#f8eeea" font-family="Arial, Helvetica, sans-serif" font-size="29">A post people want to read</text><rect x="78" y="554" width="780" height="66" rx="12" fill="#211612" stroke="#8f6049"/><text x="104" y="596" fill="#edc3ab" font-family="monospace" font-size="19">/write-blog Write a launch post for this project.</text><circle cx="1058" cy="586" r="30" fill="#c47b55"/><path d="m1048 586 8 8 15-17" fill="none" stroke="#1a0e0a" stroke-width="5"/>
7
+ </svg>
@@ -0,0 +1,134 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("node:fs");
4
+ const os = require("node:os");
5
+ const path = require("node:path");
6
+
7
+ const packageRoot = path.resolve(__dirname, "..");
8
+ const packageName = require(path.join(packageRoot, "package.json")).name;
9
+ const npxCommand = `npx ${packageName}`;
10
+ const skillsSource = path.join(packageRoot, "skills");
11
+ const agentsSource = path.join(packageRoot, ".claude", "agents");
12
+
13
+ function printHelp() {
14
+ console.log(`Install Builder's Essential Skills.
15
+
16
+ Usage:
17
+ ${npxCommand} [--skill <name>] [--project]
18
+
19
+ Options:
20
+ -s, --skill Install one skill instead of the full collection
21
+ -p, --project Install into the current repository instead of your user home
22
+ -h, --help Show this help message
23
+
24
+ User install locations:
25
+ Claude Code ~/.claude/skills and ~/.claude/agents
26
+ Codex $CODEX_HOME/skills (or ~/.codex/skills)
27
+
28
+ Project install locations:
29
+ .claude/skills, .claude/agents, and .codex/skills in the current directory
30
+ `);
31
+ }
32
+
33
+ function parseArgs(args) {
34
+ let project = false;
35
+ let skill = null;
36
+
37
+ for (let index = 0; index < args.length; index += 1) {
38
+ const arg = args[index];
39
+ if (arg === "-p" || arg === "--project") {
40
+ project = true;
41
+ } else if (arg === "-s" || arg === "--skill") {
42
+ const value = args[index + 1];
43
+ if (!value || value.startsWith("-")) {
44
+ console.error("Missing skill name after --skill.");
45
+ process.exit(1);
46
+ }
47
+ skill = value;
48
+ index += 1;
49
+ } else if (arg === "-h" || arg === "--help") {
50
+ printHelp();
51
+ process.exit(0);
52
+ } else {
53
+ console.error(`Unknown option: ${arg}`);
54
+ console.error(`Run \`${npxCommand} --help\` for usage.`);
55
+ process.exit(1);
56
+ }
57
+ }
58
+
59
+ return { project, skill };
60
+ }
61
+
62
+ function installDirectory(source, destination, label, selectedSkill) {
63
+ fs.mkdirSync(destination, { recursive: true });
64
+
65
+ for (const entry of fs.readdirSync(source, { withFileTypes: true })) {
66
+ if (!entry.isDirectory() || (selectedSkill && entry.name !== selectedSkill)) {
67
+ continue;
68
+ }
69
+
70
+ const sourcePath = path.join(source, entry.name);
71
+ const destinationPath = path.join(destination, entry.name);
72
+ fs.rmSync(destinationPath, { recursive: true, force: true });
73
+ fs.cpSync(sourcePath, destinationPath, { recursive: true });
74
+ removePythonCaches(destinationPath);
75
+ console.log(`Installed ${label} /${entry.name} to ${destinationPath}`);
76
+ }
77
+ }
78
+
79
+ function removePythonCaches(root) {
80
+ for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
81
+ const entryPath = path.join(root, entry.name);
82
+ if (entry.isDirectory() && entry.name === "__pycache__") {
83
+ fs.rmSync(entryPath, { recursive: true, force: true });
84
+ } else if (entry.isDirectory()) {
85
+ removePythonCaches(entryPath);
86
+ }
87
+ }
88
+ }
89
+
90
+ function installAgents(destination) {
91
+ if (!fs.existsSync(agentsSource)) {
92
+ return;
93
+ }
94
+
95
+ fs.mkdirSync(destination, { recursive: true });
96
+ for (const entry of fs.readdirSync(agentsSource, { withFileTypes: true })) {
97
+ if (!entry.isFile()) {
98
+ continue;
99
+ }
100
+
101
+ const destinationPath = path.join(destination, entry.name);
102
+ fs.cpSync(path.join(agentsSource, entry.name), destinationPath);
103
+ console.log(`Installed agent ${entry.name} to ${destinationPath}`);
104
+ }
105
+ }
106
+
107
+ function main() {
108
+ const { project, skill } = parseArgs(process.argv.slice(2));
109
+ const availableSkills = fs
110
+ .readdirSync(skillsSource, { withFileTypes: true })
111
+ .filter((entry) => entry.isDirectory())
112
+ .map((entry) => entry.name);
113
+
114
+ if (skill && !availableSkills.includes(skill)) {
115
+ console.error(`Unknown skill: ${skill}`);
116
+ console.error(`Available skills: ${availableSkills.join(", ")}`);
117
+ process.exit(1);
118
+ }
119
+
120
+ const root = project ? process.cwd() : os.homedir();
121
+ const codexHome = process.env.CODEX_HOME || path.join(os.homedir(), ".codex");
122
+ const claudeRoot = path.join(root, ".claude");
123
+ const codexRoot = project ? path.join(root, ".codex") : codexHome;
124
+
125
+ installDirectory(skillsSource, path.join(claudeRoot, "skills"), "Claude", skill);
126
+ installDirectory(skillsSource, path.join(codexRoot, "skills"), "Codex", skill);
127
+ if (!skill || skill === "lead") {
128
+ installAgents(path.join(claudeRoot, "agents"));
129
+ }
130
+
131
+ console.log("\nRestart Claude Code or Codex to load the installed skills.");
132
+ }
133
+
134
+ main();