hool-cli 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/dist/adapters/adapters.test.js +1 -0
  2. package/dist/adapters/adapters.test.js.map +1 -1
  3. package/dist/adapters/claude-code.js +23 -8
  4. package/dist/adapters/claude-code.js.map +1 -1
  5. package/dist/adapters/types.d.ts +2 -0
  6. package/dist/core/scaffold.d.ts +4 -4
  7. package/dist/core/scaffold.js +151 -48
  8. package/dist/core/scaffold.js.map +1 -1
  9. package/dist/core/templates.d.ts +2 -0
  10. package/dist/core/templates.js +31 -0
  11. package/dist/core/templates.js.map +1 -1
  12. package/dist/e2e.test.js +240 -0
  13. package/dist/e2e.test.js.map +1 -1
  14. package/dist/index.js +23 -12
  15. package/dist/index.js.map +1 -1
  16. package/dist/mcps/mcps.test.js +1 -0
  17. package/dist/mcps/mcps.test.js.map +1 -1
  18. package/package.json +4 -8
  19. package/presets/solo/NEXT-v0.1-context-mcp.md +95 -0
  20. package/presets/solo/docs/workflow-reference.md +784 -0
  21. package/presets/solo/mcps/README.md +129 -0
  22. package/presets/solo/mcps/testing-by-domain.md +138 -0
  23. package/presets/solo/memory/be-dev/best-practices.md +0 -0
  24. package/presets/solo/memory/be-dev/cold.md +4 -0
  25. package/presets/solo/memory/be-dev/hot.md +0 -0
  26. package/presets/solo/memory/be-dev/issues.md +0 -0
  27. package/presets/solo/memory/be-tech-lead/best-practices.md +0 -0
  28. package/presets/solo/memory/be-tech-lead/cold.md +4 -0
  29. package/presets/solo/memory/be-tech-lead/hot.md +0 -0
  30. package/presets/solo/memory/be-tech-lead/issues.md +0 -0
  31. package/presets/solo/memory/fe-dev/best-practices.md +0 -0
  32. package/presets/solo/memory/fe-dev/cold.md +4 -0
  33. package/presets/solo/memory/fe-dev/hot.md +0 -0
  34. package/presets/solo/memory/fe-dev/issues.md +0 -0
  35. package/presets/solo/memory/fe-tech-lead/best-practices.md +0 -0
  36. package/presets/solo/memory/fe-tech-lead/cold.md +4 -0
  37. package/presets/solo/memory/fe-tech-lead/hot.md +0 -0
  38. package/presets/solo/memory/fe-tech-lead/issues.md +0 -0
  39. package/presets/solo/memory/forensic/best-practices.md +0 -0
  40. package/presets/solo/memory/forensic/cold.md +4 -0
  41. package/presets/solo/memory/forensic/hot.md +0 -0
  42. package/presets/solo/memory/forensic/issues.md +0 -0
  43. package/presets/solo/memory/product-lead/best-practices.md +0 -0
  44. package/presets/solo/memory/product-lead/cold.md +5 -0
  45. package/presets/solo/memory/product-lead/hot.md +0 -0
  46. package/presets/solo/memory/product-lead/issues.md +0 -0
  47. package/presets/solo/memory/qa/best-practices.md +0 -0
  48. package/presets/solo/memory/qa/cold.md +4 -0
  49. package/presets/solo/memory/qa/hot.md +0 -0
  50. package/presets/solo/memory/qa/issues.md +0 -0
  51. package/presets/solo/operations/bugs.md +10 -0
  52. package/presets/solo/operations/current-phase.md +8 -0
  53. package/presets/solo/operations/inconsistencies.md +8 -0
  54. package/presets/solo/operations/issues.md +11 -0
  55. package/presets/solo/operations/metrics.md +4 -0
  56. package/presets/solo/operations/needs-human-review.md +8 -0
  57. package/presets/solo/operations/task-board.md +10 -0
  58. package/presets/team/agents/claude/be-dev.md +166 -0
  59. package/presets/team/agents/claude/be-tech-lead.md +233 -0
  60. package/presets/team/agents/claude/fe-dev.md +202 -0
  61. package/presets/team/agents/claude/fe-tech-lead.md +229 -0
  62. package/presets/team/agents/claude/forensic.md +158 -0
  63. package/presets/team/agents/claude/governor.md +99 -0
  64. package/presets/team/agents/claude/product-lead.md +602 -0
  65. package/presets/team/agents/claude/qa.md +155 -0
  66. package/presets/team/cli/git-setup.md +175 -0
  67. package/presets/team/hooks/completion-checklist.sh +39 -0
  68. package/presets/team/hooks/governor-trigger.sh +30 -0
  69. package/presets/team/hooks/identity-reminder.sh +30 -0
  70. package/presets/team/hooks/login-nudge.sh +64 -0
  71. package/presets/team/hooks/metrics.sh +23 -0
  72. package/presets/team/mcps/mcps.json +50 -0
  73. package/presets/team/mcps/testing-by-domain.md +68 -0
  74. package/presets/team/prompts/claude-md.md +185 -0
  75. package/presets/team/settings/claude-settings.json +76 -0
  76. package/presets/team/skills/architect.md +75 -0
  77. package/presets/team/skills/auditor.md +89 -0
  78. package/presets/team/skills/brainstormer.md +53 -0
  79. package/presets/team/skills/code-reviewer.md +77 -0
  80. package/presets/team/skills/contract-negotiator.md +98 -0
  81. package/presets/team/skills/designer.md +87 -0
  82. package/presets/team/skills/root-cause-analyst.md +85 -0
  83. package/presets/team/skills/speccer.md +85 -0
  84. package/presets/team/skills/tdd-implementer.md +104 -0
  85. package/presets/team/skills/test-engineer.md +87 -0
  86. package/presets/team/templates/memory/best-practices.md +6 -0
  87. package/presets/team/templates/memory/client-preferences.md +14 -0
  88. package/presets/team/templates/memory/cold.md +5 -0
  89. package/presets/team/templates/memory/governor-feedback.md +5 -0
  90. package/presets/team/templates/memory/hot.md +12 -0
  91. package/presets/team/templates/memory/identity.md +22 -0
  92. package/presets/team/templates/memory/issues.md +9 -0
  93. package/presets/team/templates/memory/operational-knowledge.md +19 -0
  94. package/presets/team/templates/memory/picked-tasks.md +6 -0
  95. package/presets/team/templates/memory/skill.md +10 -0
  96. package/presets/team/templates/memory/task-log.md +17 -0
  97. package/presets/team/templates/operations/bugs.md +17 -0
  98. package/presets/team/templates/operations/client-preferences.md +21 -0
  99. package/presets/team/templates/operations/current-phase.md +4 -0
  100. package/presets/team/templates/operations/governor-feedback.md +11 -0
  101. package/presets/team/templates/operations/governor-log.md +14 -0
  102. package/presets/team/templates/operations/governor-rules.md +22 -0
  103. package/presets/team/templates/operations/human-feedback.md +7 -0
  104. package/presets/team/templates/operations/inconsistencies.md +12 -0
  105. package/presets/team/templates/operations/issues.md +13 -0
  106. package/presets/team/templates/operations/metrics.md +4 -0
  107. package/presets/team/templates/operations/needs-human-review.md +11 -0
  108. package/presets/team/templates/operations/task-board.md +11 -0
  109. package/presets/team/templates/phases/00-init/project-profile.md +45 -0
  110. package/presets/team/templates/phases/01-brainstorm/brainstorm.md +33 -0
  111. package/presets/team/templates/phases/02-spec/spec.md +28 -0
  112. package/presets/team/templates/phases/03-design/design.md +26 -0
  113. package/presets/team/templates/phases/04-architecture/architecture.md +26 -0
  114. package/presets/team/templates/phases/05-contracts/_index.md +20 -0
  115. package/presets/team/templates/phases/09-qa/test-plan.md +29 -0
  116. package/presets/team/templates/phases/12-retrospective/retrospective.md +24 -0
  117. /package/{agents → presets/solo/agents}/claude/be-dev.md +0 -0
  118. /package/{agents → presets/solo/agents}/claude/be-tech-lead.md +0 -0
  119. /package/{agents → presets/solo/agents}/claude/fe-dev.md +0 -0
  120. /package/{agents → presets/solo/agents}/claude/fe-tech-lead.md +0 -0
  121. /package/{agents → presets/solo/agents}/claude/forensic.md +0 -0
  122. /package/{agents → presets/solo/agents}/claude/governor.md +0 -0
  123. /package/{agents → presets/solo/agents}/claude/qa.md +0 -0
  124. /package/{agents → presets/solo/agents}/cursor/be-dev.md +0 -0
  125. /package/{agents → presets/solo/agents}/cursor/be-tech-lead.md +0 -0
  126. /package/{agents → presets/solo/agents}/cursor/fe-dev.md +0 -0
  127. /package/{agents → presets/solo/agents}/cursor/fe-tech-lead.md +0 -0
  128. /package/{agents → presets/solo/agents}/cursor/forensic.md +0 -0
  129. /package/{agents → presets/solo/agents}/cursor/governor.md +0 -0
  130. /package/{agents → presets/solo/agents}/cursor/qa.md +0 -0
  131. /package/{hooks → presets/solo/hooks}/agent-checklist.sh +0 -0
  132. /package/{hooks → presets/solo/hooks}/block-pl-src-write.sh +0 -0
  133. /package/{hooks → presets/solo/hooks}/inject-pl-context.sh +0 -0
  134. /package/{hooks → presets/solo/hooks}/pre-compact.sh +0 -0
  135. /package/{hooks → presets/solo/hooks}/run-if-profile.sh +0 -0
  136. /package/{hooks → presets/solo/hooks}/session-start.sh +0 -0
  137. /package/{hooks → presets/solo/hooks}/suggest-compact.sh +0 -0
  138. /package/{hooks → presets/solo/hooks}/track-prompt-count.sh +0 -0
  139. /package/{prompts → presets/solo/prompts}/agents/05-fe-tech-lead.md +0 -0
  140. /package/{prompts → presets/solo/prompts}/agents/06-be-tech-lead.md +0 -0
  141. /package/{prompts → presets/solo/prompts}/agents/08-be-dev.md +0 -0
  142. /package/{prompts → presets/solo/prompts}/agents/08-fe-dev.md +0 -0
  143. /package/{prompts → presets/solo/prompts}/agents/10-qa.md +0 -0
  144. /package/{prompts → presets/solo/prompts}/agents/11-forensic.md +0 -0
  145. /package/{prompts → presets/solo/prompts}/agents/governor.md +0 -0
  146. /package/{prompts → presets/solo/prompts}/checklists/code-review.md +0 -0
  147. /package/{prompts → presets/solo/prompts}/orchestrator.md +0 -0
  148. /package/{prompts → presets/solo/prompts}/skills/01-brainstorm.md +0 -0
  149. /package/{prompts → presets/solo/prompts}/skills/02-spec.md +0 -0
  150. /package/{prompts → presets/solo/prompts}/skills/03-design.md +0 -0
  151. /package/{prompts → presets/solo/prompts}/skills/04-architecture.md +0 -0
  152. /package/{rules → presets/solo/rules}/cursor/be-dev.mdc +0 -0
  153. /package/{rules → presets/solo/rules}/cursor/be-tech-lead.mdc +0 -0
  154. /package/{rules → presets/solo/rules}/cursor/fe-dev.mdc +0 -0
  155. /package/{rules → presets/solo/rules}/cursor/fe-tech-lead.mdc +0 -0
  156. /package/{rules → presets/solo/rules}/cursor/forensic.mdc +0 -0
  157. /package/{rules → presets/solo/rules}/cursor/governor.mdc +0 -0
  158. /package/{rules → presets/solo/rules}/cursor/qa.mdc +0 -0
  159. /package/{settings → presets/solo/settings}/be-dev.json +0 -0
  160. /package/{settings → presets/solo/settings}/be-tech-lead.json +0 -0
  161. /package/{settings → presets/solo/settings}/claude-settings.json +0 -0
  162. /package/{settings → presets/solo/settings}/fe-dev.json +0 -0
  163. /package/{settings → presets/solo/settings}/fe-tech-lead.json +0 -0
  164. /package/{settings → presets/solo/settings}/forensic.json +0 -0
  165. /package/{settings → presets/solo/settings}/governor.json +0 -0
  166. /package/{settings → presets/solo/settings}/qa.json +0 -0
@@ -0,0 +1,155 @@
1
+ # Agent: QA
2
+
3
+ You are the QA agent, running as an **Agent Teams teammate**. You own testing — test plan creation, 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.
4
+
5
+ ## HOOL Context
6
+ - All state lives in files: `.hool/phases/`, `.hool/operations/`, `.hool/memory/`
7
+ - Never modify your own prompts — escalate to `.hool/operations/needs-human-review.md`
8
+ - MCP: context7 (`mcp__context7__resolve-library-id`, `mcp__context7__query-docs`)
9
+ - Playwright headless (`mcp__playwright__*`) — E2E testing, screenshots, browser automation. Use profile `qa`.
10
+ - Playwright headful (`mcp__playwright-headful__*`) — visible browser for showing test results to user, demonstrating bugs, or when user asks to watch a test run.
11
+
12
+ ## Teammates
13
+ - **Forensic** — you find bugs, Forensic diagnoses them. Message with bug details.
14
+ - **FE Dev / BE Dev** — message for reproduction context if needed
15
+ - **Product Lead** — assigns tasks, you report results
16
+
17
+ ## Roles
18
+ - **Test Planner** (Phase 9, first entry) — load `skills/test-engineer.md`
19
+ - **Test Executor** (Phase 9, subsequent) — load `skills/test-engineer.md`
20
+ - **Exploratory Tester** (Phase 9) — go beyond the plan, find edge cases
21
+
22
+ When entering Phase 9, read the test engineer skill file from `.hool/skills/`.
23
+
24
+ ## Boot Sequence
25
+ 1. Read `.hool/memory/qa/hot.md`
26
+ 2. Read `.hool/memory/qa/best-practices.md`
27
+ 3. Read `.hool/memory/qa/issues.md`
28
+ 4. Read `.hool/memory/qa/governor-feedback.md`
29
+ 5. Read `.hool/memory/qa/client-preferences.md`
30
+ 6. Read `.hool/memory/qa/operational-knowledge.md`
31
+ 7. Read `.hool/memory/qa/picked-tasks.md`
32
+ 8. Read `.hool/operations/governor-rules.md`
33
+ 9. Read `.hool/phases/02-spec/spec.md` (and `features/` if split) — source of truth for expected behavior
34
+
35
+ Cross-reference with other agents' memory when relevant.
36
+ Before submitting work, verify you haven't violated `governor-feedback.md` entries.
37
+
38
+ ## Phase 9: QA
39
+
40
+ ### Test Planning (first entry)
41
+
42
+ #### Reads
43
+ - `.hool/phases/02-spec/spec.md` (and `features/` if split)
44
+ - `.hool/phases/05-contracts/` (read `_index.md` first, then domain files)
45
+ - `.hool/phases/04-architecture/fe/lld.md`
46
+ - `.hool/phases/04-architecture/be/lld.md`
47
+ - `.hool/phases/04-architecture/schema.md`
48
+
49
+ #### Writes
50
+ - `.hool/phases/09-qa/test-plan.md` — coverage matrix + test infrastructure
51
+ - `.hool/phases/09-qa/cases/` — test cases split by feature (for larger projects)
52
+
53
+ #### Process
54
+ 1. Extract every acceptance criterion from spec
55
+ 2. Generate unit test cases for each service/function in LLD
56
+ 3. Generate integration test cases for each API endpoint from contracts
57
+ 4. Generate E2E test cases for each user story
58
+ 5. Generate visual test cases for each design card (screenshot comparison points)
59
+ 6. Cross-reference: every acceptance criterion has at least one test
60
+ 7. Document in test-plan.md (+ cases/ if >10 cases)
61
+
62
+ ### Test Execution
63
+
64
+ #### Reads
65
+ - `.hool/phases/09-qa/test-plan.md` (and `cases/` if split)
66
+ - `.hool/phases/03-design/cards/` — design cards for visual comparison
67
+ - `.hool/operations/bugs.md` — don't re-report known bugs
68
+
69
+ #### Process
70
+ 1. **Run existing tests**: unit → integration → E2E → report pass/fail. Capture output to `.hool/logs/test.log`.
71
+ 2. **Check logs after test runs**: Read `.hool/logs/be.log` and `.hool/logs/fe.log` — look for errors that tests might not catch (unhandled exceptions, DB errors, console errors). Include log evidence in bug reports.
72
+ 3. **Execute test plan**: walk through cases, verify expected results, capture evidence
73
+ 4. **Exploratory testing**:
74
+ - Rapid clicks / double submissions
75
+ - Empty inputs, max-length inputs, special characters
76
+ - Browser back/forward during flows
77
+ - Network-like scenarios (slow API)
78
+ - Permission boundaries (access things you shouldn't)
79
+ 5. **Visual testing** (FE):
80
+ - Use Playwright headless (`mcp__playwright__*`) to screenshot each page/screen
81
+ - Compare against design cards using multimodal analysis
82
+ - Check all states: default, empty, loading, error
83
+ - Use Playwright headful (`mcp__playwright-headful__*`) when user asks to see the test or when a visual bug needs human confirmation
84
+ 6. **Log verification**: After each test phase, check logs for:
85
+ - Error-level entries that didn't surface as test failures (silent errors)
86
+ - Warning-level entries that indicate degraded behavior
87
+ - Missing log entries for critical paths (logging gaps — report as issues)
88
+ 7. Bugs found → write to `.hool/operations/bugs.md` with log evidence → message PL
89
+
90
+ ### Test Case Format
91
+ ```markdown
92
+ ### TC-XXX: [Test Name]
93
+ - **Type**: unit | integration | e2e | visual
94
+ - **Source**: US-XXX / CONTRACT-XXX / DESIGN-XXX
95
+ - **Precondition**: [setup needed]
96
+ - **Steps**:
97
+ 1. [action]
98
+ 2. [action]
99
+ - **Expected**: [result]
100
+ - **Edge variant**: [if applicable]
101
+ ```
102
+
103
+ ### Bug Report Format
104
+ ```markdown
105
+ ## BUG-XXX: [brief description]
106
+ - **Found by**: qa
107
+ - **Severity**: critical | high | medium | low
108
+ - **Type**: functional | visual | performance | security
109
+ - **Spec reference**: US-XXX / TC-XXX
110
+ - **Steps to reproduce**:
111
+ 1. [step]
112
+ - **Expected**: [what should happen]
113
+ - **Actual**: [what actually happens]
114
+ - **Evidence**: [screenshot path or response body]
115
+ - **Environment**: [browser, viewport, etc.]
116
+ - **Status**: open
117
+ ```
118
+
119
+ ### Severity Guide
120
+ - **critical**: Core flow broken (can't login, can't submit, data loss)
121
+ - **high**: Feature doesn't work as specified
122
+ - **medium**: Feature works but with wrong behavior in edge case
123
+ - **low**: Visual glitch, cosmetic issue
124
+
125
+ ## What You DON'T Do
126
+ - Don't fix bugs. Report them.
127
+ - Don't review code quality. That's the Tech Lead's job.
128
+ - Don't suggest architectural changes.
129
+ - Don't modify source code.
130
+
131
+ ## Memory Update (before going idle)
132
+ - Append to `.hool/memory/qa/cold.md`
133
+ - Rebuild `.hool/memory/qa/hot.md`
134
+ - Update `.hool/memory/qa/task-log.md`
135
+ - Append [PATTERN]/[GOTCHA] to `best-practices.md`
136
+
137
+ ## Writable Paths
138
+ - `.hool/phases/09-qa/`
139
+ - `.hool/operations/bugs.md`
140
+ - `.hool/memory/qa/`
141
+
142
+ ## Forbidden Actions
143
+ - NEVER modify application source code (`src/`)
144
+ - NEVER modify agent prompts
145
+ - NEVER modify `governor-rules.md`
146
+ - NEVER fix bugs — only report them
147
+
148
+ ## Work Log Tags
149
+ - `[QA-PLAN]` — test plan generation
150
+ - `[QA-RUN]` — test execution results
151
+ - `[QA-BUG]` — bug discovered
152
+ - `[QA-VISUAL]` — visual test result
153
+ - `[QA-EXPLORATORY]` — exploratory testing result
154
+ - `[GOTCHA]` — trap/pitfall → best-practices.md
155
+ - `[PATTERN]` — reusable pattern → best-practices.md
@@ -0,0 +1,175 @@
1
+ # CLI Integration: Git Repo Setup
2
+
3
+ ## Overview
4
+
5
+ hool-team uses a **three-repo model**. The CLI must handle git initialization during `hool init` based on the project type and user's GitHub remote preferences.
6
+
7
+ ## Init Flow
8
+
9
+ ### Step 1: Project Type (determines which repos are needed)
10
+
11
+ ```
12
+ ? What are we building?
13
+ > Web application → needs FE + BE repos
14
+ > API / backend only → needs BE repo only
15
+ > CLI tool → needs BE repo only (or just project-level)
16
+ > Browser game → needs FE repo (+ BE if multiplayer)
17
+ > Animation → needs FE repo only
18
+ > Mobile app → needs FE + BE repos
19
+ > Desktop application → needs FE + BE repos
20
+ > Other → ask follow-up
21
+ ```
22
+
23
+ ### Step 2: Git Remotes (only for applicable repos)
24
+
25
+ If FE is needed:
26
+ ```
27
+ ? GitHub remote for frontend? (leave blank for local-only git)
28
+ > https://github.com/user/project-frontend.git
29
+ ```
30
+
31
+ If BE is needed:
32
+ ```
33
+ ? GitHub remote for backend? (leave blank for local-only git)
34
+ > https://github.com/user/project-backend.git
35
+ ```
36
+
37
+ ### Step 3: Git Initialization
38
+
39
+ ```typescript
40
+ async function setupGitRepos(projectType: string, feRemote?: string, beRemote?: string) {
41
+ const projectRoot = process.cwd();
42
+
43
+ // 1. Project-level git (always)
44
+ if (!existsSync(join(projectRoot, '.git'))) {
45
+ await exec('git init', { cwd: projectRoot });
46
+ }
47
+
48
+ // 2. Create .gitignore at project root
49
+ const gitignoreEntries = ['.hool/logs/', '.hool/browser-profiles/', 'node_modules/'];
50
+
51
+ // 3. Frontend repo (if applicable)
52
+ if (needsFE(projectType)) {
53
+ const feDir = join(projectRoot, 'src', 'frontend');
54
+ mkdirSync(feDir, { recursive: true });
55
+ gitignoreEntries.push('src/frontend/');
56
+
57
+ await exec('git init', { cwd: feDir });
58
+ if (feRemote) {
59
+ await exec(`git remote add origin ${feRemote}`, { cwd: feDir });
60
+ }
61
+ }
62
+
63
+ // 4. Backend repo (if applicable)
64
+ if (needsBE(projectType)) {
65
+ const beDir = join(projectRoot, 'src', 'backend');
66
+ mkdirSync(beDir, { recursive: true });
67
+ gitignoreEntries.push('src/backend/');
68
+
69
+ await exec('git init', { cwd: beDir });
70
+ if (beRemote) {
71
+ await exec(`git remote add origin ${beRemote}`, { cwd: beDir });
72
+ }
73
+ }
74
+
75
+ // 5. Write .gitignore
76
+ writeFileSync(
77
+ join(projectRoot, '.gitignore'),
78
+ gitignoreEntries.join('\n') + '\n'
79
+ );
80
+
81
+ // 6. Install Playwright MCP globally + create browser profile directories
82
+ if (needsFE(projectType)) {
83
+ // Permanent global install — profiles persist auth state across sessions
84
+ await exec('npm install -g @playwright/mcp');
85
+
86
+ // Each agent gets its own browser profile for persisted auth state
87
+ mkdirSync(join(projectRoot, '.hool', 'browser-profiles', 'qa'), { recursive: true });
88
+ mkdirSync(join(projectRoot, '.hool', 'browser-profiles', 'fe-dev'), { recursive: true });
89
+ mkdirSync(join(projectRoot, '.hool', 'browser-profiles', 'forensic'), { recursive: true });
90
+ }
91
+
92
+ // 7. Store remotes in client preferences
93
+ const prefs = readFileSync(join(projectRoot, '.hool/operations/client-preferences.md'), 'utf-8');
94
+ const remoteSection = `\n## Git Remotes\n- frontend: ${feRemote || 'local only'}\n- backend: ${beRemote || 'local only'}\n`;
95
+ writeFileSync(
96
+ join(projectRoot, '.hool/operations/client-preferences.md'),
97
+ prefs.replace('## Git Remotes\n<!-- Captured during Phase 0 init -->\n<!-- frontend: ... -->\n<!-- backend: ... -->', remoteSection.trim())
98
+ );
99
+ }
100
+
101
+ function needsFE(projectType: string): boolean {
102
+ return ['web-app', 'browser-game', 'animation', 'mobile', 'desktop'].includes(projectType);
103
+ }
104
+
105
+ function needsBE(projectType: string): boolean {
106
+ return ['web-app', 'api-only', 'cli-tool', 'mobile', 'desktop'].includes(projectType);
107
+ }
108
+ ```
109
+
110
+ ## Ship Phase Git Flow
111
+
112
+ ```typescript
113
+ async function shipFlow(feRemote?: string, beRemote?: string, version?: string) {
114
+ const tag = version || `v${Date.now()}`;
115
+
116
+ // 1. Frontend
117
+ if (existsSync('src/frontend/.git')) {
118
+ if (feRemote) {
119
+ await exec('git push -u origin main', { cwd: 'src/frontend' });
120
+ // Create PR via gh CLI if available
121
+ try {
122
+ await exec(`gh pr create --title "Release ${tag}" --body "HOOL automated release"`, { cwd: 'src/frontend' });
123
+ } catch {
124
+ console.log('gh CLI not available — pushed branch, create PR manually');
125
+ }
126
+ } else {
127
+ await exec(`git tag -a ${tag} -m "Release ${tag}"`, { cwd: 'src/frontend' });
128
+ }
129
+ }
130
+
131
+ // 2. Backend
132
+ if (existsSync('src/backend/.git')) {
133
+ if (beRemote) {
134
+ await exec('git push -u origin main', { cwd: 'src/backend' });
135
+ try {
136
+ await exec(`gh pr create --title "Release ${tag}" --body "HOOL automated release"`, { cwd: 'src/backend' });
137
+ } catch {
138
+ console.log('gh CLI not available — pushed branch, create PR manually');
139
+ }
140
+ } else {
141
+ await exec(`git tag -a ${tag} -m "Release ${tag}"`, { cwd: 'src/backend' });
142
+ }
143
+ }
144
+
145
+ // 3. Project-level
146
+ await exec(`git tag -a ${tag} -m "Release ${tag}"`);
147
+ }
148
+ ```
149
+
150
+ ## Key Differences from hool-mini
151
+
152
+ | Aspect | hool-mini | hool-team |
153
+ |--------|-----------|-----------|
154
+ | Git repos | 1 (project-level) | 3 (project + FE + BE) |
155
+ | Who commits | PL only | PL (project), Leads/Devs (domain repos) |
156
+ | .gitignore | N/A | src/frontend/ and src/backend/ ignored at project level |
157
+ | Remote setup | Not handled | CLI asks during init |
158
+ | Ship flow | PL commits + pushes | Domain repos push/tag independently |
159
+
160
+ ## Agent Settings Integration
161
+
162
+ The `CLAUDE_AGENT` env var tells hooks which agent is running. The CLI should set this when spawning teammates:
163
+
164
+ ```json
165
+ {
166
+ "env": {
167
+ "CLAUDE_AGENT": "be-dev"
168
+ }
169
+ }
170
+ ```
171
+
172
+ This is used by:
173
+ - `metrics.sh` — per-agent tool call counting
174
+ - `identity-reminder.sh` — inject correct agent context
175
+ - `completion-checklist.sh` — check correct domain repo for uncommitted changes
@@ -0,0 +1,39 @@
1
+ #!/bin/bash
2
+ # Hook: Completion Checklist
3
+ # Trigger: TeammateIdle (when a teammate finishes and goes idle)
4
+ # Purpose: Check for uncommitted changes in domain repos
5
+ #
6
+ # Exit code 0 = allow idle
7
+ # Exit code 2 = send feedback, keep agent working
8
+
9
+ set -euo pipefail
10
+
11
+ ISSUES=()
12
+
13
+ # Check for uncommitted changes in FE repo
14
+ if [ -d "src/frontend/.git" ]; then
15
+ UNCOMMITTED=$(cd src/frontend && git diff --name-only 2>/dev/null | wc -l | tr -d ' ')
16
+ if [ "$UNCOMMITTED" -gt 0 ]; then
17
+ ISSUES+=("${UNCOMMITTED} uncommitted file(s) in src/frontend/ — commit your changes")
18
+ fi
19
+ fi
20
+
21
+ # Check for uncommitted changes in BE repo
22
+ if [ -d "src/backend/.git" ]; then
23
+ UNCOMMITTED=$(cd src/backend && git diff --name-only 2>/dev/null | wc -l | tr -d ' ')
24
+ if [ "$UNCOMMITTED" -gt 0 ]; then
25
+ ISSUES+=("${UNCOMMITTED} uncommitted file(s) in src/backend/ — commit your changes")
26
+ fi
27
+ fi
28
+
29
+ # If issues found, send feedback and keep agent working
30
+ if [ ${#ISSUES[@]} -gt 0 ]; then
31
+ FEEDBACK="COMPLETION CHECKLIST: Fix before going idle:\n"
32
+ for issue in "${ISSUES[@]}"; do
33
+ FEEDBACK+="- ${issue}\n"
34
+ done
35
+ echo -e "$FEEDBACK" >&2
36
+ exit 2
37
+ fi
38
+
39
+ exit 0
@@ -0,0 +1,30 @@
1
+ #!/bin/bash
2
+ # Hook: Governor Trigger
3
+ # Trigger: TaskCompleted
4
+ # Purpose: Increment task count, nudge PL when governor audit is due (every 5)
5
+
6
+ set -euo pipefail
7
+
8
+ METRICS_FILE=".hool/operations/metrics.md"
9
+ GOVERNOR_THRESHOLD=5
10
+
11
+ if [ ! -f "$METRICS_FILE" ]; then
12
+ exit 0
13
+ fi
14
+
15
+ # Get and increment task completions
16
+ TASK_COMPLETIONS=$(grep -oP '(?<=task-completions: )\d+' "$METRICS_FILE" 2>/dev/null | head -1 || echo "0")
17
+ NEW_COUNT=$((TASK_COMPLETIONS + 1))
18
+ sed -i '' "s/task-completions: ${TASK_COMPLETIONS}/task-completions: ${NEW_COUNT}/" "$METRICS_FILE" 2>/dev/null || true
19
+
20
+ # Check if governor audit is due
21
+ if [ $((NEW_COUNT % GOVERNOR_THRESHOLD)) -eq 0 ]; then
22
+ cat << EOF
23
+ {
24
+ "hookSpecificOutput": {
25
+ "hookEventName": "TaskCompleted",
26
+ "additionalContext": "GOVERNOR AUDIT DUE: ${NEW_COUNT} tasks completed. Message the Governor teammate to run an audit cycle."
27
+ }
28
+ }
29
+ EOF
30
+ fi
@@ -0,0 +1,30 @@
1
+ #!/bin/bash
2
+ # Hook: Identity Reminder
3
+ # Trigger: UserPromptSubmit
4
+ # Purpose: Inject current phase and task status into prompt context
5
+
6
+ set -euo pipefail
7
+
8
+ CURRENT_PHASE=$(head -5 .hool/operations/current-phase.md 2>/dev/null | grep -oP '(?<=phase: )\S+' || echo "unknown")
9
+
10
+ # Get task board status
11
+ PENDING=0
12
+ COMPLETED=0
13
+ if [ -f ".hool/operations/task-board.md" ]; then
14
+ PENDING=$(grep -c '^\- \[ \]' ".hool/operations/task-board.md" 2>/dev/null || echo "0")
15
+ COMPLETED=$(grep -c '^\- \[x\]' ".hool/operations/task-board.md" 2>/dev/null || echo "0")
16
+ fi
17
+
18
+ CONTEXT="HOOL CONTEXT | "
19
+ CONTEXT+="Phase: ${CURRENT_PHASE} | "
20
+ CONTEXT+="Tasks: ${PENDING} pending, ${COMPLETED} done | "
21
+ CONTEXT+="REMEMBER: Read your agent file for identity and process. Check memory files. Update memory before going idle."
22
+
23
+ cat << EOF
24
+ {
25
+ "hookSpecificOutput": {
26
+ "hookEventName": "UserPromptSubmit",
27
+ "additionalContext": "${CONTEXT}"
28
+ }
29
+ }
30
+ EOF
@@ -0,0 +1,64 @@
1
+ #!/bin/bash
2
+ # Hook: Login Nudge
3
+ # Trigger: Called by PL before first QA run or when authenticated testing is needed
4
+ # Purpose: Prompt user to manually log into browser profiles
5
+ #
6
+ # Agents can't log into services requiring real credentials (OAuth, 2FA, passwords).
7
+ # This hook opens each browser profile in headed mode so the user can log in.
8
+ # After login, the profile persists cookies/localStorage for agent use.
9
+
10
+ set -euo pipefail
11
+
12
+ PROFILES_DIR=".hool/browser-profiles"
13
+ PROFILES=("qa" "fe-dev" "forensic")
14
+
15
+ echo "============================================"
16
+ echo " BROWSER PROFILE LOGIN REQUIRED"
17
+ echo "============================================"
18
+ echo ""
19
+ echo "Agents need authenticated browser sessions to test login-protected flows."
20
+ echo "You need to manually log into each browser profile."
21
+ echo ""
22
+
23
+ for profile in "${PROFILES[@]}"; do
24
+ PROFILE_DIR="${PROFILES_DIR}/${profile}"
25
+ mkdir -p "$PROFILE_DIR"
26
+
27
+ echo "---"
28
+ echo "Profile: ${profile}"
29
+ echo " Purpose:"
30
+ case "$profile" in
31
+ qa) echo " QA agent uses this for E2E testing and visual testing" ;;
32
+ fe-dev) echo " FE Dev uses this for design card comparison and visual checks" ;;
33
+ forensic) echo " Forensic uses this for reproducing UI bugs" ;;
34
+ esac
35
+ echo " Directory: ${PROFILE_DIR}/"
36
+ echo ""
37
+ done
38
+
39
+ echo "============================================"
40
+ echo " HOW TO LOG IN"
41
+ echo "============================================"
42
+ echo ""
43
+ echo "For each profile, run:"
44
+ echo ""
45
+ echo " playwright-mcp --profile .hool/browser-profiles/<profile-name>"
46
+ echo ""
47
+ echo "This opens a browser with that profile. Log into all required services,"
48
+ echo "then close the browser. The auth state will persist for agent use."
49
+ echo ""
50
+ echo "Example:"
51
+ echo " playwright-mcp --profile .hool/browser-profiles/qa"
52
+ echo ""
53
+ echo "After logging in to all profiles, tell the Product Lead you're done."
54
+ echo "============================================"
55
+
56
+ # Output for hook system
57
+ cat << 'EOF'
58
+ {
59
+ "hookSpecificOutput": {
60
+ "hookEventName": "UserPromptSubmit",
61
+ "additionalContext": "LOGIN NUDGE: Browser profiles need user login before agents can test authenticated flows. Profiles: qa, fe-dev, forensic. Ask the user to run: playwright-mcp --profile .hool/browser-profiles/<name> for each profile, log into required services, then close the browser."
62
+ }
63
+ }
64
+ EOF
@@ -0,0 +1,23 @@
1
+ #!/bin/bash
2
+ # Hook: Metrics
3
+ # Trigger: PostToolUse (every tool call)
4
+ # Purpose: Track total tool calls globally
5
+
6
+ set -euo pipefail
7
+
8
+ METRICS_FILE=".hool/operations/metrics.md"
9
+
10
+ # Ensure metrics file exists
11
+ if [ ! -f "$METRICS_FILE" ]; then
12
+ cat > "$METRICS_FILE" << 'INIT'
13
+ # Metrics
14
+
15
+ - tool-calls: 0
16
+ - task-completions: 0
17
+ INIT
18
+ fi
19
+
20
+ # Increment total tool calls
21
+ current_total=$(grep -oP '(?<=tool-calls: )\d+' "$METRICS_FILE" 2>/dev/null || echo "0")
22
+ new_total=$((current_total + 1))
23
+ sed -i '' "s/tool-calls: ${current_total}/tool-calls: ${new_total}/" "$METRICS_FILE" 2>/dev/null || true
@@ -0,0 +1,50 @@
1
+ {
2
+ "servers": {
3
+ "context7": {
4
+ "command": "npx",
5
+ "args": ["-y", "@context7/mcp"],
6
+ "install": "global (npx auto-installs)",
7
+ "description": "Up-to-date library documentation. All agents use this.",
8
+ "agents": ["all"]
9
+ },
10
+ "deepwiki": {
11
+ "command": "npx",
12
+ "args": ["-y", "deepwiki-mcp"],
13
+ "install": "global (npx auto-installs)",
14
+ "description": "Deep documentation for open-source projects.",
15
+ "agents": ["product-lead", "be-tech-lead", "fe-tech-lead", "be-dev", "fe-dev"]
16
+ },
17
+ "playwright": {
18
+ "package": "@playwright/mcp",
19
+ "command": "playwright-mcp",
20
+ "args": ["--headless"],
21
+ "install": "npm install -g @playwright/mcp (done during hool init)",
22
+ "description": "Browser automation. Single instance, multiple named profiles.",
23
+ "agents": ["qa", "forensic", "fe-dev"],
24
+ "profiles": {
25
+ "description": "Each agent operates in its own named browser profile stored under .hool/browser-profiles/<profile-name>/. Profiles persist cookies, localStorage, and auth state across sessions.",
26
+ "available": ["qa", "fe-dev", "forensic"],
27
+ "user-login-required": "Agents cannot log into services that require real credentials (OAuth, 2FA, etc). The user must manually open each profile and log in before agents can test authenticated flows. See the login-nudge hook."
28
+ }
29
+ }
30
+ },
31
+ "by-domain": {
32
+ "web-app": ["context7", "deepwiki", "playwright"],
33
+ "api-only": ["context7", "deepwiki"],
34
+ "cli-tool": ["context7", "deepwiki"],
35
+ "browser-game": ["context7", "deepwiki", "playwright"],
36
+ "animation": ["context7", "deepwiki", "playwright"],
37
+ "mobile": ["context7", "deepwiki"],
38
+ "desktop": ["context7", "deepwiki", "playwright"]
39
+ },
40
+ "agent-access-matrix": {
41
+ "product-lead": ["context7", "deepwiki"],
42
+ "be-tech-lead": ["context7", "deepwiki"],
43
+ "fe-tech-lead": ["context7", "deepwiki"],
44
+ "be-dev": ["context7", "deepwiki"],
45
+ "fe-dev": ["context7", "deepwiki", "playwright"],
46
+ "qa": ["context7", "playwright"],
47
+ "forensic": ["context7", "playwright"],
48
+ "governor": ["context7"]
49
+ }
50
+ }
@@ -0,0 +1,68 @@
1
+ # Testing Strategy by Domain
2
+
3
+ How each project type gets tested, what MCP tools are available, and what gaps exist.
4
+
5
+ ## Web App (FE + BE)
6
+
7
+ ```
8
+ Layer | Tool | MCP | Autonomous?
9
+ -------------|-------------------|--------------|------------
10
+ Static | ESLint/TSC | none (CLI) | 100%
11
+ Unit (FE) | Vitest/Jest | none (CLI) | 100%
12
+ Unit (BE) | Vitest/Jest/Pytest| none (CLI) | 100%
13
+ Integration | Supertest/httpx | none (CLI) | 100%
14
+ E2E | Playwright | playwright | 100%
15
+ Visual | Playwright + multimodal | playwright | ~95%
16
+ ```
17
+ **Gaps**: Subjective aesthetic judgment (~5% escalated).
18
+
19
+ ## API / Backend Only
20
+
21
+ ```
22
+ Layer | Tool | MCP | Autonomous?
23
+ -------------|-------------------|--------------|------------
24
+ Static | ESLint/TSC | none (CLI) | 100%
25
+ Unit | Vitest/Jest/Pytest| none (CLI) | 100%
26
+ Integration | Supertest/httpx | none (CLI) | 100%
27
+ Contract | Schema validation | none (CLI) | 100%
28
+ Load | k6/autocannon | none (CLI) | 90%
29
+ ```
30
+ **Gaps**: Almost none. Best domain for autonomy.
31
+
32
+ ## Browser Game
33
+
34
+ ```
35
+ Layer | Tool | MCP | Autonomous?
36
+ -------------|-------------------|--------------|------------
37
+ Static | ESLint/TSC | none (CLI) | 100%
38
+ Unit (logic) | Vitest/Jest | none (CLI) | 100%
39
+ Visual | Playwright screenshot | playwright | ~60%
40
+ Game E2E | Playwright + game state bridge | playwright | ~50%
41
+ Performance | FPS monitoring | playwright | 90%
42
+ Game feel | Human playtest | none | 0%
43
+ ```
44
+ **Gaps**: Canvas interactions are coordinate-based, "is this fun" always requires human.
45
+
46
+ ## Mobile App
47
+
48
+ ```
49
+ Layer | Tool | MCP | Autonomous?
50
+ -------------|-------------------|--------------|------------
51
+ Static | ESLint/TSC | none (CLI) | 100%
52
+ Unit | Jest | none (CLI) | 100%
53
+ Integration | Supertest (API) | none (CLI) | 100%
54
+ E2E | Maestro or Detox | none | ~80%
55
+ Visual | Emulator screenshot| none | ~70%
56
+ ```
57
+ **Gaps**: No Playwright MCP — E2E relies on Maestro/Detox CLI. Real device testing not covered.
58
+
59
+ ## Summary
60
+
61
+ | Domain | Coverage | Biggest Gap | MCP Tools |
62
+ |--------|----------|-------------|-----------|
63
+ | Web App | ~95% | Aesthetic judgment | context7, deepwiki, playwright |
64
+ | API Only | ~98% | Security edge cases | context7, deepwiki |
65
+ | CLI Tool | ~95% | Integration testing | context7, deepwiki |
66
+ | Browser Game | ~55% | Game feel | context7, deepwiki, playwright |
67
+ | Mobile | ~70% | Device matrix | context7, deepwiki |
68
+ | Animation | ~50% | Smoothness feel | context7, deepwiki, playwright |