@ai-agent-lead/skills 1.0.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 (48) hide show
  1. package/README.md +37 -0
  2. package/bin/install.js +272 -0
  3. package/package.json +34 -0
  4. package/skills/LANGUAGE.md +72 -0
  5. package/skills/README.md +156 -0
  6. package/skills/SKILL-TEMPLATE.md +120 -0
  7. package/skills/TRIGGERS.md +64 -0
  8. package/skills/WORKFLOWS.md +369 -0
  9. package/skills/bench/SKILL.md +40 -0
  10. package/skills/bench/templates/benchmark-report.md +26 -0
  11. package/skills/bootstrap/BOOTSTRAP.md +13 -0
  12. package/skills/bootstrap/SKILL.md +47 -0
  13. package/skills/code-hygiene/SKILL.md +92 -0
  14. package/skills/debug/SKILL.md +122 -0
  15. package/skills/design/DEEP-MODULES.md +76 -0
  16. package/skills/design/FUNCTIONAL-CORE.md +121 -0
  17. package/skills/design/ILLEGAL-STATES.md +102 -0
  18. package/skills/design/OBSERVABILITY.md +49 -0
  19. package/skills/design/PERSONAS.md +41 -0
  20. package/skills/design/SKILL.md +139 -0
  21. package/skills/design/TESTABILITY.md +84 -0
  22. package/skills/feature-doc/SKILL.md +113 -0
  23. package/skills/feature-doc/templates/feature-template.md +52 -0
  24. package/skills/formats/ADR-FORMAT.md +51 -0
  25. package/skills/formats/CONTEXT-FORMAT.md +109 -0
  26. package/skills/formats/CONTEXT-MAP-FORMAT.md +6 -0
  27. package/skills/grill-plan/SKILL.md +112 -0
  28. package/skills/improve-codebase-architecture/DEEPENING.md +37 -0
  29. package/skills/improve-codebase-architecture/INTERFACE-DESIGN.md +41 -0
  30. package/skills/improve-codebase-architecture/SKILL.md +115 -0
  31. package/skills/investigate/SKILL.md +97 -0
  32. package/skills/investigate/templates/research-note.md +84 -0
  33. package/skills/pr-review/SKILL.md +197 -0
  34. package/skills/prod-ready/SKILL.md +88 -0
  35. package/skills/security-review/SKILL.md +145 -0
  36. package/skills/simplify/SKILL.md +105 -0
  37. package/skills/sync-check/SKILL.md +69 -0
  38. package/skills/system-design/SKILL.md +160 -0
  39. package/skills/tdd/SKILL.md +121 -0
  40. package/skills/tdd/TESTS.md +93 -0
  41. package/skills/tdd-rounds/COMMITS.md +122 -0
  42. package/skills/tdd-rounds/SKILL.md +96 -0
  43. package/skills/tdd-rounds/templates/builder-brief.md +73 -0
  44. package/skills/tdd-rounds/templates/builder-report.md +21 -0
  45. package/skills/verify-real-deps/MOTIVATION.md +18 -0
  46. package/skills/verify-real-deps/SKILL.md +118 -0
  47. package/skills/verify-real-deps/templates/known-issues.md +45 -0
  48. package/skills/zoom-out/SKILL.md +104 -0
package/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # Skills
2
+
3
+ A library of Claude Code skills that encode engineering discipline so Claude follows it by default.
4
+
5
+ ## Why
6
+
7
+ Out of the box Claude writes code competently, but shipping well needs more than that: investigate before building, design the interface before writing, test-first, review at PR boundaries, and verify before merge.
8
+
9
+ These skills bake those habits into Claude's defaults. Each one fires on its own trigger phrases — `tdd` when a task starts with a feature, `prod-ready` before merge, `pr-review` on someone else's PR, and so on — instead of waiting for me to remember to ask.
10
+
11
+ The goal: turn engineering discipline from something I have to enforce into something Claude reaches for automatically.
12
+
13
+ ## Where things live
14
+
15
+ - [`skills/`](./skills/) — the skill set. See [`skills/README.md`](./skills/README.md) for the index, the role/trigger taxonomy, and how skills compose into workflows.
16
+
17
+ ## Installation
18
+
19
+ You can install all the skills in this repository directly using `npx`:
20
+
21
+ ```bash
22
+ npx github:ai-agent-lead/skills
23
+ ```
24
+
25
+ ### Options and Customization
26
+
27
+ By default, the installer runs in an interactive console wizard allowing you to select your targets. You can also specify flags to customize the installation target and scope:
28
+
29
+ - `--global`, `-g` Install to personal/user-level global directories (e.g. `~/.claude/skills`)
30
+ - `--local`, `-l` Install to current project/workspace directories (e.g. `./.claude/skills`)
31
+ - `--claude` Install skills only for Claude Code
32
+ - `--codex` Install skills only for Codex
33
+ - `--antigravity`, `-agy` Install skills only for Antigravity
34
+ - `--all` Install skills for all supported assistants (default)
35
+ - `--force`, `-f` Overwrite files without confirmation
36
+ - `--help`, `-h` Show the help menu with all options
37
+
package/bin/install.js ADDED
@@ -0,0 +1,272 @@
1
+ #!/usr/bin/env node
2
+
3
+ import fs from 'fs';
4
+ import path from 'path';
5
+ import os from 'os';
6
+ import { fileURLToPath } from 'url';
7
+ import readline from 'readline';
8
+
9
+ // --- ANSI Colors ---
10
+ const ESC = '\x1b[';
11
+ const RESET = `${ESC}0m`;
12
+ const BOLD = `${ESC}1m`;
13
+ const GRAY = `${ESC}90m`;
14
+ const RED = `${ESC}31m`;
15
+ const GREEN = `${ESC}32m`;
16
+ const YELLOW = `${ESC}33m`;
17
+ const BLUE = `${ESC}34m`;
18
+ const MAGENTA = `${ESC}35m`;
19
+ const CYAN = `${ESC}36m`;
20
+ const WHITE = `${ESC}37m`;
21
+
22
+ const BRAND_COLOR = `${BOLD}${CYAN}`;
23
+ const SUCCESS_COLOR = `${BOLD}${GREEN}`;
24
+ const INFO_COLOR = `${CYAN}`;
25
+
26
+ // Get current filename and directory in ESM
27
+ const __filename = fileURLToPath(import.meta.url);
28
+ const __dirname = path.dirname(__filename);
29
+ const SOURCE_SKILLS_DIR = path.resolve(__dirname, '../skills');
30
+
31
+ // --- Helper Functions ---
32
+ function printBanner() {
33
+ console.log(`
34
+ ${BRAND_COLOR} _ ___ _ ___ ___ _ _ _____ _ ___ _ ___
35
+ /_\\ |_ _| /_\\ / __|| __|| \\| ||_ _| | | | __| /_\\ | \\
36
+ / _ \\ | | / _ \\ | (_ || _| | .\` | | | | |__ | _| / _ \\ | |) |
37
+ /_/ \\_\\|___| /_/ \\_\\ \\___||___||_|\\_| |_| |____||___/_/ \\_\\|___/
38
+ ${RESET}
39
+ ${BOLD}${WHITE} S K I L L S I N S T A L L E R${RESET}
40
+ ${GRAY}-------------------------------------------------------------${RESET}
41
+ `);
42
+ }
43
+
44
+ function printHelp() {
45
+ printBanner();
46
+ console.log(`${BOLD}Usage:${RESET}`);
47
+ console.log(` npx github:ai-agent-lead/skills [options]`);
48
+ console.log(``);
49
+ console.log(`${BOLD}Options:${RESET}`);
50
+ console.log(` ${CYAN}--global, -g${RESET} Install to global directories (e.g. ~/.claude/skills)`);
51
+ console.log(` ${CYAN}--local, -l${RESET} Install to local project directories (e.g. ./.claude/skills)`);
52
+ console.log(` ${CYAN}--claude${RESET} Install skills only for Claude Code`);
53
+ console.log(` ${CYAN}--codex${RESET} Install skills only for Codex`);
54
+ console.log(` ${CYAN}--antigravity, -agy${RESET} Install skills only for Antigravity`);
55
+ console.log(` ${CYAN}--all${RESET} Install skills for all supported assistants (default)`);
56
+ console.log(` ${CYAN}--force, -f${RESET} Overwrite files without confirmation`);
57
+ console.log(` ${CYAN}--help, -h${RESET} Show this help menu`);
58
+ console.log(``);
59
+ console.log(`${BOLD}Examples:${RESET}`);
60
+ console.log(` npx github:ai-agent-lead/skills --global`);
61
+ console.log(` npx github:ai-agent-lead/skills --local --claude`);
62
+ console.log(``);
63
+ }
64
+
65
+ function askQuestion(query) {
66
+ const rl = readline.createInterface({
67
+ input: process.stdin,
68
+ output: process.stdout
69
+ });
70
+ return new Promise(resolve => rl.question(query, answer => {
71
+ rl.close();
72
+ resolve(answer.trim());
73
+ }));
74
+ }
75
+
76
+ function copyFolderSync(from, to, { force = false } = {}, stats = { copied: 0, skipped: 0 }) {
77
+ if (!fs.existsSync(from)) return stats;
78
+ fs.mkdirSync(to, { recursive: true });
79
+ const elements = fs.readdirSync(from);
80
+ for (const element of elements) {
81
+ const fromPath = path.join(from, element);
82
+ const toPath = path.join(to, element);
83
+ const stat = fs.lstatSync(fromPath);
84
+ if (stat.isDirectory()) {
85
+ copyFolderSync(fromPath, toPath, { force }, stats);
86
+ } else if (stat.isFile()) {
87
+ if (!force && fs.existsSync(toPath)) {
88
+ stats.skipped++;
89
+ continue;
90
+ }
91
+ fs.copyFileSync(fromPath, toPath);
92
+ stats.copied++;
93
+ }
94
+ }
95
+ return stats;
96
+ }
97
+
98
+ // --- Main Execution ---
99
+ async function run() {
100
+ const args = process.argv.slice(2);
101
+
102
+ const flags = {
103
+ global: false,
104
+ local: false,
105
+ claude: false,
106
+ codex: false,
107
+ antigravity: false,
108
+ all: false,
109
+ force: false,
110
+ help: false
111
+ };
112
+
113
+ for (const arg of args) {
114
+ if (arg === '--global' || arg === '-g') flags.global = true;
115
+ else if (arg === '--local' || arg === '-l') flags.local = true;
116
+ else if (arg === '--claude') flags.claude = true;
117
+ else if (arg === '--codex') flags.codex = true;
118
+ else if (arg === '--antigravity' || arg === '--agy' || arg === '-agy') flags.antigravity = true;
119
+ else if (arg === '--all') flags.all = true;
120
+ else if (arg === '--force' || arg === '-f') flags.force = true;
121
+ else if (arg === '--help' || arg === '-h') flags.help = true;
122
+ }
123
+
124
+ if (flags.help) {
125
+ printHelp();
126
+ return;
127
+ }
128
+
129
+ // Check if source skills folder exists in the package
130
+ if (!fs.existsSync(SOURCE_SKILLS_DIR)) {
131
+ console.error(`${RED}✗ Error: Source skills folder not found at: ${SOURCE_SKILLS_DIR}${RESET}`);
132
+ process.exit(1);
133
+ }
134
+
135
+ // Interactive Mode
136
+ if (args.length === 0 && process.stdout.isTTY) {
137
+ printBanner();
138
+ console.log(`${INFO_COLOR}No options provided. Running interactive setup...${RESET}\n`);
139
+
140
+ console.log(`${BOLD}1. Select Scope:${RESET}`);
141
+ console.log(` [1] Global (Personal / User-level) - ${GRAY}Available in all projects${RESET}`);
142
+ console.log(` [2] Local (Project / Workspace-specific) - ${GRAY}Available in current folder${RESET}`);
143
+ console.log(` [3] Both Scope Options`);
144
+ const scopeAns = await askQuestion(`${BOLD}${CYAN}? Choose scope [1-3] (Default: 1): ${RESET}`);
145
+
146
+ if (scopeAns === '2') {
147
+ flags.local = true;
148
+ } else if (scopeAns === '3') {
149
+ flags.global = true;
150
+ flags.local = true;
151
+ } else {
152
+ flags.global = true;
153
+ }
154
+ console.log(``);
155
+
156
+ console.log(`${BOLD}2. Select Targets:${RESET}`);
157
+ console.log(` [1] All Assistants (Claude, Codex, Antigravity)`);
158
+ console.log(` [2] Claude Code only`);
159
+ console.log(` [3] Codex only`);
160
+ console.log(` [4] Antigravity only`);
161
+ const targetAns = await askQuestion(`${BOLD}${CYAN}? Choose target [1-4] (Default: 1): ${RESET}`);
162
+
163
+ if (targetAns === '2') {
164
+ flags.claude = true;
165
+ } else if (targetAns === '3') {
166
+ flags.codex = true;
167
+ } else if (targetAns === '4') {
168
+ flags.antigravity = true;
169
+ } else {
170
+ flags.claude = true;
171
+ flags.codex = true;
172
+ flags.antigravity = true;
173
+ }
174
+ console.log(``);
175
+ } else {
176
+ // If not interactive and no flags specified, apply defaults
177
+ const hasScopeFlag = flags.global || flags.local;
178
+ if (!hasScopeFlag) {
179
+ flags.global = true; // Default to global
180
+ }
181
+
182
+ const hasAssistantFlag = flags.claude || flags.codex || flags.antigravity;
183
+ if (!hasAssistantFlag) {
184
+ flags.claude = true;
185
+ flags.codex = true;
186
+ flags.antigravity = true;
187
+ }
188
+ }
189
+
190
+ // Setup Paths
191
+ const home = os.homedir();
192
+ const cwd = process.cwd();
193
+
194
+ const destinations = [];
195
+
196
+ if (flags.global) {
197
+ if (flags.claude) {
198
+ destinations.push({ name: 'Claude Code (Global)', path: path.join(home, '.claude', 'skills') });
199
+ }
200
+ if (flags.codex) {
201
+ destinations.push({ name: 'Codex (Global)', path: path.join(home, '.codex', 'skills') });
202
+ }
203
+ if (flags.antigravity) {
204
+ destinations.push({ name: 'Antigravity (Global)', path: path.join(home, '.gemini', 'antigravity', 'skills') });
205
+ destinations.push({ name: 'Antigravity CLI (Global)', path: path.join(home, '.gemini', 'antigravity-cli', 'skills') });
206
+ destinations.push({ name: 'Antigravity Config (Global)', path: path.join(home, '.gemini', 'config', 'skills') });
207
+ }
208
+ }
209
+
210
+ if (flags.local) {
211
+ if (flags.claude) {
212
+ destinations.push({ name: 'Claude Code (Local)', path: path.join(cwd, '.claude', 'skills') });
213
+ }
214
+ if (flags.codex) {
215
+ destinations.push({ name: 'Codex (Local)', path: path.join(cwd, '.codex', 'skills') });
216
+ }
217
+ if (flags.antigravity) {
218
+ destinations.push({ name: 'Antigravity Agents (Local)', path: path.join(cwd, '.agents', 'skills') });
219
+ destinations.push({ name: 'Antigravity Agent (Local)', path: path.join(cwd, '.agent', 'skills') });
220
+ destinations.push({ name: 'Antigravity CLI (Local)', path: path.join(cwd, '.antigravitycli', 'skills') });
221
+ }
222
+ }
223
+
224
+ if (destinations.length === 0) {
225
+ console.log(`${YELLOW}⚠ No destinations matching current selection.${RESET}`);
226
+ return;
227
+ }
228
+
229
+ if (args.length !== 0 || !process.stdout.isTTY) {
230
+ printBanner();
231
+ }
232
+
233
+ console.log(`${BOLD}Starting installation to destinations...${RESET}`);
234
+ console.log(`${GRAY}---------------------------------------------${RESET}`);
235
+
236
+ let successCount = 0;
237
+ for (const dest of destinations) {
238
+ console.log(`${INFO_COLOR}➜ Installing to ${BOLD}${dest.name}${RESET}${GRAY}...${RESET}`);
239
+ try {
240
+ // Resolve absolute paths nicely for output display
241
+ const displayPath = dest.path.replace(home, '~');
242
+ console.log(` ${GRAY}Path: ${displayPath}${RESET}`);
243
+
244
+ // Perform directory copy
245
+ const result = copyFolderSync(SOURCE_SKILLS_DIR, dest.path, { force: flags.force });
246
+
247
+ const summary = result.skipped > 0
248
+ ? ` (${result.copied} copied, ${result.skipped} skipped — use --force to overwrite)`
249
+ : ` (${result.copied} files)`;
250
+ console.log(` ${SUCCESS_COLOR}✔ Successfully installed to ${dest.name}!${RESET}${GRAY}${summary}${RESET}`);
251
+ successCount++;
252
+ } catch (err) {
253
+ console.error(` ${RED}✗ Failed to install to ${dest.name}: ${err.message}${RESET}`);
254
+ }
255
+ console.log(``);
256
+ }
257
+
258
+ console.log(`${GRAY}---------------------------------------------${RESET}`);
259
+ if (successCount === destinations.length) {
260
+ console.log(`${SUCCESS_COLOR}🎉 Installation complete! All (${successCount}/${destinations.length}) targets successfully updated.${RESET}`);
261
+ } else if (successCount > 0) {
262
+ console.log(`${YELLOW}⚠ Installation completed with warnings. Installed ${successCount} of ${destinations.length} targets.${RESET}`);
263
+ } else {
264
+ console.error(`${RED}✗ Installation failed. No targets were updated.${RESET}`);
265
+ process.exit(1);
266
+ }
267
+ }
268
+
269
+ run().catch(err => {
270
+ console.error(`${RED}✗ Unexpected Error: ${err.message}${RESET}`);
271
+ process.exit(1);
272
+ });
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@ai-agent-lead/skills",
3
+ "version": "1.0.0",
4
+ "description": "Install AI agent skills for Claude Code, Codex, and Antigravity",
5
+ "main": "bin/install.js",
6
+ "bin": {
7
+ "install-skills": "bin/install.js"
8
+ },
9
+ "type": "module",
10
+ "files": [
11
+ "bin/",
12
+ "skills/",
13
+ "README.md"
14
+ ],
15
+ "engines": {
16
+ "node": ">=16.0.0"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/ai-agent-lead/skills.git"
21
+ },
22
+ "keywords": [
23
+ "claude",
24
+ "codex",
25
+ "antigravity",
26
+ "skills",
27
+ "ai-agent"
28
+ ],
29
+ "author": "ai-agent-lead",
30
+ "license": "Apache-2.0",
31
+ "publishConfig": {
32
+ "access": "public"
33
+ }
34
+ }
@@ -0,0 +1,72 @@
1
+ # Language
2
+
3
+ Shared vocabulary across every skill in this set. Use these terms exactly — don't substitute "component," "service," "API," or "boundary." Consistent language is the whole point.
4
+
5
+ This file is the canonical source. Skills that need this vocabulary (`design`, `system-design`, `improve-codebase-architecture`, `grill-plan`) link here rather than duplicating definitions.
6
+
7
+ ## Architecture terms
8
+
9
+ **Module**
10
+ Anything with an interface and an implementation. Deliberately scale-agnostic — applies equally to a function, class, package, or tier-spanning slice.
11
+ _Avoid_: unit, component, service.
12
+
13
+ **Interface**
14
+ Everything a caller must know to use the module correctly. Includes the type signature, but also invariants, ordering constraints, error modes, required configuration, and performance characteristics.
15
+ _Avoid_: API, signature (too narrow — those refer only to the type-level surface).
16
+
17
+ **Implementation**
18
+ What's inside a module — its body of code. Distinct from **Adapter**: a thing can be a small adapter with a large implementation (a Postgres repo) or a large adapter with a small implementation (an in-memory fake). Reach for "adapter" when the seam is the topic; "implementation" otherwise.
19
+
20
+ **Depth**
21
+ Leverage at the interface — the amount of behaviour a caller (or test) can exercise per unit of interface they have to learn. A module is **deep** when a large amount of behaviour sits behind a small interface. A module is **shallow** when the interface is nearly as complex as the implementation.
22
+
23
+ **Seam** _(from Michael Feathers)_
24
+ A place where you can alter behaviour without editing in that place. The *location* at which a module's interface lives. Choosing where to put the seam is its own design decision, distinct from what goes behind it.
25
+ _Avoid_: boundary (overloaded with DDD's bounded context).
26
+
27
+ **Adapter**
28
+ A concrete thing that satisfies an interface at a seam. Describes *role* (what slot it fills), not substance (what's inside).
29
+
30
+ **Leverage**
31
+ What callers get from depth. More capability per unit of interface they have to learn. One implementation pays back across N call sites and M tests.
32
+
33
+ **Locality**
34
+ What maintainers get from depth. Change, bugs, knowledge, and verification concentrate at one place rather than spreading across callers. Fix once, fixed everywhere.
35
+
36
+ ## Topology terms (greenfield system shape)
37
+
38
+ **Responsibility**
39
+ What a module does, stated in one sentence. If you can't say it in one sentence, the module is too big — split or merge.
40
+
41
+ **Dependency direction**
42
+ Module A depends on B if A imports, calls, or relies on B's interface. Directional. The dependency graph at the system level is the topology.
43
+
44
+ **Acyclic**
45
+ The dependency graph has no cycles. If A → B → A, the modules aren't really separate — merge them, or insert a third module to break the cycle.
46
+
47
+ **Port** *(from ports & adapters / hexagonal architecture)*
48
+ An interface defined by a domain module so that infrastructure can implement it without the domain depending on infrastructure. The port lives in the domain; the adapter lives in the infra. Inverts the naive dependency direction.
49
+
50
+ ## Principles
51
+
52
+ - **Depth is a property of the interface, not the implementation.** A deep module can be internally composed of small, mockable, swappable parts — they just aren't part of the interface. A module can have **internal seams** (private to its implementation, used by its own tests) as well as the **external seam** at its interface.
53
+ - **The deletion test.** Imagine deleting the module. If complexity vanishes, the module wasn't hiding anything (it was a pass-through). If complexity reappears across N callers, the module was earning its keep.
54
+ - **The interface is the test surface.** Callers and tests cross the same seam. If you want to test *past* the interface, the module is probably the wrong shape.
55
+ - **One adapter means a hypothetical seam. Two adapters means a real one.** Don't introduce a seam unless something actually varies across it.
56
+ - **Domain doesn't depend on infrastructure.** Use ports — domain defines the interface, infrastructure implements it. Keeps domain logic runnable in tests with no infra.
57
+
58
+ ## Relationships
59
+
60
+ - A **Module** has exactly one **Interface** (the surface it presents to callers and tests).
61
+ - **Depth** is a property of a **Module**, measured against its **Interface**.
62
+ - A **Seam** is where a **Module**'s **Interface** lives.
63
+ - An **Adapter** sits at a **Seam** and satisfies the **Interface**.
64
+ - **Depth** produces **Leverage** for callers and **Locality** for maintainers.
65
+ - A **Port** is an **Interface** defined by a domain **Module** for an infra **Adapter** to implement.
66
+
67
+ ## Rejected framings
68
+
69
+ - **Depth as ratio of implementation-lines to interface-lines** (Ousterhout's original): rewards padding the implementation. We use depth-as-leverage instead.
70
+ - **"Interface" as the TypeScript `interface` keyword or a class's public methods**: too narrow — interface here includes every fact a caller must know.
71
+ - **"Boundary"**: overloaded with DDD's bounded context. Say **seam** or **interface**.
72
+ - **Layer-named modules** (`controllers`, `services`, `repositories`): a category split, not a responsibility split. Prefer feature slicing (`ordering/`, `billing/`, `auth/`).
@@ -0,0 +1,156 @@
1
+ # Claude skills
2
+
3
+ Skills shape how Claude works on this repo. Each skill lives in its own subdirectory with a `SKILL.md` (the contract Claude reads) plus templates or supporting docs.
4
+
5
+ This README is for humans. Claude discovers skills automatically — nothing is registered here.
6
+
7
+ ## Index — by trigger phase
8
+
9
+ Grouped by role. Trigger phrases are in each skill's `description` frontmatter.
10
+
11
+ ### Planning & investigation
12
+
13
+ | Skill | Trigger | Produces | Location |
14
+ | --- | --- | --- | --- |
15
+ | `bootstrap` | Starting a new project or service | `docs/` structure + `docs/CONTEXT.md` | [bootstrap/](./bootstrap/) |
16
+ | `feature-doc` | Before any non-trivial feature or bug fix | `docs/features/<short-name>.md` | [feature-doc/](./feature-doc/) |
17
+ | `investigate` | Open-ended research, proposals, or "options before code" | `docs/research/<topic>.md` | [investigate/](./investigate/) |
18
+ | `grill-plan` | Stress-test a **chosen** plan against existing terminology and decisions | Updates to `docs/CONTEXT.md` and `docs/adr/` | [grill-plan/](./grill-plan/) |
19
+ | `bench` | Verifying performance ACs or profiling hot paths | `docs/benchmarks/<feature>.md` | [bench/](./bench/) |
20
+
21
+ ### Design & architecture
22
+
23
+ | Skill | Trigger | Produces | Location |
24
+ | --- | --- | --- | --- |
25
+ | `system-design` | Greenfield system architecture — modules, dependency direction, seams | `docs/architecture.md` (system map) | [system-design/](./system-design/) |
26
+ | `design` | Designing a module or public API before implementation | Guidance only — optional `docs/features/<feature>.design.md` for non-trivial shapes | [design/](./design/) |
27
+ | `improve-codebase-architecture` | Finding deepening opportunities — turning shallow modules into deep ones | Numbered candidate list, optional ADR / CONTEXT.md updates | [improve-codebase-architecture/](./improve-codebase-architecture/) |
28
+ | `code-hygiene` | Line/function-level coding discipline (boring, naming, YAGNI, rule of 3, locality) | Guidance only — applied as a lens during `simplify` and `pr-review` | [code-hygiene/](./code-hygiene/) |
29
+ | `zoom-out` | User-invoked: ask for higher-level context when unfamiliar with an area | Map of relevant modules and callers in `CONTEXT.md` vocabulary | [zoom-out/](./zoom-out/) |
30
+
31
+ ### Implementation
32
+
33
+ | Skill | Trigger | Produces | Location |
34
+ | --- | --- | --- | --- |
35
+ | `debug` | Non-trivial bug whose root cause isn't obvious — runs **before** `tdd` | Reproduction + named root cause; optional `docs/research/<bug>.md` | [debug/](./debug/) |
36
+ | `tdd` | Implementing a feature or fixing a bug, test-first | Test-first code | [tdd/](./tdd/) |
37
+ | `tdd-rounds` | Multi-round TDD orchestration via Builder sub-agents (≥10 ACs / multi-package) | Builder briefs + reports + `docs/STATE.md` | [tdd-rounds/](./tdd-rounds/) |
38
+ | `simplify` | End-of-slice / end-of-round sweep — reuse, quality, efficiency, test relevance | Tightened diff + a separate `simplify` commit | [simplify/](./simplify/) |
39
+
40
+ ### Pre-merge gates & review
41
+
42
+ | Skill | Trigger | Produces | Location |
43
+ | --- | --- | --- | --- |
44
+ | `prod-ready` | After tdd green, before merge | Verified pre-merge checklist (incl. doc drift) | [prod-ready/](./prod-ready/) |
45
+ | `security-review` | Surface-changing work — new entry points, identity flows, authz, sensitive data, external deps | Threat model + verified controls; appended to feature doc, or `docs/security/<feature>.md` for high-stakes | [security-review/](./security-review/) |
46
+ | `pr-review` | Reviewing someone else's PR (or self-reviewing before opening) | Structured review with severity-classified findings (blocker / suggestion / nit / question) | [pr-review/](./pr-review/) |
47
+ | `verify-real-deps` | Pre-tag smoke test against real third-party APIs | `docs/known-issues.md` bug ledger; fix-rounds until clean | [verify-real-deps/](./verify-real-deps/) |
48
+
49
+ ## Index — by role
50
+
51
+ Orthogonal axis. The trigger-phrase index above tells you *when* a skill fires; this one tells you *what kind of thing it is*.
52
+
53
+ | Role | Skills | What they have in common |
54
+ | --- | --- | --- |
55
+ | **Doc-producing** (writes a durable artifact under `docs/`) | `feature-doc`, `investigate`, `system-design`, `grill-plan`, `debug` (optional), `security-review` (optional), `verify-real-deps` | Output survives the conversation. The discipline of writing it is the value. |
56
+ | **Build** (writes code) | `tdd`, `tdd-rounds`, `simplify` | Diff-producing. Always behind a contract (feature doc + ACs). |
57
+ | **Gate** (verifies before merge / tag) | `prod-ready`, `security-review`, `pr-review`, `verify-real-deps` | Pre-merge or pre-tag — refuse to advance until the checklist passes. |
58
+ | **Diagnose** (no code, no doc — just analysis) | `debug`, `zoom-out`, `sync-check` | Run *before* a build skill when the input isn't yet clear. |
59
+ | **Shape** (decides module / topology) | `design`, `system-design`, `improve-codebase-architecture` | Greenfield-module / greenfield-system / brownfield. Same vocabulary ([`LANGUAGE.md`](./LANGUAGE.md)). |
60
+ | **Lens** (applied during other skills, not invoked alone) | `code-hygiene` | Five principles you carry into `simplify`, `pr-review`, and any code-reading session. |
61
+
62
+ ## Skill relationship map
63
+
64
+ The 16 skills + their dependencies. Lateral edges are vocabulary / lens; vertical edges are workflow flow.
65
+
66
+ ```
67
+ ┌─────────────────────────────────────────────┐
68
+ │ SHARED SUBSTRATE │
69
+ │ │
70
+ │ LANGUAGE.md formats/ TRIGGERS.md │
71
+ │ ▲ ▲ ▲ │
72
+ └───────┼─────────────┼──────────┼─────────────┘
73
+ │ vocab │ format │ routing
74
+ ┌─────────────────────────┴─────────────┴──────────┴────────────┐
75
+ │ │
76
+ │ investigate ──► feature-doc ──► (design) ──► tdd ──► simplify │
77
+ │ │ │ ▲ ▲ │ │
78
+ │ │ ▼ │ │ │ │
79
+ │ │ grill-plan ──► ADR │ │ ▼ │
80
+ │ │ ▲ │ │ prod-ready│
81
+ │ │ │ │ │ │ │
82
+ │ └──────────────┘ │ │ ▼ │
83
+ │ │ │ pr-review │
84
+ │ system-design ──► design (per mod) ─┘ │ │ │
85
+ │ │ │ ▼ │
86
+ │ ▼ │ verify-real-deps │
87
+ │ docs/architecture.md │ │ │
88
+ │ │ ▼ │
89
+ │ improve-codebase-architecture ─────────────────┘ [merge] │
90
+ │ ▲ │
91
+ │ │ │
92
+ │ tdd-rounds (orchestrator) ── dispatches Builders ──────────────│
93
+ │ │ ▲ ▲ ▲ │
94
+ │ │ │ │ │ │
95
+ │ │ debug security-review │
96
+ │ │ (when bug) (when surface) │
97
+ │ │
98
+ │ ┌────────────── LENSES & UTILITIES ──────────────┐ │
99
+ │ │ code-hygiene ──► applied during simplify, │ │
100
+ │ │ pr-review, any code reading │ │
101
+ │ │ │ │
102
+ │ │ zoom-out ──► interrupts any workflow, │ │
103
+ │ │ maps unfamiliar areas │ │
104
+ │ └────────────────────────────────────────────────┘ │
105
+ └──────────────────────────────────────────────────────────────────┘
106
+ ```
107
+
108
+ **Six things the map shows:**
109
+
110
+ 1. `code-hygiene` and `zoom-out` are not nodes in any flow — they're lenses / utilities applied across.
111
+ 2. `grill-plan` is the only skill invoked from three upstreams (`investigate`, `feature-doc`, `improve-codebase-architecture`) — it's the shared pressure-test step.
112
+ 3. `tdd-rounds` is the only multi-callee orchestrator — dispatches `design`, `tdd`, `simplify`, `prod-ready`, `verify-real-deps` to Builders.
113
+ 4. `pr-review` is the reviewer-side mirror of `prod-ready` — Section 7 doc-drift covered in both.
114
+ 5. `system-design` and `improve-codebase-architecture` are duals — same [LANGUAGE.md](./LANGUAGE.md), greenfield vs brownfield.
115
+ 6. The shared substrate ([LANGUAGE.md](./LANGUAGE.md), [formats/](./formats/), [TRIGGERS.md](./TRIGGERS.md)) is referenced everywhere — never copy-paste the content into a skill.
116
+
117
+ ## Workflows
118
+
119
+ The skills compose into canonical workflows (greenfield feature, large feature, investigation, refactor, bug fix, greenfield system) plus utilities (`zoom-out`, `pr-review`). See [WORKFLOWS.md](./WORKFLOWS.md) for the decision tree, ASCII flow diagrams, and cross-workflow patterns.
120
+
121
+ ## Trigger lookup
122
+
123
+ [TRIGGERS.md](./TRIGGERS.md) is the flat phrase → skill index. Useful for routing-collision debugging and onboarding.
124
+
125
+ ## Shared vocabulary
126
+
127
+ [`LANGUAGE.md`](./LANGUAGE.md) at this directory's root is the canonical vocabulary used across every skill — **module**, **interface**, **depth**, **seam**, **adapter**, **leverage**, **locality**, **responsibility**, **dependency direction**, **port**. Skills link here rather than duplicating definitions.
128
+
129
+ ## Shared formats
130
+
131
+ [`formats/`](./formats/) holds reference docs that more than one skill consumes:
132
+
133
+ - [`formats/ADR-FORMAT.md`](./formats/ADR-FORMAT.md) — ADR template, numbering, when-to-write criteria.
134
+ - [`formats/CONTEXT-FORMAT.md`](./formats/CONTEXT-FORMAT.md) — `CONTEXT.md` structure, single-vs-multi-context layout, minimal example.
135
+
136
+ Used by `grill-plan`, `improve-codebase-architecture`, `system-design`, `investigate`, and (lazily) `feature-doc`.
137
+
138
+ ## Conventions
139
+
140
+ - **File naming.** UPPERCASE for skill-level reference docs (`SKILL.md`, `LANGUAGE.md`, `MOTIVATION.md`, `*-FORMAT.md`, etc.) — Claude loads these as supporting context. lowercase for templates inside `<skill>/templates/` — skeletons to copy and fill in.
141
+ - Output artifacts live under `docs/` in the repo root, never inside `.claude/`.
142
+ - Status enums, frontmatter shape, and cross-doc linking rules are in [`docs/CONVENTIONS.md`](../docs/CONVENTIONS.md).
143
+ - Domain vocabulary is in [`docs/CONTEXT.md`](../docs/CONTEXT.md). Terms there beat synonyms invented at the keyboard.
144
+ - **Body size matches role, not importance.** Skills that *teach* an agent how to do something (e.g. `tdd`, `debug`, `security-review`) tend to be longer — pedagogy, anti-pattern callouts, examples. Skills that *orchestrate* (e.g. `tdd-rounds`) tend to be shorter — contracts, tables, failure modes. Don't pad an orchestration skill to match a teaching skill's length; it just adds noise.
145
+ - **SKILL.md heading order is canonical.** See [`SKILL-TEMPLATE.md`](./SKILL-TEMPLATE.md). Keep `When to use` / `When to skip` early so routing decisions land before the body.
146
+
147
+ ## Adding a skill
148
+
149
+ 1. Copy [`SKILL-TEMPLATE.md`](./SKILL-TEMPLATE.md) to `<name>/SKILL.md` and fill in.
150
+ 2. Make the `description` sharp enough that Claude will pick the skill on the right triggers and skip it on the wrong ones — name trigger phrases AND skip conditions AND adjacent skills.
151
+ 3. Reference [`LANGUAGE.md`](./LANGUAGE.md) and [`formats/`](./formats/) rather than redefining shared terms or formats.
152
+ 4. Link any templates from `SKILL.md` so Claude can find them.
153
+ 5. Add the skill to **both** index tables above (by trigger phase AND by role).
154
+ 6. Add an entry to [TRIGGERS.md](./TRIGGERS.md) for routing.
155
+ 7. Update [WORKFLOWS.md](./WORKFLOWS.md) if the skill participates in a canonical workflow or as a cross-workflow pattern.
156
+ . Update [WORKFLOWS.md](./WORKFLOWS.md) if the skill participates in a canonical workflow or as a cross-workflow pattern.