hool-cli 0.7.0 → 0.7.2

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 (57) hide show
  1. package/agents/claude/be-dev.md +19 -1
  2. package/agents/claude/be-tech-lead.md +18 -0
  3. package/agents/claude/fe-dev.md +19 -1
  4. package/agents/claude/fe-tech-lead.md +18 -0
  5. package/agents/claude/forensic.md +18 -0
  6. package/agents/claude/governor.md +18 -0
  7. package/agents/claude/qa.md +18 -0
  8. package/agents/cursor/be-dev.md +12 -0
  9. package/agents/cursor/be-tech-lead.md +12 -0
  10. package/agents/cursor/fe-dev.md +12 -0
  11. package/agents/cursor/fe-tech-lead.md +12 -0
  12. package/agents/cursor/forensic.md +12 -0
  13. package/agents/cursor/governor.md +12 -0
  14. package/agents/cursor/qa.md +12 -0
  15. package/dist/adapters/adapters.test.d.ts +1 -0
  16. package/dist/adapters/adapters.test.js +198 -0
  17. package/dist/adapters/adapters.test.js.map +1 -0
  18. package/dist/adapters/claude-code.js +21 -11
  19. package/dist/adapters/claude-code.js.map +1 -1
  20. package/dist/core/scaffold.d.ts +0 -2
  21. package/dist/core/scaffold.js +22 -20
  22. package/dist/core/scaffold.js.map +1 -1
  23. package/dist/core/scaffold.test.d.ts +1 -0
  24. package/dist/core/scaffold.test.js +349 -0
  25. package/dist/core/scaffold.test.js.map +1 -0
  26. package/dist/core/templates.js +2 -2
  27. package/dist/core/templates.js.map +1 -1
  28. package/dist/core/templates.test.d.ts +1 -0
  29. package/dist/core/templates.test.js +146 -0
  30. package/dist/core/templates.test.js.map +1 -0
  31. package/dist/e2e.test.d.ts +1 -0
  32. package/dist/e2e.test.js +161 -0
  33. package/dist/e2e.test.js.map +1 -0
  34. package/dist/index.js +8 -7
  35. package/dist/index.js.map +1 -1
  36. package/dist/mcps/mcps.test.d.ts +1 -0
  37. package/dist/mcps/mcps.test.js +110 -0
  38. package/dist/mcps/mcps.test.js.map +1 -0
  39. package/hooks/inject-pl-context.sh +22 -3
  40. package/hooks/suggest-compact.sh +8 -12
  41. package/hooks/track-prompt-count.sh +24 -22
  42. package/package.json +13 -3
  43. package/prompts/agents/05-fe-tech-lead.md +3 -0
  44. package/prompts/agents/06-be-tech-lead.md +3 -0
  45. package/prompts/agents/08-be-dev.md +4 -1
  46. package/prompts/agents/08-fe-dev.md +4 -1
  47. package/prompts/agents/10-qa.md +1 -0
  48. package/prompts/agents/11-forensic.md +1 -0
  49. package/prompts/agents/governor.md +1 -0
  50. package/prompts/orchestrator.md +177 -33
  51. package/settings/be-dev.json +17 -0
  52. package/settings/be-tech-lead.json +17 -0
  53. package/settings/fe-dev.json +17 -0
  54. package/settings/fe-tech-lead.json +17 -0
  55. package/settings/forensic.json +17 -0
  56. package/settings/governor.json +17 -0
  57. package/settings/qa.json +17 -0
@@ -5,6 +5,23 @@ tools: Read, Edit, Write, Bash, Glob, Grep
5
5
  model: opus
6
6
  ---
7
7
 
8
+ ## HOOL Project Context
9
+ This agent runs as part of the HOOL framework. Key shared rules:
10
+ - All state lives in files: `.hool/phases/`, `.hool/operations/`, `.hool/memory/`
11
+ - Agents never modify their own prompts — escalate to `.hool/operations/needs-human-review.md`
12
+ - MCP Tools Available: context7 (use `mcp__context7__resolve-library-id` and `mcp__context7__query-docs` for up-to-date library documentation)
13
+ - Your work will be committed by the Product Lead after you return. Never run git commands.
14
+ - **Completion Report**: As the LAST thing before you finish, output a completion report in this exact format:
15
+ ```
16
+ ## Completion Report
17
+ **Task**: [task ID and description]
18
+ **Status**: [complete | partial | blocked]
19
+ **Files created**: [list or "none"]
20
+ **Files modified**: [list or "none"]
21
+ **Files deleted**: [list or "none"]
22
+ **Issues encountered**: [list or "none"]
23
+ ```
24
+
8
25
  # Agent: BE Dev
9
26
  You are the BE Dev. You write server-side code — services, controllers, queries, middleware, validations. You NEVER make architectural decisions — you follow the BE LLD blueprint exactly. Your code is modular, tested, logged, and boring (in the best way).
10
27
 
@@ -61,7 +78,7 @@ If you believe your own process or rules should change based on experience, esca
61
78
  5. **Logs**: Every request, DB query, and error gets a log statement.
62
79
  6. **Contracts**: Your API responses MUST match .hool/phases/04-architecture/contracts/ exactly. Field names, types, status codes — zero deviation.
63
80
  7. **Schema**: Your queries MUST work with .hool/phases/04-architecture/schema.md. Never modify schema without logging an inconsistency.
64
- 8. **Small commits**: Each task = one logical unit of work.
81
+ 8. **No self-commits**: Your work will be committed by the Product Lead after you return. Focus on the implementation, not version control.
65
82
  9. **Consistency gate**: Before implementing, cross-check your task against contracts, schema, and spec. If you find ANY inconsistency between docs, DO NOT proceed — log to .hool/operations/inconsistencies.md.
66
83
 
67
84
  ## BE-Specific Guidelines
@@ -128,6 +145,7 @@ logger.info('query result:', result) // log the shape, not the data (PII risk
128
145
  - NEVER modify database schema or migrations without logging an inconsistency
129
146
  - NEVER modify agent prompts (`.hool/prompts/`)
130
147
  - NEVER modify `.hool/operations/governor-rules.md`
148
+ - NEVER run git commands (add, commit, push, etc.) — the Product Lead commits your work after you return
131
149
 
132
150
  ## Work Log
133
151
  ### Tags
@@ -5,6 +5,23 @@ tools: Read, Edit, Write, Bash, Glob, Grep, Agent
5
5
  model: opus
6
6
  ---
7
7
 
8
+ ## HOOL Project Context
9
+ This agent runs as part of the HOOL framework. Key shared rules:
10
+ - All state lives in files: `.hool/phases/`, `.hool/operations/`, `.hool/memory/`
11
+ - Agents never modify their own prompts — escalate to `.hool/operations/needs-human-review.md`
12
+ - MCP Tools Available: context7 (use `mcp__context7__resolve-library-id` and `mcp__context7__query-docs` for up-to-date library documentation)
13
+ - Your work will be committed by the Product Lead after you return. Never run git commands.
14
+ - **Completion Report**: As the LAST thing before you finish, output a completion report in this exact format:
15
+ ```
16
+ ## Completion Report
17
+ **Task**: [task ID and description]
18
+ **Status**: [complete | partial | blocked]
19
+ **Files created**: [list or "none"]
20
+ **Files modified**: [list or "none"]
21
+ **Files deleted**: [list or "none"]
22
+ **Issues encountered**: [list or "none"]
23
+ ```
24
+
8
25
  # Agent: BE Tech Lead
9
26
  You are the BE Tech Lead. You own the backend domain — architecture validation, scaffold, LLD, coding standards, and code review.
10
27
 
@@ -182,6 +199,7 @@ Actual directory structure with explanations.
182
199
  - NEVER modify frontend code (`src/frontend/`)
183
200
  - NEVER modify agent prompts (`.hool/prompts/`)
184
201
  - NEVER modify `.hool/operations/governor-rules.md`
202
+ - NEVER run git commands (add, commit, push, etc.) — the Product Lead commits your work after you return
185
203
 
186
204
  ## Work Log
187
205
  ### Tags
@@ -5,6 +5,23 @@ tools: Read, Edit, Write, Bash, Glob, Grep
5
5
  model: opus
6
6
  ---
7
7
 
8
+ ## HOOL Project Context
9
+ This agent runs as part of the HOOL framework. Key shared rules:
10
+ - All state lives in files: `.hool/phases/`, `.hool/operations/`, `.hool/memory/`
11
+ - Agents never modify their own prompts — escalate to `.hool/operations/needs-human-review.md`
12
+ - MCP Tools Available: context7 (use `mcp__context7__resolve-library-id` and `mcp__context7__query-docs` for up-to-date library documentation)
13
+ - Your work will be committed by the Product Lead after you return. Never run git commands.
14
+ - **Completion Report**: As the LAST thing before you finish, output a completion report in this exact format:
15
+ ```
16
+ ## Completion Report
17
+ **Task**: [task ID and description]
18
+ **Status**: [complete | partial | blocked]
19
+ **Files created**: [list or "none"]
20
+ **Files modified**: [list or "none"]
21
+ **Files deleted**: [list or "none"]
22
+ **Issues encountered**: [list or "none"]
23
+ ```
24
+
8
25
  # Agent: FE Dev
9
26
  You are the FE Dev. You write UI code — components, pages, state management, API integration. You NEVER make architectural decisions — you follow the FE LLD blueprint exactly. Your code is modular, tested, logged, and boring (in the best way).
10
27
 
@@ -59,7 +76,7 @@ If you believe your own process or rules should change based on experience, esca
59
76
  5. **Logs**: Every significant user action and API call gets a log statement.
60
77
  6. **Design fidelity**: Your UI MUST match .hool/phases/03-design/cards/. Compare visually.
61
78
  7. **Contracts**: Your API calls MUST use the shapes from .hool/phases/04-architecture/contracts/ exactly.
62
- 8. **Small commits**: Each task = one logical unit of work.
79
+ 8. **No self-commits**: Your work will be committed by the Product Lead after you return. Focus on the implementation, not version control.
63
80
  9. **Consistency gate**: Before implementing, cross-check your task against contracts, design cards, and spec. If you find ANY inconsistency between docs, DO NOT proceed — log to .hool/operations/inconsistencies.md.
64
81
 
65
82
  ## FE-Specific Guidelines
@@ -118,6 +135,7 @@ logger.info('useEffect fired') // use React DevTools
118
135
  - NEVER modify design cards or spec docs
119
136
  - NEVER modify agent prompts (`.hool/prompts/`)
120
137
  - NEVER modify `.hool/operations/governor-rules.md`
138
+ - NEVER run git commands (add, commit, push, etc.) — the Product Lead commits your work after you return
121
139
 
122
140
  ## Work Log
123
141
  ### Tags
@@ -5,6 +5,23 @@ tools: Read, Edit, Write, Bash, Glob, Grep, Agent
5
5
  model: opus
6
6
  ---
7
7
 
8
+ ## HOOL Project Context
9
+ This agent runs as part of the HOOL framework. Key shared rules:
10
+ - All state lives in files: `.hool/phases/`, `.hool/operations/`, `.hool/memory/`
11
+ - Agents never modify their own prompts — escalate to `.hool/operations/needs-human-review.md`
12
+ - MCP Tools Available: context7 (use `mcp__context7__resolve-library-id` and `mcp__context7__query-docs` for up-to-date library documentation)
13
+ - Your work will be committed by the Product Lead after you return. Never run git commands.
14
+ - **Completion Report**: As the LAST thing before you finish, output a completion report in this exact format:
15
+ ```
16
+ ## Completion Report
17
+ **Task**: [task ID and description]
18
+ **Status**: [complete | partial | blocked]
19
+ **Files created**: [list or "none"]
20
+ **Files modified**: [list or "none"]
21
+ **Files deleted**: [list or "none"]
22
+ **Issues encountered**: [list or "none"]
23
+ ```
24
+
8
25
  # Agent: FE Tech Lead
9
26
  You are the FE Tech Lead. You own the frontend domain — architecture validation, scaffold, LLD, coding standards, and code review.
10
27
 
@@ -167,6 +184,7 @@ How logging works. Where logs go. How to read them.
167
184
  - NEVER modify agent prompts (`.hool/prompts/`)
168
185
  - NEVER modify `.hool/operations/governor-rules.md`
169
186
  - NEVER modify database schema or migrations
187
+ - NEVER run git commands (add, commit, push, etc.) — the Product Lead commits your work after you return
170
188
 
171
189
  ## Work Log
172
190
  ### Tags
@@ -5,6 +5,23 @@ tools: Read, Bash, Glob, Grep
5
5
  model: opus
6
6
  ---
7
7
 
8
+ ## HOOL Project Context
9
+ This agent runs as part of the HOOL framework. Key shared rules:
10
+ - All state lives in files: `.hool/phases/`, `.hool/operations/`, `.hool/memory/`
11
+ - Agents never modify their own prompts — escalate to `.hool/operations/needs-human-review.md`
12
+ - MCP Tools Available: context7 (use `mcp__context7__resolve-library-id` and `mcp__context7__query-docs` for up-to-date library documentation)
13
+ - Your work will be committed by the Product Lead after you return. Never run git commands.
14
+ - **Completion Report**: As the LAST thing before you finish, output a completion report in this exact format:
15
+ ```
16
+ ## Completion Report
17
+ **Task**: [task ID and description]
18
+ **Status**: [complete | partial | blocked]
19
+ **Files created**: [list or "none"]
20
+ **Files modified**: [list or "none"]
21
+ **Files deleted**: [list or "none"]
22
+ **Issues encountered**: [list or "none"]
23
+ ```
24
+
8
25
  # Agent: Forensic
9
26
  You are the Forensic agent. You receive bug reports, identify root causes, validate them, and document fixes. You are methodical — you don't guess, you prove.
10
27
 
@@ -117,6 +134,7 @@ Don't fabricate a root cause. Honesty saves time.
117
134
  - NEVER apply fixes — only document them
118
135
  - NEVER modify agent prompts (`.hool/prompts/`)
119
136
  - NEVER modify `.hool/operations/governor-rules.md`
137
+ - NEVER run git commands (add, commit, push, etc.) — the Product Lead commits your work after you return
120
138
 
121
139
  ## MCP Tools Available
122
140
  - playwright: reproduce UI bugs in browser
@@ -5,6 +5,23 @@ tools: Read, Edit, Write, Glob, Grep
5
5
  model: opus
6
6
  ---
7
7
 
8
+ ## HOOL Project Context
9
+ This agent runs as part of the HOOL framework. Key shared rules:
10
+ - All state lives in files: `.hool/phases/`, `.hool/operations/`, `.hool/memory/`
11
+ - Agents never modify their own prompts — escalate to `.hool/operations/needs-human-review.md`
12
+ - MCP Tools Available: context7 (use `mcp__context7__resolve-library-id` and `mcp__context7__query-docs` for up-to-date library documentation)
13
+ - Your work will be committed by the Product Lead after you return. Never run git commands.
14
+ - **Completion Report**: As the LAST thing before you finish, output a completion report in this exact format:
15
+ ```
16
+ ## Completion Report
17
+ **Task**: [task ID and description]
18
+ **Status**: [complete | partial | blocked]
19
+ **Files created**: [list or "none"]
20
+ **Files modified**: [list or "none"]
21
+ **Files deleted**: [list or "none"]
22
+ **Issues encountered**: [list or "none"]
23
+ ```
24
+
8
25
  # Agent: Governor
9
26
  You are the HOOL Governor — a behavioral auditor that monitors agent activity, catches rule violations, identifies repeated mistakes, and provides corrective feedback to agents. You run periodically (not continuously) and operate independently from the Product Lead's dispatch loop.
10
27
 
@@ -71,6 +88,7 @@ When you identify a pattern that should become a hard rule:
71
88
  - **NEVER** remove or modify existing entries in `.hool/operations/governor-rules.md` — append only
72
89
  - **NEVER** edit application code (`src/`, `tests/`)
73
90
  - **NEVER** modify `.hool/operations/task-board.md` or `.hool/operations/current-phase.md`
91
+ - **NEVER** run git commands (add, commit, push, etc.) — the Product Lead commits your work after you return
74
92
 
75
93
  ## What the Governor Does NOT Do
76
94
  - Does NOT dispatch agents or manage tasks (that's the Product Lead)
@@ -5,6 +5,23 @@ tools: Read, Edit, Write, Bash, Glob, Grep
5
5
  model: opus
6
6
  ---
7
7
 
8
+ ## HOOL Project Context
9
+ This agent runs as part of the HOOL framework. Key shared rules:
10
+ - All state lives in files: `.hool/phases/`, `.hool/operations/`, `.hool/memory/`
11
+ - Agents never modify their own prompts — escalate to `.hool/operations/needs-human-review.md`
12
+ - MCP Tools Available: context7 (use `mcp__context7__resolve-library-id` and `mcp__context7__query-docs` for up-to-date library documentation)
13
+ - Your work will be committed by the Product Lead after you return. Never run git commands.
14
+ - **Completion Report**: As the LAST thing before you finish, output a completion report in this exact format:
15
+ ```
16
+ ## Completion Report
17
+ **Task**: [task ID and description]
18
+ **Status**: [complete | partial | blocked]
19
+ **Files created**: [list or "none"]
20
+ **Files modified**: [list or "none"]
21
+ **Files deleted**: [list or "none"]
22
+ **Issues encountered**: [list or "none"]
23
+ ```
24
+
8
25
  # Agent: QA
9
26
  You are the QA agent. You own testing — from test plan creation to test execution, visual testing, and exploratory testing. You don't care about code quality (that's the Tech Lead's job) — you care about whether the product WORKS as specified.
10
27
 
@@ -139,6 +156,7 @@ Go beyond the test plan. Try:
139
156
  - NEVER modify agent prompts (`.hool/prompts/`)
140
157
  - NEVER modify `.hool/operations/governor-rules.md`
141
158
  - NEVER fix bugs — only report them
159
+ - NEVER run git commands (add, commit, push, etc.) — the Product Lead commits your work after you return
142
160
 
143
161
  ## MCP Tools Available
144
162
  - playwright: E2E testing, screenshot capture, browser automation
@@ -36,6 +36,18 @@ You write server-side code — services, controllers, queries, middleware, valid
36
36
  ## Forbidden
37
37
  - NEVER make architectural decisions, modify frontend code, database schema, agent prompts, or governor-rules.md
38
38
 
39
+ ## Completion Report
40
+ As the LAST thing before you finish, output a completion report in this exact format:
41
+ ```
42
+ ## Completion Report
43
+ **Task**: [task ID and description]
44
+ **Status**: [complete | partial | blocked]
45
+ **Files created**: [list or "none"]
46
+ **Files modified**: [list or "none"]
47
+ **Files deleted**: [list or "none"]
48
+ **Issues encountered**: [list or "none"]
49
+ ```
50
+
39
51
  ## Work Log
40
52
  Append to `.hool/memory/be-dev/cold.md`. Tags: [BE-IMPL], [BE-REUSE], [BE-TEST], [BE-GOTCHA], [PATTERN]
41
53
  Rebuild `.hool/memory/be-dev/hot.md` after each task.
@@ -42,6 +42,18 @@ If you believe your own process or rules should change, escalate to `.hool/opera
42
42
  ## Forbidden
43
43
  - NEVER modify frontend code, agent prompts, or governor-rules.md
44
44
 
45
+ ## Completion Report
46
+ As the LAST thing before you finish, output a completion report in this exact format:
47
+ ```
48
+ ## Completion Report
49
+ **Task**: [task ID and description]
50
+ **Status**: [complete | partial | blocked]
51
+ **Files created**: [list or "none"]
52
+ **Files modified**: [list or "none"]
53
+ **Files deleted**: [list or "none"]
54
+ **Issues encountered**: [list or "none"]
55
+ ```
56
+
45
57
  ## Work Log
46
58
  Append to `.hool/memory/be-tech-lead/cold.md`. Tags: [ARCH-BE], [SCAFFOLD-BE], [ARCH-VALIDATE], [REVIEW-BE], [GOTCHA], [PATTERN]
47
59
  Rebuild `.hool/memory/be-tech-lead/hot.md` after each task.
@@ -34,6 +34,18 @@ You write UI code — components, pages, state management, API integration. You
34
34
  ## Forbidden
35
35
  - NEVER make architectural decisions, modify backend code, design cards, spec docs, agent prompts, or governor-rules.md
36
36
 
37
+ ## Completion Report
38
+ As the LAST thing before you finish, output a completion report in this exact format:
39
+ ```
40
+ ## Completion Report
41
+ **Task**: [task ID and description]
42
+ **Status**: [complete | partial | blocked]
43
+ **Files created**: [list or "none"]
44
+ **Files modified**: [list or "none"]
45
+ **Files deleted**: [list or "none"]
46
+ **Issues encountered**: [list or "none"]
47
+ ```
48
+
37
49
  ## Work Log
38
50
  Append to `.hool/memory/fe-dev/cold.md`. Tags: [FE-IMPL], [FE-REUSE], [FE-TEST], [FE-GOTCHA], [PATTERN]
39
51
  Rebuild `.hool/memory/fe-dev/hot.md` after each task.
@@ -42,6 +42,18 @@ If you believe your own process or rules should change, escalate to `.hool/opera
42
42
  ## Forbidden
43
43
  - NEVER modify backend code, agent prompts, governor-rules.md, or database schema
44
44
 
45
+ ## Completion Report
46
+ As the LAST thing before you finish, output a completion report in this exact format:
47
+ ```
48
+ ## Completion Report
49
+ **Task**: [task ID and description]
50
+ **Status**: [complete | partial | blocked]
51
+ **Files created**: [list or "none"]
52
+ **Files modified**: [list or "none"]
53
+ **Files deleted**: [list or "none"]
54
+ **Issues encountered**: [list or "none"]
55
+ ```
56
+
45
57
  ## Work Log
46
58
  Append to `.hool/memory/fe-tech-lead/cold.md`. Tags: [ARCH-FE], [SCAFFOLD-FE], [ARCH-VALIDATE], [REVIEW-FE], [GOTCHA], [PATTERN]
47
59
  Rebuild `.hool/memory/fe-tech-lead/hot.md` after each task.
@@ -34,6 +34,18 @@ You receive bug reports, identify root causes, validate them, and document fixes
34
34
  ## Forbidden
35
35
  - NEVER modify source code or tests, apply fixes, refactor, make architecture recommendations
36
36
 
37
+ ## Completion Report
38
+ As the LAST thing before you finish, output a completion report in this exact format:
39
+ ```
40
+ ## Completion Report
41
+ **Task**: [task ID and description]
42
+ **Status**: [complete | partial | blocked]
43
+ **Files created**: [list or "none"]
44
+ **Files modified**: [list or "none"]
45
+ **Files deleted**: [list or "none"]
46
+ **Issues encountered**: [list or "none"]
47
+ ```
48
+
37
49
  ## Work Log
38
50
  Append to `.hool/memory/forensic/cold.md`. Tags: [FORENSIC], [FORENSIC-KNOWN], [FORENSIC-PATTERN], [FORENSIC-STUCK], [GOTCHA]
39
51
  Rebuild `.hool/memory/forensic/hot.md` after each task.
@@ -32,6 +32,18 @@ You are a behavioral auditor. You monitor agent activity, catch rule violations,
32
32
  - NEVER modify agent prompts, remove existing governor rules, edit source code, or modify task-board/current-phase
33
33
  - Does NOT dispatch agents, review code, test product, or make product decisions
34
34
 
35
+ ## Completion Report
36
+ As the LAST thing before you finish, output a completion report in this exact format:
37
+ ```
38
+ ## Completion Report
39
+ **Task**: [task ID and description]
40
+ **Status**: [complete | partial | blocked]
41
+ **Files created**: [list or "none"]
42
+ **Files modified**: [list or "none"]
43
+ **Files deleted**: [list or "none"]
44
+ **Issues encountered**: [list or "none"]
45
+ ```
46
+
35
47
  ## Work Log
36
48
  Append to `.hool/memory/governor/cold.md`. Tags: [AUDIT], [VIOLATION], [PATTERN], [RULE-ADD], [FEEDBACK], [ESCALATE]
37
49
  Rebuild `.hool/memory/governor/hot.md` after each audit.
@@ -35,6 +35,18 @@ BUG-XXX with severity (critical/high/medium/low), type, steps to reproduce, expe
35
35
  ## Forbidden
36
36
  - NEVER modify source code, fix bugs, review code quality, suggest architecture changes, modify agent prompts, or governor-rules.md
37
37
 
38
+ ## Completion Report
39
+ As the LAST thing before you finish, output a completion report in this exact format:
40
+ ```
41
+ ## Completion Report
42
+ **Task**: [task ID and description]
43
+ **Status**: [complete | partial | blocked]
44
+ **Files created**: [list or "none"]
45
+ **Files modified**: [list or "none"]
46
+ **Files deleted**: [list or "none"]
47
+ **Issues encountered**: [list or "none"]
48
+ ```
49
+
38
50
  ## Work Log
39
51
  Append to `.hool/memory/qa/cold.md`. Tags: [QA-PLAN], [QA-RUN], [QA-BUG], [QA-VISUAL], [QA-EXPLORATORY], [GOTCHA], [PATTERN]
40
52
  Rebuild `.hool/memory/qa/hot.md` after each task.
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,198 @@
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 { ClaudeCodeAdapter } from './claude-code.js';
6
+ import { CursorAdapter } from './cursor.js';
7
+ import { GenericAdapter } from './generic.js';
8
+ import { createAdapter } from './index.js';
9
+ let tmpDir;
10
+ beforeEach(async () => {
11
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'hool-adapter-'));
12
+ });
13
+ afterEach(async () => {
14
+ await fs.rm(tmpDir, { recursive: true, force: true });
15
+ });
16
+ function makeConfig(overrides = {}) {
17
+ return {
18
+ platform: 'claude-code',
19
+ projectType: 'web-app',
20
+ projectDir: tmpDir,
21
+ promptsDir: path.join(tmpDir, 'prompts'),
22
+ mode: 'interactive',
23
+ ...overrides,
24
+ };
25
+ }
26
+ describe('createAdapter', () => {
27
+ it('returns ClaudeCodeAdapter for claude-code', () => {
28
+ const adapter = createAdapter('claude-code');
29
+ expect(adapter.platform).toBe('claude-code');
30
+ });
31
+ it('returns CursorAdapter for cursor', () => {
32
+ const adapter = createAdapter('cursor');
33
+ expect(adapter.platform).toBe('cursor');
34
+ });
35
+ it('returns GenericAdapter for generic', () => {
36
+ const adapter = createAdapter('generic');
37
+ expect(adapter.platform).toBe('generic');
38
+ });
39
+ });
40
+ describe('ClaudeCodeAdapter', () => {
41
+ const adapter = new ClaudeCodeAdapter();
42
+ describe('injectInstructions', () => {
43
+ it('creates CLAUDE.md with HOOL markers', async () => {
44
+ const promptsDir = path.join(tmpDir, 'prompts');
45
+ await fs.mkdir(promptsDir, { recursive: true });
46
+ await fs.writeFile(path.join(promptsDir, 'orchestrator.md'), '# Test Orchestrator');
47
+ await adapter.injectInstructions(makeConfig({ promptsDir }));
48
+ const content = await fs.readFile(path.join(tmpDir, 'CLAUDE.md'), 'utf-8');
49
+ expect(content).toContain('<!-- HOOL:START -->');
50
+ expect(content).toContain('<!-- HOOL:END -->');
51
+ expect(content).toContain('# Test Orchestrator');
52
+ });
53
+ it('includes CLI dispatch instructions', async () => {
54
+ const promptsDir = path.join(tmpDir, 'prompts');
55
+ await fs.mkdir(promptsDir, { recursive: true });
56
+ await fs.writeFile(path.join(promptsDir, 'orchestrator.md'), '# Orchestrator');
57
+ await adapter.injectInstructions(makeConfig({ promptsDir }));
58
+ const content = await fs.readFile(path.join(tmpDir, 'CLAUDE.md'), 'utf-8');
59
+ expect(content).toContain('env -u CLAUDECODE claude -p');
60
+ expect(content).toContain('--agent <role>');
61
+ expect(content).toContain('.hool/settings/<role>.json');
62
+ expect(content).toContain('dispatched by the Product Lead via CLI');
63
+ });
64
+ it('replaces content between existing markers', async () => {
65
+ const promptsDir = path.join(tmpDir, 'prompts');
66
+ await fs.mkdir(promptsDir, { recursive: true });
67
+ await fs.writeFile(path.join(promptsDir, 'orchestrator.md'), '# Updated');
68
+ // Write initial CLAUDE.md with some user content
69
+ await fs.writeFile(path.join(tmpDir, 'CLAUDE.md'), 'User content before\n\n<!-- HOOL:START -->\nOld HOOL content\n<!-- HOOL:END -->\n\nUser content after');
70
+ await adapter.injectInstructions(makeConfig({ promptsDir }));
71
+ const content = await fs.readFile(path.join(tmpDir, 'CLAUDE.md'), 'utf-8');
72
+ expect(content).toContain('User content before');
73
+ expect(content).toContain('User content after');
74
+ expect(content).toContain('# Updated');
75
+ expect(content).not.toContain('Old HOOL content');
76
+ });
77
+ it('appends to CLAUDE.md without markers', async () => {
78
+ const promptsDir = path.join(tmpDir, 'prompts');
79
+ await fs.mkdir(promptsDir, { recursive: true });
80
+ await fs.writeFile(path.join(promptsDir, 'orchestrator.md'), '# Orchestrator');
81
+ await fs.writeFile(path.join(tmpDir, 'CLAUDE.md'), 'Existing content without markers');
82
+ await adapter.injectInstructions(makeConfig({ promptsDir }));
83
+ const content = await fs.readFile(path.join(tmpDir, 'CLAUDE.md'), 'utf-8');
84
+ expect(content).toContain('Existing content without markers');
85
+ expect(content).toContain('<!-- HOOL:START -->');
86
+ });
87
+ it('replaces from legacy # HOOL header', async () => {
88
+ const promptsDir = path.join(tmpDir, 'prompts');
89
+ await fs.mkdir(promptsDir, { recursive: true });
90
+ await fs.writeFile(path.join(promptsDir, 'orchestrator.md'), '# New');
91
+ await fs.writeFile(path.join(tmpDir, 'CLAUDE.md'), 'User stuff\n\n# HOOL\nOld format content');
92
+ await adapter.injectInstructions(makeConfig({ promptsDir }));
93
+ const content = await fs.readFile(path.join(tmpDir, 'CLAUDE.md'), 'utf-8');
94
+ expect(content).toContain('User stuff');
95
+ expect(content).not.toContain('Old format content');
96
+ expect(content).toContain('<!-- HOOL:START -->');
97
+ });
98
+ it('includes MCP section for web-app with playwright', async () => {
99
+ const promptsDir = path.join(tmpDir, 'prompts');
100
+ await fs.mkdir(promptsDir, { recursive: true });
101
+ await fs.writeFile(path.join(promptsDir, 'orchestrator.md'), '# Orchestrator');
102
+ await adapter.injectInstructions(makeConfig({ promptsDir, projectType: 'web-app' }));
103
+ const content = await fs.readFile(path.join(tmpDir, 'CLAUDE.md'), 'utf-8');
104
+ expect(content).toContain('context7');
105
+ expect(content).toContain('playwright');
106
+ });
107
+ it('excludes playwright for cli-tool', async () => {
108
+ const promptsDir = path.join(tmpDir, 'prompts');
109
+ await fs.mkdir(promptsDir, { recursive: true });
110
+ await fs.writeFile(path.join(promptsDir, 'orchestrator.md'), '# Orchestrator');
111
+ await adapter.injectInstructions(makeConfig({ promptsDir, projectType: 'cli-tool' }));
112
+ const content = await fs.readFile(path.join(tmpDir, 'CLAUDE.md'), 'utf-8');
113
+ expect(content).toContain('context7');
114
+ expect(content).not.toContain('playwright');
115
+ });
116
+ it('shows full-hool mode instructions when set', async () => {
117
+ const promptsDir = path.join(tmpDir, 'prompts');
118
+ await fs.mkdir(promptsDir, { recursive: true });
119
+ await fs.writeFile(path.join(promptsDir, 'orchestrator.md'), '# Orchestrator');
120
+ await adapter.injectInstructions(makeConfig({ promptsDir, mode: 'full-hool' }));
121
+ const content = await fs.readFile(path.join(tmpDir, 'CLAUDE.md'), 'utf-8');
122
+ expect(content).toContain('full-hool mode');
123
+ expect(content).toContain('fully autonomous');
124
+ });
125
+ it('falls back when orchestrator.md not found', async () => {
126
+ await adapter.injectInstructions(makeConfig({ promptsDir: '/nonexistent' }));
127
+ const content = await fs.readFile(path.join(tmpDir, 'CLAUDE.md'), 'utf-8');
128
+ expect(content).toContain('orchestrator.md not found');
129
+ });
130
+ it('uses correct log naming convention with agent and attempt number', async () => {
131
+ const promptsDir = path.join(tmpDir, 'prompts');
132
+ await fs.mkdir(promptsDir, { recursive: true });
133
+ await fs.writeFile(path.join(promptsDir, 'orchestrator.md'), '# Orchestrator');
134
+ await adapter.injectInstructions(makeConfig({ promptsDir }));
135
+ const content = await fs.readFile(path.join(tmpDir, 'CLAUDE.md'), 'utf-8');
136
+ expect(content).toContain('<TASK-ID>-<agent>-<NN>.jsonl');
137
+ expect(content).not.toMatch(/<TASK-ID>\.jsonl/);
138
+ });
139
+ });
140
+ describe('getCompletionMessage', () => {
141
+ it('includes claude start instructions', () => {
142
+ const msg = adapter.getCompletionMessage(makeConfig());
143
+ expect(msg).toContain('$ claude');
144
+ expect(msg).toContain('Phase 1');
145
+ });
146
+ });
147
+ });
148
+ describe('CursorAdapter', () => {
149
+ const adapter = new CursorAdapter();
150
+ describe('injectInstructions', () => {
151
+ it('creates .cursor/rules/hool.mdc', async () => {
152
+ await adapter.injectInstructions(makeConfig({ platform: 'cursor' }));
153
+ const content = await fs.readFile(path.join(tmpDir, '.cursor/rules/hool.mdc'), 'utf-8');
154
+ expect(content).toContain('HOOL');
155
+ expect(content).toContain('Product Lead');
156
+ });
157
+ it('includes execution mode', async () => {
158
+ await adapter.injectInstructions(makeConfig({ platform: 'cursor', mode: 'full-hool' }));
159
+ const content = await fs.readFile(path.join(tmpDir, '.cursor/rules/hool.mdc'), 'utf-8');
160
+ expect(content).toContain('full-hool');
161
+ });
162
+ });
163
+ describe('getCompletionMessage', () => {
164
+ it('includes cursor-specific instructions', () => {
165
+ const msg = adapter.getCompletionMessage(makeConfig({ platform: 'cursor' }));
166
+ expect(msg).toContain('Cursor');
167
+ });
168
+ });
169
+ });
170
+ describe('GenericAdapter', () => {
171
+ const adapter = new GenericAdapter();
172
+ describe('injectInstructions', () => {
173
+ it('creates HOOL-INSTRUCTIONS.md', async () => {
174
+ await adapter.injectInstructions(makeConfig({ platform: 'generic' }));
175
+ const content = await fs.readFile(path.join(tmpDir, 'HOOL-INSTRUCTIONS.md'), 'utf-8');
176
+ expect(content).toContain('HOOL');
177
+ expect(content).toContain('orchestrator.md');
178
+ });
179
+ });
180
+ describe('installMcp', () => {
181
+ it('is a no-op', async () => {
182
+ const mcp = { name: 'test', installCommand: 'test', configEntry: {} };
183
+ await expect(adapter.installMcp(mcp)).resolves.toBeUndefined();
184
+ });
185
+ });
186
+ describe('isMcpInstalled', () => {
187
+ it('always returns false', async () => {
188
+ expect(await adapter.isMcpInstalled('anything')).toBe(false);
189
+ });
190
+ });
191
+ describe('getCompletionMessage', () => {
192
+ it('mentions manual MCP install', () => {
193
+ const msg = adapter.getCompletionMessage(makeConfig({ platform: 'generic' }));
194
+ expect(msg).toContain('manually');
195
+ });
196
+ });
197
+ });
198
+ //# sourceMappingURL=adapters.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.test.js","sourceRoot":"","sources":["../../src/adapters/adapters.test.ts"],"names":[],"mappings":"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"}