gentyr 1.3.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/.claude/agents/antipattern-hunter.md +176 -0
- package/.claude/agents/code-reviewer.md +205 -0
- package/.claude/agents/code-writer.md +154 -0
- package/.claude/agents/deputy-cto.md +309 -0
- package/.claude/agents/feedback-agent.md +101 -0
- package/.claude/agents/investigator.md +136 -0
- package/.claude/agents/product-manager.md +97 -0
- package/.claude/agents/project-manager.md +116 -0
- package/.claude/agents/repo-hygiene-expert.md +626 -0
- package/.claude/agents/secret-manager.md +324 -0
- package/.claude/agents/test-writer.md +354 -0
- package/.claude/commands/configure-personas.md +144 -0
- package/.claude/commands/cto-report.md +36 -0
- package/.claude/commands/demo.md +89 -0
- package/.claude/commands/deputy-cto.md +345 -0
- package/.claude/commands/hotfix.md +31 -0
- package/.claude/commands/overdrive-gentyr.md +167 -0
- package/.claude/commands/product-manager.md +32 -0
- package/.claude/commands/push-migrations.md +86 -0
- package/.claude/commands/push-secrets.md +97 -0
- package/.claude/commands/services.json.example +30 -0
- package/.claude/commands/setup-gentyr.md +396 -0
- package/.claude/commands/show.md +42 -0
- package/.claude/commands/spawn-tasks.md +79 -0
- package/.claude/commands/toggle-automation-gentyr.md +75 -0
- package/.claude/commands/toggle-product-manager.md +19 -0
- package/.claude/commands/triage.md +69 -0
- package/.claude/hooks/README.md +686 -0
- package/.claude/hooks/__tests__/README.md +129 -0
- package/.claude/hooks/agent-tracker.js +434 -0
- package/.claude/hooks/antipattern-hunter-hook.js +401 -0
- package/.claude/hooks/api-key-watcher.js +289 -0
- package/.claude/hooks/block-no-verify.js +301 -0
- package/.claude/hooks/bypass-approval-hook.js +313 -0
- package/.claude/hooks/compliance-checker.js +1309 -0
- package/.claude/hooks/config-reader.js +143 -0
- package/.claude/hooks/credential-file-guard.js +1139 -0
- package/.claude/hooks/credential-health-check.js +168 -0
- package/.claude/hooks/credential-sync-hook.js +79 -0
- package/.claude/hooks/cto-notification-hook.js +656 -0
- package/.claude/hooks/feedback-launcher.js +424 -0
- package/.claude/hooks/feedback-orchestrator.js +367 -0
- package/.claude/hooks/gentyr-splash.js +47 -0
- package/.claude/hooks/gentyr-sync.js +389 -0
- package/.claude/hooks/hourly-automation.js +3340 -0
- package/.claude/hooks/key-sync.js +899 -0
- package/.claude/hooks/lib/approval-utils.js +731 -0
- package/.claude/hooks/lib/feature-branch-helper.js +102 -0
- package/.claude/hooks/lib/worktree-manager.js +330 -0
- package/.claude/hooks/mapping-validator.js +285 -0
- package/.claude/hooks/plan-executor.js +398 -0
- package/.claude/hooks/playwright-cli-guard.js +104 -0
- package/.claude/hooks/playwright-health-check.js +71 -0
- package/.claude/hooks/pre-commit-review.js +725 -0
- package/.claude/hooks/prompts/local-spec-enforcement.md +310 -0
- package/.claude/hooks/prompts/mapping-fix.md +92 -0
- package/.claude/hooks/prompts/mapping-review.md +140 -0
- package/.claude/hooks/prompts/schema-mapper.md +185 -0
- package/.claude/hooks/prompts/spec-enforcement.md +233 -0
- package/.claude/hooks/protected-action-approval-hook.js +336 -0
- package/.claude/hooks/protected-action-gate.js +562 -0
- package/.claude/hooks/protected-actions.json +208 -0
- package/.claude/hooks/protected-actions.json.template +122 -0
- package/.claude/hooks/quota-monitor.js +490 -0
- package/.claude/hooks/reporters/jest-failure-reporter.js +401 -0
- package/.claude/hooks/reporters/playwright-failure-reporter.js +446 -0
- package/.claude/hooks/reporters/vitest-failure-reporter.js +443 -0
- package/.claude/hooks/schema-mapper-hook.js +544 -0
- package/.claude/hooks/secret-leak-detector.js +216 -0
- package/.claude/hooks/session-reviver.js +514 -0
- package/.claude/hooks/slash-command-prefetch.js +1145 -0
- package/.claude/hooks/stale-work-detector.js +205 -0
- package/.claude/hooks/stop-continue-hook.js +414 -0
- package/.claude/hooks/todo-maintenance.js +522 -0
- package/.claude/hooks/todo-processing-prompt.md +75 -0
- package/.claude/hooks/usage-optimizer.js +791 -0
- package/.claude/mcp/README.md +246 -0
- package/.claude/settings.json.template +168 -0
- package/.mcp.json.template +207 -0
- package/CLAUDE.md +340 -0
- package/CLAUDE.md.gentyr-section +89 -0
- package/LICENSE +21 -0
- package/README.md +297 -0
- package/cli/commands/init.js +471 -0
- package/cli/commands/migrate.js +132 -0
- package/cli/commands/protect.js +271 -0
- package/cli/commands/scaffold.js +48 -0
- package/cli/commands/status.js +133 -0
- package/cli/commands/sync.js +101 -0
- package/cli/commands/uninstall.js +207 -0
- package/cli/index.js +111 -0
- package/cli/lib/config-gen.js +214 -0
- package/cli/lib/resolve-framework.js +97 -0
- package/cli/lib/state.js +140 -0
- package/cli/lib/symlinks.js +260 -0
- package/docs/AUTOMATION-SYSTEMS.md +484 -0
- package/docs/BINARY-PATCHING.md +212 -0
- package/docs/CHANGELOG.md +2830 -0
- package/docs/CREDENTIAL-DETECTION.md +151 -0
- package/docs/CTO-DASHBOARD.md +476 -0
- package/docs/DEPLOYMENT-FLOW.md +477 -0
- package/docs/DEVELOPER.md +116 -0
- package/docs/Executive.md +372 -0
- package/docs/SECRET-PATHS.md +77 -0
- package/docs/SETUP-GUIDE.md +419 -0
- package/docs/STACK.md +109 -0
- package/docs/TESTING.md +440 -0
- package/docs/assets/claude-logo.svg +3 -0
- package/docs/sessions/2026-01-24-spec-suite-implementation.md +190 -0
- package/docs/sessions/2026-02-15-feedback-e2e-audit.md +484 -0
- package/docs/sessions/2026-02-20-credential-rotation-experiments.md +340 -0
- package/docs/sessions/TEST-COVERAGE-REPORT-2026-02-20.md +168 -0
- package/docs/shared/EPHEMERAL-STATE-FILES.md +115 -0
- package/docs/shared/PROTECTION-SYSTEM.md +341 -0
- package/husky/post-commit +10 -0
- package/husky/pre-commit +40 -0
- package/husky/pre-push +94 -0
- package/package.json +43 -0
- package/packages/cto-dashboard/package-lock.json +3510 -0
- package/packages/cto-dashboard/package.json +41 -0
- package/packages/cto-dashboard/pnpm-lock.yaml +2168 -0
- package/packages/mcp-servers/dist/__testUtils__/fixtures.d.ts +220 -0
- package/packages/mcp-servers/dist/__testUtils__/fixtures.d.ts.map +1 -0
- package/packages/mcp-servers/dist/__testUtils__/fixtures.js +376 -0
- package/packages/mcp-servers/dist/__testUtils__/fixtures.js.map +1 -0
- package/packages/mcp-servers/dist/__testUtils__/index.d.ts +121 -0
- package/packages/mcp-servers/dist/__testUtils__/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/__testUtils__/index.js +180 -0
- package/packages/mcp-servers/dist/__testUtils__/index.js.map +1 -0
- package/packages/mcp-servers/dist/__testUtils__/schemas.d.ts +84 -0
- package/packages/mcp-servers/dist/__testUtils__/schemas.d.ts.map +1 -0
- package/packages/mcp-servers/dist/__testUtils__/schemas.js +309 -0
- package/packages/mcp-servers/dist/__testUtils__/schemas.js.map +1 -0
- package/packages/mcp-servers/dist/agent-reports/index.d.ts +7 -0
- package/packages/mcp-servers/dist/agent-reports/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/agent-reports/index.js +8 -0
- package/packages/mcp-servers/dist/agent-reports/index.js.map +1 -0
- package/packages/mcp-servers/dist/agent-reports/server.d.ts +22 -0
- package/packages/mcp-servers/dist/agent-reports/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/agent-reports/server.js +535 -0
- package/packages/mcp-servers/dist/agent-reports/server.js.map +1 -0
- package/packages/mcp-servers/dist/agent-reports/types.d.ts +258 -0
- package/packages/mcp-servers/dist/agent-reports/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/agent-reports/types.js +81 -0
- package/packages/mcp-servers/dist/agent-reports/types.js.map +1 -0
- package/packages/mcp-servers/dist/agent-tracker/index.d.ts +5 -0
- package/packages/mcp-servers/dist/agent-tracker/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/agent-tracker/index.js +5 -0
- package/packages/mcp-servers/dist/agent-tracker/index.js.map +1 -0
- package/packages/mcp-servers/dist/agent-tracker/server.d.ts +12 -0
- package/packages/mcp-servers/dist/agent-tracker/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/agent-tracker/server.js +919 -0
- package/packages/mcp-servers/dist/agent-tracker/server.js.map +1 -0
- package/packages/mcp-servers/dist/agent-tracker/types.d.ts +328 -0
- package/packages/mcp-servers/dist/agent-tracker/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/agent-tracker/types.js +128 -0
- package/packages/mcp-servers/dist/agent-tracker/types.js.map +1 -0
- package/packages/mcp-servers/dist/chrome-bridge/browser-tips.d.ts +27 -0
- package/packages/mcp-servers/dist/chrome-bridge/browser-tips.d.ts.map +1 -0
- package/packages/mcp-servers/dist/chrome-bridge/browser-tips.js +167 -0
- package/packages/mcp-servers/dist/chrome-bridge/browser-tips.js.map +1 -0
- package/packages/mcp-servers/dist/chrome-bridge/index.d.ts +6 -0
- package/packages/mcp-servers/dist/chrome-bridge/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/chrome-bridge/index.js +6 -0
- package/packages/mcp-servers/dist/chrome-bridge/index.js.map +1 -0
- package/packages/mcp-servers/dist/chrome-bridge/server.d.ts +13 -0
- package/packages/mcp-servers/dist/chrome-bridge/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/chrome-bridge/server.js +959 -0
- package/packages/mcp-servers/dist/chrome-bridge/server.js.map +1 -0
- package/packages/mcp-servers/dist/chrome-bridge/types.d.ts +41 -0
- package/packages/mcp-servers/dist/chrome-bridge/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/chrome-bridge/types.js +8 -0
- package/packages/mcp-servers/dist/chrome-bridge/types.js.map +1 -0
- package/packages/mcp-servers/dist/cloudflare/index.d.ts +8 -0
- package/packages/mcp-servers/dist/cloudflare/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cloudflare/index.js +8 -0
- package/packages/mcp-servers/dist/cloudflare/index.js.map +1 -0
- package/packages/mcp-servers/dist/cloudflare/server.d.ts +16 -0
- package/packages/mcp-servers/dist/cloudflare/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cloudflare/server.js +253 -0
- package/packages/mcp-servers/dist/cloudflare/server.js.map +1 -0
- package/packages/mcp-servers/dist/cloudflare/types.d.ts +141 -0
- package/packages/mcp-servers/dist/cloudflare/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cloudflare/types.js +53 -0
- package/packages/mcp-servers/dist/cloudflare/types.js.map +1 -0
- package/packages/mcp-servers/dist/codecov/index.d.ts +7 -0
- package/packages/mcp-servers/dist/codecov/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/codecov/index.js +7 -0
- package/packages/mcp-servers/dist/codecov/index.js.map +1 -0
- package/packages/mcp-servers/dist/codecov/server.d.ts +21 -0
- package/packages/mcp-servers/dist/codecov/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/codecov/server.js +376 -0
- package/packages/mcp-servers/dist/codecov/server.js.map +1 -0
- package/packages/mcp-servers/dist/codecov/types.d.ts +269 -0
- package/packages/mcp-servers/dist/codecov/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/codecov/types.js +128 -0
- package/packages/mcp-servers/dist/codecov/types.js.map +1 -0
- package/packages/mcp-servers/dist/cto-report/index.d.ts +9 -0
- package/packages/mcp-servers/dist/cto-report/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cto-report/index.js +9 -0
- package/packages/mcp-servers/dist/cto-report/index.js.map +1 -0
- package/packages/mcp-servers/dist/cto-report/server.d.ts +14 -0
- package/packages/mcp-servers/dist/cto-report/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cto-report/server.js +859 -0
- package/packages/mcp-servers/dist/cto-report/server.js.map +1 -0
- package/packages/mcp-servers/dist/cto-report/types.d.ts +213 -0
- package/packages/mcp-servers/dist/cto-report/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cto-report/types.js +29 -0
- package/packages/mcp-servers/dist/cto-report/types.js.map +1 -0
- package/packages/mcp-servers/dist/cto-reports/index.d.ts +7 -0
- package/packages/mcp-servers/dist/cto-reports/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cto-reports/index.js +8 -0
- package/packages/mcp-servers/dist/cto-reports/index.js.map +1 -0
- package/packages/mcp-servers/dist/cto-reports/server.d.ts +20 -0
- package/packages/mcp-servers/dist/cto-reports/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cto-reports/server.js +538 -0
- package/packages/mcp-servers/dist/cto-reports/server.js.map +1 -0
- package/packages/mcp-servers/dist/cto-reports/types.d.ts +236 -0
- package/packages/mcp-servers/dist/cto-reports/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cto-reports/types.js +77 -0
- package/packages/mcp-servers/dist/cto-reports/types.js.map +1 -0
- package/packages/mcp-servers/dist/deputy-cto/index.d.ts +7 -0
- package/packages/mcp-servers/dist/deputy-cto/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/deputy-cto/index.js +8 -0
- package/packages/mcp-servers/dist/deputy-cto/index.js.map +1 -0
- package/packages/mcp-servers/dist/deputy-cto/server.d.ts +23 -0
- package/packages/mcp-servers/dist/deputy-cto/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/deputy-cto/server.js +1700 -0
- package/packages/mcp-servers/dist/deputy-cto/server.js.map +1 -0
- package/packages/mcp-servers/dist/deputy-cto/types.d.ts +439 -0
- package/packages/mcp-servers/dist/deputy-cto/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/deputy-cto/types.js +102 -0
- package/packages/mcp-servers/dist/deputy-cto/types.js.map +1 -0
- package/packages/mcp-servers/dist/elastic-logs/index.d.ts +5 -0
- package/packages/mcp-servers/dist/elastic-logs/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/elastic-logs/index.js +5 -0
- package/packages/mcp-servers/dist/elastic-logs/index.js.map +1 -0
- package/packages/mcp-servers/dist/elastic-logs/server.d.ts +18 -0
- package/packages/mcp-servers/dist/elastic-logs/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/elastic-logs/server.js +259 -0
- package/packages/mcp-servers/dist/elastic-logs/server.js.map +1 -0
- package/packages/mcp-servers/dist/elastic-logs/types.d.ts +107 -0
- package/packages/mcp-servers/dist/elastic-logs/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/elastic-logs/types.js +31 -0
- package/packages/mcp-servers/dist/elastic-logs/types.js.map +1 -0
- package/packages/mcp-servers/dist/feedback-explorer/index.d.ts +2 -0
- package/packages/mcp-servers/dist/feedback-explorer/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/feedback-explorer/index.js +2 -0
- package/packages/mcp-servers/dist/feedback-explorer/index.js.map +1 -0
- package/packages/mcp-servers/dist/feedback-explorer/server.d.ts +21 -0
- package/packages/mcp-servers/dist/feedback-explorer/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/feedback-explorer/server.js +580 -0
- package/packages/mcp-servers/dist/feedback-explorer/server.js.map +1 -0
- package/packages/mcp-servers/dist/feedback-explorer/types.d.ts +331 -0
- package/packages/mcp-servers/dist/feedback-explorer/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/feedback-explorer/types.js +40 -0
- package/packages/mcp-servers/dist/feedback-explorer/types.js.map +1 -0
- package/packages/mcp-servers/dist/feedback-reporter/index.d.ts +9 -0
- package/packages/mcp-servers/dist/feedback-reporter/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/feedback-reporter/index.js +9 -0
- package/packages/mcp-servers/dist/feedback-reporter/index.js.map +1 -0
- package/packages/mcp-servers/dist/feedback-reporter/server.d.ts +36 -0
- package/packages/mcp-servers/dist/feedback-reporter/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/feedback-reporter/server.js +392 -0
- package/packages/mcp-servers/dist/feedback-reporter/server.js.map +1 -0
- package/packages/mcp-servers/dist/feedback-reporter/types.d.ts +152 -0
- package/packages/mcp-servers/dist/feedback-reporter/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/feedback-reporter/types.js +67 -0
- package/packages/mcp-servers/dist/feedback-reporter/types.js.map +1 -0
- package/packages/mcp-servers/dist/github/index.d.ts +7 -0
- package/packages/mcp-servers/dist/github/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/github/index.js +7 -0
- package/packages/mcp-servers/dist/github/index.js.map +1 -0
- package/packages/mcp-servers/dist/github/server.d.ts +15 -0
- package/packages/mcp-servers/dist/github/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/github/server.js +686 -0
- package/packages/mcp-servers/dist/github/server.js.map +1 -0
- package/packages/mcp-servers/dist/github/types.d.ts +660 -0
- package/packages/mcp-servers/dist/github/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/github/types.js +209 -0
- package/packages/mcp-servers/dist/github/types.js.map +1 -0
- package/packages/mcp-servers/dist/index.d.ts +30 -0
- package/packages/mcp-servers/dist/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/index.js +32 -0
- package/packages/mcp-servers/dist/index.js.map +1 -0
- package/packages/mcp-servers/dist/makerkit-docs/index.d.ts +5 -0
- package/packages/mcp-servers/dist/makerkit-docs/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/makerkit-docs/index.js +5 -0
- package/packages/mcp-servers/dist/makerkit-docs/index.js.map +1 -0
- package/packages/mcp-servers/dist/makerkit-docs/server.d.ts +15 -0
- package/packages/mcp-servers/dist/makerkit-docs/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/makerkit-docs/server.js +252 -0
- package/packages/mcp-servers/dist/makerkit-docs/server.js.map +1 -0
- package/packages/mcp-servers/dist/makerkit-docs/types.d.ts +74 -0
- package/packages/mcp-servers/dist/makerkit-docs/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/makerkit-docs/types.js +20 -0
- package/packages/mcp-servers/dist/makerkit-docs/types.js.map +1 -0
- package/packages/mcp-servers/dist/onepassword/index.d.ts +2 -0
- package/packages/mcp-servers/dist/onepassword/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/onepassword/index.js +2 -0
- package/packages/mcp-servers/dist/onepassword/index.js.map +1 -0
- package/packages/mcp-servers/dist/onepassword/server.d.ts +2 -0
- package/packages/mcp-servers/dist/onepassword/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/onepassword/server.js +159 -0
- package/packages/mcp-servers/dist/onepassword/server.js.map +1 -0
- package/packages/mcp-servers/dist/onepassword/types.d.ts +55 -0
- package/packages/mcp-servers/dist/onepassword/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/onepassword/types.js +22 -0
- package/packages/mcp-servers/dist/onepassword/types.js.map +1 -0
- package/packages/mcp-servers/dist/playwright/helpers.d.ts +20 -0
- package/packages/mcp-servers/dist/playwright/helpers.d.ts.map +1 -0
- package/packages/mcp-servers/dist/playwright/helpers.js +31 -0
- package/packages/mcp-servers/dist/playwright/helpers.js.map +1 -0
- package/packages/mcp-servers/dist/playwright/index.d.ts +5 -0
- package/packages/mcp-servers/dist/playwright/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/playwright/index.js +5 -0
- package/packages/mcp-servers/dist/playwright/index.js.map +1 -0
- package/packages/mcp-servers/dist/playwright/server.d.ts +13 -0
- package/packages/mcp-servers/dist/playwright/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/playwright/server.js +1201 -0
- package/packages/mcp-servers/dist/playwright/server.js.map +1 -0
- package/packages/mcp-servers/dist/playwright/types.d.ts +216 -0
- package/packages/mcp-servers/dist/playwright/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/playwright/types.js +172 -0
- package/packages/mcp-servers/dist/playwright/types.js.map +1 -0
- package/packages/mcp-servers/dist/playwright-feedback/browser-manager.d.ts +39 -0
- package/packages/mcp-servers/dist/playwright-feedback/browser-manager.d.ts.map +1 -0
- package/packages/mcp-servers/dist/playwright-feedback/browser-manager.js +71 -0
- package/packages/mcp-servers/dist/playwright-feedback/browser-manager.js.map +1 -0
- package/packages/mcp-servers/dist/playwright-feedback/index.d.ts +5 -0
- package/packages/mcp-servers/dist/playwright-feedback/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/playwright-feedback/index.js +5 -0
- package/packages/mcp-servers/dist/playwright-feedback/index.js.map +1 -0
- package/packages/mcp-servers/dist/playwright-feedback/server.d.ts +34 -0
- package/packages/mcp-servers/dist/playwright-feedback/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/playwright-feedback/server.js +538 -0
- package/packages/mcp-servers/dist/playwright-feedback/server.js.map +1 -0
- package/packages/mcp-servers/dist/playwright-feedback/types.d.ts +305 -0
- package/packages/mcp-servers/dist/playwright-feedback/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/playwright-feedback/types.js +123 -0
- package/packages/mcp-servers/dist/playwright-feedback/types.js.map +1 -0
- package/packages/mcp-servers/dist/product-manager/server.d.ts +17 -0
- package/packages/mcp-servers/dist/product-manager/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/product-manager/server.js +690 -0
- package/packages/mcp-servers/dist/product-manager/server.js.map +1 -0
- package/packages/mcp-servers/dist/product-manager/types.d.ts +286 -0
- package/packages/mcp-servers/dist/product-manager/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/product-manager/types.js +99 -0
- package/packages/mcp-servers/dist/product-manager/types.js.map +1 -0
- package/packages/mcp-servers/dist/programmatic-feedback/index.d.ts +7 -0
- package/packages/mcp-servers/dist/programmatic-feedback/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/programmatic-feedback/index.js +7 -0
- package/packages/mcp-servers/dist/programmatic-feedback/index.js.map +1 -0
- package/packages/mcp-servers/dist/programmatic-feedback/sandbox.d.ts +19 -0
- package/packages/mcp-servers/dist/programmatic-feedback/sandbox.d.ts.map +1 -0
- package/packages/mcp-servers/dist/programmatic-feedback/sandbox.js +174 -0
- package/packages/mcp-servers/dist/programmatic-feedback/sandbox.js.map +1 -0
- package/packages/mcp-servers/dist/programmatic-feedback/server.d.ts +35 -0
- package/packages/mcp-servers/dist/programmatic-feedback/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/programmatic-feedback/server.js +465 -0
- package/packages/mcp-servers/dist/programmatic-feedback/server.js.map +1 -0
- package/packages/mcp-servers/dist/programmatic-feedback/types.d.ts +127 -0
- package/packages/mcp-servers/dist/programmatic-feedback/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/programmatic-feedback/types.js +80 -0
- package/packages/mcp-servers/dist/programmatic-feedback/types.js.map +1 -0
- package/packages/mcp-servers/dist/render/index.d.ts +8 -0
- package/packages/mcp-servers/dist/render/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/render/index.js +8 -0
- package/packages/mcp-servers/dist/render/index.js.map +1 -0
- package/packages/mcp-servers/dist/render/server.d.ts +15 -0
- package/packages/mcp-servers/dist/render/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/render/server.js +428 -0
- package/packages/mcp-servers/dist/render/server.js.map +1 -0
- package/packages/mcp-servers/dist/render/types.d.ts +273 -0
- package/packages/mcp-servers/dist/render/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/render/types.js +102 -0
- package/packages/mcp-servers/dist/render/types.js.map +1 -0
- package/packages/mcp-servers/dist/resend/index.d.ts +7 -0
- package/packages/mcp-servers/dist/resend/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/resend/index.js +7 -0
- package/packages/mcp-servers/dist/resend/index.js.map +1 -0
- package/packages/mcp-servers/dist/resend/server.d.ts +15 -0
- package/packages/mcp-servers/dist/resend/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/resend/server.js +298 -0
- package/packages/mcp-servers/dist/resend/server.js.map +1 -0
- package/packages/mcp-servers/dist/resend/types.d.ts +222 -0
- package/packages/mcp-servers/dist/resend/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/resend/types.js +58 -0
- package/packages/mcp-servers/dist/resend/types.js.map +1 -0
- package/packages/mcp-servers/dist/review-queue/index.d.ts +6 -0
- package/packages/mcp-servers/dist/review-queue/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/review-queue/index.js +6 -0
- package/packages/mcp-servers/dist/review-queue/index.js.map +1 -0
- package/packages/mcp-servers/dist/review-queue/server.d.ts +17 -0
- package/packages/mcp-servers/dist/review-queue/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/review-queue/server.js +348 -0
- package/packages/mcp-servers/dist/review-queue/server.js.map +1 -0
- package/packages/mcp-servers/dist/review-queue/types.d.ts +162 -0
- package/packages/mcp-servers/dist/review-queue/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/review-queue/types.js +56 -0
- package/packages/mcp-servers/dist/review-queue/types.js.map +1 -0
- package/packages/mcp-servers/dist/secret-sync/server.d.ts +19 -0
- package/packages/mcp-servers/dist/secret-sync/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/secret-sync/server.js +1139 -0
- package/packages/mcp-servers/dist/secret-sync/server.js.map +1 -0
- package/packages/mcp-servers/dist/secret-sync/types.d.ts +442 -0
- package/packages/mcp-servers/dist/secret-sync/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/secret-sync/types.js +113 -0
- package/packages/mcp-servers/dist/secret-sync/types.js.map +1 -0
- package/packages/mcp-servers/dist/session-events/index.d.ts +5 -0
- package/packages/mcp-servers/dist/session-events/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/session-events/index.js +5 -0
- package/packages/mcp-servers/dist/session-events/index.js.map +1 -0
- package/packages/mcp-servers/dist/session-events/server.d.ts +11 -0
- package/packages/mcp-servers/dist/session-events/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/session-events/server.js +290 -0
- package/packages/mcp-servers/dist/session-events/server.js.map +1 -0
- package/packages/mcp-servers/dist/session-events/types.d.ts +213 -0
- package/packages/mcp-servers/dist/session-events/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/session-events/types.js +69 -0
- package/packages/mcp-servers/dist/session-events/types.js.map +1 -0
- package/packages/mcp-servers/dist/session-restart/index.d.ts +9 -0
- package/packages/mcp-servers/dist/session-restart/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/session-restart/index.js +9 -0
- package/packages/mcp-servers/dist/session-restart/index.js.map +1 -0
- package/packages/mcp-servers/dist/session-restart/server.d.ts +20 -0
- package/packages/mcp-servers/dist/session-restart/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/session-restart/server.js +411 -0
- package/packages/mcp-servers/dist/session-restart/server.js.map +1 -0
- package/packages/mcp-servers/dist/session-restart/types.d.ts +26 -0
- package/packages/mcp-servers/dist/session-restart/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/session-restart/types.js +16 -0
- package/packages/mcp-servers/dist/session-restart/types.js.map +1 -0
- package/packages/mcp-servers/dist/setup-helper/index.d.ts +5 -0
- package/packages/mcp-servers/dist/setup-helper/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/setup-helper/index.js +5 -0
- package/packages/mcp-servers/dist/setup-helper/index.js.map +1 -0
- package/packages/mcp-servers/dist/setup-helper/server.d.ts +14 -0
- package/packages/mcp-servers/dist/setup-helper/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/setup-helper/server.js +454 -0
- package/packages/mcp-servers/dist/setup-helper/server.js.map +1 -0
- package/packages/mcp-servers/dist/setup-helper/types.d.ts +81 -0
- package/packages/mcp-servers/dist/setup-helper/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/setup-helper/types.js +41 -0
- package/packages/mcp-servers/dist/setup-helper/types.js.map +1 -0
- package/packages/mcp-servers/dist/shared/audited-server.d.ts +31 -0
- package/packages/mcp-servers/dist/shared/audited-server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/shared/audited-server.js +126 -0
- package/packages/mcp-servers/dist/shared/audited-server.js.map +1 -0
- package/packages/mcp-servers/dist/shared/constants.d.ts +26 -0
- package/packages/mcp-servers/dist/shared/constants.d.ts.map +1 -0
- package/packages/mcp-servers/dist/shared/constants.js +41 -0
- package/packages/mcp-servers/dist/shared/constants.js.map +1 -0
- package/packages/mcp-servers/dist/shared/index.d.ts +6 -0
- package/packages/mcp-servers/dist/shared/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/shared/index.js +6 -0
- package/packages/mcp-servers/dist/shared/index.js.map +1 -0
- package/packages/mcp-servers/dist/shared/readonly-db.d.ts +11 -0
- package/packages/mcp-servers/dist/shared/readonly-db.d.ts.map +1 -0
- package/packages/mcp-servers/dist/shared/readonly-db.js +47 -0
- package/packages/mcp-servers/dist/shared/readonly-db.js.map +1 -0
- package/packages/mcp-servers/dist/shared/resolve-framework.d.ts +20 -0
- package/packages/mcp-servers/dist/shared/resolve-framework.d.ts.map +1 -0
- package/packages/mcp-servers/dist/shared/resolve-framework.js +65 -0
- package/packages/mcp-servers/dist/shared/resolve-framework.js.map +1 -0
- package/packages/mcp-servers/dist/shared/server.d.ts +86 -0
- package/packages/mcp-servers/dist/shared/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/shared/server.js +291 -0
- package/packages/mcp-servers/dist/shared/server.js.map +1 -0
- package/packages/mcp-servers/dist/shared/types.d.ts +113 -0
- package/packages/mcp-servers/dist/shared/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/shared/types.js +36 -0
- package/packages/mcp-servers/dist/shared/types.js.map +1 -0
- package/packages/mcp-servers/dist/show/server.d.ts +12 -0
- package/packages/mcp-servers/dist/show/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/show/server.js +97 -0
- package/packages/mcp-servers/dist/show/server.js.map +1 -0
- package/packages/mcp-servers/dist/show/types.d.ts +19 -0
- package/packages/mcp-servers/dist/show/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/show/types.js +32 -0
- package/packages/mcp-servers/dist/show/types.js.map +1 -0
- package/packages/mcp-servers/dist/specs-browser/index.d.ts +5 -0
- package/packages/mcp-servers/dist/specs-browser/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/specs-browser/index.js +5 -0
- package/packages/mcp-servers/dist/specs-browser/index.js.map +1 -0
- package/packages/mcp-servers/dist/specs-browser/server.d.ts +13 -0
- package/packages/mcp-servers/dist/specs-browser/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/specs-browser/server.js +692 -0
- package/packages/mcp-servers/dist/specs-browser/server.js.map +1 -0
- package/packages/mcp-servers/dist/specs-browser/types.d.ts +337 -0
- package/packages/mcp-servers/dist/specs-browser/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/specs-browser/types.js +134 -0
- package/packages/mcp-servers/dist/specs-browser/types.js.map +1 -0
- package/packages/mcp-servers/dist/supabase/index.d.ts +10 -0
- package/packages/mcp-servers/dist/supabase/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/supabase/index.js +10 -0
- package/packages/mcp-servers/dist/supabase/index.js.map +1 -0
- package/packages/mcp-servers/dist/supabase/server.d.ts +20 -0
- package/packages/mcp-servers/dist/supabase/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/supabase/server.js +451 -0
- package/packages/mcp-servers/dist/supabase/server.js.map +1 -0
- package/packages/mcp-servers/dist/supabase/types.d.ts +196 -0
- package/packages/mcp-servers/dist/supabase/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/supabase/types.js +76 -0
- package/packages/mcp-servers/dist/supabase/types.js.map +1 -0
- package/packages/mcp-servers/dist/todo-db/index.d.ts +5 -0
- package/packages/mcp-servers/dist/todo-db/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/todo-db/index.js +5 -0
- package/packages/mcp-servers/dist/todo-db/index.js.map +1 -0
- package/packages/mcp-servers/dist/todo-db/server.d.ts +13 -0
- package/packages/mcp-servers/dist/todo-db/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/todo-db/server.js +649 -0
- package/packages/mcp-servers/dist/todo-db/server.js.map +1 -0
- package/packages/mcp-servers/dist/todo-db/types.d.ts +225 -0
- package/packages/mcp-servers/dist/todo-db/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/todo-db/types.js +69 -0
- package/packages/mcp-servers/dist/todo-db/types.js.map +1 -0
- package/packages/mcp-servers/dist/user-feedback/index.d.ts +7 -0
- package/packages/mcp-servers/dist/user-feedback/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/user-feedback/index.js +8 -0
- package/packages/mcp-servers/dist/user-feedback/index.js.map +1 -0
- package/packages/mcp-servers/dist/user-feedback/server.d.ts +25 -0
- package/packages/mcp-servers/dist/user-feedback/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/user-feedback/server.js +914 -0
- package/packages/mcp-servers/dist/user-feedback/server.js.map +1 -0
- package/packages/mcp-servers/dist/user-feedback/types.d.ts +415 -0
- package/packages/mcp-servers/dist/user-feedback/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/user-feedback/types.js +132 -0
- package/packages/mcp-servers/dist/user-feedback/types.js.map +1 -0
- package/packages/mcp-servers/dist/vercel/index.d.ts +9 -0
- package/packages/mcp-servers/dist/vercel/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/vercel/index.js +9 -0
- package/packages/mcp-servers/dist/vercel/index.js.map +1 -0
- package/packages/mcp-servers/dist/vercel/server.d.ts +17 -0
- package/packages/mcp-servers/dist/vercel/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/vercel/server.js +265 -0
- package/packages/mcp-servers/dist/vercel/server.js.map +1 -0
- package/packages/mcp-servers/dist/vercel/types.d.ts +189 -0
- package/packages/mcp-servers/dist/vercel/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/vercel/types.js +65 -0
- package/packages/mcp-servers/dist/vercel/types.js.map +1 -0
- package/packages/mcp-servers/package-lock.json +3765 -0
- package/packages/mcp-servers/package.json +64 -0
- package/packages/mcp-servers/test/reporters/test-failure-reporter.ts +372 -0
- package/packages/mcp-servers/vitest.config.ts +27 -0
- package/scripts/__tests__/README.md +163 -0
- package/scripts/apply-credential-hardening.sh +271 -0
- package/scripts/credential-providers/manual.js +56 -0
- package/scripts/credential-providers/onepassword.js +85 -0
- package/scripts/credential-providers/provider-interface.js +104 -0
- package/scripts/encrypt-credential.js +337 -0
- package/scripts/feedback-launcher.js +338 -0
- package/scripts/feedback-orchestrator.js +373 -0
- package/scripts/fix-mcp-launcher-issues.sh +97 -0
- package/scripts/force-spawn-tasks.js +651 -0
- package/scripts/force-triage-reports.js +560 -0
- package/scripts/generate-protected-actions-spec.js +142 -0
- package/scripts/generate-proxy-certs.sh +158 -0
- package/scripts/grant-chrome-ext-permissions.sh +242 -0
- package/scripts/mcp-launcher.js +125 -0
- package/scripts/merge-settings.cjs +167 -0
- package/scripts/patch-clawd.py +844 -0
- package/scripts/patch-credential-cache.py +313 -0
- package/scripts/patches/credential-file-guard-patched.mjs +573 -0
- package/scripts/patches/credential-file-guard.js.patched +573 -0
- package/scripts/patches/verify-tokenizer.mjs +132 -0
- package/scripts/protect-framework.sh +478 -0
- package/scripts/readme-chrome.template +12 -0
- package/scripts/reap-completed-agents.js +439 -0
- package/scripts/reinstall.sh +86 -0
- package/scripts/resign-node.sh +185 -0
- package/scripts/rotation-proxy.js +656 -0
- package/scripts/rotation-stress-monitor.mjs +862 -0
- package/scripts/setup-automation-service.sh +648 -0
- package/scripts/setup-check.js +251 -0
- package/scripts/watch-claude-version.js +142 -0
- package/specs/framework/CORE-INVARIANTS.md +161 -0
- package/specs/patterns/AGENT-PATTERNS.md +223 -0
- package/specs/patterns/HOOK-PATTERNS.md +242 -0
- package/specs/patterns/MCP-SERVER-PATTERNS.md +144 -0
- package/templates/config/gitignore.template +14 -0
- package/templates/config/merge-chain-check.yml.template +51 -0
- package/templates/config/package.json.template +18 -0
- package/templates/config/pnpm-workspace.yaml +5 -0
- package/templates/config/services.json.template +18 -0
- package/templates/config/tsconfig.base.json +17 -0
- package/templates/scaffold/integrations/_template/.gitkeep +0 -0
- package/templates/scaffold/packages/logger/package.json +17 -0
- package/templates/scaffold/packages/logger/src/logger.ts +44 -0
- package/templates/scaffold/packages/shared/package.json +17 -0
- package/templates/scaffold/packages/shared/src/errors.ts +43 -0
- package/templates/scaffold/products/_product/apps/backend/package.json +21 -0
- package/templates/scaffold/products/_product/apps/backend/src/index.ts +17 -0
- package/templates/scaffold/products/_product/apps/extension/.gitkeep +0 -0
- package/templates/scaffold/products/_product/apps/web/.gitkeep +0 -0
- package/templates/scaffold/specs/global/.gitkeep +0 -0
- package/templates/scaffold/specs/local/.gitkeep +0 -0
- package/templates/scaffold/specs/reference/.gitkeep +0 -0
- package/version.json +15 -0
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* TODO Database Maintenance Script for Claude Code Hooks
|
|
5
|
+
*
|
|
6
|
+
* This script maintains the SQLite todo.db by:
|
|
7
|
+
* 1. Clearing stale "in_progress" tasks (>30 min without completion)
|
|
8
|
+
* 2. Removing completed tasks older than 3 hours
|
|
9
|
+
* 3. Capping completed tasks at 50 (removes oldest)
|
|
10
|
+
* 4. Spawning Claude to process pending tasks when threshold is met
|
|
11
|
+
*
|
|
12
|
+
* Exit codes:
|
|
13
|
+
* - 0: Success (stdout provides summary)
|
|
14
|
+
* - 1: Script error (non-blocking warning)
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* node todo-maintenance.js cleanup # Full cleanup (for SessionStart/UserPromptSubmit)
|
|
18
|
+
*
|
|
19
|
+
* @version 2.0.0 - Database-only version for x_test
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import fs from 'fs';
|
|
23
|
+
import path from 'path';
|
|
24
|
+
import { spawn } from 'child_process';
|
|
25
|
+
import { registerSpawn, registerHookExecution, AGENT_TYPES, HOOK_TYPES } from './agent-tracker.js';
|
|
26
|
+
import { getCooldown } from './config-reader.js';
|
|
27
|
+
|
|
28
|
+
// Try to import better-sqlite3 for database operations
|
|
29
|
+
let Database = null;
|
|
30
|
+
try {
|
|
31
|
+
Database = (await import('better-sqlite3')).default;
|
|
32
|
+
} catch (err) {
|
|
33
|
+
// G001: Log warning when database module is unavailable
|
|
34
|
+
console.error(`Warning: better-sqlite3 not available: ${err.message}`);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Debug logging - writes to file since stdout is used for hook response
|
|
38
|
+
const DEBUG = process.env.DEBUG_TODO_MAINTENANCE === 'true';
|
|
39
|
+
const DEBUG_LOG_PATH = path.join(process.cwd(), '.claude', 'hooks', 'todo-maintenance-debug.log');
|
|
40
|
+
|
|
41
|
+
function debugLog(message, data = null) {
|
|
42
|
+
if (!DEBUG) return;
|
|
43
|
+
const timestamp = new Date().toISOString();
|
|
44
|
+
let logLine = `[${timestamp}] ${message}`;
|
|
45
|
+
if (data !== null) {
|
|
46
|
+
logLine += '\n' + JSON.stringify(data, null, 2);
|
|
47
|
+
}
|
|
48
|
+
logLine += '\n---\n';
|
|
49
|
+
try {
|
|
50
|
+
fs.appendFileSync(DEBUG_LOG_PATH, logLine);
|
|
51
|
+
} catch (err) {
|
|
52
|
+
// Ignore write errors
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Configuration
|
|
57
|
+
const CONFIG = {
|
|
58
|
+
STALE_STARTED_MINUTES: 30, // Clear start time after 30 minutes without completion
|
|
59
|
+
COMPLETED_RETENTION_HOURS: 3, // Remove completed tasks after 3 hours from completion
|
|
60
|
+
MAX_COMPLETED_TASKS: 50, // Maximum completed tasks to keep (removes oldest beyond this)
|
|
61
|
+
STATE_FILENAME: 'todo-maintenance-state.json',
|
|
62
|
+
PENDING_THRESHOLD: 5, // Spawn Claude when pending tasks >= this
|
|
63
|
+
COOLDOWN_MINUTES: getCooldown('todo_maintenance', 15), // Dynamic from config
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Validate and resolve project directory path (G003)
|
|
68
|
+
* @param {string} inputPath
|
|
69
|
+
* @returns {string|null} Resolved absolute path or null if invalid
|
|
70
|
+
*/
|
|
71
|
+
function validateProjectDir(inputPath) {
|
|
72
|
+
if (!inputPath || typeof inputPath !== 'string') {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Resolve to absolute path
|
|
77
|
+
const resolved = path.resolve(inputPath);
|
|
78
|
+
|
|
79
|
+
// Basic validation: must be a directory that exists
|
|
80
|
+
try {
|
|
81
|
+
const stat = fs.statSync(resolved);
|
|
82
|
+
if (!stat.isDirectory()) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
} catch {
|
|
86
|
+
// Directory doesn't exist - allow for new projects
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Reject paths with suspicious patterns (basic path traversal protection)
|
|
90
|
+
if (resolved.includes('\0') || resolved.includes('..')) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return resolved;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Valid task sections for x_test
|
|
98
|
+
const VALID_SECTIONS = ['TEST-WRITER', 'INVESTIGATOR & PLANNER', 'CODE-REVIEWER', 'PROJECT-MANAGER'];
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Perform cleanup on the TODO database
|
|
102
|
+
* @param {string} projectDir
|
|
103
|
+
* @param {Date} now
|
|
104
|
+
* @returns {object|null} Cleanup results or null if database not available
|
|
105
|
+
*/
|
|
106
|
+
function performDatabaseCleanup(projectDir, now = new Date()) {
|
|
107
|
+
if (!Database) {
|
|
108
|
+
debugLog('Database module not available - skipping database cleanup');
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const dbPath = path.join(projectDir, '.claude', 'todo.db');
|
|
113
|
+
if (!fs.existsSync(dbPath)) {
|
|
114
|
+
debugLog('Database file not found - skipping database cleanup', { dbPath });
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
try {
|
|
119
|
+
const db = new Database(dbPath);
|
|
120
|
+
const nowTimestamp = Math.floor(now.getTime() / 1000);
|
|
121
|
+
const changes = {
|
|
122
|
+
staleStartsCleared: 0,
|
|
123
|
+
completedRemoved: 0,
|
|
124
|
+
completedCapped: 0
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
// Clear stale starts (>30 min without completion)
|
|
128
|
+
const staleResult = db.prepare(`
|
|
129
|
+
UPDATE tasks
|
|
130
|
+
SET status = 'pending', started_at = NULL
|
|
131
|
+
WHERE status = 'in_progress'
|
|
132
|
+
AND started_at IS NOT NULL
|
|
133
|
+
AND (? - created_timestamp) > 1800
|
|
134
|
+
`).run(nowTimestamp);
|
|
135
|
+
changes.staleStartsCleared = staleResult.changes;
|
|
136
|
+
|
|
137
|
+
// Remove completed tasks older than 3 hours
|
|
138
|
+
const oldResult = db.prepare(`
|
|
139
|
+
DELETE FROM tasks
|
|
140
|
+
WHERE status = 'completed'
|
|
141
|
+
AND completed_timestamp IS NOT NULL
|
|
142
|
+
AND (? - completed_timestamp) > 10800
|
|
143
|
+
`).run(nowTimestamp);
|
|
144
|
+
changes.completedRemoved = oldResult.changes;
|
|
145
|
+
|
|
146
|
+
// Cap completed tasks at 50 (keep most recent)
|
|
147
|
+
const completedCount = db.prepare("SELECT COUNT(*) as count FROM tasks WHERE status = 'completed'").get().count;
|
|
148
|
+
if (completedCount > 50) {
|
|
149
|
+
const toRemove = completedCount - 50;
|
|
150
|
+
const capResult = db.prepare(`
|
|
151
|
+
DELETE FROM tasks WHERE id IN (
|
|
152
|
+
SELECT id FROM tasks
|
|
153
|
+
WHERE status = 'completed'
|
|
154
|
+
ORDER BY completed_timestamp ASC
|
|
155
|
+
LIMIT ?
|
|
156
|
+
)
|
|
157
|
+
`).run(toRemove);
|
|
158
|
+
changes.completedCapped = capResult.changes;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
db.close();
|
|
162
|
+
|
|
163
|
+
debugLog('Database cleanup complete', changes);
|
|
164
|
+
return changes;
|
|
165
|
+
} catch (err) {
|
|
166
|
+
debugLog('Database cleanup error', { error: err.message });
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Get pending task count from database
|
|
173
|
+
* @param {string} projectDir
|
|
174
|
+
* @returns {number} Pending count or 0 if database not available
|
|
175
|
+
*/
|
|
176
|
+
function getDatabasePendingCount(projectDir) {
|
|
177
|
+
if (!Database) return 0;
|
|
178
|
+
|
|
179
|
+
const dbPath = path.join(projectDir, '.claude', 'todo.db');
|
|
180
|
+
if (!fs.existsSync(dbPath)) return 0;
|
|
181
|
+
|
|
182
|
+
try {
|
|
183
|
+
const db = new Database(dbPath);
|
|
184
|
+
const result = db.prepare("SELECT COUNT(*) as count FROM tasks WHERE status = 'pending'").get();
|
|
185
|
+
db.close();
|
|
186
|
+
return result.count;
|
|
187
|
+
} catch (err) {
|
|
188
|
+
// G001: Log database errors instead of silently returning 0
|
|
189
|
+
debugLog('getDatabasePendingCount error', { error: err.message });
|
|
190
|
+
return 0;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Get task summary from database
|
|
196
|
+
* @param {string} projectDir
|
|
197
|
+
* @returns {object} Summary with pending, in_progress, completed counts
|
|
198
|
+
*/
|
|
199
|
+
function getDatabaseSummary(projectDir) {
|
|
200
|
+
const summary = { pending: 0, in_progress: 0, completed: 0, total: 0 };
|
|
201
|
+
|
|
202
|
+
if (!Database) return summary;
|
|
203
|
+
|
|
204
|
+
const dbPath = path.join(projectDir, '.claude', 'todo.db');
|
|
205
|
+
if (!fs.existsSync(dbPath)) return summary;
|
|
206
|
+
|
|
207
|
+
try {
|
|
208
|
+
const db = new Database(dbPath);
|
|
209
|
+
const rows = db.prepare("SELECT status, COUNT(*) as count FROM tasks GROUP BY status").all();
|
|
210
|
+
db.close();
|
|
211
|
+
|
|
212
|
+
for (const row of rows) {
|
|
213
|
+
summary[row.status] = row.count;
|
|
214
|
+
summary.total += row.count;
|
|
215
|
+
}
|
|
216
|
+
return summary;
|
|
217
|
+
} catch (err) {
|
|
218
|
+
// G001: Log database errors instead of silently returning empty summary
|
|
219
|
+
debugLog('getDatabaseSummary error', { error: err.message });
|
|
220
|
+
return summary;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Get the path to the cooldown state file
|
|
226
|
+
* @param {string} projectDir
|
|
227
|
+
* @returns {string}
|
|
228
|
+
*/
|
|
229
|
+
function getStatePath(projectDir) {
|
|
230
|
+
return path.join(projectDir, '.claude', 'hooks', CONFIG.STATE_FILENAME);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Read the cooldown state from file
|
|
235
|
+
* @param {string} statePath
|
|
236
|
+
* @returns {object} { lastSpawnTime: number | null }
|
|
237
|
+
*/
|
|
238
|
+
function readCooldownState(statePath) {
|
|
239
|
+
try {
|
|
240
|
+
const content = fs.readFileSync(statePath, 'utf8');
|
|
241
|
+
const state = JSON.parse(content);
|
|
242
|
+
return {
|
|
243
|
+
lastSpawnTime: state.lastSpawnTime || null
|
|
244
|
+
};
|
|
245
|
+
} catch {
|
|
246
|
+
// File doesn't exist or is invalid - return empty state
|
|
247
|
+
return { lastSpawnTime: null };
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Write the cooldown state to file
|
|
253
|
+
* @param {string} statePath
|
|
254
|
+
* @param {object} state
|
|
255
|
+
*/
|
|
256
|
+
function writeCooldownState(statePath, state) {
|
|
257
|
+
try {
|
|
258
|
+
fs.writeFileSync(statePath, JSON.stringify(state, null, 2), 'utf8');
|
|
259
|
+
} catch (err) {
|
|
260
|
+
// Non-fatal - just log and continue
|
|
261
|
+
console.error(`Warning: Could not write cooldown state: ${err.message}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Check if we're within the cooldown period
|
|
267
|
+
* @param {string} statePath
|
|
268
|
+
* @param {Date} now
|
|
269
|
+
* @returns {boolean} true if still in cooldown (should skip spawn)
|
|
270
|
+
*/
|
|
271
|
+
function isInCooldown(statePath, now = new Date()) {
|
|
272
|
+
const state = readCooldownState(statePath);
|
|
273
|
+
|
|
274
|
+
if (!state.lastSpawnTime) {
|
|
275
|
+
return false; // Never spawned before
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const lastSpawn = new Date(state.lastSpawnTime);
|
|
279
|
+
const minutesSinceSpawn = (now - lastSpawn) / (1000 * 60);
|
|
280
|
+
|
|
281
|
+
return minutesSinceSpawn < CONFIG.COOLDOWN_MINUTES;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Record a spawn event in the cooldown state
|
|
286
|
+
* @param {string} statePath
|
|
287
|
+
* @param {Date} now
|
|
288
|
+
*/
|
|
289
|
+
function recordSpawn(statePath, now = new Date()) {
|
|
290
|
+
writeCooldownState(statePath, {
|
|
291
|
+
lastSpawnTime: now.toISOString()
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Get the path to the prompt file
|
|
297
|
+
* @param {string} projectDir
|
|
298
|
+
* @returns {string}
|
|
299
|
+
*/
|
|
300
|
+
function getPromptPath(projectDir) {
|
|
301
|
+
return path.join(projectDir, '.claude', 'hooks', 'todo-processing-prompt.md');
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Read the TODO processing prompt from file
|
|
306
|
+
* @param {string} promptPath
|
|
307
|
+
* @returns {string|null}
|
|
308
|
+
*/
|
|
309
|
+
function readPrompt(promptPath) {
|
|
310
|
+
try {
|
|
311
|
+
return fs.readFileSync(promptPath, 'utf8').trim();
|
|
312
|
+
} catch (err) {
|
|
313
|
+
console.error(`Warning: Could not read prompt file: ${err.message}`);
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Spawn Claude Code to process pending TODO items (fire and forget)
|
|
320
|
+
* @param {string} projectDir
|
|
321
|
+
* @param {number} pendingCount
|
|
322
|
+
*/
|
|
323
|
+
function spawnClaudeForTodoProcessing(projectDir, pendingCount) {
|
|
324
|
+
// Read prompt from file
|
|
325
|
+
const promptPath = getPromptPath(projectDir);
|
|
326
|
+
const prompt = readPrompt(promptPath);
|
|
327
|
+
|
|
328
|
+
if (!prompt) {
|
|
329
|
+
console.error('Warning: No prompt file found, skipping Claude spawn');
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
try {
|
|
334
|
+
// Prefix with [Task][type] so CTO report can track task types
|
|
335
|
+
const taggedPrompt = `[Task][todo-processing] ${prompt}`;
|
|
336
|
+
|
|
337
|
+
// Register spawn with agent tracker
|
|
338
|
+
registerSpawn({
|
|
339
|
+
type: AGENT_TYPES.TODO_PROCESSING,
|
|
340
|
+
hookType: HOOK_TYPES.TODO_MAINTENANCE,
|
|
341
|
+
description: `Processing ${pendingCount} pending TODO items`,
|
|
342
|
+
prompt: taggedPrompt,
|
|
343
|
+
metadata: { pendingCount },
|
|
344
|
+
projectDir
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
const claude = spawn('claude', [
|
|
348
|
+
'--dangerously-skip-permissions',
|
|
349
|
+
'-p',
|
|
350
|
+
taggedPrompt
|
|
351
|
+
], {
|
|
352
|
+
detached: true, // Don't tie to parent process
|
|
353
|
+
stdio: 'ignore', // Don't capture output (fire and forget)
|
|
354
|
+
cwd: projectDir,
|
|
355
|
+
env: {
|
|
356
|
+
...process.env,
|
|
357
|
+
CLAUDE_PROJECT_DIR: projectDir,
|
|
358
|
+
CLAUDE_SPAWNED_SESSION: 'true' // Prevent chain reaction
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
// Allow parent to exit independently
|
|
363
|
+
claude.unref();
|
|
364
|
+
|
|
365
|
+
return true;
|
|
366
|
+
} catch (err) {
|
|
367
|
+
console.error(`Warning: Failed to spawn Claude for TODO processing: ${err.message}`);
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Check if we should spawn Claude and do so if appropriate
|
|
374
|
+
* @param {string} projectDir
|
|
375
|
+
* @param {number} pendingCount
|
|
376
|
+
* @param {Date} now
|
|
377
|
+
* @returns {string|null} Message about what happened, or null if nothing
|
|
378
|
+
*/
|
|
379
|
+
function maybeSpawnClaude(projectDir, pendingCount, now = new Date()) {
|
|
380
|
+
if (pendingCount < CONFIG.PENDING_THRESHOLD) {
|
|
381
|
+
return null; // Not enough pending tasks
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
const statePath = getStatePath(projectDir);
|
|
385
|
+
|
|
386
|
+
if (isInCooldown(statePath, now)) {
|
|
387
|
+
const state = readCooldownState(statePath);
|
|
388
|
+
const lastSpawn = new Date(state.lastSpawnTime);
|
|
389
|
+
const minutesAgo = Math.round((now - lastSpawn) / (1000 * 60));
|
|
390
|
+
return `Skipped Claude spawn (${pendingCount} pending): cooldown active (${minutesAgo}/${CONFIG.COOLDOWN_MINUTES} min)`;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// Spawn Claude
|
|
394
|
+
const spawned = spawnClaudeForTodoProcessing(projectDir, pendingCount);
|
|
395
|
+
|
|
396
|
+
if (spawned) {
|
|
397
|
+
recordSpawn(statePath, now);
|
|
398
|
+
return `Spawned Claude to process ${pendingCount} pending TODO items`;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
return 'Failed to spawn Claude for TODO processing';
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Main entry point
|
|
406
|
+
*/
|
|
407
|
+
async function main() {
|
|
408
|
+
const startTime = Date.now();
|
|
409
|
+
const args = process.argv.slice(2);
|
|
410
|
+
const mode = args[0] || 'cleanup';
|
|
411
|
+
|
|
412
|
+
debugLog('TODO maintenance hook triggered', { mode, args: process.argv });
|
|
413
|
+
|
|
414
|
+
// CHAIN REACTION PREVENTION: If this is a spawned session, skip processing
|
|
415
|
+
const isSpawnedSession = process.env.CLAUDE_SPAWNED_SESSION === 'true';
|
|
416
|
+
|
|
417
|
+
debugLog('Environment check', {
|
|
418
|
+
isSpawnedSession,
|
|
419
|
+
CLAUDE_SPAWNED_SESSION: process.env.CLAUDE_SPAWNED_SESSION,
|
|
420
|
+
CLAUDE_PROJECT_DIR: process.env.CLAUDE_PROJECT_DIR,
|
|
421
|
+
cwd: process.cwd()
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
if (isSpawnedSession) {
|
|
425
|
+
// Allow spawned sessions to run without triggering more spawns
|
|
426
|
+
debugLog('Spawned session detected - skipping spawn logic');
|
|
427
|
+
registerHookExecution({
|
|
428
|
+
hookType: HOOK_TYPES.TODO_MAINTENANCE,
|
|
429
|
+
status: 'skipped',
|
|
430
|
+
durationMs: Date.now() - startTime,
|
|
431
|
+
metadata: { reason: 'spawned_session' }
|
|
432
|
+
});
|
|
433
|
+
console.log(JSON.stringify({
|
|
434
|
+
continue: true,
|
|
435
|
+
suppressOutput: true,
|
|
436
|
+
systemMessage: 'Spawned session - spawn logic skipped'
|
|
437
|
+
}));
|
|
438
|
+
process.exit(0);
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// G003: Validate project directory
|
|
442
|
+
const rawProjectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
443
|
+
const projectDir = validateProjectDir(rawProjectDir);
|
|
444
|
+
|
|
445
|
+
if (!projectDir) {
|
|
446
|
+
debugLog('Invalid project directory', { rawProjectDir });
|
|
447
|
+
console.log(JSON.stringify({
|
|
448
|
+
continue: true,
|
|
449
|
+
suppressOutput: false,
|
|
450
|
+
systemMessage: 'todo-maintenance: invalid project directory'
|
|
451
|
+
}));
|
|
452
|
+
process.exit(0);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
// Run database cleanup
|
|
456
|
+
const dbChanges = performDatabaseCleanup(projectDir);
|
|
457
|
+
|
|
458
|
+
// Get summary
|
|
459
|
+
const summary = getDatabaseSummary(projectDir);
|
|
460
|
+
|
|
461
|
+
// Build changes summary
|
|
462
|
+
const changesSummary = [];
|
|
463
|
+
if (dbChanges) {
|
|
464
|
+
if (dbChanges.staleStartsCleared > 0) {
|
|
465
|
+
changesSummary.push(`${dbChanges.staleStartsCleared} stale starts cleared`);
|
|
466
|
+
}
|
|
467
|
+
if (dbChanges.completedRemoved > 0) {
|
|
468
|
+
changesSummary.push(`${dbChanges.completedRemoved} old completed removed`);
|
|
469
|
+
}
|
|
470
|
+
if (dbChanges.completedCapped > 0) {
|
|
471
|
+
changesSummary.push(`${dbChanges.completedCapped} completed capped`);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
// Check if we should spawn Claude (only if not a spawned session)
|
|
476
|
+
let spawnMessage = null;
|
|
477
|
+
if (mode === 'cleanup') {
|
|
478
|
+
spawnMessage = maybeSpawnClaude(projectDir, summary.pending);
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
const message = changesSummary.length > 0
|
|
482
|
+
? `todo-db cleaned: ${changesSummary.join(', ')}. Tasks: ${summary.pending} pending, ${summary.in_progress} in-progress, ${summary.completed} completed`
|
|
483
|
+
: `todo-db: ${summary.pending} pending, ${summary.in_progress} in-progress, ${summary.completed} completed`;
|
|
484
|
+
|
|
485
|
+
// Append spawn message if present
|
|
486
|
+
const fullMessage = spawnMessage ? `${message}. ${spawnMessage}` : message;
|
|
487
|
+
|
|
488
|
+
// Output JSON for Claude Code hooks
|
|
489
|
+
const output = {
|
|
490
|
+
continue: true,
|
|
491
|
+
suppressOutput: false,
|
|
492
|
+
hookSpecificOutput: {
|
|
493
|
+
hookEventName: 'UserPromptSubmit',
|
|
494
|
+
additionalContext: fullMessage
|
|
495
|
+
}
|
|
496
|
+
};
|
|
497
|
+
debugLog('Outputting cleanup response', output);
|
|
498
|
+
|
|
499
|
+
registerHookExecution({
|
|
500
|
+
hookType: HOOK_TYPES.TODO_MAINTENANCE,
|
|
501
|
+
status: 'success',
|
|
502
|
+
durationMs: Date.now() - startTime,
|
|
503
|
+
metadata: { pending: summary.pending, inProgress: summary.in_progress, completed: summary.completed }
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
console.log(JSON.stringify(output));
|
|
507
|
+
|
|
508
|
+
process.exit(0);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
// Run main
|
|
512
|
+
main().catch(err => {
|
|
513
|
+
debugLog('Uncaught error in main', { error: err.message, stack: err.stack });
|
|
514
|
+
registerHookExecution({
|
|
515
|
+
hookType: HOOK_TYPES.TODO_MAINTENANCE,
|
|
516
|
+
status: 'failure',
|
|
517
|
+
durationMs: 0,
|
|
518
|
+
metadata: { error: err.message }
|
|
519
|
+
});
|
|
520
|
+
console.error(`Script error: ${err.message}`);
|
|
521
|
+
process.exit(1);
|
|
522
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
You have pending TODO items in the todo-db that need attention. Process up to 3 items at a time.
|
|
2
|
+
|
|
3
|
+
NOTE: This is an automated [Task] session. You will get one continuation prompt after your first response to ensure all work is complete.
|
|
4
|
+
|
|
5
|
+
## MANDATORY SUB-AGENT REQUIREMENT
|
|
6
|
+
|
|
7
|
+
**YOU ARE PROHIBITED FROM:**
|
|
8
|
+
- Directly editing ANY files using Edit, Write, or NotebookEdit tools
|
|
9
|
+
- Making code changes without the code-writer sub-agent
|
|
10
|
+
- Making test changes without the test-writer sub-agent
|
|
11
|
+
- Skipping investigation before implementation
|
|
12
|
+
- Skipping code-reviewer after any code/test changes
|
|
13
|
+
- Skipping project-manager at the end
|
|
14
|
+
|
|
15
|
+
**ALL file modifications MUST go through the appropriate sub-agent.** This is a strict architectural requirement that cannot be bypassed.
|
|
16
|
+
|
|
17
|
+
## SUB-AGENT DEFINITIONS
|
|
18
|
+
|
|
19
|
+
| Sub-Agent | Purpose | When to Use |
|
|
20
|
+
|-----------|---------|-------------|
|
|
21
|
+
| **investigator** | Research, understand, plan | FIRST - Before any implementation |
|
|
22
|
+
| **code-writer** | Modify production code | When production code needs changes |
|
|
23
|
+
| **test-writer** | Modify test files | When tests need creation/modification |
|
|
24
|
+
| **code-reviewer** | Review all changes | AFTER any code-writer or test-writer |
|
|
25
|
+
| **project-manager** | Update documentation, cleanup | LAST - Always mandatory |
|
|
26
|
+
|
|
27
|
+
## MANDATORY SEQUENCE
|
|
28
|
+
|
|
29
|
+
1. **investigator** (parallel, up to 3) - Research each TODO item, understand the issue, plan the solution
|
|
30
|
+
2. **code-writer** (if production changes needed) - Implement fixes
|
|
31
|
+
3. **test-writer** (if test changes needed) - Add/modify tests
|
|
32
|
+
4. **code-reviewer** (parallel) - Review all changes
|
|
33
|
+
5. **project-manager** (mandatory) - Cleanup and documentation
|
|
34
|
+
|
|
35
|
+
## WHICH SUB-AGENT?
|
|
36
|
+
|
|
37
|
+
| Task Type | Sub-Agent |
|
|
38
|
+
|-----------|-----------|
|
|
39
|
+
| Investigation/research/planning | investigator |
|
|
40
|
+
| Modifying production code | code-writer (MANDATORY) |
|
|
41
|
+
| Modifying test files | test-writer (MANDATORY) |
|
|
42
|
+
| After any code or test changes | code-reviewer (MANDATORY) |
|
|
43
|
+
| Finishing the session | project-manager (MANDATORY) |
|
|
44
|
+
|
|
45
|
+
## MCP TODO-DB COORDINATION
|
|
46
|
+
|
|
47
|
+
Multiple Claude agents work on this codebase concurrently. The todo-db MCP server prevents conflicts:
|
|
48
|
+
|
|
49
|
+
1. **BEFORE starting**: `mcp__todo-db__start_task({ id: "task-uuid" })` - Mark task as in-progress
|
|
50
|
+
2. **DURING work**: `mcp__todo-db__create_task(...)` - Add new discoveries immediately
|
|
51
|
+
3. **AFTER completing**: `mcp__todo-db__complete_task({ id: "task-uuid" })` - Mark task as completed
|
|
52
|
+
|
|
53
|
+
## GETTING YOUR TASKS
|
|
54
|
+
|
|
55
|
+
First, list pending tasks from your section:
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
mcp__todo-db__list_tasks({ status: "pending", limit: 10 })
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Then select up to 3 items to process, prioritizing:
|
|
62
|
+
1. P0 CRITICAL
|
|
63
|
+
2. P1 HIGH
|
|
64
|
+
3. P2 MEDIUM
|
|
65
|
+
4. P3 LOW
|
|
66
|
+
5. Oldest created timestamp
|
|
67
|
+
|
|
68
|
+
## VALID SECTIONS
|
|
69
|
+
|
|
70
|
+
Tasks are organized into these sections:
|
|
71
|
+
- `TEST-WRITER` - Test-related tasks
|
|
72
|
+
- `INVESTIGATOR & PLANNER` - Research and planning tasks
|
|
73
|
+
- `CODE-REVIEWER` - Code review tasks
|
|
74
|
+
- `PROJECT-MANAGER` - Documentation and cleanup tasks
|
|
75
|
+
|