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,686 @@
|
|
|
1
|
+
# Claude Code Hooks
|
|
2
|
+
|
|
3
|
+
This directory contains automation hooks that extend Claude Code functionality.
|
|
4
|
+
|
|
5
|
+
## Hook Types by Trigger Event
|
|
6
|
+
|
|
7
|
+
### SessionStart
|
|
8
|
+
|
|
9
|
+
#### `api-key-watcher.js`
|
|
10
|
+
**Purpose**: Track multiple Claude API keys and auto-rotate based on usage
|
|
11
|
+
|
|
12
|
+
**Behavior**:
|
|
13
|
+
1. Reads current credentials from `~/.claude/.credentials.json`
|
|
14
|
+
2. Captures new keys when users log in with different accounts
|
|
15
|
+
3. Runs health checks on all tracked keys via Anthropic Usage API
|
|
16
|
+
4. Applies rotation logic based on usage thresholds
|
|
17
|
+
5. Updates credentials file if switching to a different key
|
|
18
|
+
|
|
19
|
+
**Rotation Logic**:
|
|
20
|
+
- Switch at 90% usage (any bucket) if a lower-usage key is available
|
|
21
|
+
- At 100% usage, switch to any usable key
|
|
22
|
+
- When all keys are above 90%, stick with current until 100%
|
|
23
|
+
|
|
24
|
+
**Storage Files**:
|
|
25
|
+
- `.claude/api-key-rotation.json` - Tracked keys and state
|
|
26
|
+
- `.claude/api-key-rotation.log` - Human-readable event log
|
|
27
|
+
|
|
28
|
+
**Data Schema** (`api-key-rotation.json`):
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"version": 1,
|
|
32
|
+
"active_key_id": "a1b2c3d4e5f6g7h8",
|
|
33
|
+
"keys": {
|
|
34
|
+
"a1b2c3d4e5f6g7h8": {
|
|
35
|
+
"accessToken": "sk-ant-oat01-...",
|
|
36
|
+
"refreshToken": "sk-ant-ort01-...",
|
|
37
|
+
"expiresAt": 1769059870151,
|
|
38
|
+
"subscriptionType": "max",
|
|
39
|
+
"rateLimitTier": "default_claude_max_20x",
|
|
40
|
+
"added_at": 1705853100000,
|
|
41
|
+
"last_used_at": 1705853200000,
|
|
42
|
+
"last_health_check": 1705853300000,
|
|
43
|
+
"last_usage": {
|
|
44
|
+
"five_hour": 0.45,
|
|
45
|
+
"seven_day": 0.30,
|
|
46
|
+
"seven_day_sonnet": 0.25,
|
|
47
|
+
"checked_at": 1705853300000
|
|
48
|
+
},
|
|
49
|
+
"status": "active"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"rotation_log": [
|
|
53
|
+
{
|
|
54
|
+
"timestamp": 1705853300000,
|
|
55
|
+
"event": "key_switched",
|
|
56
|
+
"key_id": "a1b2c3d4e5f6g7h8",
|
|
57
|
+
"reason": "initial_selection",
|
|
58
|
+
"usage_snapshot": { "five_hour": 0.45, "seven_day": 0.30, "seven_day_sonnet": 0.25 }
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**CTO Report Integration**: Multi-key status visible in `/cto-report`:
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"key_rotation": {
|
|
68
|
+
"active_key_id": "a1b2c3d4...",
|
|
69
|
+
"total_keys": 2,
|
|
70
|
+
"usable_keys": 2,
|
|
71
|
+
"keys": [...],
|
|
72
|
+
"rotation_events_24h": 1
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
### UserPromptSubmit
|
|
80
|
+
|
|
81
|
+
Hooks that run when the user submits a message in the chat.
|
|
82
|
+
|
|
83
|
+
#### `cto-notification-hook.js`
|
|
84
|
+
**Purpose**: Display CTO status report at session start
|
|
85
|
+
|
|
86
|
+
#### `bypass-approval-hook.js`
|
|
87
|
+
**Purpose**: Process CTO bypass approvals
|
|
88
|
+
|
|
89
|
+
**Trigger Pattern**: Message matches `APPROVE BYPASS <6-char-code>`
|
|
90
|
+
|
|
91
|
+
**Behavior**:
|
|
92
|
+
1. Parse user message for approval pattern
|
|
93
|
+
2. Validate code exists in pending bypass requests (deputy-cto.db)
|
|
94
|
+
3. Write approval token to `.claude/bypass-approval-token.json`
|
|
95
|
+
4. Token expires after 5 minutes
|
|
96
|
+
|
|
97
|
+
**Security Model**:
|
|
98
|
+
- Agents cannot trigger UserPromptSubmit hooks (only real user input triggers them)
|
|
99
|
+
- Agents cannot forge approval tokens without user typing the approval phrase
|
|
100
|
+
- Each bypass code is unique and tied to a specific request
|
|
101
|
+
|
|
102
|
+
**Token Format**:
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"code": "X7K9M2",
|
|
106
|
+
"request_id": "uuid",
|
|
107
|
+
"user_message": "APPROVE BYPASS X7K9M2",
|
|
108
|
+
"created_at": "2024-01-22T10:00:00Z",
|
|
109
|
+
"expires_at": "2024-01-22T10:05:00Z",
|
|
110
|
+
"expires_timestamp": 1705920300000
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Output Format** (cto-notification-hook):
|
|
115
|
+
```
|
|
116
|
+
Quota: 5-hour █░░░░░░░ 8% (resets 3h) | 7-day ████░░░░ 51% (resets 2d)
|
|
117
|
+
Usage: 1.2M tokens (24h) | 5 hook / 3 user sessions | 4 tasks | Deputy: ON
|
|
118
|
+
Pending: 2 CTO decision(s), 5 unread report(s)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Data Sources**:
|
|
122
|
+
- Anthropic API for quota (`~/.claude/.credentials.json`)
|
|
123
|
+
- Session JSONL files for token usage
|
|
124
|
+
- `agent-tracker-history.json` for session counts
|
|
125
|
+
- `todo.db` for task counts
|
|
126
|
+
- `deputy-cto.db` for pending items
|
|
127
|
+
- `autonomous-mode.json` for deputy status
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
#### `todo-maintenance.js`
|
|
132
|
+
**Purpose**: Auto-process pending TODO items
|
|
133
|
+
|
|
134
|
+
**Behavior**:
|
|
135
|
+
1. Checks for pending tasks in `todo.db`
|
|
136
|
+
2. If pending > 0 and cooldown passed (15 min):
|
|
137
|
+
- Spawns `todo-processing` agent
|
|
138
|
+
- Registers with `agent-tracker.js`
|
|
139
|
+
3. Skips if `CLAUDE_SPAWNED_SESSION=true` (prevents chain reactions)
|
|
140
|
+
|
|
141
|
+
**State File**: `todo-maintenance-state.json`
|
|
142
|
+
```json
|
|
143
|
+
{ "lastSpawn": 1705853100000 }
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
### Pre-Commit (git commit)
|
|
149
|
+
|
|
150
|
+
#### `pre-commit-review.js`
|
|
151
|
+
**Purpose**: Deputy-CTO reviews all commits
|
|
152
|
+
|
|
153
|
+
**Flow**:
|
|
154
|
+
```
|
|
155
|
+
git commit
|
|
156
|
+
↓
|
|
157
|
+
pre-commit-review.js
|
|
158
|
+
↓
|
|
159
|
+
Check for pending rejections → BLOCK if any
|
|
160
|
+
↓
|
|
161
|
+
Get staged diff
|
|
162
|
+
↓
|
|
163
|
+
Spawn deputy-cto agent
|
|
164
|
+
↓
|
|
165
|
+
Wait for decision (30 min timeout)
|
|
166
|
+
↓
|
|
167
|
+
APPROVE (exit 0) or REJECT (exit 1)
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**G001 Compliance**: Fails closed on any error
|
|
171
|
+
|
|
172
|
+
**Success/Failure Measurement**:
|
|
173
|
+
- **Success (exit 0)**: Deputy-CTO called `approve_commit` MCP tool
|
|
174
|
+
- **Failure (exit 1)**: Deputy-CTO called `reject_commit` OR timed out OR error occurred
|
|
175
|
+
- Decision is stored in `deputy-cto.db` `commit_decisions` table
|
|
176
|
+
|
|
177
|
+
**Emergency Bypass** (requires CTO approval):
|
|
178
|
+
|
|
179
|
+
The `SKIP_DEPUTY_CTO_REVIEW` env var bypass has been removed. To bypass commit blocking:
|
|
180
|
+
|
|
181
|
+
1. Agent calls `mcp__deputy-cto__request_bypass()` → Gets code like `X7K9M2`
|
|
182
|
+
2. Agent asks CTO: "Please type: APPROVE BYPASS X7K9M2"
|
|
183
|
+
3. **CTO types in chat**: `APPROVE BYPASS X7K9M2`
|
|
184
|
+
4. `bypass-approval-hook.js` creates approval token
|
|
185
|
+
5. Agent calls `mcp__deputy-cto__execute_bypass({ bypass_code: "X7K9M2" })`
|
|
186
|
+
6. Commit proceeds
|
|
187
|
+
|
|
188
|
+
This ensures only the CTO (human user) can approve bypasses - agents cannot trigger UserPromptSubmit hooks.
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
### Post-Commit (after git commit)
|
|
193
|
+
|
|
194
|
+
#### `antipattern-hunter-hook.js`
|
|
195
|
+
**Purpose**: Find spec violations in committed code
|
|
196
|
+
|
|
197
|
+
**Behavior**:
|
|
198
|
+
1. Check 6-hour cooldown
|
|
199
|
+
2. If cooldown passed, spawn `antipattern-hunter` agent
|
|
200
|
+
3. Fire-and-forget (non-blocking)
|
|
201
|
+
|
|
202
|
+
**State File**: `antipattern-hunter-state.json`
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
### Schema Mapping (Federation)
|
|
207
|
+
|
|
208
|
+
#### `schema-mapper-hook.js`
|
|
209
|
+
**Purpose**: Generate schema mappings for unknown data structures
|
|
210
|
+
|
|
211
|
+
**Trigger**: Called programmatically when federated search encounters unknown schema
|
|
212
|
+
|
|
213
|
+
**Note**: This is a project-specific hook (included in x_test) that requires the `federation-mapper` agent, which is NOT part of the framework. Projects using this hook must define the agent in their `.claude/agents/` directory.
|
|
214
|
+
|
|
215
|
+
**Behavior**:
|
|
216
|
+
1. Check 24-hour cooldown per schema
|
|
217
|
+
2. Spawn `federation-mapper` agent
|
|
218
|
+
3. Generate TypeScript mapping function
|
|
219
|
+
4. Queue for human review if confidence < 70%
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
### Compliance Checking
|
|
224
|
+
|
|
225
|
+
#### `compliance-checker.js`
|
|
226
|
+
**Purpose**: Enforce global and local specifications (with optional spec suites)
|
|
227
|
+
|
|
228
|
+
**Modes**:
|
|
229
|
+
- `--global-only` - Check mapped files against global specs + suite subspecs
|
|
230
|
+
- `--local-only` - Check using local specs + suite exploratory specs
|
|
231
|
+
- (default) - Run both global and local enforcement
|
|
232
|
+
|
|
233
|
+
**Cooldown**: 7 days per file
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
### Spec Suites (Optional)
|
|
238
|
+
|
|
239
|
+
Spec suites allow you to define **scoped subspecs** that apply to specific directory patterns. This is an additive feature - the main `specs/global/` and `specs/local/` specs continue to work exactly as before.
|
|
240
|
+
|
|
241
|
+
#### Setup
|
|
242
|
+
|
|
243
|
+
Create `.claude/hooks/suites-config.json`:
|
|
244
|
+
|
|
245
|
+
```json
|
|
246
|
+
{
|
|
247
|
+
"version": 1,
|
|
248
|
+
"suites": {
|
|
249
|
+
"frontend-connector": {
|
|
250
|
+
"description": "Frontend connector specs",
|
|
251
|
+
"scope": "integrations/*/frontend-connector/**",
|
|
252
|
+
"mappedSpecs": {
|
|
253
|
+
"dir": "specs/integrations",
|
|
254
|
+
"pattern": "INT-FRONTEND-*.md"
|
|
255
|
+
},
|
|
256
|
+
"exploratorySpecs": null,
|
|
257
|
+
"enabled": true
|
|
258
|
+
},
|
|
259
|
+
"backend-connector": {
|
|
260
|
+
"description": "Backend connector specs",
|
|
261
|
+
"scope": "integrations/*/backend-connector/**",
|
|
262
|
+
"mappedSpecs": null,
|
|
263
|
+
"exploratorySpecs": {
|
|
264
|
+
"dir": "specs/backend",
|
|
265
|
+
"pattern": "BACKEND-*.md"
|
|
266
|
+
},
|
|
267
|
+
"enabled": true
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
#### Suite Configuration
|
|
274
|
+
|
|
275
|
+
| Field | Description |
|
|
276
|
+
|-------|-------------|
|
|
277
|
+
| `description` | Human-readable description |
|
|
278
|
+
| `scope` | Glob pattern for matching files (e.g., `src/components/**`) |
|
|
279
|
+
| `mappedSpecs.dir` | Directory containing specs for mapped enforcement |
|
|
280
|
+
| `mappedSpecs.pattern` | Pattern to match spec files (default: `*.md`) |
|
|
281
|
+
| `exploratorySpecs.dir` | Directory containing specs for exploratory enforcement |
|
|
282
|
+
| `exploratorySpecs.pattern` | Pattern to match spec files (default: `*.md`) |
|
|
283
|
+
| `enabled` | Enable/disable the suite (default: `true`) |
|
|
284
|
+
|
|
285
|
+
#### How It Works
|
|
286
|
+
|
|
287
|
+
**Without `suites-config.json`** (current behavior):
|
|
288
|
+
- Global enforcement checks `specs/global/*.md` against mapped files
|
|
289
|
+
- Local enforcement checks `specs/local/*.md` with agent exploration
|
|
290
|
+
- Nothing changes
|
|
291
|
+
|
|
292
|
+
**With `suites-config.json`**:
|
|
293
|
+
- Same as above, PLUS...
|
|
294
|
+
- For each file being checked, find matching suites by scope pattern
|
|
295
|
+
- Also check the file against specs from matching suites
|
|
296
|
+
- Exploratory specs get a scope constraint (agent only explores within suite scope)
|
|
297
|
+
|
|
298
|
+
#### Example
|
|
299
|
+
|
|
300
|
+
File `integrations/azure/frontend-connector/src/index.ts`:
|
|
301
|
+
1. Always checked against main specs (G001-G020 from `specs/global/`)
|
|
302
|
+
2. Also checked against `INT-FRONTEND-*.md` from `specs/integrations/` (because it matches `frontend-connector` suite scope)
|
|
303
|
+
|
|
304
|
+
#### MCP Tools
|
|
305
|
+
|
|
306
|
+
The `specs-browser` MCP server provides tools for managing specs and suites:
|
|
307
|
+
|
|
308
|
+
**Spec Management:**
|
|
309
|
+
|
|
310
|
+
| Tool | Description |
|
|
311
|
+
|------|-------------|
|
|
312
|
+
| `list_specs` | List specs by category |
|
|
313
|
+
| `get_spec` | Get full spec content by ID |
|
|
314
|
+
| `create_spec` | Create a new spec file |
|
|
315
|
+
| `edit_spec` | Edit spec content/title |
|
|
316
|
+
| `delete_spec` | Delete a spec file |
|
|
317
|
+
|
|
318
|
+
**Suite Management:**
|
|
319
|
+
|
|
320
|
+
| Tool | Description |
|
|
321
|
+
|------|-------------|
|
|
322
|
+
| `list_suites` | List all configured suites |
|
|
323
|
+
| `get_suite` | Get full suite configuration |
|
|
324
|
+
| `create_suite` | Create a new suite |
|
|
325
|
+
| `edit_suite` | Edit suite configuration |
|
|
326
|
+
| `delete_suite` | Delete a suite (keeps spec files) |
|
|
327
|
+
|
|
328
|
+
**Utilities:**
|
|
329
|
+
|
|
330
|
+
| Tool | Description |
|
|
331
|
+
|------|-------------|
|
|
332
|
+
| `get_specs_for_file` | Find all specs that apply to a specific file |
|
|
333
|
+
|
|
334
|
+
#### Using `get_specs_for_file`
|
|
335
|
+
|
|
336
|
+
This utility helps agents discover which specs apply to any given file:
|
|
337
|
+
|
|
338
|
+
```typescript
|
|
339
|
+
// MCP call
|
|
340
|
+
mcp__specs-browser__get_specs_for_file({
|
|
341
|
+
file_path: "src/components/Button.tsx" // relative or absolute path
|
|
342
|
+
})
|
|
343
|
+
|
|
344
|
+
// Returns:
|
|
345
|
+
{
|
|
346
|
+
"file_path": "src/components/Button.tsx",
|
|
347
|
+
"specs": [
|
|
348
|
+
{
|
|
349
|
+
"spec_id": "G001",
|
|
350
|
+
"file": "specs/global/G001.md",
|
|
351
|
+
"priority": "high",
|
|
352
|
+
"lastVerified": "2024-01-20T10:00:00Z"
|
|
353
|
+
}
|
|
354
|
+
],
|
|
355
|
+
"subspecs": [
|
|
356
|
+
{
|
|
357
|
+
"spec_id": "INT-FRONTEND-001",
|
|
358
|
+
"file": "specs/integrations/INT-FRONTEND-001.md",
|
|
359
|
+
"suite_id": "frontend-connector",
|
|
360
|
+
"suite_scope": "src/components/**"
|
|
361
|
+
}
|
|
362
|
+
],
|
|
363
|
+
"total": 2
|
|
364
|
+
}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
**Fields:**
|
|
368
|
+
- `specs` - Main specs from `spec-file-mappings.json` (global enforcement)
|
|
369
|
+
- `subspecs` - Specs from matching suites in `suites-config.json`
|
|
370
|
+
- `total` - Combined count of applicable specs
|
|
371
|
+
|
|
372
|
+
**Path handling:**
|
|
373
|
+
- Accepts relative paths: `src/index.ts`
|
|
374
|
+
- Accepts absolute paths: `/home/user/project/src/index.ts`
|
|
375
|
+
- Normalizes paths internally (strips `./` prefix, converts absolute to relative)
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
### Hourly Automation
|
|
380
|
+
|
|
381
|
+
#### `hourly-automation.js`
|
|
382
|
+
**Purpose**: Wrapper for hourly systemd/launchd service
|
|
383
|
+
|
|
384
|
+
**Tasks (with independent cooldowns)**:
|
|
385
|
+
|
|
386
|
+
1. **Report Triage** (5-minute check interval, 1-hour per-item cooldown)
|
|
387
|
+
- Checks for untriaged CTO reports in `agent-reports.db`
|
|
388
|
+
- Per-item cooldown: if triage fails, that item won't be retried for 1 hour
|
|
389
|
+
- Spawns deputy-cto agent to triage reports
|
|
390
|
+
- Triage actions: `auto-acknowledged`, `escalated`, `needs-cto-review`
|
|
391
|
+
|
|
392
|
+
2. **Plan Executor** (55-minute cooldown, via `plan-executor.js`)
|
|
393
|
+
- Studies PLAN.md and `/plans`
|
|
394
|
+
- Spawns agent workflow for pending plans
|
|
395
|
+
|
|
396
|
+
3. **CLAUDE.md Refactor** (55-minute cooldown)
|
|
397
|
+
- Triggers if CLAUDE.md > 25K characters
|
|
398
|
+
- Moves content to sub-files
|
|
399
|
+
|
|
400
|
+
**Enable/Disable**: Via `autonomous-mode.json` or MCP tool
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
## Shared Modules
|
|
405
|
+
|
|
406
|
+
### `agent-tracker.js`
|
|
407
|
+
**Purpose**: Track all spawned agents
|
|
408
|
+
|
|
409
|
+
**Exports**:
|
|
410
|
+
```javascript
|
|
411
|
+
import { registerSpawn, AGENT_TYPES, HOOK_TYPES } from './agent-tracker.js';
|
|
412
|
+
|
|
413
|
+
const agentId = registerSpawn({
|
|
414
|
+
type: AGENT_TYPES.TODO_PROCESSING,
|
|
415
|
+
hookType: HOOK_TYPES.TODO_MAINTENANCE,
|
|
416
|
+
description: 'Processing 5 pending items',
|
|
417
|
+
prompt: promptText,
|
|
418
|
+
metadata: { ... }
|
|
419
|
+
});
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
**Agent Types**:
|
|
423
|
+
```javascript
|
|
424
|
+
AGENT_TYPES = {
|
|
425
|
+
TODO_PROCESSING: 'todo-processing',
|
|
426
|
+
TODO_SYNTAX_FIX: 'todo-syntax-fix',
|
|
427
|
+
COMPLIANCE_GLOBAL: 'compliance-global',
|
|
428
|
+
COMPLIANCE_LOCAL: 'compliance-local',
|
|
429
|
+
COMPLIANCE_MAPPING_FIX: 'compliance-mapping-fix',
|
|
430
|
+
COMPLIANCE_MAPPING_REVIEW: 'compliance-mapping-review',
|
|
431
|
+
TEST_FAILURE_JEST: 'test-failure-jest',
|
|
432
|
+
TEST_FAILURE_PLAYWRIGHT: 'test-failure-playwright',
|
|
433
|
+
ANTIPATTERN_HUNTER: 'antipattern-hunter',
|
|
434
|
+
FEDERATION_MAPPER: 'federation-mapper',
|
|
435
|
+
DEPUTY_CTO_REVIEW: 'deputy-cto-review',
|
|
436
|
+
PLAN_EXECUTOR: 'plan-executor',
|
|
437
|
+
CLAUDEMD_REFACTOR: 'claudemd-refactor'
|
|
438
|
+
}
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
**Hook Types**:
|
|
442
|
+
```javascript
|
|
443
|
+
HOOK_TYPES = {
|
|
444
|
+
TODO_MAINTENANCE: 'todo-maintenance',
|
|
445
|
+
COMPLIANCE_CHECKER: 'compliance-checker',
|
|
446
|
+
JEST_REPORTER: 'jest-reporter',
|
|
447
|
+
PLAYWRIGHT_REPORTER: 'playwright-reporter',
|
|
448
|
+
ANTIPATTERN_HUNTER: 'antipattern-hunter',
|
|
449
|
+
SCHEMA_MAPPER: 'schema-mapper',
|
|
450
|
+
PRE_COMMIT_REVIEW: 'pre-commit-review',
|
|
451
|
+
PLAN_EXECUTOR: 'plan-executor',
|
|
452
|
+
HOURLY_AUTOMATION: 'hourly-automation'
|
|
453
|
+
}
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
---
|
|
457
|
+
|
|
458
|
+
### `mapping-validator.js`
|
|
459
|
+
**Purpose**: Validate spec-file-mappings.json
|
|
460
|
+
|
|
461
|
+
---
|
|
462
|
+
|
|
463
|
+
## Prompt Files
|
|
464
|
+
|
|
465
|
+
### `prompts/`
|
|
466
|
+
- `local-spec-enforcement.md` - Local compliance checking
|
|
467
|
+
- `mapping-fix.md` - Mapping file fixes
|
|
468
|
+
- `mapping-review.md` - Mapping review
|
|
469
|
+
- `schema-mapper.md` - Federation schema mapping
|
|
470
|
+
|
|
471
|
+
### Root Level
|
|
472
|
+
- `todo-processing-prompt.md` - TODO item processing
|
|
473
|
+
- `test-failure-prompt.md` - Test failure handling
|
|
474
|
+
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
## State Management
|
|
478
|
+
|
|
479
|
+
Each hook maintains its own state file:
|
|
480
|
+
|
|
481
|
+
| Hook | State File | Contents |
|
|
482
|
+
|------|------------|----------|
|
|
483
|
+
| TODO Maintenance | `todo-maintenance-state.json` | `{ lastSpawn }` |
|
|
484
|
+
| Antipattern Hunter | `antipattern-hunter-state.json` | `{ lastRun }` |
|
|
485
|
+
| Compliance | `compliance-state.json` | Per-file timestamps |
|
|
486
|
+
| Schema Mapper | (in DB) | Per-schema cooldowns |
|
|
487
|
+
| Hourly Automation | `hourly-automation-state.json` | `{ lastRun, lastClaudeMdRefactor, lastTriageCheck, triageAttempts }` |
|
|
488
|
+
|
|
489
|
+
---
|
|
490
|
+
|
|
491
|
+
## Environment Variables
|
|
492
|
+
|
|
493
|
+
| Variable | Purpose |
|
|
494
|
+
|----------|---------|
|
|
495
|
+
| `CLAUDE_PROJECT_DIR` | Project root directory |
|
|
496
|
+
| `CLAUDE_SPAWNED_SESSION` | Set to `"true"` for spawned sessions |
|
|
497
|
+
| `CLAUDE_AGENT_ID` | Agent ID from tracker |
|
|
498
|
+
| `COMPLIANCE_MODE` | Current compliance mode |
|
|
499
|
+
|
|
500
|
+
Note: `SKIP_DEPUTY_CTO_REVIEW` has been removed. See "Framework Protection" section.
|
|
501
|
+
|
|
502
|
+
---
|
|
503
|
+
|
|
504
|
+
## Adding a New Hook
|
|
505
|
+
|
|
506
|
+
1. **Create the hook script** in this directory:
|
|
507
|
+
```javascript
|
|
508
|
+
#!/usr/bin/env node
|
|
509
|
+
import { registerSpawn, AGENT_TYPES, HOOK_TYPES } from './agent-tracker.js';
|
|
510
|
+
// ... hook logic
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
2. **Add agent/hook types** to `agent-tracker.js`:
|
|
514
|
+
```javascript
|
|
515
|
+
AGENT_TYPES.MY_NEW_AGENT = 'my-new-agent';
|
|
516
|
+
HOOK_TYPES.MY_NEW_HOOK = 'my-new-hook';
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
3. **Register in settings.json**:
|
|
520
|
+
```json
|
|
521
|
+
{
|
|
522
|
+
"hooks": {
|
|
523
|
+
"UserPromptSubmit": ["node .claude/hooks/my-hook.js"]
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
4. **Update MCP server types** in `packages/mcp-servers/src/agent-tracker/types.ts`
|
|
529
|
+
|
|
530
|
+
5. **Rebuild MCP servers**:
|
|
531
|
+
```bash
|
|
532
|
+
cd packages/mcp-servers && npm run build
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
---
|
|
536
|
+
|
|
537
|
+
## Testing
|
|
538
|
+
|
|
539
|
+
### Pre-Commit Review Tests
|
|
540
|
+
```bash
|
|
541
|
+
node --test .claude/hooks/__tests__/pre-commit-review.test.js
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
See `__tests__/README.md` for details.
|
|
545
|
+
|
|
546
|
+
---
|
|
547
|
+
|
|
548
|
+
## Debugging
|
|
549
|
+
|
|
550
|
+
### View Hook Logs
|
|
551
|
+
```bash
|
|
552
|
+
# Todo maintenance
|
|
553
|
+
tail -f .claude/hooks/todo-maintenance-debug.log
|
|
554
|
+
|
|
555
|
+
# Hourly automation
|
|
556
|
+
tail -f .claude/hourly-automation.log
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
### Check Agent History
|
|
560
|
+
```bash
|
|
561
|
+
cat .claude/hooks/agent-tracker-history.json | jq '.agents | length'
|
|
562
|
+
cat .claude/hooks/agent-tracker-history.json | jq '.agents[-1]'
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
### Check State Files
|
|
566
|
+
```bash
|
|
567
|
+
cat .claude/hooks/todo-maintenance-state.json
|
|
568
|
+
cat .claude/hooks/antipattern-hunter-state.json
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
---
|
|
572
|
+
|
|
573
|
+
## Technical Notes
|
|
574
|
+
|
|
575
|
+
### Capturing Claude CLI Output
|
|
576
|
+
|
|
577
|
+
When spawning Claude CLI with `stdio: 'pipe'` in Node.js, use `--output-format json` or `--output-format stream-json` to capture output:
|
|
578
|
+
|
|
579
|
+
```javascript
|
|
580
|
+
// Use --output-format json for structured output via pipes
|
|
581
|
+
const claude = spawn('claude', [
|
|
582
|
+
'--dangerously-skip-permissions',
|
|
583
|
+
'-p', prompt,
|
|
584
|
+
'--output-format', 'json' // or 'stream-json' for real-time streaming
|
|
585
|
+
], {
|
|
586
|
+
cwd: PROJECT_DIR,
|
|
587
|
+
stdio: 'pipe',
|
|
588
|
+
});
|
|
589
|
+
|
|
590
|
+
claude.stdout.on('data', (data) => {
|
|
591
|
+
const result = JSON.parse(data.toString());
|
|
592
|
+
console.log('Result:', result.result);
|
|
593
|
+
console.log('Session ID:', result.session_id);
|
|
594
|
+
});
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
**Output formats**:
|
|
598
|
+
- `json` - Single JSON object with complete response
|
|
599
|
+
- `stream-json` - Real-time streaming JSON events
|
|
600
|
+
- `text` - Plain text (default, may not work with pipes)
|
|
601
|
+
|
|
602
|
+
**JSON output includes**:
|
|
603
|
+
- `result` - The assistant's response text
|
|
604
|
+
- `session_id` - Session ID for resuming
|
|
605
|
+
- `duration_ms` - Total execution time
|
|
606
|
+
- `total_cost_usd` - API cost
|
|
607
|
+
- `usage` - Token usage breakdown
|
|
608
|
+
|
|
609
|
+
**Hooks using JSON output**:
|
|
610
|
+
- `pre-commit-review.js` - Waits for approve/reject decision
|
|
611
|
+
- `plan-executor.js` - Waits for execution completion
|
|
612
|
+
- `hourly-automation.js` - Waits for CLAUDE.md refactor
|
|
613
|
+
- `schema-mapper-hook.js` - Real-time mapping output (stream-json)
|
|
614
|
+
|
|
615
|
+
**Fire-and-forget hooks** (no output capture needed):
|
|
616
|
+
- `todo-maintenance.js`
|
|
617
|
+
- `antipattern-hunter-hook.js`
|
|
618
|
+
- `compliance-checker.js`
|
|
619
|
+
|
|
620
|
+
### Session File Creation
|
|
621
|
+
|
|
622
|
+
All spawned Claude sessions create `.jsonl` files in `~/.claude/projects/{project-path}/`:
|
|
623
|
+
|
|
624
|
+
```bash
|
|
625
|
+
# List recent sessions
|
|
626
|
+
ls -lt ~/.claude/projects/-home-user-git-your-project/*.jsonl | head -10
|
|
627
|
+
|
|
628
|
+
# Search for specific session content
|
|
629
|
+
grep -l "deputy-cto agent" ~/.claude/projects/-home-user-git-your-project/*.jsonl
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
Session files are created even if the hook doesn't capture output.
|
|
633
|
+
|
|
634
|
+
---
|
|
635
|
+
|
|
636
|
+
## Framework Protection
|
|
637
|
+
|
|
638
|
+
To prevent agents from bypassing security mechanisms, critical files can be made root-owned. This is the only truly unbypassable protection since agents run as the same user and have the same file permissions.
|
|
639
|
+
|
|
640
|
+
### Protected Files
|
|
641
|
+
|
|
642
|
+
| File | Purpose |
|
|
643
|
+
|------|---------|
|
|
644
|
+
| `pre-commit-review.js` | Enforces lint + deputy-cto review |
|
|
645
|
+
| `bypass-approval-hook.js` | Processes CTO approval phrases |
|
|
646
|
+
| `eslint.config.js` | Lint rules (can't be weakened) |
|
|
647
|
+
| `.husky/pre-commit` | Git hook entry point |
|
|
648
|
+
|
|
649
|
+
### Setup
|
|
650
|
+
|
|
651
|
+
```bash
|
|
652
|
+
# Enable protection (one-time setup)
|
|
653
|
+
sudo ./scripts/protect-framework.sh
|
|
654
|
+
|
|
655
|
+
# Check protection status
|
|
656
|
+
./scripts/protect-framework.sh status
|
|
657
|
+
|
|
658
|
+
# Disable protection (to make changes)
|
|
659
|
+
sudo ./scripts/protect-framework.sh disable
|
|
660
|
+
|
|
661
|
+
# After making changes, re-enable
|
|
662
|
+
sudo ./scripts/protect-framework.sh
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
### How It Works
|
|
666
|
+
|
|
667
|
+
1. **Root ownership**: Files are owned by root with 644 permissions
|
|
668
|
+
2. **Agent cannot modify**: Agents run as user, not root - no sudo access
|
|
669
|
+
3. **Verification at commit**: Pre-commit hook warns if protection not enabled
|
|
670
|
+
|
|
671
|
+
### Bypass Flow (With Protection)
|
|
672
|
+
|
|
673
|
+
Even with protection enabled, the CTO can approve bypasses:
|
|
674
|
+
|
|
675
|
+
1. Agent calls `request_bypass()` → gets code `X7K9M2`
|
|
676
|
+
2. Agent asks: "Please type: APPROVE BYPASS X7K9M2"
|
|
677
|
+
3. CTO types in chat: `APPROVE BYPASS X7K9M2`
|
|
678
|
+
4. UserPromptSubmit hook creates approval token
|
|
679
|
+
5. Agent calls `execute_bypass()` → verifies token
|
|
680
|
+
6. Commit proceeds
|
|
681
|
+
|
|
682
|
+
The protection ensures:
|
|
683
|
+
- Agent cannot skip the approval flow
|
|
684
|
+
- Agent cannot modify the hooks to bypass checks
|
|
685
|
+
- Agent cannot weaken lint rules
|
|
686
|
+
- Only CTO typing the approval phrase can authorize bypasses
|