hool-cli 0.7.4 → 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.
- package/dist/adapters/adapters.test.js +88 -10
- package/dist/adapters/adapters.test.js.map +1 -1
- package/dist/adapters/claude-code.js +48 -31
- package/dist/adapters/claude-code.js.map +1 -1
- package/dist/adapters/types.d.ts +2 -0
- package/dist/core/scaffold.d.ts +4 -4
- package/dist/core/scaffold.js +151 -48
- package/dist/core/scaffold.js.map +1 -1
- package/dist/core/templates.d.ts +2 -0
- package/dist/core/templates.js +31 -0
- package/dist/core/templates.js.map +1 -1
- package/dist/e2e.test.js +241 -1
- package/dist/e2e.test.js.map +1 -1
- package/dist/index.js +23 -12
- package/dist/index.js.map +1 -1
- package/dist/mcps/mcps.test.js +1 -0
- package/dist/mcps/mcps.test.js.map +1 -1
- package/package.json +4 -8
- package/presets/solo/NEXT-v0.1-context-mcp.md +95 -0
- package/presets/solo/docs/workflow-reference.md +784 -0
- package/presets/solo/mcps/README.md +129 -0
- package/presets/solo/mcps/testing-by-domain.md +138 -0
- package/presets/solo/memory/be-dev/best-practices.md +0 -0
- package/presets/solo/memory/be-dev/cold.md +4 -0
- package/presets/solo/memory/be-dev/hot.md +0 -0
- package/presets/solo/memory/be-dev/issues.md +0 -0
- package/presets/solo/memory/be-tech-lead/best-practices.md +0 -0
- package/presets/solo/memory/be-tech-lead/cold.md +4 -0
- package/presets/solo/memory/be-tech-lead/hot.md +0 -0
- package/presets/solo/memory/be-tech-lead/issues.md +0 -0
- package/presets/solo/memory/fe-dev/best-practices.md +0 -0
- package/presets/solo/memory/fe-dev/cold.md +4 -0
- package/presets/solo/memory/fe-dev/hot.md +0 -0
- package/presets/solo/memory/fe-dev/issues.md +0 -0
- package/presets/solo/memory/fe-tech-lead/best-practices.md +0 -0
- package/presets/solo/memory/fe-tech-lead/cold.md +4 -0
- package/presets/solo/memory/fe-tech-lead/hot.md +0 -0
- package/presets/solo/memory/fe-tech-lead/issues.md +0 -0
- package/presets/solo/memory/forensic/best-practices.md +0 -0
- package/presets/solo/memory/forensic/cold.md +4 -0
- package/presets/solo/memory/forensic/hot.md +0 -0
- package/presets/solo/memory/forensic/issues.md +0 -0
- package/presets/solo/memory/product-lead/best-practices.md +0 -0
- package/presets/solo/memory/product-lead/cold.md +5 -0
- package/presets/solo/memory/product-lead/hot.md +0 -0
- package/presets/solo/memory/product-lead/issues.md +0 -0
- package/presets/solo/memory/qa/best-practices.md +0 -0
- package/presets/solo/memory/qa/cold.md +4 -0
- package/presets/solo/memory/qa/hot.md +0 -0
- package/presets/solo/memory/qa/issues.md +0 -0
- package/presets/solo/operations/bugs.md +10 -0
- package/presets/solo/operations/current-phase.md +8 -0
- package/presets/solo/operations/inconsistencies.md +8 -0
- package/presets/solo/operations/issues.md +11 -0
- package/presets/solo/operations/metrics.md +4 -0
- package/presets/solo/operations/needs-human-review.md +8 -0
- package/presets/solo/operations/task-board.md +10 -0
- package/presets/team/agents/claude/be-dev.md +166 -0
- package/presets/team/agents/claude/be-tech-lead.md +233 -0
- package/presets/team/agents/claude/fe-dev.md +202 -0
- package/presets/team/agents/claude/fe-tech-lead.md +229 -0
- package/presets/team/agents/claude/forensic.md +158 -0
- package/presets/team/agents/claude/governor.md +99 -0
- package/presets/team/agents/claude/product-lead.md +602 -0
- package/presets/team/agents/claude/qa.md +155 -0
- package/presets/team/cli/git-setup.md +175 -0
- package/presets/team/hooks/completion-checklist.sh +39 -0
- package/presets/team/hooks/governor-trigger.sh +30 -0
- package/presets/team/hooks/identity-reminder.sh +30 -0
- package/presets/team/hooks/login-nudge.sh +64 -0
- package/presets/team/hooks/metrics.sh +23 -0
- package/presets/team/mcps/mcps.json +50 -0
- package/presets/team/mcps/testing-by-domain.md +68 -0
- package/presets/team/prompts/claude-md.md +185 -0
- package/presets/team/settings/claude-settings.json +76 -0
- package/presets/team/skills/architect.md +75 -0
- package/presets/team/skills/auditor.md +89 -0
- package/presets/team/skills/brainstormer.md +53 -0
- package/presets/team/skills/code-reviewer.md +77 -0
- package/presets/team/skills/contract-negotiator.md +98 -0
- package/presets/team/skills/designer.md +87 -0
- package/presets/team/skills/root-cause-analyst.md +85 -0
- package/presets/team/skills/speccer.md +85 -0
- package/presets/team/skills/tdd-implementer.md +104 -0
- package/presets/team/skills/test-engineer.md +87 -0
- package/presets/team/templates/memory/best-practices.md +6 -0
- package/presets/team/templates/memory/client-preferences.md +14 -0
- package/presets/team/templates/memory/cold.md +5 -0
- package/presets/team/templates/memory/governor-feedback.md +5 -0
- package/presets/team/templates/memory/hot.md +12 -0
- package/presets/team/templates/memory/identity.md +22 -0
- package/presets/team/templates/memory/issues.md +9 -0
- package/presets/team/templates/memory/operational-knowledge.md +19 -0
- package/presets/team/templates/memory/picked-tasks.md +6 -0
- package/presets/team/templates/memory/skill.md +10 -0
- package/presets/team/templates/memory/task-log.md +17 -0
- package/presets/team/templates/operations/bugs.md +17 -0
- package/presets/team/templates/operations/client-preferences.md +21 -0
- package/presets/team/templates/operations/current-phase.md +4 -0
- package/presets/team/templates/operations/governor-feedback.md +11 -0
- package/presets/team/templates/operations/governor-log.md +14 -0
- package/presets/team/templates/operations/governor-rules.md +22 -0
- package/presets/team/templates/operations/human-feedback.md +7 -0
- package/presets/team/templates/operations/inconsistencies.md +12 -0
- package/presets/team/templates/operations/issues.md +13 -0
- package/presets/team/templates/operations/metrics.md +4 -0
- package/presets/team/templates/operations/needs-human-review.md +11 -0
- package/presets/team/templates/operations/task-board.md +11 -0
- package/presets/team/templates/phases/00-init/project-profile.md +45 -0
- package/presets/team/templates/phases/01-brainstorm/brainstorm.md +33 -0
- package/presets/team/templates/phases/02-spec/spec.md +28 -0
- package/presets/team/templates/phases/03-design/design.md +26 -0
- package/presets/team/templates/phases/04-architecture/architecture.md +26 -0
- package/presets/team/templates/phases/05-contracts/_index.md +20 -0
- package/presets/team/templates/phases/09-qa/test-plan.md +29 -0
- package/presets/team/templates/phases/12-retrospective/retrospective.md +24 -0
- /package/{agents → presets/solo/agents}/claude/be-dev.md +0 -0
- /package/{agents → presets/solo/agents}/claude/be-tech-lead.md +0 -0
- /package/{agents → presets/solo/agents}/claude/fe-dev.md +0 -0
- /package/{agents → presets/solo/agents}/claude/fe-tech-lead.md +0 -0
- /package/{agents → presets/solo/agents}/claude/forensic.md +0 -0
- /package/{agents → presets/solo/agents}/claude/governor.md +0 -0
- /package/{agents → presets/solo/agents}/claude/qa.md +0 -0
- /package/{agents → presets/solo/agents}/cursor/be-dev.md +0 -0
- /package/{agents → presets/solo/agents}/cursor/be-tech-lead.md +0 -0
- /package/{agents → presets/solo/agents}/cursor/fe-dev.md +0 -0
- /package/{agents → presets/solo/agents}/cursor/fe-tech-lead.md +0 -0
- /package/{agents → presets/solo/agents}/cursor/forensic.md +0 -0
- /package/{agents → presets/solo/agents}/cursor/governor.md +0 -0
- /package/{agents → presets/solo/agents}/cursor/qa.md +0 -0
- /package/{hooks → presets/solo/hooks}/agent-checklist.sh +0 -0
- /package/{hooks → presets/solo/hooks}/block-pl-src-write.sh +0 -0
- /package/{hooks → presets/solo/hooks}/inject-pl-context.sh +0 -0
- /package/{hooks → presets/solo/hooks}/pre-compact.sh +0 -0
- /package/{hooks → presets/solo/hooks}/run-if-profile.sh +0 -0
- /package/{hooks → presets/solo/hooks}/session-start.sh +0 -0
- /package/{hooks → presets/solo/hooks}/suggest-compact.sh +0 -0
- /package/{hooks → presets/solo/hooks}/track-prompt-count.sh +0 -0
- /package/{prompts → presets/solo/prompts}/agents/05-fe-tech-lead.md +0 -0
- /package/{prompts → presets/solo/prompts}/agents/06-be-tech-lead.md +0 -0
- /package/{prompts → presets/solo/prompts}/agents/08-be-dev.md +0 -0
- /package/{prompts → presets/solo/prompts}/agents/08-fe-dev.md +0 -0
- /package/{prompts → presets/solo/prompts}/agents/10-qa.md +0 -0
- /package/{prompts → presets/solo/prompts}/agents/11-forensic.md +0 -0
- /package/{prompts → presets/solo/prompts}/agents/governor.md +0 -0
- /package/{prompts → presets/solo/prompts}/checklists/code-review.md +0 -0
- /package/{prompts → presets/solo/prompts}/orchestrator.md +0 -0
- /package/{prompts → presets/solo/prompts}/skills/01-brainstorm.md +0 -0
- /package/{prompts → presets/solo/prompts}/skills/02-spec.md +0 -0
- /package/{prompts → presets/solo/prompts}/skills/03-design.md +0 -0
- /package/{prompts → presets/solo/prompts}/skills/04-architecture.md +0 -0
- /package/{rules → presets/solo/rules}/cursor/be-dev.mdc +0 -0
- /package/{rules → presets/solo/rules}/cursor/be-tech-lead.mdc +0 -0
- /package/{rules → presets/solo/rules}/cursor/fe-dev.mdc +0 -0
- /package/{rules → presets/solo/rules}/cursor/fe-tech-lead.mdc +0 -0
- /package/{rules → presets/solo/rules}/cursor/forensic.mdc +0 -0
- /package/{rules → presets/solo/rules}/cursor/governor.mdc +0 -0
- /package/{rules → presets/solo/rules}/cursor/qa.mdc +0 -0
- /package/{settings → presets/solo/settings}/be-dev.json +0 -0
- /package/{settings → presets/solo/settings}/be-tech-lead.json +0 -0
- /package/{settings → presets/solo/settings}/claude-settings.json +0 -0
- /package/{settings → presets/solo/settings}/fe-dev.json +0 -0
- /package/{settings → presets/solo/settings}/fe-tech-lead.json +0 -0
- /package/{settings → presets/solo/settings}/forensic.json +0 -0
- /package/{settings → presets/solo/settings}/governor.json +0 -0
- /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 |
|