hool-cli 0.6.2 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/agents/claude/be-dev.md +9 -1
  2. package/agents/claude/be-tech-lead.md +8 -0
  3. package/agents/claude/fe-dev.md +9 -1
  4. package/agents/claude/fe-tech-lead.md +8 -0
  5. package/agents/claude/forensic.md +8 -0
  6. package/agents/claude/governor.md +8 -0
  7. package/agents/claude/qa.md +8 -0
  8. package/dist/adapters/adapters.test.d.ts +1 -0
  9. package/dist/adapters/adapters.test.js +189 -0
  10. package/dist/adapters/adapters.test.js.map +1 -0
  11. package/dist/adapters/claude-code.js +22 -13
  12. package/dist/adapters/claude-code.js.map +1 -1
  13. package/dist/core/scaffold.d.ts +3 -0
  14. package/dist/core/scaffold.js +88 -10
  15. package/dist/core/scaffold.js.map +1 -1
  16. package/dist/core/scaffold.test.d.ts +1 -0
  17. package/dist/core/scaffold.test.js +329 -0
  18. package/dist/core/scaffold.test.js.map +1 -0
  19. package/dist/core/templates.js +2 -2
  20. package/dist/core/templates.js.map +1 -1
  21. package/dist/core/templates.test.d.ts +1 -0
  22. package/dist/core/templates.test.js +146 -0
  23. package/dist/core/templates.test.js.map +1 -0
  24. package/dist/e2e.test.d.ts +1 -0
  25. package/dist/e2e.test.js +161 -0
  26. package/dist/e2e.test.js.map +1 -0
  27. package/dist/index.js +5 -23
  28. package/dist/index.js.map +1 -1
  29. package/dist/mcps/mcps.test.d.ts +1 -0
  30. package/dist/mcps/mcps.test.js +110 -0
  31. package/dist/mcps/mcps.test.js.map +1 -0
  32. package/hooks/inject-pl-context.sh +22 -3
  33. package/hooks/suggest-compact.sh +8 -12
  34. package/hooks/track-prompt-count.sh +24 -22
  35. package/package.json +13 -3
  36. package/prompts/agents/05-fe-tech-lead.md +5 -2
  37. package/prompts/agents/06-be-tech-lead.md +5 -2
  38. package/prompts/agents/08-be-dev.md +4 -1
  39. package/prompts/agents/08-fe-dev.md +4 -1
  40. package/prompts/agents/10-qa.md +1 -0
  41. package/prompts/agents/11-forensic.md +1 -0
  42. package/prompts/agents/governor.md +3 -2
  43. package/prompts/orchestrator.md +130 -38
  44. package/prompts/skills/01-brainstorm.md +5 -0
  45. package/prompts/skills/02-spec.md +5 -0
  46. package/prompts/skills/03-design.md +5 -0
  47. package/prompts/skills/04-architecture.md +5 -0
  48. package/settings/be-dev.json +17 -0
  49. package/settings/be-tech-lead.json +17 -0
  50. package/settings/fe-dev.json +17 -0
  51. package/settings/fe-tech-lead.json +17 -0
  52. package/settings/forensic.json +17 -0
  53. package/settings/governor.json +17 -0
  54. package/settings/qa.json +17 -0
@@ -59,6 +59,7 @@ export async function scaffoldProject(projectDir, projectType, mode = 'interacti
59
59
  await fs.mkdir(path.join(projectDir, '.hool/operations'), { recursive: true });
60
60
  await fs.mkdir(path.join(projectDir, '.hool/operations/context'), { recursive: true });
61
61
  await fs.mkdir(path.join(projectDir, '.hool/operations/dispatch'), { recursive: true });
62
+ await fs.mkdir(path.join(projectDir, '.hool/operations/logs'), { recursive: true });
62
63
  const opTemplates = getOperationTemplates(mode);
63
64
  for (const [filename, content] of Object.entries(opTemplates)) {
64
65
  await fs.writeFile(path.join(projectDir, '.hool/operations', filename), content, 'utf-8');
@@ -73,10 +74,11 @@ export async function scaffoldProject(projectDir, projectType, mode = 'interacti
73
74
  }
74
75
  }
75
76
  // Create .hool directories
76
- await fs.mkdir(path.join(projectDir, '.hool/prompts'), { recursive: true });
77
+ await fs.mkdir(path.join(projectDir, '.hool/checklists'), { recursive: true });
77
78
  await fs.mkdir(path.join(projectDir, '.hool/hooks'), { recursive: true });
78
79
  await fs.mkdir(path.join(projectDir, '.hool/logs'), { recursive: true });
79
80
  await fs.mkdir(path.join(projectDir, '.hool/metrics'), { recursive: true });
81
+ await fs.mkdir(path.join(projectDir, '.hool/settings'), { recursive: true });
80
82
  // NOTE: src/, tests/ are NOT created here.
81
83
  // Those are project concerns decided during architecture (Phase 4)
82
84
  // and scaffolded by Tech Leads during Phases 5-6 (LLD).
@@ -95,6 +97,7 @@ export async function scaffoldOnboard(projectDir, projectType, mode = 'interacti
95
97
  await fs.mkdir(path.join(projectDir, '.hool/operations'), { recursive: true });
96
98
  await fs.mkdir(path.join(projectDir, '.hool/operations/context'), { recursive: true });
97
99
  await fs.mkdir(path.join(projectDir, '.hool/operations/dispatch'), { recursive: true });
100
+ await fs.mkdir(path.join(projectDir, '.hool/operations/logs'), { recursive: true });
98
101
  const opTemplates = getOnboardOperationTemplates(mode);
99
102
  for (const [filename, content] of Object.entries(opTemplates)) {
100
103
  await fs.writeFile(path.join(projectDir, '.hool/operations', filename), content, 'utf-8');
@@ -109,10 +112,11 @@ export async function scaffoldOnboard(projectDir, projectType, mode = 'interacti
109
112
  }
110
113
  }
111
114
  // Create .hool directories
112
- await fs.mkdir(path.join(projectDir, '.hool/prompts'), { recursive: true });
115
+ await fs.mkdir(path.join(projectDir, '.hool/checklists'), { recursive: true });
113
116
  await fs.mkdir(path.join(projectDir, '.hool/hooks'), { recursive: true });
114
117
  await fs.mkdir(path.join(projectDir, '.hool/logs'), { recursive: true });
115
118
  await fs.mkdir(path.join(projectDir, '.hool/metrics'), { recursive: true });
119
+ await fs.mkdir(path.join(projectDir, '.hool/settings'), { recursive: true });
116
120
  }
117
121
  export async function reonboard(projectDir, mode = 'interactive') {
118
122
  // Only overwrite current-phase.md and prepend onboard tasks to task-board.md
@@ -131,7 +135,9 @@ export async function reonboard(projectDir, mode = 'interactive') {
131
135
  const body = existing.startsWith('# Task Board') ? existing.replace(/^# Task Board\n*/, '') : existing;
132
136
  await fs.writeFile(taskBoardPath, header + prepend + body, 'utf-8');
133
137
  }
138
+ /** @deprecated Use copySkills + copyChecklists instead */
134
139
  export async function copyPrompts(projectDir, promptsSourceDir) {
140
+ // Legacy: copies all prompts to .hool/prompts/ — kept for backwards compat
135
141
  const hoolPromptsDir = path.join(projectDir, '.hool/prompts');
136
142
  async function copyDir(src, dest) {
137
143
  await fs.mkdir(dest, { recursive: true });
@@ -149,6 +155,35 @@ export async function copyPrompts(projectDir, promptsSourceDir) {
149
155
  }
150
156
  await copyDir(promptsSourceDir, hoolPromptsDir);
151
157
  }
158
+ export async function copySkills(projectDir, promptsSourceDir) {
159
+ const skillsSourceDir = path.join(promptsSourceDir, 'skills');
160
+ try {
161
+ const entries = await fs.readdir(skillsSourceDir);
162
+ for (const entry of entries) {
163
+ if (!entry.endsWith('.md'))
164
+ continue;
165
+ const skillName = entry.replace(/^\d+-/, '').replace('.md', ''); // "01-brainstorm.md" -> "brainstorm"
166
+ const skillDir = path.join(projectDir, '.claude/skills', skillName);
167
+ await fs.mkdir(skillDir, { recursive: true });
168
+ await fs.copyFile(path.join(skillsSourceDir, entry), path.join(skillDir, 'SKILL.md'));
169
+ }
170
+ }
171
+ catch { /* skills dir doesn't exist */ }
172
+ }
173
+ export async function copyChecklists(projectDir, promptsSourceDir) {
174
+ const checklistsSourceDir = path.join(promptsSourceDir, 'checklists');
175
+ const checklistsDest = path.join(projectDir, '.hool/checklists');
176
+ await fs.mkdir(checklistsDest, { recursive: true });
177
+ try {
178
+ const entries = await fs.readdir(checklistsSourceDir);
179
+ for (const entry of entries) {
180
+ if (!entry.endsWith('.md'))
181
+ continue;
182
+ await fs.copyFile(path.join(checklistsSourceDir, entry), path.join(checklistsDest, entry));
183
+ }
184
+ }
185
+ catch { /* checklists dir doesn't exist */ }
186
+ }
152
187
  export async function writeMcpManifest(projectDir, projectType, requiredMcps) {
153
188
  const servers = {};
154
189
  for (const name of requiredMcps) {
@@ -168,7 +203,7 @@ const AGENT_MANIFEST = [
168
203
  {
169
204
  name: 'product-lead',
170
205
  role: 'Vision, contracts, doc consistency, phase gating, agent dispatch',
171
- prompt: '.hool/prompts/orchestrator.md',
206
+ prompt: 'CLAUDE.md',
172
207
  'agent-definition': { 'claude-code': null, cursor: null },
173
208
  memory: '.hool/memory/product-lead/',
174
209
  phases: [0, 1, 2, 3, 4, 12],
@@ -176,7 +211,7 @@ const AGENT_MANIFEST = [
176
211
  {
177
212
  name: 'fe-tech-lead',
178
213
  role: 'FE scaffold, LLD, code review, code-vs-doc consistency',
179
- prompt: '.hool/prompts/agents/05-fe-tech-lead.md',
214
+ prompt: '.claude/agents/fe-tech-lead.md',
180
215
  'agent-definition': { 'claude-code': '.claude/agents/fe-tech-lead.md', cursor: '.cursor/agents/fe-tech-lead.md' },
181
216
  'cursor-rule': '.cursor/rules/fe-tech-lead.mdc',
182
217
  memory: '.hool/memory/fe-tech-lead/',
@@ -185,7 +220,7 @@ const AGENT_MANIFEST = [
185
220
  {
186
221
  name: 'be-tech-lead',
187
222
  role: 'BE scaffold, LLD, code review, code-vs-doc consistency',
188
- prompt: '.hool/prompts/agents/06-be-tech-lead.md',
223
+ prompt: '.claude/agents/be-tech-lead.md',
189
224
  'agent-definition': { 'claude-code': '.claude/agents/be-tech-lead.md', cursor: '.cursor/agents/be-tech-lead.md' },
190
225
  'cursor-rule': '.cursor/rules/be-tech-lead.mdc',
191
226
  memory: '.hool/memory/be-tech-lead/',
@@ -194,7 +229,7 @@ const AGENT_MANIFEST = [
194
229
  {
195
230
  name: 'fe-dev',
196
231
  role: 'Frontend implementation',
197
- prompt: '.hool/prompts/agents/08-fe-dev.md',
232
+ prompt: '.claude/agents/fe-dev.md',
198
233
  'agent-definition': { 'claude-code': '.claude/agents/fe-dev.md', cursor: '.cursor/agents/fe-dev.md' },
199
234
  'cursor-rule': '.cursor/rules/fe-dev.mdc',
200
235
  memory: '.hool/memory/fe-dev/',
@@ -203,7 +238,7 @@ const AGENT_MANIFEST = [
203
238
  {
204
239
  name: 'be-dev',
205
240
  role: 'Backend implementation',
206
- prompt: '.hool/prompts/agents/08-be-dev.md',
241
+ prompt: '.claude/agents/be-dev.md',
207
242
  'agent-definition': { 'claude-code': '.claude/agents/be-dev.md', cursor: '.cursor/agents/be-dev.md' },
208
243
  'cursor-rule': '.cursor/rules/be-dev.mdc',
209
244
  memory: '.hool/memory/be-dev/',
@@ -212,7 +247,7 @@ const AGENT_MANIFEST = [
212
247
  {
213
248
  name: 'qa',
214
249
  role: 'Test plan, test execution, bug reporting',
215
- prompt: '.hool/prompts/agents/10-qa.md',
250
+ prompt: '.claude/agents/qa.md',
216
251
  'agent-definition': { 'claude-code': '.claude/agents/qa.md', cursor: '.cursor/agents/qa.md' },
217
252
  'cursor-rule': '.cursor/rules/qa.mdc',
218
253
  memory: '.hool/memory/qa/',
@@ -221,7 +256,7 @@ const AGENT_MANIFEST = [
221
256
  {
222
257
  name: 'forensic',
223
258
  role: 'Root cause analysis, bug triage, fix routing',
224
- prompt: '.hool/prompts/agents/11-forensic.md',
259
+ prompt: '.claude/agents/forensic.md',
225
260
  'agent-definition': { 'claude-code': '.claude/agents/forensic.md', cursor: '.cursor/agents/forensic.md' },
226
261
  'cursor-rule': '.cursor/rules/forensic.mdc',
227
262
  memory: '.hool/memory/forensic/',
@@ -230,7 +265,7 @@ const AGENT_MANIFEST = [
230
265
  {
231
266
  name: 'governor',
232
267
  role: 'Behavioral auditor, rule enforcement, corrective feedback',
233
- prompt: '.hool/prompts/agents/governor.md',
268
+ prompt: '.claude/agents/governor.md',
234
269
  'agent-definition': { 'claude-code': '.claude/agents/governor.md', cursor: '.cursor/agents/governor.md' },
235
270
  'cursor-rule': '.cursor/rules/governor.mdc',
236
271
  memory: '.hool/memory/governor/',
@@ -307,6 +342,49 @@ export async function copyPlatformFiles(projectDir, templateRootDir, platform) {
307
342
  }
308
343
  }
309
344
  catch { /* ok */ }
345
+ // Copy skills to .claude/skills/
346
+ const skillsSrc = path.join(hoolMiniDir, 'prompts/skills');
347
+ try {
348
+ const skillEntries = await fs.readdir(skillsSrc);
349
+ for (const entry of skillEntries) {
350
+ if (!entry.endsWith('.md'))
351
+ continue;
352
+ const skillName = entry.replace(/^\d+-/, '').replace('.md', '');
353
+ const skillDir = path.join(projectDir, '.claude/skills', skillName);
354
+ await fs.mkdir(skillDir, { recursive: true });
355
+ await fs.copyFile(path.join(skillsSrc, entry), path.join(skillDir, 'SKILL.md'));
356
+ }
357
+ }
358
+ catch { /* ok */ }
359
+ // Copy checklists to .hool/checklists/
360
+ const checklistsSrc = path.join(hoolMiniDir, 'prompts/checklists');
361
+ const checklistsDest = path.join(projectDir, '.hool/checklists');
362
+ await fs.mkdir(checklistsDest, { recursive: true });
363
+ try {
364
+ const checklistEntries = await fs.readdir(checklistsSrc);
365
+ for (const entry of checklistEntries) {
366
+ if (!entry.endsWith('.md'))
367
+ continue;
368
+ await fs.copyFile(path.join(checklistsSrc, entry), path.join(checklistsDest, entry));
369
+ }
370
+ }
371
+ catch { /* ok */ }
372
+ // Copy per-role settings to .hool/settings/
373
+ const roleSettingsSrc = path.join(hoolMiniDir, 'settings');
374
+ const roleSettingsDest = path.join(projectDir, '.hool/settings');
375
+ await fs.mkdir(roleSettingsDest, { recursive: true });
376
+ try {
377
+ const settingsEntries = await fs.readdir(roleSettingsSrc);
378
+ for (const entry of settingsEntries) {
379
+ // Skip the PL settings file (claude-settings.json) — it goes to .claude/settings.json
380
+ if (entry === 'claude-settings.json')
381
+ continue;
382
+ if (!entry.endsWith('.json'))
383
+ continue;
384
+ await fs.copyFile(path.join(roleSettingsSrc, entry), path.join(roleSettingsDest, entry));
385
+ }
386
+ }
387
+ catch { /* ok */ }
310
388
  }
311
389
  if (platform === 'cursor') {
312
390
  // Copy .cursor/agents/*.md
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/core/scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/core/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,329 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import fs from 'fs/promises';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ import { scaffoldProject, scaffoldOnboard, reonboard, writeMcpManifest, writeAgentManifest, copyPlatformFiles, copySkills, copyChecklists, } from './scaffold.js';
6
+ let tmpDir;
7
+ beforeEach(async () => {
8
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'hool-test-'));
9
+ });
10
+ afterEach(async () => {
11
+ await fs.rm(tmpDir, { recursive: true, force: true });
12
+ });
13
+ describe('scaffoldProject', () => {
14
+ it('creates .hool/operations/ with all template files', async () => {
15
+ await scaffoldProject(tmpDir, 'web-app');
16
+ const files = await fs.readdir(path.join(tmpDir, '.hool/operations'));
17
+ expect(files).toContain('current-phase.md');
18
+ expect(files).toContain('task-board.md');
19
+ expect(files).toContain('bugs.md');
20
+ expect(files).toContain('issues.md');
21
+ expect(files).toContain('inconsistencies.md');
22
+ expect(files).toContain('needs-human-review.md');
23
+ expect(files).toContain('client-preferences.md');
24
+ expect(files).toContain('governor-rules.md');
25
+ expect(files).toContain('governor-log.md');
26
+ });
27
+ it('creates context and dispatch subdirs', async () => {
28
+ await scaffoldProject(tmpDir, 'web-app');
29
+ const stat1 = await fs.stat(path.join(tmpDir, '.hool/operations/context'));
30
+ const stat2 = await fs.stat(path.join(tmpDir, '.hool/operations/dispatch'));
31
+ expect(stat1.isDirectory()).toBe(true);
32
+ expect(stat2.isDirectory()).toBe(true);
33
+ });
34
+ it('creates memory dirs for all 8 agents', async () => {
35
+ await scaffoldProject(tmpDir, 'web-app');
36
+ const agents = ['product-lead', 'fe-tech-lead', 'be-tech-lead', 'fe-dev', 'be-dev', 'qa', 'forensic', 'governor'];
37
+ for (const agent of agents) {
38
+ const agentDir = path.join(tmpDir, '.hool/memory', agent);
39
+ const files = await fs.readdir(agentDir);
40
+ expect(files).toContain('hot.md');
41
+ expect(files).toContain('cold.md');
42
+ expect(files).toContain('best-practices.md');
43
+ expect(files).toContain('issues.md');
44
+ expect(files).toContain('governor-feedback.md');
45
+ }
46
+ });
47
+ it('creates project-profile.md with correct type and mode', async () => {
48
+ await scaffoldProject(tmpDir, 'cli-tool', 'full-hool');
49
+ const profile = await fs.readFile(path.join(tmpDir, '.hool/phases/00-init/project-profile.md'), 'utf-8');
50
+ expect(profile).toContain('cli-tool');
51
+ expect(profile).toContain('full-hool');
52
+ });
53
+ it('creates all phase directories for web-app', async () => {
54
+ await scaffoldProject(tmpDir, 'web-app');
55
+ const expectedDirs = [
56
+ '.hool/phases/00-init',
57
+ '.hool/phases/01-brainstorm',
58
+ '.hool/phases/02-spec/features',
59
+ '.hool/phases/03-design/cards',
60
+ '.hool/phases/03-design/flows',
61
+ '.hool/phases/04-architecture/contracts',
62
+ '.hool/phases/04-architecture/flows',
63
+ '.hool/phases/05-fe-scaffold/pages',
64
+ '.hool/phases/06-be-scaffold/services',
65
+ '.hool/phases/07-test-plan/cases',
66
+ ];
67
+ for (const dir of expectedDirs) {
68
+ const stat = await fs.stat(path.join(tmpDir, dir));
69
+ expect(stat.isDirectory()).toBe(true);
70
+ }
71
+ });
72
+ it('skips design and fe-scaffold for cli-tool', async () => {
73
+ await scaffoldProject(tmpDir, 'cli-tool');
74
+ // These should NOT exist
75
+ await expect(fs.access(path.join(tmpDir, '.hool/phases/03-design'))).rejects.toThrow();
76
+ await expect(fs.access(path.join(tmpDir, '.hool/phases/05-fe-scaffold'))).rejects.toThrow();
77
+ // These SHOULD exist
78
+ const stat = await fs.stat(path.join(tmpDir, '.hool/phases/06-be-scaffold/services'));
79
+ expect(stat.isDirectory()).toBe(true);
80
+ });
81
+ it('skips be-scaffold for animation', async () => {
82
+ await scaffoldProject(tmpDir, 'animation');
83
+ await expect(fs.access(path.join(tmpDir, '.hool/phases/06-be-scaffold'))).rejects.toThrow();
84
+ const stat = await fs.stat(path.join(tmpDir, '.hool/phases/05-fe-scaffold/pages'));
85
+ expect(stat.isDirectory()).toBe(true);
86
+ });
87
+ it('creates .hool utility directories', async () => {
88
+ await scaffoldProject(tmpDir, 'web-app');
89
+ for (const dir of ['checklists', 'hooks', 'logs', 'metrics', 'settings']) {
90
+ const stat = await fs.stat(path.join(tmpDir, '.hool', dir));
91
+ expect(stat.isDirectory()).toBe(true);
92
+ }
93
+ });
94
+ it('defaults to interactive mode', async () => {
95
+ await scaffoldProject(tmpDir, 'web-app');
96
+ const phase = await fs.readFile(path.join(tmpDir, '.hool/operations/current-phase.md'), 'utf-8');
97
+ expect(phase).toContain('interactive');
98
+ });
99
+ });
100
+ describe('scaffoldOnboard', () => {
101
+ it('creates .hool structure with onboarding phase', async () => {
102
+ await scaffoldOnboard(tmpDir, 'web-app');
103
+ const phase = await fs.readFile(path.join(tmpDir, '.hool/operations/current-phase.md'), 'utf-8');
104
+ expect(phase).toContain('onboarding');
105
+ });
106
+ it('creates task-board with ONBOARD tasks', async () => {
107
+ await scaffoldOnboard(tmpDir, 'web-app');
108
+ const board = await fs.readFile(path.join(tmpDir, '.hool/operations/task-board.md'), 'utf-8');
109
+ expect(board).toContain('ONBOARD-001');
110
+ expect(board).toContain('ONBOARD-011');
111
+ });
112
+ it('marks project-profile as onboarded', async () => {
113
+ await scaffoldOnboard(tmpDir, 'cli-tool', 'full-hool');
114
+ const profile = await fs.readFile(path.join(tmpDir, '.hool/phases/00-init/project-profile.md'), 'utf-8');
115
+ expect(profile).toContain('onboarded');
116
+ expect(profile).toContain('cli-tool');
117
+ expect(profile).toContain('full-hool');
118
+ });
119
+ it('respects skip phases same as init', async () => {
120
+ await scaffoldOnboard(tmpDir, 'api-only');
121
+ await expect(fs.access(path.join(tmpDir, '.hool/phases/03-design'))).rejects.toThrow();
122
+ await expect(fs.access(path.join(tmpDir, '.hool/phases/05-fe-scaffold'))).rejects.toThrow();
123
+ });
124
+ });
125
+ describe('reonboard', () => {
126
+ it('overwrites current-phase to onboarding', async () => {
127
+ await scaffoldProject(tmpDir, 'web-app');
128
+ // Verify it starts at phase 0
129
+ let phase = await fs.readFile(path.join(tmpDir, '.hool/operations/current-phase.md'), 'utf-8');
130
+ expect(phase).toContain('Phase**: 0');
131
+ await reonboard(tmpDir);
132
+ phase = await fs.readFile(path.join(tmpDir, '.hool/operations/current-phase.md'), 'utf-8');
133
+ expect(phase).toContain('onboarding');
134
+ });
135
+ it('prepends re-onboard tasks to existing task-board', async () => {
136
+ await scaffoldProject(tmpDir, 'web-app');
137
+ // Add a custom task
138
+ const taskBoardPath = path.join(tmpDir, '.hool/operations/task-board.md');
139
+ await fs.writeFile(taskBoardPath, '# Task Board\n\n## Active Tasks\n- [ ] TASK-099: Custom task | assigned: be-dev\n', 'utf-8');
140
+ await reonboard(tmpDir);
141
+ const board = await fs.readFile(taskBoardPath, 'utf-8');
142
+ expect(board).toContain('## Re-onboard Tasks');
143
+ expect(board).toContain('ONBOARD-001');
144
+ expect(board).toContain('TASK-099'); // preserved
145
+ });
146
+ it('works when no existing task-board', async () => {
147
+ await fs.mkdir(path.join(tmpDir, '.hool/operations'), { recursive: true });
148
+ await reonboard(tmpDir);
149
+ const board = await fs.readFile(path.join(tmpDir, '.hool/operations/task-board.md'), 'utf-8');
150
+ expect(board).toContain('# Task Board');
151
+ expect(board).toContain('ONBOARD-001');
152
+ });
153
+ });
154
+ describe('writeMcpManifest', () => {
155
+ it('writes valid JSON manifest', async () => {
156
+ await fs.mkdir(path.join(tmpDir, '.hool'), { recursive: true });
157
+ await writeMcpManifest(tmpDir, 'web-app', ['context7', 'playwright']);
158
+ const content = await fs.readFile(path.join(tmpDir, '.hool/mcps.json'), 'utf-8');
159
+ const manifest = JSON.parse(content);
160
+ expect(manifest.domain).toBe('web-app');
161
+ expect(manifest.servers).toHaveProperty('context7');
162
+ expect(manifest.servers).toHaveProperty('playwright');
163
+ expect(manifest.servers.context7).toHaveProperty('command');
164
+ expect(manifest.servers.context7).toHaveProperty('args');
165
+ });
166
+ it('includes optional field', async () => {
167
+ await fs.mkdir(path.join(tmpDir, '.hool'), { recursive: true });
168
+ await writeMcpManifest(tmpDir, 'cli-tool', ['context7']);
169
+ const manifest = JSON.parse(await fs.readFile(path.join(tmpDir, '.hool/mcps.json'), 'utf-8'));
170
+ expect(manifest.optional).toContain('hool-context-mcp');
171
+ });
172
+ it('skips unknown MCP names gracefully', async () => {
173
+ await fs.mkdir(path.join(tmpDir, '.hool'), { recursive: true });
174
+ await writeMcpManifest(tmpDir, 'web-app', ['context7', 'nonexistent-mcp']);
175
+ const manifest = JSON.parse(await fs.readFile(path.join(tmpDir, '.hool/mcps.json'), 'utf-8'));
176
+ expect(manifest.servers).toHaveProperty('context7');
177
+ expect(manifest.servers).not.toHaveProperty('nonexistent-mcp');
178
+ });
179
+ });
180
+ describe('writeAgentManifest', () => {
181
+ it('writes valid JSON with all 8 agents', async () => {
182
+ await fs.mkdir(path.join(tmpDir, '.hool'), { recursive: true });
183
+ await writeAgentManifest(tmpDir);
184
+ const content = await fs.readFile(path.join(tmpDir, '.hool/agents.json'), 'utf-8');
185
+ const agents = JSON.parse(content);
186
+ expect(agents).toHaveLength(8);
187
+ const names = agents.map((a) => a.name);
188
+ expect(names).toContain('product-lead');
189
+ expect(names).toContain('be-dev');
190
+ expect(names).toContain('fe-dev');
191
+ expect(names).toContain('qa');
192
+ expect(names).toContain('governor');
193
+ });
194
+ it('each agent has required fields', async () => {
195
+ await fs.mkdir(path.join(tmpDir, '.hool'), { recursive: true });
196
+ await writeAgentManifest(tmpDir);
197
+ const agents = JSON.parse(await fs.readFile(path.join(tmpDir, '.hool/agents.json'), 'utf-8'));
198
+ for (const agent of agents) {
199
+ expect(agent).toHaveProperty('name');
200
+ expect(agent).toHaveProperty('role');
201
+ expect(agent).toHaveProperty('prompt');
202
+ expect(agent).toHaveProperty('memory');
203
+ }
204
+ });
205
+ it('agent memory paths use .hool/memory/ prefix', async () => {
206
+ await fs.mkdir(path.join(tmpDir, '.hool'), { recursive: true });
207
+ await writeAgentManifest(tmpDir);
208
+ const agents = JSON.parse(await fs.readFile(path.join(tmpDir, '.hool/agents.json'), 'utf-8'));
209
+ for (const agent of agents) {
210
+ expect(agent.memory).toMatch(/^\.hool\/memory\//);
211
+ }
212
+ });
213
+ });
214
+ describe('copyPlatformFiles', () => {
215
+ let templateDir;
216
+ beforeEach(async () => {
217
+ templateDir = await fs.mkdtemp(path.join(os.tmpdir(), 'hool-templates-'));
218
+ // Create minimal template structure
219
+ await fs.mkdir(path.join(templateDir, 'agents/claude'), { recursive: true });
220
+ await fs.writeFile(path.join(templateDir, 'agents/claude/be-dev.md'), '---\nname: BE Dev\n---\nBE Dev agent');
221
+ await fs.writeFile(path.join(templateDir, 'agents/claude/qa.md'), '---\nname: QA\n---\nQA agent');
222
+ await fs.mkdir(path.join(templateDir, 'hooks'), { recursive: true });
223
+ await fs.writeFile(path.join(templateDir, 'hooks/block-pl-src-write.sh'), '#!/bin/bash\necho test');
224
+ await fs.writeFile(path.join(templateDir, 'hooks/track-prompt-count.sh'), '#!/bin/bash\necho test');
225
+ await fs.mkdir(path.join(templateDir, 'settings'), { recursive: true });
226
+ await fs.writeFile(path.join(templateDir, 'settings/claude-settings.json'), JSON.stringify({
227
+ hooks: { PreToolUse: [{ matcher: 'Edit', hooks: [{ type: 'command', command: '.hool/hooks/block-pl-src-write.sh' }] }] }
228
+ }));
229
+ await fs.writeFile(path.join(templateDir, 'settings/be-dev.json'), JSON.stringify({
230
+ hooks: { Stop: [{ matcher: '', hooks: [{ type: 'command', command: '.hool/hooks/agent-checklist.sh' }] }] }
231
+ }));
232
+ await fs.writeFile(path.join(templateDir, 'settings/qa.json'), JSON.stringify({
233
+ hooks: { Stop: [{ matcher: '', hooks: [{ type: 'command', command: '.hool/hooks/agent-checklist.sh' }] }] }
234
+ }));
235
+ await fs.mkdir(path.join(templateDir, 'prompts/skills'), { recursive: true });
236
+ await fs.writeFile(path.join(templateDir, 'prompts/skills/01-brainstorm.md'), '# Brainstorm skill');
237
+ await fs.mkdir(path.join(templateDir, 'prompts/checklists'), { recursive: true });
238
+ await fs.writeFile(path.join(templateDir, 'prompts/checklists/code-review.md'), '# Code review checklist');
239
+ });
240
+ afterEach(async () => {
241
+ await fs.rm(templateDir, { recursive: true, force: true });
242
+ });
243
+ it('copies agent definitions to .claude/agents/ for claude-code', async () => {
244
+ await copyPlatformFiles(tmpDir, templateDir, 'claude-code');
245
+ const agents = await fs.readdir(path.join(tmpDir, '.claude/agents'));
246
+ expect(agents).toContain('be-dev.md');
247
+ expect(agents).toContain('qa.md');
248
+ });
249
+ it('copies hooks to .hool/hooks/ and makes them executable', async () => {
250
+ await copyPlatformFiles(tmpDir, templateDir, 'claude-code');
251
+ const hookPath = path.join(tmpDir, '.hool/hooks/block-pl-src-write.sh');
252
+ const stat = await fs.stat(hookPath);
253
+ expect(stat.mode & 0o111).toBeGreaterThan(0); // executable
254
+ });
255
+ it('copies settings.json to .claude/settings.json', async () => {
256
+ await copyPlatformFiles(tmpDir, templateDir, 'claude-code');
257
+ const settings = JSON.parse(await fs.readFile(path.join(tmpDir, '.claude/settings.json'), 'utf-8'));
258
+ expect(settings.hooks).toHaveProperty('PreToolUse');
259
+ });
260
+ it('merges with existing .claude/settings.json', async () => {
261
+ await fs.mkdir(path.join(tmpDir, '.claude'), { recursive: true });
262
+ await fs.writeFile(path.join(tmpDir, '.claude/settings.json'), JSON.stringify({
263
+ hooks: { PostToolUse: [{ matcher: 'Test', hooks: [{ type: 'command', command: 'test.sh' }] }] }
264
+ }));
265
+ await copyPlatformFiles(tmpDir, templateDir, 'claude-code');
266
+ const settings = JSON.parse(await fs.readFile(path.join(tmpDir, '.claude/settings.json'), 'utf-8'));
267
+ expect(settings.hooks).toHaveProperty('PreToolUse'); // from HOOL
268
+ expect(settings.hooks).toHaveProperty('PostToolUse'); // preserved
269
+ });
270
+ it('copies per-role settings to .hool/settings/ (excluding claude-settings.json)', async () => {
271
+ await fs.mkdir(path.join(tmpDir, '.hool/settings'), { recursive: true });
272
+ await copyPlatformFiles(tmpDir, templateDir, 'claude-code');
273
+ const settingsFiles = await fs.readdir(path.join(tmpDir, '.hool/settings'));
274
+ expect(settingsFiles).toContain('be-dev.json');
275
+ expect(settingsFiles).toContain('qa.json');
276
+ expect(settingsFiles).not.toContain('claude-settings.json');
277
+ });
278
+ it('copies skills to .claude/skills/', async () => {
279
+ await copyPlatformFiles(tmpDir, templateDir, 'claude-code');
280
+ const skillFile = await fs.readFile(path.join(tmpDir, '.claude/skills/brainstorm/SKILL.md'), 'utf-8');
281
+ expect(skillFile).toContain('Brainstorm skill');
282
+ });
283
+ it('copies checklists to .hool/checklists/', async () => {
284
+ await copyPlatformFiles(tmpDir, templateDir, 'claude-code');
285
+ const checklist = await fs.readFile(path.join(tmpDir, '.hool/checklists/code-review.md'), 'utf-8');
286
+ expect(checklist).toContain('Code review checklist');
287
+ });
288
+ it('copies cursor agents for cursor platform', async () => {
289
+ await fs.mkdir(path.join(templateDir, 'agents/cursor'), { recursive: true });
290
+ await fs.writeFile(path.join(templateDir, 'agents/cursor/be-dev.md'), 'cursor be-dev');
291
+ await fs.mkdir(path.join(templateDir, 'rules/cursor'), { recursive: true });
292
+ await fs.writeFile(path.join(templateDir, 'rules/cursor/be-dev.mdc'), 'cursor rule');
293
+ await copyPlatformFiles(tmpDir, templateDir, 'cursor');
294
+ const agentContent = await fs.readFile(path.join(tmpDir, '.cursor/agents/be-dev.md'), 'utf-8');
295
+ expect(agentContent).toBe('cursor be-dev');
296
+ const ruleContent = await fs.readFile(path.join(tmpDir, '.cursor/rules/be-dev.mdc'), 'utf-8');
297
+ expect(ruleContent).toBe('cursor rule');
298
+ });
299
+ });
300
+ describe('copySkills', () => {
301
+ it('copies skill files with correct naming', async () => {
302
+ const skillsDir = path.join(tmpDir, 'skills');
303
+ await fs.mkdir(skillsDir, { recursive: true });
304
+ await fs.writeFile(path.join(skillsDir, '01-brainstorm.md'), '# Brainstorm');
305
+ await fs.writeFile(path.join(skillsDir, '02-spec.md'), '# Spec');
306
+ const projectDir = await fs.mkdtemp(path.join(os.tmpdir(), 'hool-proj-'));
307
+ await copySkills(projectDir, tmpDir);
308
+ expect(await fs.readFile(path.join(projectDir, '.claude/skills/brainstorm/SKILL.md'), 'utf-8')).toBe('# Brainstorm');
309
+ expect(await fs.readFile(path.join(projectDir, '.claude/skills/spec/SKILL.md'), 'utf-8')).toBe('# Spec');
310
+ await fs.rm(projectDir, { recursive: true, force: true });
311
+ });
312
+ it('handles missing skills directory gracefully', async () => {
313
+ const projectDir = await fs.mkdtemp(path.join(os.tmpdir(), 'hool-proj-'));
314
+ await expect(copySkills(projectDir, '/nonexistent')).resolves.toBeUndefined();
315
+ await fs.rm(projectDir, { recursive: true, force: true });
316
+ });
317
+ });
318
+ describe('copyChecklists', () => {
319
+ it('copies checklist files', async () => {
320
+ const checklistsDir = path.join(tmpDir, 'checklists');
321
+ await fs.mkdir(checklistsDir, { recursive: true });
322
+ await fs.writeFile(path.join(checklistsDir, 'review.md'), '# Review');
323
+ const projectDir = await fs.mkdtemp(path.join(os.tmpdir(), 'hool-proj-'));
324
+ await copyChecklists(projectDir, tmpDir);
325
+ expect(await fs.readFile(path.join(projectDir, '.hool/checklists/review.md'), 'utf-8')).toBe('# Review');
326
+ await fs.rm(projectDir, { recursive: true, force: true });
327
+ });
328
+ });
329
+ //# sourceMappingURL=scaffold.test.js.map