@grimoire-cc/cli 0.13.2 → 0.14.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.
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +14 -0
- package/dist/commands/update.js.map +1 -1
- package/dist/enforce.d.ts +3 -1
- package/dist/enforce.d.ts.map +1 -1
- package/dist/enforce.js +18 -6
- package/dist/enforce.js.map +1 -1
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +47 -0
- package/dist/setup.js.map +1 -1
- package/dist/summary.d.ts.map +1 -1
- package/dist/summary.js +9 -0
- package/dist/summary.js.map +1 -1
- package/package.json +1 -1
- package/packs/dev-pack/agents/grimoire.tdd-specialist.md +194 -27
- package/packs/dev-pack/grimoire.json +9 -42
- package/packs/dev-pack/skills/grimoire.conventional-commit/SKILL.md +68 -47
- package/packs/dotnet-pack/agents/grimoire.csharp-coder.md +110 -113
- package/packs/dotnet-pack/grimoire.json +23 -5
- package/packs/dotnet-pack/skills/grimoire.unit-testing-dotnet/SKILL.md +252 -0
- package/packs/{dev-pack/skills/grimoire.tdd-specialist → dotnet-pack/skills/grimoire.unit-testing-dotnet}/reference/anti-patterns.md +78 -0
- package/packs/dotnet-pack/skills/grimoire.unit-testing-dotnet/reference/tdd-workflow-patterns.md +259 -0
- package/packs/go-pack/grimoire.json +19 -0
- package/packs/go-pack/skills/grimoire.unit-testing-go/SKILL.md +256 -0
- package/packs/go-pack/skills/grimoire.unit-testing-go/reference/anti-patterns.md +244 -0
- package/packs/go-pack/skills/grimoire.unit-testing-go/reference/tdd-workflow-patterns.md +259 -0
- package/packs/python-pack/grimoire.json +19 -0
- package/packs/python-pack/skills/grimoire.unit-testing-python/SKILL.md +239 -0
- package/packs/python-pack/skills/grimoire.unit-testing-python/reference/anti-patterns.md +244 -0
- package/packs/python-pack/skills/grimoire.unit-testing-python/reference/tdd-workflow-patterns.md +259 -0
- package/packs/rust-pack/grimoire.json +29 -0
- package/packs/rust-pack/skills/grimoire.unit-testing-rust/SKILL.md +243 -0
- package/packs/rust-pack/skills/grimoire.unit-testing-rust/reference/anti-patterns.md +244 -0
- package/packs/rust-pack/skills/grimoire.unit-testing-rust/reference/tdd-workflow-patterns.md +259 -0
- package/packs/ts-pack/agents/grimoire.typescript-coder.md +36 -1
- package/packs/ts-pack/grimoire.json +27 -1
- package/packs/ts-pack/skills/grimoire.unit-testing-typescript/SKILL.md +255 -0
- package/packs/ts-pack/skills/grimoire.unit-testing-typescript/reference/anti-patterns.md +244 -0
- package/packs/ts-pack/skills/grimoire.unit-testing-typescript/reference/tdd-workflow-patterns.md +259 -0
- package/packs/dev-pack/skills/grimoire.tdd-specialist/SKILL.md +0 -248
- package/packs/dev-pack/skills/grimoire.tdd-specialist/reference/language-frameworks.md +0 -388
- package/packs/dev-pack/skills/grimoire.tdd-specialist/reference/tdd-workflow-patterns.md +0 -135
- package/packs/dotnet-pack/skills/grimoire.dotnet-unit-testing/SKILL.md +0 -293
- package/packs/dotnet-pack/skills/grimoire.dotnet-unit-testing/reference/anti-patterns.md +0 -329
- package/packs/dotnet-pack/skills/grimoire.dotnet-unit-testing/reference/framework-guidelines.md +0 -361
- package/packs/dotnet-pack/skills/grimoire.dotnet-unit-testing/reference/parameterized-testing.md +0 -378
- package/packs/dotnet-pack/skills/grimoire.dotnet-unit-testing/reference/test-organization.md +0 -476
- package/packs/dotnet-pack/skills/grimoire.dotnet-unit-testing/reference/test-performance.md +0 -576
- package/packs/dotnet-pack/skills/grimoire.dotnet-unit-testing/templates/tunit-template.md +0 -438
- package/packs/dotnet-pack/skills/grimoire.dotnet-unit-testing/templates/xunit-template.md +0 -303
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,UAAU,iBAAiB;IACzB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,iBAAiB,EAAE,CAyD7E;AAED,wBAAsB,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA4EvE"}
|
package/dist/commands/update.js
CHANGED
|
@@ -5,6 +5,7 @@ import { loadAllPacks } from '../resolve.js';
|
|
|
5
5
|
import { copyItems } from '../copy.js';
|
|
6
6
|
import { printSummary } from '../summary.js';
|
|
7
7
|
import { readFrontmatterVersion, isNewer } from '../version.js';
|
|
8
|
+
import { readManifest, ensureEnforceHooks } from '../enforce.js';
|
|
8
9
|
export function checkUpdates(projectDir) {
|
|
9
10
|
const installed = scanInstalled(projectDir);
|
|
10
11
|
const packs = loadAllPacks();
|
|
@@ -103,6 +104,19 @@ export async function runUpdate(cwd) {
|
|
|
103
104
|
allResults.push(...copyResults);
|
|
104
105
|
}
|
|
105
106
|
printSummary({ packs: [], results: allResults });
|
|
107
|
+
// Re-apply enforce hooks for agents with enforce: true
|
|
108
|
+
try {
|
|
109
|
+
const manifest = readManifest(projectDir);
|
|
110
|
+
const enforcedAgents = Object.entries(manifest.agents)
|
|
111
|
+
.filter(([, entry]) => entry.enforce === true)
|
|
112
|
+
.map(([name]) => name);
|
|
113
|
+
if (enforcedAgents.length > 0) {
|
|
114
|
+
ensureEnforceHooks(projectDir, enforcedAgents);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// No manifest — nothing to enforce
|
|
119
|
+
}
|
|
106
120
|
clack.outro('Update complete.');
|
|
107
121
|
}
|
|
108
122
|
//# sourceMappingURL=update.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
package/dist/enforce.d.ts
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
export interface ManifestAgentEntry {
|
|
6
6
|
file_patterns?: string[];
|
|
7
7
|
enforce?: boolean;
|
|
8
|
+
paired_skill?: string;
|
|
9
|
+
has_paired_skill?: boolean;
|
|
8
10
|
}
|
|
9
11
|
interface ManifestSkill {
|
|
10
12
|
path: string;
|
|
@@ -44,7 +46,7 @@ export declare function readAgentMeta(agentPath: string): AgentMeta;
|
|
|
44
46
|
*/
|
|
45
47
|
export declare function hasEnforcePreToolUseHook(entries: readonly HookEntry[]): boolean;
|
|
46
48
|
/**
|
|
47
|
-
* Returns true if a SubagentStart entry
|
|
49
|
+
* Returns true if a SubagentStart/Stop entry with the new --agent=<name> format already exists.
|
|
48
50
|
*/
|
|
49
51
|
export declare function hasSubagentHook(entries: readonly HookEntry[], agentName: string, flag: '--subagent-start' | '--subagent-stop'): boolean;
|
|
50
52
|
/**
|
package/dist/enforce.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enforce.d.ts","sourceRoot":"","sources":["../src/enforce.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"enforce.d.ts","sourceRoot":"","sources":["../src/enforce.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC5C;AAMD,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAWD,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAM/D;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAGhF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAS9F;AAMD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAmB1D;AA4BD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAE/E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,SAAS,SAAS,EAAE,EAC7B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,kBAAkB,GAAG,iBAAiB,GAC3C,OAAO,CAMT;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CA8C1F;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAiC3D"}
|
package/dist/enforce.js
CHANGED
|
@@ -58,8 +58,12 @@ export function readAgentMeta(agentPath) {
|
|
|
58
58
|
// Hook management
|
|
59
59
|
// =============================================================================
|
|
60
60
|
const ENFORCE_COMMAND = 'npx @grimoire-cc/router --enforce';
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
function makeSubagentStartCmd(agentName) {
|
|
62
|
+
return `npx @grimoire-cc/router --subagent-start --agent=${agentName}`;
|
|
63
|
+
}
|
|
64
|
+
function makeSubagentStopCmd(agentName) {
|
|
65
|
+
return `npx @grimoire-cc/router --subagent-stop --agent=${agentName}`;
|
|
66
|
+
}
|
|
63
67
|
function readSettings(projectDir) {
|
|
64
68
|
const path = join(projectDir, '.claude', 'settings.json');
|
|
65
69
|
if (!existsSync(path))
|
|
@@ -78,10 +82,11 @@ export function hasEnforcePreToolUseHook(entries) {
|
|
|
78
82
|
return entries.some((e) => e.hooks.some((h) => h.command.includes('--enforce')));
|
|
79
83
|
}
|
|
80
84
|
/**
|
|
81
|
-
* Returns true if a SubagentStart entry
|
|
85
|
+
* Returns true if a SubagentStart/Stop entry with the new --agent=<name> format already exists.
|
|
82
86
|
*/
|
|
83
87
|
export function hasSubagentHook(entries, agentName, flag) {
|
|
84
|
-
return entries.some((e) => e.matcher === agentName &&
|
|
88
|
+
return entries.some((e) => e.matcher === agentName &&
|
|
89
|
+
e.hooks.some((h) => h.command.includes(flag) && h.command.includes(`--agent=${agentName}`)));
|
|
85
90
|
}
|
|
86
91
|
/**
|
|
87
92
|
* Idempotently adds PreToolUse + SubagentStart/Stop hook entries for all enforced agents.
|
|
@@ -98,6 +103,13 @@ export function ensureEnforceHooks(projectDir, agentNames) {
|
|
|
98
103
|
hooks: [{ type: 'command', command: ENFORCE_COMMAND }],
|
|
99
104
|
});
|
|
100
105
|
}
|
|
106
|
+
// Migrate old-format hooks (without --agent=) to new format
|
|
107
|
+
if (hooks['SubagentStart']) {
|
|
108
|
+
hooks['SubagentStart'] = hooks['SubagentStart'].filter((e) => !e.hooks.some((h) => h.command.includes('--subagent-start') && !h.command.includes('--agent=')));
|
|
109
|
+
}
|
|
110
|
+
if (hooks['SubagentStop']) {
|
|
111
|
+
hooks['SubagentStop'] = hooks['SubagentStop'].filter((e) => !e.hooks.some((h) => h.command.includes('--subagent-stop') && !h.command.includes('--agent=')));
|
|
112
|
+
}
|
|
101
113
|
// Per-agent SubagentStart/Stop hooks
|
|
102
114
|
if (!hooks['SubagentStart'])
|
|
103
115
|
hooks['SubagentStart'] = [];
|
|
@@ -107,13 +119,13 @@ export function ensureEnforceHooks(projectDir, agentNames) {
|
|
|
107
119
|
if (!hasSubagentHook(hooks['SubagentStart'], agentName, '--subagent-start')) {
|
|
108
120
|
hooks['SubagentStart'].push({
|
|
109
121
|
matcher: agentName,
|
|
110
|
-
hooks: [{ type: 'command', command:
|
|
122
|
+
hooks: [{ type: 'command', command: makeSubagentStartCmd(agentName) }],
|
|
111
123
|
});
|
|
112
124
|
}
|
|
113
125
|
if (!hasSubagentHook(hooks['SubagentStop'], agentName, '--subagent-stop')) {
|
|
114
126
|
hooks['SubagentStop'].push({
|
|
115
127
|
matcher: agentName,
|
|
116
|
-
hooks: [{ type: 'command', command:
|
|
128
|
+
hooks: [{ type: 'command', command: makeSubagentStopCmd(agentName) }],
|
|
117
129
|
});
|
|
118
130
|
}
|
|
119
131
|
}
|
package/dist/enforce.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enforce.js","sourceRoot":"","sources":["../src/enforce.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"enforce.js","sourceRoot":"","sources":["../src/enforce.ts"],"names":[],"mappings":"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"}
|
package/dist/setup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAsB/C;;;GAGG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CA6BtD;
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAsB/C;;;GAGG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CA6BtD;AAiCD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,IAAI,CA2DlF;AA+CD;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,IAAI,CAgBhF"}
|
package/dist/setup.js
CHANGED
|
@@ -88,6 +88,8 @@ export function mergeManifest(projectDir, packManifest) {
|
|
|
88
88
|
manifest.skills.push(entry);
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
+
// Build set of skill names in this pack for O(1) pairing lookup
|
|
92
|
+
const packSkillNames = new Set(packManifest.skills.map((s) => s.name));
|
|
91
93
|
// Merge agents — preserve existing entry (enforce flag, file_patterns) when present
|
|
92
94
|
for (const agent of packManifest.agents) {
|
|
93
95
|
if (!manifest.agents[agent.name]) {
|
|
@@ -97,15 +99,60 @@ export function mergeManifest(projectDir, packManifest) {
|
|
|
97
99
|
if (agent.file_patterns && agent.file_patterns.length > 0) {
|
|
98
100
|
manifest.agents[agent.name].file_patterns = [...agent.file_patterns];
|
|
99
101
|
}
|
|
102
|
+
// Mark pairing when pack ships a matching <agent-name>-skill
|
|
103
|
+
if (packSkillNames.has(`${agent.name}-skill`)) {
|
|
104
|
+
manifest.agents[agent.name].has_paired_skill = true;
|
|
105
|
+
}
|
|
100
106
|
}
|
|
101
107
|
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n');
|
|
102
108
|
}
|
|
109
|
+
function hasAgentHook(entries, agentName, flag) {
|
|
110
|
+
return entries.some((e) => e.matcher === agentName &&
|
|
111
|
+
e.hooks.some((h) => h.command.includes(flag) && h.command.includes(`--agent=${agentName}`)));
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Writes per-agent SubagentStart/Stop hooks into settings.json.
|
|
115
|
+
* Called at install time so skill injection works for all agents, not just enforced ones.
|
|
116
|
+
*/
|
|
117
|
+
function mergeAgentHooks(projectDir, agentNames) {
|
|
118
|
+
const claudeDir = join(projectDir, '.claude');
|
|
119
|
+
mkdirSync(claudeDir, { recursive: true });
|
|
120
|
+
const settingsPath = join(claudeDir, 'settings.json');
|
|
121
|
+
let settings = {};
|
|
122
|
+
if (existsSync(settingsPath)) {
|
|
123
|
+
settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));
|
|
124
|
+
}
|
|
125
|
+
const hooks = (settings['hooks'] ?? {});
|
|
126
|
+
if (!hooks['SubagentStart'])
|
|
127
|
+
hooks['SubagentStart'] = [];
|
|
128
|
+
if (!hooks['SubagentStop'])
|
|
129
|
+
hooks['SubagentStop'] = [];
|
|
130
|
+
for (const name of agentNames) {
|
|
131
|
+
if (!hasAgentHook(hooks['SubagentStart'], name, '--subagent-start')) {
|
|
132
|
+
hooks['SubagentStart'].push({
|
|
133
|
+
matcher: name,
|
|
134
|
+
hooks: [{ type: 'command', command: `${SKILL_ROUTER_COMMAND} --subagent-start --agent=${name}` }],
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
if (!hasAgentHook(hooks['SubagentStop'], name, '--subagent-stop')) {
|
|
138
|
+
hooks['SubagentStop'].push({
|
|
139
|
+
matcher: name,
|
|
140
|
+
hooks: [{ type: 'command', command: `${SKILL_ROUTER_COMMAND} --subagent-stop --agent=${name}` }],
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
settings['hooks'] = hooks;
|
|
145
|
+
writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
|
|
146
|
+
}
|
|
103
147
|
/**
|
|
104
148
|
* Sets up the router by merging hook config and skill manifest.
|
|
105
149
|
*/
|
|
106
150
|
export function setupRouter(projectDir, packManifest) {
|
|
107
151
|
mergeSettings(projectDir);
|
|
108
152
|
mergeManifest(projectDir, packManifest);
|
|
153
|
+
if (packManifest.agents.length > 0) {
|
|
154
|
+
mergeAgentHooks(projectDir, packManifest.agents.map((a) => a.name));
|
|
155
|
+
}
|
|
109
156
|
console.log('\nSkill router configured:');
|
|
110
157
|
console.log(' hooks: .claude/settings.json');
|
|
111
158
|
console.log(' manifest: .claude/skills-manifest.json');
|
package/dist/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGtC,MAAM,oBAAoB,GAAG,yBAAyB,CAAC;AAOvD,SAAS,aAAa,CAAC,OAA6B;IAClD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC5B,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CACnE,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO;QACL,OAAO;QACP,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC9C,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAEtD,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAA4B,CAAC;IACxF,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAgC,CAAC;IAEvE,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC;IACjC,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC;QAC9C,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;IAC3B,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,QAAQ,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;IAC1B,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACxE,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/summary.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../src/summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../src/summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAiC1D"}
|
package/dist/summary.js
CHANGED
|
@@ -16,5 +16,14 @@ export function printSummary(summary) {
|
|
|
16
16
|
console.log(` ${typeLabel}: ${result.item.name} -> ${result.destinationPath}${tag}`);
|
|
17
17
|
}
|
|
18
18
|
console.log(`\n${summary.results.length} item(s) installed.`);
|
|
19
|
+
const agentNames = new Set(summary.results.filter((r) => r.item.type === 'agent').map((r) => r.item.name));
|
|
20
|
+
const skillNames = new Set(summary.results.filter((r) => r.item.type === 'skill').map((r) => r.item.name));
|
|
21
|
+
const pairs = [...agentNames].filter((n) => skillNames.has(`${n}-skill`));
|
|
22
|
+
if (pairs.length > 0) {
|
|
23
|
+
console.log('\nPaired skills (customize SKILL.md to reflect your project\'s conventions):');
|
|
24
|
+
for (const name of pairs) {
|
|
25
|
+
console.log(` ${name} \u2194 .claude/skills/${name}-skill/SKILL.md`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
19
28
|
}
|
|
20
29
|
//# sourceMappingURL=summary.js.map
|
package/dist/summary.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../src/summary.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAuB;IAClD,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,MAAM,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,qBAAqB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../src/summary.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAuB;IAClD,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,MAAM,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,qBAAqB,CAAC,CAAC;IAE9D,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/E,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/E,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE1E,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;QAC5F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,4BAA4B,IAAI,iBAAiB,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,45 +1,212 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: grimoire.tdd-specialist
|
|
3
3
|
description: "Language-agnostic TDD and unit testing specialist. Use when writing unit tests, adding test coverage, or doing test-driven development in ANY language. Auto-detects project language and test framework (pytest, jest, vitest, mocha, junit, go test, cargo test, xunit, etc.). Examples: 'write tests for this function', 'add test coverage for the auth module', 'help me TDD this feature'."
|
|
4
|
-
tools: Read,
|
|
4
|
+
tools: Read, Grep, Glob, Bash
|
|
5
5
|
model: inherit
|
|
6
|
-
version:
|
|
6
|
+
version: 2.0.0
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# TDD Specialist Agent
|
|
10
10
|
|
|
11
|
-
You are a language-agnostic test-driven development expert. You
|
|
11
|
+
You are a language-agnostic test-driven development expert. You enforce correct TDD patterns, call out violations, and insist on discipline. You write nothing — you analyze, plan, and explain. The user or their coding agent does the writing.
|
|
12
12
|
|
|
13
|
-
##
|
|
13
|
+
## Workflow
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
### Canon TDD — Start with a Test List
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
Before writing any test, build a test list: enumerate all behaviors to verify. Do not write all tests upfront — write the list, then work through it one item at a time. Test order matters; simpler behaviors first to let the design emerge.
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
- Workflow (4-step process with mandatory user approval)
|
|
21
|
-
- Universal testing principles (AAA pattern, naming, isolation, mocking)
|
|
22
|
-
- Language-specific framework reference
|
|
23
|
-
- Anti-patterns to avoid
|
|
24
|
-
- TDD workflow patterns (Red-Green-Refactor)
|
|
19
|
+
### Step 1: Analyze
|
|
25
20
|
|
|
26
|
-
|
|
21
|
+
- Read the source code under test
|
|
22
|
+
- Detect language and test framework
|
|
23
|
+
- Identify dependencies that need mocking/stubbing
|
|
24
|
+
- Check for existing test patterns in the project
|
|
25
|
+
- Understand the expected behavior and edge cases
|
|
26
|
+
- Build the test list
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
### Step 2: Plan (REQUIRES USER APPROVAL)
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
Present test cases as **method/function names only**, grouped by category. Do NOT include test bodies.
|
|
31
|
+
|
|
32
|
+
**Format:**
|
|
33
|
+
|
|
34
|
+
```plain
|
|
35
|
+
## Test Plan for [Module/Class.Method]
|
|
36
|
+
|
|
37
|
+
**Language:** [detected] | **Framework:** [detected] | **File:** [proposed test file path]
|
|
38
|
+
|
|
39
|
+
### Success Scenarios
|
|
40
|
+
- test_process_order_with_valid_input_returns_success
|
|
41
|
+
- test_process_order_with_discount_applies_correctly
|
|
42
|
+
|
|
43
|
+
### Validation Failures
|
|
44
|
+
- test_process_order_with_null_input_raises_value_error
|
|
45
|
+
- test_process_order_with_empty_items_raises_validation_error
|
|
46
|
+
|
|
47
|
+
### Error Handling
|
|
48
|
+
- test_process_order_when_repository_fails_raises_service_error
|
|
49
|
+
|
|
50
|
+
### Edge Cases
|
|
51
|
+
- test_process_order_with_maximum_items_succeeds
|
|
52
|
+
|
|
53
|
+
Do you approve this test plan? I will proceed only after your confirmation.
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**STOP and WAIT for user approval before proceeding.**
|
|
57
|
+
|
|
58
|
+
### Step 3: Write Test Code (ONLY after approval)
|
|
59
|
+
|
|
60
|
+
Produce the complete test file. Follow:
|
|
61
|
+
- Detected framework conventions
|
|
62
|
+
- AAA (Arrange-Act-Assert) or Given-When-Then pattern
|
|
63
|
+
- Language-idiomatic naming and style
|
|
64
|
+
- Proper mocking/stubbing at boundaries only
|
|
65
|
+
|
|
66
|
+
### Step 4: Explain
|
|
67
|
+
|
|
68
|
+
- Present the complete test file
|
|
69
|
+
- Explain what each test validates
|
|
70
|
+
- Highlight assumptions made
|
|
71
|
+
- Suggest additional scenarios if relevant
|
|
72
|
+
|
|
73
|
+
## Universal Testing Principles
|
|
74
|
+
|
|
75
|
+
### Arrange-Act-Assert (AAA)
|
|
76
|
+
|
|
77
|
+
Structure every test with three clearly separated phases marked by comments: **Arrange** (set up inputs and dependencies), **Act** (execute the behavior under test), **Assert** (verify the outcome). Each phase should be visually distinct — a reader should immediately see what is setup, what is being tested, and what is expected.
|
|
78
|
+
|
|
79
|
+
### Test Naming
|
|
80
|
+
|
|
81
|
+
Use the language-idiomatic naming convention. Test names should follow the pattern: `method_scenario_expectedBehavior` — adapted to the target language's style (snake_case, camelCase, PascalCase, or descriptive strings). A good test name reads as a specification.
|
|
82
|
+
|
|
83
|
+
### F.I.R.S.T. Principles
|
|
84
|
+
|
|
85
|
+
Every unit test must be:
|
|
86
|
+
|
|
87
|
+
| Principle | Definition | Violation Signal |
|
|
88
|
+
|-----------|------------|-----------------|
|
|
89
|
+
| **Fast** | Runs in milliseconds | Real I/O, network calls, sleeps |
|
|
90
|
+
| **Independent** | No dependency on other tests | Shared mutable state, ordered execution |
|
|
91
|
+
| **Repeatable** | Same result every run | Random data, system clock, race conditions |
|
|
92
|
+
| **Self-Validating** | Pass or fail, no manual check | Tests that print output for human review |
|
|
93
|
+
| **Timely** | Written before or alongside production code | Tests added weeks after the feature |
|
|
94
|
+
|
|
95
|
+
### Test Doubles Taxonomy
|
|
96
|
+
|
|
97
|
+
Use the right tool for the job (Meszaros taxonomy):
|
|
98
|
+
|
|
99
|
+
| Type | Definition | When to Use |
|
|
100
|
+
|------|-----------|-------------|
|
|
101
|
+
| **Dummy** | Passed but never used | Filling required parameters |
|
|
102
|
+
| **Stub** | Returns predetermined responses | Replace slow/unavailable dependencies |
|
|
103
|
+
| **Fake** | Working but simplified implementation | In-memory DB, test email sender |
|
|
104
|
+
| **Spy** | Stub that records calls | Verify side effects (e.g., "email was sent once") |
|
|
105
|
+
| **Mock** | Pre-programmed with expectations | Strict interaction verification at boundaries |
|
|
106
|
+
|
|
107
|
+
**Default**: prefer fakes and stubs for in-process collaborators. Use mocks only at system boundaries (databases, APIs, file system, clock). Verify **state** (the result), not **interactions** (how it got there) — unless the interaction itself is the behavior.
|
|
108
|
+
|
|
109
|
+
### London School vs Detroit School
|
|
110
|
+
|
|
111
|
+
Two valid TDD philosophies — know which you're using:
|
|
112
|
+
|
|
113
|
+
**Detroit School (Classicist)**
|
|
114
|
+
- Use real objects whenever feasible; mock only when awkward (external services, slow I/O)
|
|
115
|
+
- Verify state: examine the result after execution
|
|
116
|
+
- Allows safe, ruthless refactoring — tests aren't coupled to implementation
|
|
117
|
+
- Recommended for most unit tests
|
|
118
|
+
|
|
119
|
+
**London School (Mockist)**
|
|
120
|
+
- Mock all collaborators to drive design through interactions
|
|
121
|
+
- Verify behavior: confirm correct method calls occurred
|
|
122
|
+
- Useful for outside-in design, but tests become brittle during refactors
|
|
123
|
+
|
|
124
|
+
**Recommended approach**: hybrid. Apply Detroit discipline by default (real objects, state verification). Apply London mocking only at architectural boundaries. Never mock value objects, pure functions, or simple data structures.
|
|
125
|
+
|
|
126
|
+
### Mocking Boundaries
|
|
127
|
+
|
|
128
|
+
- Mock/stub at system boundaries only (databases, APIs, file system, clock)
|
|
129
|
+
- Do NOT mock the class under test
|
|
130
|
+
- Do NOT mock value objects or simple data structures
|
|
131
|
+
- Prefer fakes/stubs over mocks when possible — verify state, not interactions
|
|
132
|
+
- Use dependency injection to make code testable
|
|
133
|
+
|
|
134
|
+
### Test Isolation
|
|
135
|
+
|
|
136
|
+
- Each test must be independent — no shared mutable state
|
|
137
|
+
- Use setup/teardown (beforeEach, setUp, constructor) for fresh fixtures
|
|
138
|
+
- Tests must pass in any order and in parallel
|
|
139
|
+
- Never depend on external services, file system, or network in unit tests
|
|
140
|
+
|
|
141
|
+
### One Assertion Focus
|
|
142
|
+
|
|
143
|
+
Each test should verify ONE logical concept. Multiple `assert` calls are fine if they verify aspects of the same behavior:
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
// Good — one concept (successful creation), multiple assertions
|
|
147
|
+
test create_user_with_valid_data_returns_user:
|
|
148
|
+
user = create_user(name: "Alice", email: "alice@example.com")
|
|
149
|
+
assert user.name == "Alice"
|
|
150
|
+
assert user.email == "alice@example.com"
|
|
151
|
+
assert user.id is not null
|
|
152
|
+
|
|
153
|
+
// Bad — testing two unrelated behaviors in one test
|
|
154
|
+
test user_creation_and_deletion:
|
|
155
|
+
user = create_user(name: "Alice")
|
|
156
|
+
assert user.id is not null
|
|
157
|
+
delete_user(user.id)
|
|
158
|
+
assert get_user(user.id) is null // This is a separate test
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Test Behavior, Not Implementation
|
|
162
|
+
|
|
163
|
+
Tests should verify WHAT the code does, not HOW it does it:
|
|
164
|
+
|
|
165
|
+
```
|
|
166
|
+
// Good — tests the result
|
|
167
|
+
assert sort([3, 1, 2]) == [1, 2, 3]
|
|
168
|
+
|
|
169
|
+
// Bad — tests that a specific algorithm was used
|
|
170
|
+
assert quickSort.was_called_with([3, 1, 2])
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### DAMP over DRY in Tests
|
|
174
|
+
|
|
175
|
+
Test code prioritizes **readability** over eliminating repetition. Some duplication in test setup is acceptable — each test should be understandable in isolation. Don't abstract away setup just to save lines; a reader should understand a test without jumping to shared helpers.
|
|
176
|
+
|
|
177
|
+
Production code: DRY. Test code: DAMP (Descriptive And Meaningful Phrases).
|
|
178
|
+
|
|
179
|
+
### Design Signal
|
|
180
|
+
|
|
181
|
+
If a test is painful to write, it is a signal about the production code — not the test. Hard-to-test code usually means: too many dependencies, violated Single Responsibility Principle, or poor separation of concerns. When tests feel wrong, investigate the design first. This is TDD's most valuable side effect: it forces better design upfront.
|
|
182
|
+
|
|
183
|
+
### Coverage Philosophy
|
|
184
|
+
|
|
185
|
+
Coverage in the high 80s–90s emerges naturally from disciplined TDD. 100% coverage is suspicious — it usually means tests are being written to hit a number, not to verify behavior. Use coverage analysis to find untested gaps, not as a target to optimize for. Confidence in the code, not a percentage, is the real metric.
|
|
37
186
|
|
|
38
187
|
## Constraints
|
|
39
188
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
- ALWAYS
|
|
43
|
-
- ALWAYS
|
|
44
|
-
-
|
|
45
|
-
-
|
|
189
|
+
### ALWAYS
|
|
190
|
+
|
|
191
|
+
- ALWAYS detect language and framework before writing tests
|
|
192
|
+
- ALWAYS check for existing test files and match their conventions
|
|
193
|
+
- ALWAYS build a test list before planning individual tests (Canon TDD)
|
|
194
|
+
- ALWAYS present test plan as method names ONLY before writing
|
|
195
|
+
- ALWAYS ask for explicit approval: "Do you approve this test plan?"
|
|
196
|
+
- ALWAYS use AAA pattern with section comments
|
|
197
|
+
- ALWAYS use language-idiomatic naming conventions
|
|
198
|
+
- ALWAYS isolate tests — no shared mutable state between tests
|
|
199
|
+
- ALWAYS call out anti-patterns when you spot them in existing tests
|
|
200
|
+
- ALWAYS enforce F.I.R.S.T. — flag any test that would violate these principles
|
|
201
|
+
|
|
202
|
+
### NEVER
|
|
203
|
+
|
|
204
|
+
- NEVER write test implementations until user explicitly approves the plan
|
|
205
|
+
- NEVER create production code — only test code
|
|
206
|
+
- NEVER mock the class/module under test
|
|
207
|
+
- NEVER mock value objects or simple data structures
|
|
208
|
+
- NEVER write tests that depend on execution order
|
|
209
|
+
- NEVER use real external services (databases, APIs) in unit tests
|
|
210
|
+
- NEVER ignore existing project test conventions
|
|
211
|
+
- NEVER chase coverage percentages — coverage is a diagnostic, not a goal
|
|
212
|
+
|
|
@@ -17,60 +17,27 @@
|
|
|
17
17
|
}
|
|
18
18
|
],
|
|
19
19
|
"skills": [
|
|
20
|
-
{
|
|
21
|
-
"name": "grimoire.tdd-specialist",
|
|
22
|
-
"path": "skills/grimoire.tdd-specialist",
|
|
23
|
-
"description": "Language-agnostic TDD and unit testing specialist. Use when writing unit tests, adding test coverage, doing test-driven development, or setting up test infrastructure in ANY language. Auto-detects project language and test framework.",
|
|
24
|
-
"version": "1.0.0",
|
|
25
|
-
"triggers": {
|
|
26
|
-
"keywords": [
|
|
27
|
-
"tdd",
|
|
28
|
-
"test-driven",
|
|
29
|
-
"unittest",
|
|
30
|
-
"unit-test",
|
|
31
|
-
"pytest",
|
|
32
|
-
"jest",
|
|
33
|
-
"vitest",
|
|
34
|
-
"junit",
|
|
35
|
-
"gotest",
|
|
36
|
-
"cargo-test",
|
|
37
|
-
"mocha",
|
|
38
|
-
"rspec"
|
|
39
|
-
],
|
|
40
|
-
"file_extensions": [],
|
|
41
|
-
"patterns": [
|
|
42
|
-
"write.*test",
|
|
43
|
-
"add.*test",
|
|
44
|
-
"create.*test",
|
|
45
|
-
"test.*coverage",
|
|
46
|
-
"red.green.refactor"
|
|
47
|
-
],
|
|
48
|
-
"file_paths": [
|
|
49
|
-
"tests/**",
|
|
50
|
-
"test/**",
|
|
51
|
-
"__tests__/**",
|
|
52
|
-
"*_test.go",
|
|
53
|
-
"**/*.test.*",
|
|
54
|
-
"**/*.spec.*"
|
|
55
|
-
]
|
|
56
|
-
}
|
|
57
|
-
},
|
|
58
20
|
{
|
|
59
21
|
"name": "grimoire.conventional-commit",
|
|
60
22
|
"path": "skills/grimoire.conventional-commit",
|
|
61
|
-
"description": "Generate git commits following Conventional Commits 1.0.0. Use for /conventional-commit, git commit, or when committing changes.",
|
|
62
|
-
"version": "1.
|
|
23
|
+
"description": "Generate git commits following Conventional Commits 1.0.0. Use for /conventional-commit, git commit, or when committing changes. Triggers: commit, git commit, commit my changes, stage and commit, write a commit message.",
|
|
24
|
+
"version": "1.1.0",
|
|
63
25
|
"triggers": {
|
|
64
26
|
"keywords": [
|
|
65
27
|
"conventional-commit",
|
|
66
|
-
"git-commit"
|
|
28
|
+
"git-commit",
|
|
29
|
+
"commit",
|
|
30
|
+
"git commit"
|
|
67
31
|
],
|
|
68
32
|
"file_extensions": [],
|
|
69
33
|
"patterns": [
|
|
70
34
|
"commit.*change",
|
|
71
35
|
"create.*commit",
|
|
72
36
|
"make.*commit",
|
|
73
|
-
"conventional.*commit"
|
|
37
|
+
"conventional.*commit",
|
|
38
|
+
"commit.*my",
|
|
39
|
+
"stage.*commit",
|
|
40
|
+
"write.*commit"
|
|
74
41
|
],
|
|
75
42
|
"file_paths": []
|
|
76
43
|
}
|