start-vibing 2.0.8 → 2.0.10

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 (139) hide show
  1. package/README.md +177 -176
  2. package/dist/cli.js +38 -11
  3. package/package.json +42 -42
  4. package/template/.claude/CLAUDE.md +174 -152
  5. package/template/.claude/agents/01-orchestration/agent-selector.md +130 -123
  6. package/template/.claude/agents/01-orchestration/checkpoint-manager.md +142 -131
  7. package/template/.claude/agents/01-orchestration/context-manager.md +138 -124
  8. package/template/.claude/agents/01-orchestration/error-recovery.md +182 -176
  9. package/template/.claude/agents/01-orchestration/orchestrator.md +114 -107
  10. package/template/.claude/agents/01-orchestration/parallel-coordinator.md +141 -130
  11. package/template/.claude/agents/01-orchestration/task-decomposer.md +121 -118
  12. package/template/.claude/agents/01-orchestration/workflow-router.md +114 -111
  13. package/template/.claude/agents/02-typescript/bun-runtime-expert.md +197 -180
  14. package/template/.claude/agents/02-typescript/esm-resolver.md +193 -187
  15. package/template/.claude/agents/02-typescript/import-alias-enforcer.md +158 -149
  16. package/template/.claude/agents/02-typescript/ts-generics-helper.md +183 -165
  17. package/template/.claude/agents/02-typescript/ts-migration-helper.md +238 -227
  18. package/template/.claude/agents/02-typescript/ts-strict-checker.md +180 -162
  19. package/template/.claude/agents/02-typescript/ts-types-analyzer.md +199 -185
  20. package/template/.claude/agents/02-typescript/type-definition-writer.md +187 -183
  21. package/template/.claude/agents/02-typescript/zod-schema-designer.md +212 -197
  22. package/template/.claude/agents/02-typescript/zod-validator.md +158 -153
  23. package/template/.claude/agents/03-testing/playwright-assertions.md +265 -255
  24. package/template/.claude/agents/03-testing/playwright-e2e.md +247 -245
  25. package/template/.claude/agents/03-testing/playwright-fixtures.md +234 -240
  26. package/template/.claude/agents/03-testing/playwright-multi-viewport.md +256 -261
  27. package/template/.claude/agents/03-testing/playwright-page-objects.md +247 -247
  28. package/template/.claude/agents/03-testing/test-cleanup-manager.md +248 -256
  29. package/template/.claude/agents/03-testing/test-data-generator.md +254 -266
  30. package/template/.claude/agents/03-testing/tester-integration.md +278 -278
  31. package/template/.claude/agents/03-testing/tester-unit.md +207 -204
  32. package/template/.claude/agents/03-testing/vitest-config.md +287 -289
  33. package/template/.claude/agents/04-docker/container-health.md +255 -239
  34. package/template/.claude/agents/04-docker/deployment-validator.md +225 -217
  35. package/template/.claude/agents/04-docker/docker-compose-designer.md +281 -268
  36. package/template/.claude/agents/04-docker/docker-env-manager.md +235 -228
  37. package/template/.claude/agents/04-docker/docker-multi-stage.md +241 -229
  38. package/template/.claude/agents/04-docker/dockerfile-optimizer.md +208 -204
  39. package/template/.claude/agents/05-database/data-migration.md +0 -293
  40. package/template/.claude/agents/05-database/database-seeder.md +273 -270
  41. package/template/.claude/agents/05-database/mongodb-query-optimizer.md +230 -219
  42. package/template/.claude/agents/05-database/mongoose-aggregation.md +306 -280
  43. package/template/.claude/agents/05-database/mongoose-index-optimizer.md +182 -174
  44. package/template/.claude/agents/05-database/mongoose-schema-designer.md +267 -267
  45. package/template/.claude/agents/06-security/auth-session-validator.md +68 -65
  46. package/template/.claude/agents/06-security/input-sanitizer.md +80 -81
  47. package/template/.claude/agents/06-security/owasp-checker.md +97 -87
  48. package/template/.claude/agents/06-security/permission-auditor.md +100 -95
  49. package/template/.claude/agents/06-security/security-auditor.md +84 -82
  50. package/template/.claude/agents/06-security/sensitive-data-scanner.md +83 -85
  51. package/template/.claude/agents/07-documentation/api-documenter.md +136 -131
  52. package/template/.claude/agents/07-documentation/changelog-manager.md +105 -96
  53. package/template/.claude/agents/07-documentation/documenter.md +76 -73
  54. package/template/.claude/agents/07-documentation/domain-updater.md +81 -74
  55. package/template/.claude/agents/07-documentation/jsdoc-generator.md +114 -114
  56. package/template/.claude/agents/07-documentation/readme-generator.md +135 -132
  57. package/template/.claude/agents/08-git/branch-manager.md +58 -58
  58. package/template/.claude/agents/08-git/commit-manager.md +63 -61
  59. package/template/.claude/agents/08-git/pr-creator.md +76 -72
  60. package/template/.claude/agents/09-quality/code-reviewer.md +71 -64
  61. package/template/.claude/agents/09-quality/quality-checker.md +67 -67
  62. package/template/.claude/agents/10-research/best-practices-finder.md +89 -82
  63. package/template/.claude/agents/10-research/competitor-analyzer.md +106 -96
  64. package/template/.claude/agents/10-research/pattern-researcher.md +93 -86
  65. package/template/.claude/agents/10-research/research-cache-manager.md +76 -75
  66. package/template/.claude/agents/10-research/research-web.md +98 -91
  67. package/template/.claude/agents/10-research/tech-evaluator.md +101 -94
  68. package/template/.claude/agents/11-ui-ux/accessibility-auditor.md +136 -128
  69. package/template/.claude/agents/11-ui-ux/design-system-enforcer.md +125 -116
  70. package/template/.claude/agents/11-ui-ux/skeleton-generator.md +118 -120
  71. package/template/.claude/agents/11-ui-ux/ui-desktop.md +132 -126
  72. package/template/.claude/agents/11-ui-ux/ui-mobile.md +98 -94
  73. package/template/.claude/agents/11-ui-ux/ui-tablet.md +110 -111
  74. package/template/.claude/agents/12-performance/api-latency-analyzer.md +156 -149
  75. package/template/.claude/agents/12-performance/bundle-analyzer.md +113 -107
  76. package/template/.claude/agents/12-performance/memory-leak-detector.md +137 -126
  77. package/template/.claude/agents/12-performance/performance-profiler.md +115 -108
  78. package/template/.claude/agents/12-performance/query-optimizer.md +124 -116
  79. package/template/.claude/agents/12-performance/render-optimizer.md +154 -148
  80. package/template/.claude/agents/13-debugging/build-error-fixer.md +207 -188
  81. package/template/.claude/agents/13-debugging/debugger.md +149 -137
  82. package/template/.claude/agents/13-debugging/error-stack-analyzer.md +141 -131
  83. package/template/.claude/agents/13-debugging/network-debugger.md +208 -185
  84. package/template/.claude/agents/13-debugging/runtime-error-fixer.md +181 -173
  85. package/template/.claude/agents/13-debugging/type-error-resolver.md +185 -173
  86. package/template/.claude/agents/14-validation/final-validator.md +93 -83
  87. package/template/.claude/agents/_backup/analyzer.md +134 -125
  88. package/template/.claude/agents/_backup/code-reviewer.md +279 -272
  89. package/template/.claude/agents/_backup/commit-manager.md +219 -212
  90. package/template/.claude/agents/_backup/debugger.md +280 -271
  91. package/template/.claude/agents/_backup/documenter.md +237 -220
  92. package/template/.claude/agents/_backup/domain-updater.md +197 -194
  93. package/template/.claude/agents/_backup/final-validator.md +169 -164
  94. package/template/.claude/agents/_backup/orchestrator.md +149 -138
  95. package/template/.claude/agents/_backup/performance.md +232 -228
  96. package/template/.claude/agents/_backup/quality-checker.md +240 -240
  97. package/template/.claude/agents/_backup/research.md +315 -299
  98. package/template/.claude/agents/_backup/security-auditor.md +192 -186
  99. package/template/.claude/agents/_backup/tester.md +566 -564
  100. package/template/.claude/agents/_backup/ui-ux-reviewer.md +247 -242
  101. package/template/.claude/commands/feature.md +48 -48
  102. package/template/.claude/config/README.md +30 -30
  103. package/template/.claude/config/mcp-config.json +344 -330
  104. package/template/.claude/config/project-config.json +53 -53
  105. package/template/.claude/config/quality-gates.json +46 -46
  106. package/template/.claude/config/security-rules.json +45 -45
  107. package/template/.claude/config/testing-config.json +164 -168
  108. package/template/.claude/hooks/SETUP.md +126 -126
  109. package/template/.claude/hooks/run-hook.ts +176 -172
  110. package/template/.claude/hooks/stop-validator.ts +825 -353
  111. package/template/.claude/hooks/user-prompt-submit.ts +886 -794
  112. package/template/.claude/scripts/mcp-quick-install.ts +151 -151
  113. package/template/.claude/scripts/setup-mcps.ts +651 -628
  114. package/template/.claude/settings.json +275 -276
  115. package/template/.claude/skills/bun-runtime/SKILL.md +430 -430
  116. package/template/.claude/skills/codebase-knowledge/SKILL.md +145 -145
  117. package/template/.claude/skills/codebase-knowledge/domains/claude-system.md +431 -403
  118. package/template/.claude/skills/codebase-knowledge/domains/mcp-integration.md +295 -281
  119. package/template/.claude/skills/debugging-patterns/SKILL.md +485 -484
  120. package/template/.claude/skills/docker-patterns/SKILL.md +555 -547
  121. package/template/.claude/skills/docs-tracker/SKILL.md +239 -239
  122. package/template/.claude/skills/final-check/SKILL.md +284 -284
  123. package/template/.claude/skills/git-workflow/SKILL.md +454 -454
  124. package/template/.claude/skills/mongoose-patterns/SKILL.md +499 -512
  125. package/template/.claude/skills/nextjs-app-router/SKILL.md +327 -337
  126. package/template/.claude/skills/performance-patterns/SKILL.md +547 -549
  127. package/template/.claude/skills/playwright-automation/SKILL.md +438 -438
  128. package/template/.claude/skills/quality-gate/SKILL.md +294 -294
  129. package/template/.claude/skills/react-patterns/SKILL.md +389 -376
  130. package/template/.claude/skills/research-cache/SKILL.md +222 -207
  131. package/template/.claude/skills/security-scan/SKILL.md +222 -222
  132. package/template/.claude/skills/shadcn-ui/SKILL.md +511 -520
  133. package/template/.claude/skills/tailwind-patterns/SKILL.md +465 -467
  134. package/template/.claude/skills/test-coverage/SKILL.md +467 -464
  135. package/template/.claude/skills/trpc-api/SKILL.md +434 -435
  136. package/template/.claude/skills/typescript-strict/SKILL.md +367 -368
  137. package/template/.claude/skills/ui-ux-audit/SKILL.md +254 -254
  138. package/template/.claude/skills/zod-validation/SKILL.md +403 -405
  139. package/template/CLAUDE.md +25 -25
@@ -1,794 +1,886 @@
1
- #!/usr/bin/env node
2
- /**
3
- * UserPromptSubmit Hook - TypeScript version (fallback when Python not available)
4
- *
5
- * This hook runs BEFORE Claude processes any user prompt and ENFORCES:
6
- * 1. MANDATORY detailed todo list creation from prompt
7
- * 2. MANDATORY research agent for new features
8
- * 3. STRICT workflow: audit -> branch -> implement -> document -> quality -> PR
9
- * 4. Separate UI for mobile/tablet/desktop (NOT just responsive)
10
- *
11
- * AGENT SYSTEM: 82 specialized agents in 14 categories
12
- * SKILL SYSTEM: 22 skills auto-loaded by agents
13
- */
14
-
15
- import { existsSync, readFileSync } from 'fs';
16
- import { join } from 'path';
17
-
18
- const PROJECT_DIR = process.env['CLAUDE_PROJECT_DIR'] || process.cwd();
19
- const WORKFLOW_STATE_PATH = join(PROJECT_DIR, '.claude', 'workflow-state.json');
20
-
21
- const STRICT_WORKFLOW = `
22
- ┌─────────────────────────────────────────────────────────────────┐
23
- │ STRICT WORKFLOW (MANDATORY) │
24
- ├─────────────────────────────────────────────────────────────────┤
25
- │ 0. INIT TASK → Run commit-manager to REGISTER task start │
26
- │ 1. TODO LIST → Create DETAILED todo list from prompt │
27
- │ 2. RESEARCH → Run research agent for NEW features │
28
- │ 3. AUDIT → Check last audit docs OR run fresh audit │
29
- │ 4. BRANCH → Create feature/ | fix/ | refactor/ | test/ │
30
- │ 5. IMPLEMENT → Follow rules + analyzer approval │
31
- │ 6. DOCUMENT → Document ALL modified files (MANDATORY) │
32
- │ 7. QUALITY typecheck + lint + test (Husky enforced)
33
- │ 8. FINISH commit-manager creates PR with task summary
34
- └─────────────────────────────────────────────────────────────────┘
35
-
36
- ⚠️ STOP HOOK ACTIVE - Task completion will be BLOCKED if:
37
- - Working directly on main branch (must use feature/fix branch)
38
- - Source files not documented (must run documenter agent)
39
- - Documenter agent not executed for code changes
40
- `;
41
-
42
- // ============================================================================
43
- // AGENT SYSTEM - 82 Specialized Agents in 14 Categories
44
- // ============================================================================
45
-
46
- interface AgentInfo {
47
- triggers: string[];
48
- when: string;
49
- skills: string[];
50
- can_veto?: boolean;
51
- mandatory_for?: string[];
52
- }
53
-
54
- interface CategoryInfo {
55
- description: string;
56
- agents: Record<string, AgentInfo>;
57
- }
58
-
59
- const AGENT_CATEGORIES: Record<string, CategoryInfo> = {
60
- '01-orchestration': {
61
- description: 'Workflow coordination and task management',
62
- agents: {
63
- 'orchestrator': {
64
- triggers: ['implement feature', 'build', 'create', 'full workflow', 'multi-step'],
65
- when: 'Task requires >2 agents or touches >3 files',
66
- skills: ['codebase-knowledge']
67
- },
68
- 'task-decomposer': {
69
- triggers: ['complex task', 'break down', 'multiple steps'],
70
- when: 'Task has >3 steps or touches >3 files',
71
- skills: ['codebase-knowledge']
72
- },
73
- 'workflow-router': {
74
- triggers: ['route', 'which agent', 'unclear'],
75
- when: 'At task start to route to correct agent',
76
- skills: ['codebase-knowledge']
77
- },
78
- 'parallel-coordinator': {
79
- triggers: ['parallel', 'concurrent', 'simultaneous'],
80
- when: 'Multiple independent agents should run simultaneously',
81
- skills: ['codebase-knowledge']
82
- },
83
- 'context-manager': {
84
- triggers: ['context', 'compress', 'long conversation'],
85
- when: 'Context grows large or between major phases',
86
- skills: ['codebase-knowledge']
87
- },
88
- 'checkpoint-manager': {
89
- triggers: ['checkpoint', 'save state', 'backup'],
90
- when: 'BEFORE risky operations (git, deletions, refactors)',
91
- skills: ['codebase-knowledge']
92
- },
93
- 'error-recovery': {
94
- triggers: ['failed', 'retry', 'timeout', 'unexpected error'],
95
- when: 'An agent fails or returns unexpected results',
96
- skills: ['codebase-knowledge', 'debugging-patterns']
97
- },
98
- 'agent-selector': {
99
- triggers: ['select agent', 'best agent', 'which agent'],
100
- when: 'Multiple agents could handle a task',
101
- skills: ['codebase-knowledge']
102
- }
103
- }
104
- },
105
- '02-typescript': {
106
- description: 'TypeScript strict mode, types, and module resolution',
107
- agents: {
108
- 'ts-strict-checker': {
109
- triggers: ['strict mode', 'null check', 'process.env'],
110
- when: 'AFTER editing any .ts file',
111
- skills: ['typescript-strict']
112
- },
113
- 'ts-types-analyzer': {
114
- triggers: ['type error', 'inference', 'generic problem'],
115
- when: 'On type errors or typecheck fails',
116
- skills: ['typescript-strict']
117
- },
118
- 'ts-generics-helper': {
119
- triggers: ['generic', 'type parameter', 'complex type'],
120
- when: 'Creating generic functions/types',
121
- skills: ['typescript-strict']
122
- },
123
- 'ts-migration-helper': {
124
- triggers: ['migrate', 'convert to typescript', '.js'],
125
- when: 'Migrating JavaScript to TypeScript',
126
- skills: ['typescript-strict']
127
- },
128
- 'type-definition-writer': {
129
- triggers: ['new model', 'new entity', 'interface needed'],
130
- when: 'BEFORE implementing new entities',
131
- skills: ['typescript-strict']
132
- },
133
- 'import-alias-enforcer': {
134
- triggers: ['import', 'alias', '@types'],
135
- when: 'AFTER editing .ts files - enforces $types/*, @common, @db',
136
- skills: ['typescript-strict']
137
- },
138
- 'esm-resolver': {
139
- triggers: ['module error', 'import error', 'cannot find module'],
140
- when: 'On module errors',
141
- skills: ['typescript-strict', 'bun-runtime']
142
- },
143
- 'bun-runtime-expert': {
144
- triggers: ['bun', 'runtime', 'package management'],
145
- when: 'Using Bun runtime',
146
- skills: ['bun-runtime']
147
- },
148
- 'zod-validator': {
149
- triggers: ['validation', 'zod', 'schema'],
150
- when: 'BEFORE commit when API routes exist',
151
- skills: ['zod-validation']
152
- },
153
- 'zod-schema-designer': {
154
- triggers: ['new endpoint', 'form input', 'user input'],
155
- when: 'BEFORE implementing any API endpoint',
156
- skills: ['zod-validation', 'typescript-strict']
157
- }
158
- }
159
- },
160
- '03-testing': {
161
- description: 'Unit tests (Vitest) and E2E tests (Playwright)',
162
- agents: {
163
- 'vitest-config': {
164
- triggers: ['test setup', 'vitest config', 'coverage config'],
165
- when: 'Setting up tests or coverage issues arise',
166
- skills: ['test-coverage']
167
- },
168
- 'tester-unit': {
169
- triggers: ['unit test', 'function test', 'utility test'],
170
- when: 'AFTER implementing any function or utility',
171
- skills: ['test-coverage']
172
- },
173
- 'tester-integration': {
174
- triggers: ['integration test', 'api test', 'service test'],
175
- when: 'AFTER implementing API endpoints or services',
176
- skills: ['test-coverage']
177
- },
178
- 'test-data-generator': {
179
- triggers: ['mock data', 'test fixture', 'factory'],
180
- when: 'BEFORE writing tests that need data',
181
- skills: ['test-coverage']
182
- },
183
- 'test-cleanup-manager': {
184
- triggers: ['flaky test', 'test isolation', 'state leakage'],
185
- when: 'Tests are flaky or share state',
186
- skills: ['test-coverage']
187
- },
188
- 'playwright-e2e': {
189
- triggers: ['e2e test', 'user flow', 'end to end'],
190
- when: 'AFTER implementing any user-facing feature',
191
- skills: ['test-coverage', 'playwright-automation']
192
- },
193
- 'playwright-fixtures': {
194
- triggers: ['fixture', 'shared setup', 'auth helper'],
195
- when: 'Creating E2E tests that need shared setup',
196
- skills: ['test-coverage', 'playwright-automation']
197
- },
198
- 'playwright-page-objects': {
199
- triggers: ['page object', 'page model', 'page interaction'],
200
- when: 'Creating E2E tests for new pages',
201
- skills: ['test-coverage', 'playwright-automation']
202
- },
203
- 'playwright-multi-viewport': {
204
- triggers: ['viewport', 'responsive test', 'mobile test'],
205
- when: 'AFTER any UI implementation - tests desktop/tablet/mobile',
206
- skills: ['test-coverage', 'playwright-automation']
207
- },
208
- 'playwright-assertions': {
209
- triggers: ['assertion', 'expect', 'test validation'],
210
- when: 'Creating comprehensive test assertions',
211
- skills: ['test-coverage', 'playwright-automation']
212
- }
213
- }
214
- },
215
- '04-docker': {
216
- description: 'Docker containerization and deployment',
217
- agents: {
218
- 'dockerfile-optimizer': {
219
- triggers: ['dockerfile', 'docker build', 'image size'],
220
- when: 'Creating or modifying Dockerfile',
221
- skills: ['docker-patterns']
222
- },
223
- 'docker-multi-stage': {
224
- triggers: ['multi-stage', 'build optimization', 'production docker'],
225
- when: 'Dockerfile can benefit from multi-stage',
226
- skills: ['docker-patterns']
227
- },
228
- 'docker-compose-designer': {
229
- triggers: ['docker-compose', 'multi-service', 'local dev'],
230
- when: 'Multi-service setup is needed',
231
- skills: ['docker-patterns']
232
- },
233
- 'docker-env-manager': {
234
- triggers: ['docker env', 'secrets', 'env vars'],
235
- when: 'Docker uses environment variables',
236
- skills: ['docker-patterns']
237
- },
238
- 'container-health': {
239
- triggers: ['health check', 'container monitoring', 'service health'],
240
- when: 'Creating Docker containers',
241
- skills: ['docker-patterns']
242
- },
243
- 'deployment-validator': {
244
- triggers: ['deploy', 'pre-deploy', 'docker validation'],
245
- when: 'BEFORE deploying',
246
- skills: ['docker-patterns']
247
- }
248
- }
249
- },
250
- '05-database': {
251
- description: 'MongoDB/Mongoose database operations',
252
- agents: {
253
- 'mongoose-schema-designer': {
254
- triggers: ['schema', 'model', 'collection'],
255
- when: 'BEFORE creating any database model',
256
- skills: ['mongoose-patterns']
257
- },
258
- 'mongoose-index-optimizer': {
259
- triggers: ['index', 'slow query', 'query performance'],
260
- when: 'Database queries are slow',
261
- skills: ['mongoose-patterns']
262
- },
263
- 'mongoose-aggregation': {
264
- triggers: ['aggregation', 'pipeline', 'reporting'],
265
- when: 'Complex data queries needed',
266
- skills: ['mongoose-patterns']
267
- },
268
- 'mongodb-query-optimizer': {
269
- triggers: ['n+1', 'query optimizer', 'database performance'],
270
- when: 'Queries are slow',
271
- skills: ['mongoose-patterns']
272
- },
273
- 'database-seeder': {
274
- triggers: ['seed', 'sample data', 'dev data'],
275
- when: 'Setting up development environment',
276
- skills: ['mongoose-patterns']
277
- },
278
- 'data-migration': {
279
- triggers: ['migration', 'schema change', 'data transform'],
280
- when: 'Schema changes are needed',
281
- skills: ['mongoose-patterns']
282
- }
283
- }
284
- },
285
- '06-security': {
286
- description: 'Security auditing and OWASP compliance (CAN VETO)',
287
- agents: {
288
- 'security-auditor': {
289
- triggers: ['security', 'audit', 'vulnerability'],
290
- when: 'BEFORE committing auth/user/API code',
291
- can_veto: true,
292
- skills: ['security-scan']
293
- },
294
- 'owasp-checker': {
295
- triggers: ['owasp', 'top 10', 'security review'],
296
- when: 'BEFORE committing any API or security code',
297
- can_veto: true,
298
- skills: ['security-scan']
299
- },
300
- 'input-sanitizer': {
301
- triggers: ['sanitize', 'user input', 'xss'],
302
- when: 'Handling user input',
303
- skills: ['security-scan', 'zod-validation']
304
- },
305
- 'auth-session-validator': {
306
- triggers: ['auth', 'session', 'login', 'jwt'],
307
- when: 'Implementing auth or session code',
308
- skills: ['security-scan']
309
- },
310
- 'permission-auditor': {
311
- triggers: ['permission', 'authorization', 'access control'],
312
- when: 'Implementing protected routes',
313
- skills: ['security-scan']
314
- },
315
- 'sensitive-data-scanner': {
316
- triggers: ['sensitive', 'pii', 'data leak'],
317
- when: 'Implementing API responses or logging',
318
- skills: ['security-scan']
319
- }
320
- }
321
- },
322
- '07-documentation': {
323
- description: 'Documentation and domain knowledge updates',
324
- agents: {
325
- 'documenter': {
326
- triggers: ['document', 'docs', 'explain code'],
327
- when: 'AFTER any code implementation completes',
328
- skills: ['docs-tracker', 'codebase-knowledge']
329
- },
330
- 'domain-updater': {
331
- triggers: ['domain', 'learnings', 'session end'],
332
- when: 'BEFORE commit-manager at session end',
333
- skills: ['codebase-knowledge', 'docs-tracker']
334
- },
335
- 'readme-generator': {
336
- triggers: ['readme', 'project docs', 'setup guide'],
337
- when: 'Project structure changes significantly',
338
- skills: ['docs-tracker']
339
- },
340
- 'jsdoc-generator': {
341
- triggers: ['jsdoc', 'function docs', 'api docs'],
342
- when: 'Complex functions lack documentation',
343
- skills: ['docs-tracker', 'typescript-strict']
344
- },
345
- 'changelog-manager': {
346
- triggers: ['changelog', 'release notes', 'version'],
347
- when: 'BEFORE committing any feature or fix',
348
- skills: ['docs-tracker', 'git-workflow']
349
- },
350
- 'api-documenter': {
351
- triggers: ['api docs', 'swagger', 'openapi'],
352
- when: 'AFTER creating or modifying API endpoints',
353
- skills: ['docs-tracker']
354
- }
355
- }
356
- },
357
- '08-git': {
358
- description: 'Git workflow and version control',
359
- agents: {
360
- 'branch-manager': {
361
- triggers: ['branch', 'feature branch', 'fix branch'],
362
- when: 'BEFORE making source changes on main branch',
363
- skills: ['git-workflow']
364
- },
365
- 'commit-manager': {
366
- triggers: ['commit', 'push', 'finalize'],
367
- when: 'FINAL AGENT when implementation is complete',
368
- skills: ['git-workflow', 'docs-tracker', 'codebase-knowledge']
369
- },
370
- 'pr-creator': {
371
- triggers: ['pr', 'pull request', 'merge'],
372
- when: 'AFTER commit-manager when feature is ready',
373
- skills: ['git-workflow']
374
- }
375
- }
376
- },
377
- '09-quality': {
378
- description: 'Code quality and review',
379
- agents: {
380
- 'quality-checker': {
381
- triggers: ['quality', 'typecheck', 'lint', 'build'],
382
- when: 'BEFORE any commit',
383
- skills: ['quality-gate', 'codebase-knowledge']
384
- },
385
- 'code-reviewer': {
386
- triggers: ['review', 'pr review', 'code quality'],
387
- when: 'AFTER significant code is written',
388
- skills: ['quality-gate', 'codebase-knowledge']
389
- }
390
- }
391
- },
392
- '10-research': {
393
- description: 'Web research and best practices (MANDATORY for new features)',
394
- agents: {
395
- 'research-web': {
396
- triggers: ['search', 'find info', 'look up'],
397
- when: 'BEFORE implementing any new feature or technology',
398
- mandatory_for: ['feature'],
399
- skills: ['research-cache']
400
- },
401
- 'research-cache-manager': {
402
- triggers: ['cache', 'cached research', 'previous research'],
403
- when: 'BEFORE any web research',
404
- skills: ['research-cache']
405
- },
406
- 'best-practices-finder': {
407
- triggers: ['best practice', 'recommended', 'how should'],
408
- when: 'BEFORE implementing any new pattern',
409
- skills: ['research-cache']
410
- },
411
- 'pattern-researcher': {
412
- triggers: ['pattern', 'architecture', 'design decision'],
413
- when: 'Facing architectural decisions',
414
- skills: ['research-cache']
415
- },
416
- 'competitor-analyzer': {
417
- triggers: ['competitor', 'similar app', 'how does'],
418
- when: 'Designing UI or features with existing market solutions',
419
- skills: ['research-cache']
420
- },
421
- 'tech-evaluator': {
422
- triggers: ['compare', 'evaluate', 'which library'],
423
- when: 'Choosing between technologies',
424
- skills: ['research-cache']
425
- }
426
- }
427
- },
428
- '11-ui-ux': {
429
- description: 'UI/UX - SEPARATE UIs for mobile/tablet/desktop (NOT just responsive)',
430
- agents: {
431
- 'ui-mobile': {
432
- triggers: ['mobile', 'touch', '375px'],
433
- when: 'Implementing any UI feature',
434
- skills: ['ui-ux-audit', 'react-patterns', 'tailwind-patterns', 'shadcn-ui']
435
- },
436
- 'ui-tablet': {
437
- triggers: ['tablet', 'ipad', '768px'],
438
- when: 'Implementing any UI feature',
439
- skills: ['ui-ux-audit', 'react-patterns', 'tailwind-patterns', 'shadcn-ui']
440
- },
441
- 'ui-desktop': {
442
- triggers: ['desktop', 'sidebar', '1280px'],
443
- when: 'Implementing any UI feature',
444
- skills: ['ui-ux-audit', 'react-patterns', 'tailwind-patterns', 'shadcn-ui']
445
- },
446
- 'skeleton-generator': {
447
- triggers: ['skeleton', 'loading', 'placeholder'],
448
- when: 'AFTER creating any component that loads data',
449
- skills: ['react-patterns', 'tailwind-patterns']
450
- },
451
- 'design-system-enforcer': {
452
- triggers: ['design system', 'consistency', 'component style'],
453
- when: 'AFTER creating UI components',
454
- skills: ['ui-ux-audit', 'shadcn-ui', 'tailwind-patterns']
455
- },
456
- 'accessibility-auditor': {
457
- triggers: ['a11y', 'accessibility', 'wcag', 'screen reader'],
458
- when: 'AFTER any UI implementation',
459
- skills: ['ui-ux-audit']
460
- }
461
- }
462
- },
463
- '12-performance': {
464
- description: 'Performance profiling and optimization',
465
- agents: {
466
- 'performance-profiler': {
467
- triggers: ['slow', 'performance', 'profile', 'bottleneck'],
468
- when: 'Application is slow',
469
- skills: ['performance-patterns']
470
- },
471
- 'memory-leak-detector': {
472
- triggers: ['memory', 'leak', 'heap'],
473
- when: 'Memory issues are suspected',
474
- skills: ['performance-patterns']
475
- },
476
- 'bundle-analyzer': {
477
- triggers: ['bundle', 'build size', 'lighthouse'],
478
- when: 'Build is large or slow',
479
- skills: ['performance-patterns']
480
- },
481
- 'api-latency-analyzer': {
482
- triggers: ['api slow', 'response time', 'latency'],
483
- when: 'API endpoints are slow',
484
- skills: ['performance-patterns']
485
- },
486
- 'query-optimizer': {
487
- triggers: ['slow query', 'n+1', 'database slow'],
488
- when: 'Database queries are slow',
489
- skills: ['performance-patterns', 'mongoose-patterns']
490
- },
491
- 'render-optimizer': {
492
- triggers: ['re-render', 'react slow', 'component slow'],
493
- when: 'React components re-render excessively',
494
- skills: ['performance-patterns', 'react-patterns']
495
- }
496
- }
497
- },
498
- '13-debugging': {
499
- description: 'Error analysis and debugging',
500
- agents: {
501
- 'debugger': {
502
- triggers: ['bug', 'error', 'not working', 'broken', 'fails'],
503
- when: 'Any bug or error occurs',
504
- skills: ['debugging-patterns']
505
- },
506
- 'type-error-resolver': {
507
- triggers: ['ts error', 'type error', 'typecheck fails'],
508
- when: 'On TypeScript type errors',
509
- skills: ['debugging-patterns', 'typescript-strict']
510
- },
511
- 'runtime-error-fixer': {
512
- triggers: ['crash', 'exception', 'runtime error'],
513
- when: 'On runtime crashes or exceptions',
514
- skills: ['debugging-patterns']
515
- },
516
- 'network-debugger': {
517
- triggers: ['fetch error', 'api error', 'cors', 'network'],
518
- when: 'On network or API errors',
519
- skills: ['debugging-patterns']
520
- },
521
- 'error-stack-analyzer': {
522
- triggers: ['stack trace', 'trace', 'call stack'],
523
- when: 'Error includes stack trace',
524
- skills: ['debugging-patterns']
525
- },
526
- 'build-error-fixer': {
527
- triggers: ['build failed', 'compile error', 'bundler error'],
528
- when: 'Build fails',
529
- skills: ['debugging-patterns']
530
- }
531
- }
532
- },
533
- '14-validation': {
534
- description: 'Final validation before commit (CAN VETO)',
535
- agents: {
536
- 'final-validator': {
537
- triggers: ['final check', 'validate', 'ready to commit'],
538
- when: 'BEFORE commit-manager - last check',
539
- can_veto: true,
540
- skills: ['final-check']
541
- }
542
- }
543
- }
544
- };
545
-
546
- // ============================================================================
547
- // SKILL SYSTEM - 22 Skills Auto-loaded by Agents
548
- // ============================================================================
549
-
550
- const SKILLS: Record<string, string> = {
551
- 'bun-runtime': 'Bun runtime patterns, package management, scripts',
552
- 'codebase-knowledge': 'Project domain knowledge, file mapping, recent commits',
553
- 'debugging-patterns': 'Stack traces, runtime errors, build errors, network issues',
554
- 'docker-patterns': 'Containerization, multi-stage builds, Docker Compose, security',
555
- 'docs-tracker': 'Documentation maintenance, git diff detection, changelog',
556
- 'final-check': 'Final validation, tests pass, docs updated, security audited',
557
- 'git-workflow': 'Branch management, conventional commits, PR creation, hooks',
558
- 'mongoose-patterns': 'MongoDB schema design, queries, indexes, aggregations',
559
- 'nextjs-app-router': 'Next.js 15 App Router, Server/Client components, data fetching',
560
- 'performance-patterns': 'React optimization, bundle analysis, memory leaks, API latency',
561
- 'playwright-automation': 'E2E tests, browser automation, visual testing, API testing',
562
- 'quality-gate': 'Quality checks (typecheck, lint, test, build)',
563
- 'react-patterns': 'React 19 patterns, hooks, state management, performance',
564
- 'research-cache': 'Cached research findings, best practices by topic',
565
- 'security-scan': 'OWASP Top 10, user ID validation, sensitive data detection',
566
- 'shadcn-ui': 'shadcn/ui components, customization, theming, accessibility',
567
- 'tailwind-patterns': 'Tailwind CSS, responsive design, dark mode, animations',
568
- 'test-coverage': 'Playwright E2E, Vitest unit tests, coverage tracking',
569
- 'trpc-api': 'tRPC type-safe APIs, routers, procedures, middleware',
570
- 'typescript-strict': 'TypeScript strict mode, index access, null checks, generics',
571
- 'ui-ux-audit': 'UI/UX audits, competitor research, WCAG 2.1, responsiveness',
572
- 'zod-validation': 'Zod schemas, input validation, type inference, error handling'
573
- };
574
-
575
- const WORKFLOWS: Record<string, string[]> = {
576
- 'feature': ['analyzer', 'research-web', 'ui-ux-reviewer', 'documenter', 'tester', 'security-auditor', 'quality-checker', 'final-validator', 'domain-updater', 'commit-manager'],
577
- 'fix': ['debugger', 'analyzer', 'tester', 'security-auditor', 'quality-checker', 'final-validator', 'domain-updater', 'commit-manager'],
578
- 'refactor': ['analyzer', 'code-reviewer', 'tester', 'quality-checker', 'final-validator', 'domain-updater', 'commit-manager'],
579
- 'config': ['quality-checker', 'domain-updater', 'commit-manager']
580
- };
581
-
582
- interface WorkflowState {
583
- currentTask?: {
584
- id?: string;
585
- type?: string;
586
- description?: string;
587
- agents?: Record<string, { executed?: boolean }>;
588
- approvedFiles?: string[];
589
- };
590
- }
591
-
592
- function loadWorkflowState(): WorkflowState | null {
593
- if (!existsSync(WORKFLOW_STATE_PATH)) return null;
594
- try {
595
- return JSON.parse(readFileSync(WORKFLOW_STATE_PATH, 'utf8'));
596
- } catch {
597
- return null;
598
- }
599
- }
600
-
601
- function detectTaskType(prompt: string): string {
602
- const promptLower = prompt.toLowerCase();
603
-
604
- if (['bug', 'fix', 'error', 'broken', 'not working', 'issue', 'debug'].some(w => promptLower.includes(w))) {
605
- return 'fix';
606
- } else if (['refactor', 'restructure', 'reorganize', 'clean up', 'improve'].some(w => promptLower.includes(w))) {
607
- return 'refactor';
608
- } else if (['config', 'setting', 'env', 'package.json', 'tsconfig'].some(w => promptLower.includes(w))) {
609
- return 'config';
610
- }
611
- return 'feature';
612
- }
613
-
614
- function detectBestAgents(prompt: string): Array<[string, string, string]> {
615
- const promptLower = prompt.toLowerCase();
616
- const matches: Array<[string, string, string]> = [];
617
-
618
- for (const [category, info] of Object.entries(AGENT_CATEGORIES)) {
619
- for (const [agentName, agentInfo] of Object.entries(info.agents)) {
620
- for (const trigger of agentInfo.triggers) {
621
- if (promptLower.includes(trigger)) {
622
- matches.push([category, agentName, `Matched '${trigger}'`]);
623
- break;
624
- }
625
- }
626
- }
627
- }
628
-
629
- matches.sort((a, b) => a[0].localeCompare(b[0]));
630
-
631
- if (matches.length === 0) {
632
- return [['01-orchestration', 'orchestrator', 'No specific trigger - orchestrator will analyze']];
633
- }
634
-
635
- return matches.slice(0, 3);
636
- }
637
-
638
- function formatAgentCategories(): string {
639
- const lines: string[] = [];
640
- for (const [category, info] of Object.entries(AGENT_CATEGORIES).sort()) {
641
- const agentCount = Object.keys(info.agents).length;
642
- const vetoAgents = Object.entries(info.agents)
643
- .filter(([, a]) => a.can_veto)
644
- .map(([n]) => n);
645
- const vetoStr = vetoAgents.length > 0 ? ` [VETO: ${vetoAgents.join(', ')}]` : '';
646
- lines.push(` ${category}: ${info.description} (${agentCount} agents)${vetoStr}`);
647
- }
648
- return lines.join('\n');
649
- }
650
-
651
- function formatSkills(): string {
652
- return Object.entries(SKILLS)
653
- .sort()
654
- .map(([name, desc]) => ` ${name}: ${desc}`)
655
- .join('\n');
656
- }
657
-
658
- function formatWorkflowStatus(state: WorkflowState | null): string {
659
- if (!state || !state.currentTask) {
660
- return 'STATUS: No active task. Start with orchestrator agent';
661
- }
662
-
663
- const task = state.currentTask;
664
- const agents = task.agents || {};
665
-
666
- const executed = Object.entries(agents).filter(([, s]) => s.executed).map(([n]) => n);
667
- const pending = Object.entries(agents).filter(([, s]) => !s.executed).map(([n]) => n);
668
-
669
- return `STATUS: Task active
670
- ID: ${task.id || 'unknown'}
671
- Type: ${task.type || 'unknown'}
672
- Description: ${task.description || 'unknown'}
673
- Executed: ${executed.length > 0 ? executed.join(', ') : 'none'}
674
- Pending: ${pending.length > 0 ? pending.join(', ') : 'none'}
675
- Approved files: ${(task.approvedFiles || []).length}`;
676
- }
677
-
678
- async function readStdinWithTimeout(timeoutMs: number): Promise<string> {
679
- return new Promise((resolve) => {
680
- const timeout = setTimeout(() => {
681
- process.stdin.destroy();
682
- resolve('{}');
683
- }, timeoutMs);
684
-
685
- let data = '';
686
- process.stdin.setEncoding('utf8');
687
- process.stdin.on('data', (chunk: string) => {
688
- data += chunk;
689
- });
690
- process.stdin.on('end', () => {
691
- clearTimeout(timeout);
692
- resolve(data || '{}');
693
- });
694
- process.stdin.on('error', () => {
695
- clearTimeout(timeout);
696
- resolve('{}');
697
- });
698
-
699
- if (process.stdin.readableEnded) {
700
- clearTimeout(timeout);
701
- resolve('{}');
702
- }
703
- });
704
- }
705
-
706
- async function main(): Promise<void> {
707
- let hookInput: { user_prompt?: string; prompt?: string } = {};
708
- try {
709
- const stdin = await readStdinWithTimeout(1000);
710
- if (stdin && stdin.trim()) {
711
- hookInput = JSON.parse(stdin);
712
- }
713
- } catch {
714
- hookInput = {};
715
- }
716
-
717
- const prompt = hookInput.user_prompt || hookInput.prompt || '';
718
- const state = loadWorkflowState();
719
- const taskType = prompt ? detectTaskType(prompt) : 'unknown';
720
- const bestAgents = prompt ? detectBestAgents(prompt) : [['01-orchestration', 'orchestrator', 'Default'] as [string, string, string]];
721
-
722
- const isNewFeature = taskType === 'feature' || ['new', 'implement', 'create', 'add'].some(w => prompt.toLowerCase().includes(w));
723
- const isUiTask = ['ui', 'component', 'page', 'design', 'layout', 'mobile', 'desktop', 'tablet'].some(w => prompt.toLowerCase().includes(w));
724
- const isDebugTask = ['bug', 'error', 'broken', 'not working', 'debug', 'fix'].some(w => prompt.toLowerCase().includes(w));
725
-
726
- const recommendedStr = bestAgents.map(([cat, agent, reason], i) => ` ${i + 1}. ${cat}/${agent} - ${reason}`).join('\n');
727
-
728
- const output = `
729
- ================================================================================
730
- STRICT WORKFLOW ENFORCEMENT - UserPromptSubmit Hook
731
- ================================================================================
732
- ${STRICT_WORKFLOW}
733
-
734
- ${isNewFeature ? '⚠️ NEW FEATURE DETECTED - RESEARCH AGENT IS MANDATORY!' : ''}
735
- ${isUiTask ? '⚠️ UI TASK DETECTED - SEPARATE UIs FOR MOBILE/TABLET/DESKTOP REQUIRED!' : ''}
736
- ${isDebugTask ? '🐛 DEBUG TASK DETECTED - Use debugger or type-error-resolver agents' : ''}
737
-
738
- ================================================================================
739
- STEP 1: CREATE DETAILED TODO LIST (MANDATORY)
740
- ================================================================================
741
-
742
- BEFORE doing anything, you MUST use TodoWrite to create a detailed todo list.
743
- Break down the user's prompt into specific, actionable items.
744
-
745
- ================================================================================
746
- AGENT SYSTEM: 82 Specialized Agents in 14 Categories
747
- ================================================================================
748
-
749
- CATEGORIES:
750
- ${formatAgentCategories()}
751
-
752
- TASK ANALYSIS:
753
- Detected type: ${taskType}
754
- Recommended agents:
755
- ${recommendedStr}
756
- Research required: ${isNewFeature ? 'YES (MANDATORY)' : 'Optional'}
757
- Separate UIs required: ${isUiTask ? 'YES (MANDATORY)' : 'N/A'}
758
- Workflow sequence: ${(WORKFLOWS[taskType] || WORKFLOWS['feature']).join(' -> ')}
759
-
760
- ${formatWorkflowStatus(state)}
761
-
762
- ================================================================================
763
- SKILL SYSTEM: 22 Skills Auto-loaded by Agents
764
- ================================================================================
765
-
766
- ${formatSkills()}
767
-
768
- Skills are auto-loaded when an agent starts. Agents don't inherit parent skills.
769
-
770
- ================================================================================
771
- AGENT INVOCATION (VIA TASK TOOL ONLY)
772
- ================================================================================
773
-
774
- You MUST use the Task tool with subagent_type to invoke agents.
775
- DO NOT execute agent logic manually - INVOKE the agent properly.
776
-
777
- Example:
778
- Task(subagent_type="debugger", prompt="Fix the TypeError in user.ts")
779
- Task(subagent_type="playwright-e2e", prompt="Create E2E tests for login")
780
-
781
- ================================================================================
782
- `;
783
-
784
- const result = { continue: true, systemMessage: output };
785
- console.log(JSON.stringify(result));
786
- process.exit(0);
787
- }
788
-
789
- main().catch((err) => {
790
- console.error('Hook error:', err);
791
- const result = { continue: true, systemMessage: 'Hook error occurred, continuing...' };
792
- console.log(JSON.stringify(result));
793
- process.exit(0);
794
- });
1
+ #!/usr/bin/env node
2
+ /**
3
+ * UserPromptSubmit Hook - TypeScript version (fallback when Python not available)
4
+ *
5
+ * This hook runs BEFORE Claude processes any user prompt and ENFORCES:
6
+ * 1. MANDATORY detailed todo list creation from prompt
7
+ * 2. MANDATORY research agent for new features
8
+ * 3. STRICT workflow: audit -> branch -> implement -> document -> quality -> PR
9
+ * 4. Separate UI for mobile/tablet/desktop (NOT just responsive)
10
+ *
11
+ * AGENT SYSTEM: 82 specialized agents in 14 categories
12
+ * SKILL SYSTEM: 22 skills auto-loaded by agents
13
+ */
14
+
15
+ import { existsSync, readFileSync } from 'fs';
16
+ import { join } from 'path';
17
+
18
+ const PROJECT_DIR = process.env['CLAUDE_PROJECT_DIR'] || process.cwd();
19
+ const WORKFLOW_STATE_PATH = join(PROJECT_DIR, '.claude', 'workflow-state.json');
20
+
21
+ const STRICT_WORKFLOW = `
22
+ ┌─────────────────────────────────────────────────────────────────┐
23
+ │ STRICT WORKFLOW (MANDATORY) │
24
+ ├─────────────────────────────────────────────────────────────────┤
25
+ │ 0. INIT TASK → Run commit-manager to REGISTER task start │
26
+ │ 1. TODO LIST → Create DETAILED todo list from prompt │
27
+ │ 2. RESEARCH → Run research agent for NEW features │
28
+ │ 3. AUDIT → Check last audit docs OR run fresh audit │
29
+ │ 4. BRANCH → Create feature/ | fix/ | refactor/ | test/ │
30
+ │ 5. IMPLEMENT → Follow rules + analyzer approval │
31
+ │ 6. DOCUMENT → Document ALL modified files (MANDATORY) │
32
+ │ 7. UPDATE Update CLAUDE.md with session changes
33
+ │ 8. QUALITY typecheck + lint + test (Husky enforced)
34
+ │ 9. FINISH → PR + merge to main (clean tree required) │
35
+ └─────────────────────────────────────────────────────────────────┘
36
+
37
+ ⚠️ STOP HOOK ACTIVE - Task completion will be BLOCKED if:
38
+ - NOT on main branch (PR must be merged first)
39
+ - Git tree NOT clean (all changes must be committed)
40
+ - CLAUDE.md NOT updated (must reflect session changes)
41
+ - CLAUDE.md missing required sections (Last Change, Stack, etc.)
42
+ - CLAUDE.md exceeds 40,000 characters (must compact)
43
+ - Source files NOT documented (must run documenter agent)
44
+ `;
45
+
46
+ // ============================================================================
47
+ // AGENT SYSTEM - 82 Specialized Agents in 14 Categories
48
+ // ============================================================================
49
+
50
+ interface AgentInfo {
51
+ triggers: string[];
52
+ when: string;
53
+ skills: string[];
54
+ can_veto?: boolean;
55
+ mandatory_for?: string[];
56
+ }
57
+
58
+ interface CategoryInfo {
59
+ description: string;
60
+ agents: Record<string, AgentInfo>;
61
+ }
62
+
63
+ const AGENT_CATEGORIES: Record<string, CategoryInfo> = {
64
+ '01-orchestration': {
65
+ description: 'Workflow coordination and task management',
66
+ agents: {
67
+ orchestrator: {
68
+ triggers: ['implement feature', 'build', 'create', 'full workflow', 'multi-step'],
69
+ when: 'Task requires >2 agents or touches >3 files',
70
+ skills: ['codebase-knowledge'],
71
+ },
72
+ 'task-decomposer': {
73
+ triggers: ['complex task', 'break down', 'multiple steps'],
74
+ when: 'Task has >3 steps or touches >3 files',
75
+ skills: ['codebase-knowledge'],
76
+ },
77
+ 'workflow-router': {
78
+ triggers: ['route', 'which agent', 'unclear'],
79
+ when: 'At task start to route to correct agent',
80
+ skills: ['codebase-knowledge'],
81
+ },
82
+ 'parallel-coordinator': {
83
+ triggers: ['parallel', 'concurrent', 'simultaneous'],
84
+ when: 'Multiple independent agents should run simultaneously',
85
+ skills: ['codebase-knowledge'],
86
+ },
87
+ 'context-manager': {
88
+ triggers: ['context', 'compress', 'long conversation'],
89
+ when: 'Context grows large or between major phases',
90
+ skills: ['codebase-knowledge'],
91
+ },
92
+ 'checkpoint-manager': {
93
+ triggers: ['checkpoint', 'save state', 'backup'],
94
+ when: 'BEFORE risky operations (git, deletions, refactors)',
95
+ skills: ['codebase-knowledge'],
96
+ },
97
+ 'error-recovery': {
98
+ triggers: ['failed', 'retry', 'timeout', 'unexpected error'],
99
+ when: 'An agent fails or returns unexpected results',
100
+ skills: ['codebase-knowledge', 'debugging-patterns'],
101
+ },
102
+ 'agent-selector': {
103
+ triggers: ['select agent', 'best agent', 'which agent'],
104
+ when: 'Multiple agents could handle a task',
105
+ skills: ['codebase-knowledge'],
106
+ },
107
+ },
108
+ },
109
+ '02-typescript': {
110
+ description: 'TypeScript strict mode, types, and module resolution',
111
+ agents: {
112
+ 'ts-strict-checker': {
113
+ triggers: ['strict mode', 'null check', 'process.env'],
114
+ when: 'AFTER editing any .ts file',
115
+ skills: ['typescript-strict'],
116
+ },
117
+ 'ts-types-analyzer': {
118
+ triggers: ['type error', 'inference', 'generic problem'],
119
+ when: 'On type errors or typecheck fails',
120
+ skills: ['typescript-strict'],
121
+ },
122
+ 'ts-generics-helper': {
123
+ triggers: ['generic', 'type parameter', 'complex type'],
124
+ when: 'Creating generic functions/types',
125
+ skills: ['typescript-strict'],
126
+ },
127
+ 'ts-migration-helper': {
128
+ triggers: ['migrate', 'convert to typescript', '.js'],
129
+ when: 'Migrating JavaScript to TypeScript',
130
+ skills: ['typescript-strict'],
131
+ },
132
+ 'type-definition-writer': {
133
+ triggers: ['new model', 'new entity', 'interface needed'],
134
+ when: 'BEFORE implementing new entities',
135
+ skills: ['typescript-strict'],
136
+ },
137
+ 'import-alias-enforcer': {
138
+ triggers: ['import', 'alias', '@types'],
139
+ when: 'AFTER editing .ts files - enforces $types/*, @common, @db',
140
+ skills: ['typescript-strict'],
141
+ },
142
+ 'esm-resolver': {
143
+ triggers: ['module error', 'import error', 'cannot find module'],
144
+ when: 'On module errors',
145
+ skills: ['typescript-strict', 'bun-runtime'],
146
+ },
147
+ 'bun-runtime-expert': {
148
+ triggers: ['bun', 'runtime', 'package management'],
149
+ when: 'Using Bun runtime',
150
+ skills: ['bun-runtime'],
151
+ },
152
+ 'zod-validator': {
153
+ triggers: ['validation', 'zod', 'schema'],
154
+ when: 'BEFORE commit when API routes exist',
155
+ skills: ['zod-validation'],
156
+ },
157
+ 'zod-schema-designer': {
158
+ triggers: ['new endpoint', 'form input', 'user input'],
159
+ when: 'BEFORE implementing any API endpoint',
160
+ skills: ['zod-validation', 'typescript-strict'],
161
+ },
162
+ },
163
+ },
164
+ '03-testing': {
165
+ description: 'Unit tests (Vitest) and E2E tests (Playwright)',
166
+ agents: {
167
+ 'vitest-config': {
168
+ triggers: ['test setup', 'vitest config', 'coverage config'],
169
+ when: 'Setting up tests or coverage issues arise',
170
+ skills: ['test-coverage'],
171
+ },
172
+ 'tester-unit': {
173
+ triggers: ['unit test', 'function test', 'utility test'],
174
+ when: 'AFTER implementing any function or utility',
175
+ skills: ['test-coverage'],
176
+ },
177
+ 'tester-integration': {
178
+ triggers: ['integration test', 'api test', 'service test'],
179
+ when: 'AFTER implementing API endpoints or services',
180
+ skills: ['test-coverage'],
181
+ },
182
+ 'test-data-generator': {
183
+ triggers: ['mock data', 'test fixture', 'factory'],
184
+ when: 'BEFORE writing tests that need data',
185
+ skills: ['test-coverage'],
186
+ },
187
+ 'test-cleanup-manager': {
188
+ triggers: ['flaky test', 'test isolation', 'state leakage'],
189
+ when: 'Tests are flaky or share state',
190
+ skills: ['test-coverage'],
191
+ },
192
+ 'playwright-e2e': {
193
+ triggers: ['e2e test', 'user flow', 'end to end'],
194
+ when: 'AFTER implementing any user-facing feature',
195
+ skills: ['test-coverage', 'playwright-automation'],
196
+ },
197
+ 'playwright-fixtures': {
198
+ triggers: ['fixture', 'shared setup', 'auth helper'],
199
+ when: 'Creating E2E tests that need shared setup',
200
+ skills: ['test-coverage', 'playwright-automation'],
201
+ },
202
+ 'playwright-page-objects': {
203
+ triggers: ['page object', 'page model', 'page interaction'],
204
+ when: 'Creating E2E tests for new pages',
205
+ skills: ['test-coverage', 'playwright-automation'],
206
+ },
207
+ 'playwright-multi-viewport': {
208
+ triggers: ['viewport', 'responsive test', 'mobile test'],
209
+ when: 'AFTER any UI implementation - tests desktop/tablet/mobile',
210
+ skills: ['test-coverage', 'playwright-automation'],
211
+ },
212
+ 'playwright-assertions': {
213
+ triggers: ['assertion', 'expect', 'test validation'],
214
+ when: 'Creating comprehensive test assertions',
215
+ skills: ['test-coverage', 'playwright-automation'],
216
+ },
217
+ },
218
+ },
219
+ '04-docker': {
220
+ description: 'Docker containerization and deployment',
221
+ agents: {
222
+ 'dockerfile-optimizer': {
223
+ triggers: ['dockerfile', 'docker build', 'image size'],
224
+ when: 'Creating or modifying Dockerfile',
225
+ skills: ['docker-patterns'],
226
+ },
227
+ 'docker-multi-stage': {
228
+ triggers: ['multi-stage', 'build optimization', 'production docker'],
229
+ when: 'Dockerfile can benefit from multi-stage',
230
+ skills: ['docker-patterns'],
231
+ },
232
+ 'docker-compose-designer': {
233
+ triggers: ['docker-compose', 'multi-service', 'local dev'],
234
+ when: 'Multi-service setup is needed',
235
+ skills: ['docker-patterns'],
236
+ },
237
+ 'docker-env-manager': {
238
+ triggers: ['docker env', 'secrets', 'env vars'],
239
+ when: 'Docker uses environment variables',
240
+ skills: ['docker-patterns'],
241
+ },
242
+ 'container-health': {
243
+ triggers: ['health check', 'container monitoring', 'service health'],
244
+ when: 'Creating Docker containers',
245
+ skills: ['docker-patterns'],
246
+ },
247
+ 'deployment-validator': {
248
+ triggers: ['deploy', 'pre-deploy', 'docker validation'],
249
+ when: 'BEFORE deploying',
250
+ skills: ['docker-patterns'],
251
+ },
252
+ },
253
+ },
254
+ '05-database': {
255
+ description: 'MongoDB/Mongoose database operations',
256
+ agents: {
257
+ 'mongoose-schema-designer': {
258
+ triggers: ['schema', 'model', 'collection'],
259
+ when: 'BEFORE creating any database model',
260
+ skills: ['mongoose-patterns'],
261
+ },
262
+ 'mongoose-index-optimizer': {
263
+ triggers: ['index', 'slow query', 'query performance'],
264
+ when: 'Database queries are slow',
265
+ skills: ['mongoose-patterns'],
266
+ },
267
+ 'mongoose-aggregation': {
268
+ triggers: ['aggregation', 'pipeline', 'reporting'],
269
+ when: 'Complex data queries needed',
270
+ skills: ['mongoose-patterns'],
271
+ },
272
+ 'mongodb-query-optimizer': {
273
+ triggers: ['n+1', 'query optimizer', 'database performance'],
274
+ when: 'Queries are slow',
275
+ skills: ['mongoose-patterns'],
276
+ },
277
+ 'database-seeder': {
278
+ triggers: ['seed', 'sample data', 'dev data'],
279
+ when: 'Setting up development environment',
280
+ skills: ['mongoose-patterns'],
281
+ },
282
+ 'data-migration': {
283
+ triggers: ['migration', 'schema change', 'data transform'],
284
+ when: 'Schema changes are needed',
285
+ skills: ['mongoose-patterns'],
286
+ },
287
+ },
288
+ },
289
+ '06-security': {
290
+ description: 'Security auditing and OWASP compliance (CAN VETO)',
291
+ agents: {
292
+ 'security-auditor': {
293
+ triggers: ['security', 'audit', 'vulnerability'],
294
+ when: 'BEFORE committing auth/user/API code',
295
+ can_veto: true,
296
+ skills: ['security-scan'],
297
+ },
298
+ 'owasp-checker': {
299
+ triggers: ['owasp', 'top 10', 'security review'],
300
+ when: 'BEFORE committing any API or security code',
301
+ can_veto: true,
302
+ skills: ['security-scan'],
303
+ },
304
+ 'input-sanitizer': {
305
+ triggers: ['sanitize', 'user input', 'xss'],
306
+ when: 'Handling user input',
307
+ skills: ['security-scan', 'zod-validation'],
308
+ },
309
+ 'auth-session-validator': {
310
+ triggers: ['auth', 'session', 'login', 'jwt'],
311
+ when: 'Implementing auth or session code',
312
+ skills: ['security-scan'],
313
+ },
314
+ 'permission-auditor': {
315
+ triggers: ['permission', 'authorization', 'access control'],
316
+ when: 'Implementing protected routes',
317
+ skills: ['security-scan'],
318
+ },
319
+ 'sensitive-data-scanner': {
320
+ triggers: ['sensitive', 'pii', 'data leak'],
321
+ when: 'Implementing API responses or logging',
322
+ skills: ['security-scan'],
323
+ },
324
+ },
325
+ },
326
+ '07-documentation': {
327
+ description: 'Documentation and domain knowledge updates',
328
+ agents: {
329
+ documenter: {
330
+ triggers: ['document', 'docs', 'explain code'],
331
+ when: 'AFTER any code implementation completes',
332
+ skills: ['docs-tracker', 'codebase-knowledge'],
333
+ },
334
+ 'domain-updater': {
335
+ triggers: ['domain', 'learnings', 'session end'],
336
+ when: 'BEFORE commit-manager at session end',
337
+ skills: ['codebase-knowledge', 'docs-tracker'],
338
+ },
339
+ 'readme-generator': {
340
+ triggers: ['readme', 'project docs', 'setup guide'],
341
+ when: 'Project structure changes significantly',
342
+ skills: ['docs-tracker'],
343
+ },
344
+ 'jsdoc-generator': {
345
+ triggers: ['jsdoc', 'function docs', 'api docs'],
346
+ when: 'Complex functions lack documentation',
347
+ skills: ['docs-tracker', 'typescript-strict'],
348
+ },
349
+ 'changelog-manager': {
350
+ triggers: ['changelog', 'release notes', 'version'],
351
+ when: 'BEFORE committing any feature or fix',
352
+ skills: ['docs-tracker', 'git-workflow'],
353
+ },
354
+ 'api-documenter': {
355
+ triggers: ['api docs', 'swagger', 'openapi'],
356
+ when: 'AFTER creating or modifying API endpoints',
357
+ skills: ['docs-tracker'],
358
+ },
359
+ },
360
+ },
361
+ '08-git': {
362
+ description: 'Git workflow and version control',
363
+ agents: {
364
+ 'branch-manager': {
365
+ triggers: ['branch', 'feature branch', 'fix branch'],
366
+ when: 'BEFORE making source changes on main branch',
367
+ skills: ['git-workflow'],
368
+ },
369
+ 'commit-manager': {
370
+ triggers: ['commit', 'push', 'finalize'],
371
+ when: 'FINAL AGENT when implementation is complete',
372
+ skills: ['git-workflow', 'docs-tracker', 'codebase-knowledge'],
373
+ },
374
+ 'pr-creator': {
375
+ triggers: ['pr', 'pull request', 'merge'],
376
+ when: 'AFTER commit-manager when feature is ready',
377
+ skills: ['git-workflow'],
378
+ },
379
+ },
380
+ },
381
+ '09-quality': {
382
+ description: 'Code quality and review',
383
+ agents: {
384
+ 'quality-checker': {
385
+ triggers: ['quality', 'typecheck', 'lint', 'build'],
386
+ when: 'BEFORE any commit',
387
+ skills: ['quality-gate', 'codebase-knowledge'],
388
+ },
389
+ 'code-reviewer': {
390
+ triggers: ['review', 'pr review', 'code quality'],
391
+ when: 'AFTER significant code is written',
392
+ skills: ['quality-gate', 'codebase-knowledge'],
393
+ },
394
+ },
395
+ },
396
+ '10-research': {
397
+ description: 'Web research and best practices (MANDATORY for new features)',
398
+ agents: {
399
+ 'research-web': {
400
+ triggers: ['search', 'find info', 'look up'],
401
+ when: 'BEFORE implementing any new feature or technology',
402
+ mandatory_for: ['feature'],
403
+ skills: ['research-cache'],
404
+ },
405
+ 'research-cache-manager': {
406
+ triggers: ['cache', 'cached research', 'previous research'],
407
+ when: 'BEFORE any web research',
408
+ skills: ['research-cache'],
409
+ },
410
+ 'best-practices-finder': {
411
+ triggers: ['best practice', 'recommended', 'how should'],
412
+ when: 'BEFORE implementing any new pattern',
413
+ skills: ['research-cache'],
414
+ },
415
+ 'pattern-researcher': {
416
+ triggers: ['pattern', 'architecture', 'design decision'],
417
+ when: 'Facing architectural decisions',
418
+ skills: ['research-cache'],
419
+ },
420
+ 'competitor-analyzer': {
421
+ triggers: ['competitor', 'similar app', 'how does'],
422
+ when: 'Designing UI or features with existing market solutions',
423
+ skills: ['research-cache'],
424
+ },
425
+ 'tech-evaluator': {
426
+ triggers: ['compare', 'evaluate', 'which library'],
427
+ when: 'Choosing between technologies',
428
+ skills: ['research-cache'],
429
+ },
430
+ },
431
+ },
432
+ '11-ui-ux': {
433
+ description: 'UI/UX - SEPARATE UIs for mobile/tablet/desktop (NOT just responsive)',
434
+ agents: {
435
+ 'ui-mobile': {
436
+ triggers: ['mobile', 'touch', '375px'],
437
+ when: 'Implementing any UI feature',
438
+ skills: ['ui-ux-audit', 'react-patterns', 'tailwind-patterns', 'shadcn-ui'],
439
+ },
440
+ 'ui-tablet': {
441
+ triggers: ['tablet', 'ipad', '768px'],
442
+ when: 'Implementing any UI feature',
443
+ skills: ['ui-ux-audit', 'react-patterns', 'tailwind-patterns', 'shadcn-ui'],
444
+ },
445
+ 'ui-desktop': {
446
+ triggers: ['desktop', 'sidebar', '1280px'],
447
+ when: 'Implementing any UI feature',
448
+ skills: ['ui-ux-audit', 'react-patterns', 'tailwind-patterns', 'shadcn-ui'],
449
+ },
450
+ 'skeleton-generator': {
451
+ triggers: ['skeleton', 'loading', 'placeholder'],
452
+ when: 'AFTER creating any component that loads data',
453
+ skills: ['react-patterns', 'tailwind-patterns'],
454
+ },
455
+ 'design-system-enforcer': {
456
+ triggers: ['design system', 'consistency', 'component style'],
457
+ when: 'AFTER creating UI components',
458
+ skills: ['ui-ux-audit', 'shadcn-ui', 'tailwind-patterns'],
459
+ },
460
+ 'accessibility-auditor': {
461
+ triggers: ['a11y', 'accessibility', 'wcag', 'screen reader'],
462
+ when: 'AFTER any UI implementation',
463
+ skills: ['ui-ux-audit'],
464
+ },
465
+ },
466
+ },
467
+ '12-performance': {
468
+ description: 'Performance profiling and optimization',
469
+ agents: {
470
+ 'performance-profiler': {
471
+ triggers: ['slow', 'performance', 'profile', 'bottleneck'],
472
+ when: 'Application is slow',
473
+ skills: ['performance-patterns'],
474
+ },
475
+ 'memory-leak-detector': {
476
+ triggers: ['memory', 'leak', 'heap'],
477
+ when: 'Memory issues are suspected',
478
+ skills: ['performance-patterns'],
479
+ },
480
+ 'bundle-analyzer': {
481
+ triggers: ['bundle', 'build size', 'lighthouse'],
482
+ when: 'Build is large or slow',
483
+ skills: ['performance-patterns'],
484
+ },
485
+ 'api-latency-analyzer': {
486
+ triggers: ['api slow', 'response time', 'latency'],
487
+ when: 'API endpoints are slow',
488
+ skills: ['performance-patterns'],
489
+ },
490
+ 'query-optimizer': {
491
+ triggers: ['slow query', 'n+1', 'database slow'],
492
+ when: 'Database queries are slow',
493
+ skills: ['performance-patterns', 'mongoose-patterns'],
494
+ },
495
+ 'render-optimizer': {
496
+ triggers: ['re-render', 'react slow', 'component slow'],
497
+ when: 'React components re-render excessively',
498
+ skills: ['performance-patterns', 'react-patterns'],
499
+ },
500
+ },
501
+ },
502
+ '13-debugging': {
503
+ description: 'Error analysis and debugging',
504
+ agents: {
505
+ debugger: {
506
+ triggers: ['bug', 'error', 'not working', 'broken', 'fails'],
507
+ when: 'Any bug or error occurs',
508
+ skills: ['debugging-patterns'],
509
+ },
510
+ 'type-error-resolver': {
511
+ triggers: ['ts error', 'type error', 'typecheck fails'],
512
+ when: 'On TypeScript type errors',
513
+ skills: ['debugging-patterns', 'typescript-strict'],
514
+ },
515
+ 'runtime-error-fixer': {
516
+ triggers: ['crash', 'exception', 'runtime error'],
517
+ when: 'On runtime crashes or exceptions',
518
+ skills: ['debugging-patterns'],
519
+ },
520
+ 'network-debugger': {
521
+ triggers: ['fetch error', 'api error', 'cors', 'network'],
522
+ when: 'On network or API errors',
523
+ skills: ['debugging-patterns'],
524
+ },
525
+ 'error-stack-analyzer': {
526
+ triggers: ['stack trace', 'trace', 'call stack'],
527
+ when: 'Error includes stack trace',
528
+ skills: ['debugging-patterns'],
529
+ },
530
+ 'build-error-fixer': {
531
+ triggers: ['build failed', 'compile error', 'bundler error'],
532
+ when: 'Build fails',
533
+ skills: ['debugging-patterns'],
534
+ },
535
+ },
536
+ },
537
+ '14-validation': {
538
+ description: 'Final validation before commit (CAN VETO)',
539
+ agents: {
540
+ 'final-validator': {
541
+ triggers: ['final check', 'validate', 'ready to commit'],
542
+ when: 'BEFORE commit-manager - last check',
543
+ can_veto: true,
544
+ skills: ['final-check'],
545
+ },
546
+ },
547
+ },
548
+ };
549
+
550
+ // ============================================================================
551
+ // SKILL SYSTEM - 22 Skills Auto-loaded by Agents
552
+ // ============================================================================
553
+
554
+ const SKILLS: Record<string, string> = {
555
+ 'bun-runtime': 'Bun runtime patterns, package management, scripts',
556
+ 'codebase-knowledge': 'Project domain knowledge, file mapping, recent commits',
557
+ 'debugging-patterns': 'Stack traces, runtime errors, build errors, network issues',
558
+ 'docker-patterns': 'Containerization, multi-stage builds, Docker Compose, security',
559
+ 'docs-tracker': 'Documentation maintenance, git diff detection, changelog',
560
+ 'final-check': 'Final validation, tests pass, docs updated, security audited',
561
+ 'git-workflow': 'Branch management, conventional commits, PR creation, hooks',
562
+ 'mongoose-patterns': 'MongoDB schema design, queries, indexes, aggregations',
563
+ 'nextjs-app-router': 'Next.js 15 App Router, Server/Client components, data fetching',
564
+ 'performance-patterns': 'React optimization, bundle analysis, memory leaks, API latency',
565
+ 'playwright-automation': 'E2E tests, browser automation, visual testing, API testing',
566
+ 'quality-gate': 'Quality checks (typecheck, lint, test, build)',
567
+ 'react-patterns': 'React 19 patterns, hooks, state management, performance',
568
+ 'research-cache': 'Cached research findings, best practices by topic',
569
+ 'security-scan': 'OWASP Top 10, user ID validation, sensitive data detection',
570
+ 'shadcn-ui': 'shadcn/ui components, customization, theming, accessibility',
571
+ 'tailwind-patterns': 'Tailwind CSS, responsive design, dark mode, animations',
572
+ 'test-coverage': 'Playwright E2E, Vitest unit tests, coverage tracking',
573
+ 'trpc-api': 'tRPC type-safe APIs, routers, procedures, middleware',
574
+ 'typescript-strict': 'TypeScript strict mode, index access, null checks, generics',
575
+ 'ui-ux-audit': 'UI/UX audits, competitor research, WCAG 2.1, responsiveness',
576
+ 'zod-validation': 'Zod schemas, input validation, type inference, error handling',
577
+ };
578
+
579
+ const WORKFLOWS: Record<string, string[]> = {
580
+ feature: [
581
+ 'analyzer',
582
+ 'research-web',
583
+ 'ui-ux-reviewer',
584
+ 'documenter',
585
+ 'tester',
586
+ 'security-auditor',
587
+ 'quality-checker',
588
+ 'final-validator',
589
+ 'domain-updater',
590
+ 'commit-manager',
591
+ ],
592
+ fix: [
593
+ 'debugger',
594
+ 'analyzer',
595
+ 'tester',
596
+ 'security-auditor',
597
+ 'quality-checker',
598
+ 'final-validator',
599
+ 'domain-updater',
600
+ 'commit-manager',
601
+ ],
602
+ refactor: [
603
+ 'analyzer',
604
+ 'code-reviewer',
605
+ 'tester',
606
+ 'quality-checker',
607
+ 'final-validator',
608
+ 'domain-updater',
609
+ 'commit-manager',
610
+ ],
611
+ config: ['quality-checker', 'domain-updater', 'commit-manager'],
612
+ };
613
+
614
+ interface WorkflowState {
615
+ currentTask?: {
616
+ id?: string;
617
+ type?: string;
618
+ description?: string;
619
+ agents?: Record<string, { executed?: boolean }>;
620
+ approvedFiles?: string[];
621
+ };
622
+ }
623
+
624
+ function loadWorkflowState(): WorkflowState | null {
625
+ if (!existsSync(WORKFLOW_STATE_PATH)) return null;
626
+ try {
627
+ return JSON.parse(readFileSync(WORKFLOW_STATE_PATH, 'utf8'));
628
+ } catch {
629
+ return null;
630
+ }
631
+ }
632
+
633
+ function detectTaskType(prompt: string): string {
634
+ const promptLower = prompt.toLowerCase();
635
+
636
+ if (
637
+ ['bug', 'fix', 'error', 'broken', 'not working', 'issue', 'debug'].some((w) =>
638
+ promptLower.includes(w)
639
+ )
640
+ ) {
641
+ return 'fix';
642
+ } else if (
643
+ ['refactor', 'restructure', 'reorganize', 'clean up', 'improve'].some((w) =>
644
+ promptLower.includes(w)
645
+ )
646
+ ) {
647
+ return 'refactor';
648
+ } else if (
649
+ ['config', 'setting', 'env', 'package.json', 'tsconfig'].some((w) =>
650
+ promptLower.includes(w)
651
+ )
652
+ ) {
653
+ return 'config';
654
+ }
655
+ return 'feature';
656
+ }
657
+
658
+ function detectBestAgents(prompt: string): Array<[string, string, string]> {
659
+ const promptLower = prompt.toLowerCase();
660
+ const matches: Array<[string, string, string]> = [];
661
+
662
+ for (const [category, info] of Object.entries(AGENT_CATEGORIES)) {
663
+ for (const [agentName, agentInfo] of Object.entries(info.agents)) {
664
+ for (const trigger of agentInfo.triggers) {
665
+ if (promptLower.includes(trigger)) {
666
+ matches.push([category, agentName, `Matched '${trigger}'`]);
667
+ break;
668
+ }
669
+ }
670
+ }
671
+ }
672
+
673
+ matches.sort((a, b) => a[0].localeCompare(b[0]));
674
+
675
+ if (matches.length === 0) {
676
+ return [
677
+ ['01-orchestration', 'orchestrator', 'No specific trigger - orchestrator will analyze'],
678
+ ];
679
+ }
680
+
681
+ return matches.slice(0, 3);
682
+ }
683
+
684
+ function formatAgentCategories(): string {
685
+ const lines: string[] = [];
686
+ for (const [category, info] of Object.entries(AGENT_CATEGORIES).sort()) {
687
+ const agentCount = Object.keys(info.agents).length;
688
+ const vetoAgents = Object.entries(info.agents)
689
+ .filter(([, a]) => a.can_veto)
690
+ .map(([n]) => n);
691
+ const vetoStr = vetoAgents.length > 0 ? ` [VETO: ${vetoAgents.join(', ')}]` : '';
692
+ lines.push(` ${category}: ${info.description} (${agentCount} agents)${vetoStr}`);
693
+ }
694
+ return lines.join('\n');
695
+ }
696
+
697
+ function formatSkills(): string {
698
+ return Object.entries(SKILLS)
699
+ .sort()
700
+ .map(([name, desc]) => ` ${name}: ${desc}`)
701
+ .join('\n');
702
+ }
703
+
704
+ function formatWorkflowStatus(state: WorkflowState | null): string {
705
+ if (!state || !state.currentTask) {
706
+ return 'STATUS: No active task. Start with orchestrator agent';
707
+ }
708
+
709
+ const task = state.currentTask;
710
+ const agents = task.agents || {};
711
+
712
+ const executed = Object.entries(agents)
713
+ .filter(([, s]) => s.executed)
714
+ .map(([n]) => n);
715
+ const pending = Object.entries(agents)
716
+ .filter(([, s]) => !s.executed)
717
+ .map(([n]) => n);
718
+
719
+ return `STATUS: Task active
720
+ ID: ${task.id || 'unknown'}
721
+ Type: ${task.type || 'unknown'}
722
+ Description: ${task.description || 'unknown'}
723
+ Executed: ${executed.length > 0 ? executed.join(', ') : 'none'}
724
+ Pending: ${pending.length > 0 ? pending.join(', ') : 'none'}
725
+ Approved files: ${(task.approvedFiles || []).length}`;
726
+ }
727
+
728
+ async function readStdinWithTimeout(timeoutMs: number): Promise<string> {
729
+ return new Promise((resolve) => {
730
+ const timeout = setTimeout(() => {
731
+ process.stdin.destroy();
732
+ resolve('{}');
733
+ }, timeoutMs);
734
+
735
+ let data = '';
736
+ process.stdin.setEncoding('utf8');
737
+ process.stdin.on('data', (chunk: string) => {
738
+ data += chunk;
739
+ });
740
+ process.stdin.on('end', () => {
741
+ clearTimeout(timeout);
742
+ resolve(data || '{}');
743
+ });
744
+ process.stdin.on('error', () => {
745
+ clearTimeout(timeout);
746
+ resolve('{}');
747
+ });
748
+
749
+ if (process.stdin.readableEnded) {
750
+ clearTimeout(timeout);
751
+ resolve('{}');
752
+ }
753
+ });
754
+ }
755
+
756
+ async function main(): Promise<void> {
757
+ let hookInput: { user_prompt?: string; prompt?: string } = {};
758
+ try {
759
+ const stdin = await readStdinWithTimeout(1000);
760
+ if (stdin && stdin.trim()) {
761
+ hookInput = JSON.parse(stdin);
762
+ }
763
+ } catch {
764
+ hookInput = {};
765
+ }
766
+
767
+ const prompt = hookInput.user_prompt || hookInput.prompt || '';
768
+ const state = loadWorkflowState();
769
+ const taskType = prompt ? detectTaskType(prompt) : 'unknown';
770
+ const bestAgents = prompt
771
+ ? detectBestAgents(prompt)
772
+ : [['01-orchestration', 'orchestrator', 'Default'] as [string, string, string]];
773
+
774
+ const isNewFeature =
775
+ taskType === 'feature' ||
776
+ ['new', 'implement', 'create', 'add'].some((w) => prompt.toLowerCase().includes(w));
777
+ const isUiTask = [
778
+ 'ui',
779
+ 'component',
780
+ 'page',
781
+ 'design',
782
+ 'layout',
783
+ 'mobile',
784
+ 'desktop',
785
+ 'tablet',
786
+ ].some((w) => prompt.toLowerCase().includes(w));
787
+ const isDebugTask = ['bug', 'error', 'broken', 'not working', 'debug', 'fix'].some((w) =>
788
+ prompt.toLowerCase().includes(w)
789
+ );
790
+
791
+ const recommendedStr = bestAgents
792
+ .map(([cat, agent, reason], i) => ` ${i + 1}. ${cat}/${agent} - ${reason}`)
793
+ .join('\n');
794
+
795
+ const claudeMdReminder = `
796
+ ================================================================================
797
+ CLAUDE.MD UPDATE REQUIREMENT (MANDATORY)
798
+ ================================================================================
799
+
800
+ Before completing ANY task, you MUST update CLAUDE.md at project root with:
801
+
802
+ 1. "## Last Change" section (ONLY keep the latest, do NOT stack):
803
+ **Branch:** your-branch-name
804
+ **Date:** ${new Date().toISOString().split('T')[0]}
805
+ **Summary:** What you implemented/fixed
806
+
807
+ 2. Update "## Architecture" if structure changed
808
+
809
+ 3. Add new rules/patterns learned to appropriate sections
810
+
811
+ 4. SYNTHESIZE: If user mentioned preferences or corrections, add as rules
812
+
813
+ CHARACTER LIMIT: 40,000 max. If exceeded, COMPACT the file (keep critical sections).
814
+
815
+ STOP HOOK WILL BLOCK if CLAUDE.md is not properly updated!
816
+ ================================================================================
817
+ `;
818
+
819
+ const output = `
820
+ ================================================================================
821
+ STRICT WORKFLOW ENFORCEMENT - UserPromptSubmit Hook
822
+ ================================================================================
823
+ ${STRICT_WORKFLOW}
824
+ ${claudeMdReminder}
825
+
826
+ ${isNewFeature ? '⚠️ NEW FEATURE DETECTED - RESEARCH AGENT IS MANDATORY!' : ''}
827
+ ${isUiTask ? '⚠️ UI TASK DETECTED - SEPARATE UIs FOR MOBILE/TABLET/DESKTOP REQUIRED!' : ''}
828
+ ${isDebugTask ? '🐛 DEBUG TASK DETECTED - Use debugger or type-error-resolver agents' : ''}
829
+
830
+ ================================================================================
831
+ STEP 1: CREATE DETAILED TODO LIST (MANDATORY)
832
+ ================================================================================
833
+
834
+ BEFORE doing anything, you MUST use TodoWrite to create a detailed todo list.
835
+ Break down the user's prompt into specific, actionable items.
836
+
837
+ ================================================================================
838
+ AGENT SYSTEM: 82 Specialized Agents in 14 Categories
839
+ ================================================================================
840
+
841
+ CATEGORIES:
842
+ ${formatAgentCategories()}
843
+
844
+ TASK ANALYSIS:
845
+ Detected type: ${taskType}
846
+ Recommended agents:
847
+ ${recommendedStr}
848
+ Research required: ${isNewFeature ? 'YES (MANDATORY)' : 'Optional'}
849
+ Separate UIs required: ${isUiTask ? 'YES (MANDATORY)' : 'N/A'}
850
+ Workflow sequence: ${(WORKFLOWS[taskType] || WORKFLOWS['feature']).join(' -> ')}
851
+
852
+ ${formatWorkflowStatus(state)}
853
+
854
+ ================================================================================
855
+ SKILL SYSTEM: 22 Skills Auto-loaded by Agents
856
+ ================================================================================
857
+
858
+ ${formatSkills()}
859
+
860
+ Skills are auto-loaded when an agent starts. Agents don't inherit parent skills.
861
+
862
+ ================================================================================
863
+ AGENT INVOCATION (VIA TASK TOOL ONLY)
864
+ ================================================================================
865
+
866
+ You MUST use the Task tool with subagent_type to invoke agents.
867
+ DO NOT execute agent logic manually - INVOKE the agent properly.
868
+
869
+ Example:
870
+ Task(subagent_type="debugger", prompt="Fix the TypeError in user.ts")
871
+ Task(subagent_type="playwright-e2e", prompt="Create E2E tests for login")
872
+
873
+ ================================================================================
874
+ `;
875
+
876
+ const result = { continue: true, systemMessage: output };
877
+ console.log(JSON.stringify(result));
878
+ process.exit(0);
879
+ }
880
+
881
+ main().catch((err) => {
882
+ console.error('Hook error:', err);
883
+ const result = { continue: true, systemMessage: 'Hook error occurred, continuing...' };
884
+ console.log(JSON.stringify(result));
885
+ process.exit(0);
886
+ });