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.
Files changed (599) hide show
  1. package/.claude/agents/antipattern-hunter.md +176 -0
  2. package/.claude/agents/code-reviewer.md +205 -0
  3. package/.claude/agents/code-writer.md +154 -0
  4. package/.claude/agents/deputy-cto.md +309 -0
  5. package/.claude/agents/feedback-agent.md +101 -0
  6. package/.claude/agents/investigator.md +136 -0
  7. package/.claude/agents/product-manager.md +97 -0
  8. package/.claude/agents/project-manager.md +116 -0
  9. package/.claude/agents/repo-hygiene-expert.md +626 -0
  10. package/.claude/agents/secret-manager.md +324 -0
  11. package/.claude/agents/test-writer.md +354 -0
  12. package/.claude/commands/configure-personas.md +144 -0
  13. package/.claude/commands/cto-report.md +36 -0
  14. package/.claude/commands/demo.md +89 -0
  15. package/.claude/commands/deputy-cto.md +345 -0
  16. package/.claude/commands/hotfix.md +31 -0
  17. package/.claude/commands/overdrive-gentyr.md +167 -0
  18. package/.claude/commands/product-manager.md +32 -0
  19. package/.claude/commands/push-migrations.md +86 -0
  20. package/.claude/commands/push-secrets.md +97 -0
  21. package/.claude/commands/services.json.example +30 -0
  22. package/.claude/commands/setup-gentyr.md +396 -0
  23. package/.claude/commands/show.md +42 -0
  24. package/.claude/commands/spawn-tasks.md +79 -0
  25. package/.claude/commands/toggle-automation-gentyr.md +75 -0
  26. package/.claude/commands/toggle-product-manager.md +19 -0
  27. package/.claude/commands/triage.md +69 -0
  28. package/.claude/hooks/README.md +686 -0
  29. package/.claude/hooks/__tests__/README.md +129 -0
  30. package/.claude/hooks/agent-tracker.js +434 -0
  31. package/.claude/hooks/antipattern-hunter-hook.js +401 -0
  32. package/.claude/hooks/api-key-watcher.js +289 -0
  33. package/.claude/hooks/block-no-verify.js +301 -0
  34. package/.claude/hooks/bypass-approval-hook.js +313 -0
  35. package/.claude/hooks/compliance-checker.js +1309 -0
  36. package/.claude/hooks/config-reader.js +143 -0
  37. package/.claude/hooks/credential-file-guard.js +1139 -0
  38. package/.claude/hooks/credential-health-check.js +168 -0
  39. package/.claude/hooks/credential-sync-hook.js +79 -0
  40. package/.claude/hooks/cto-notification-hook.js +656 -0
  41. package/.claude/hooks/feedback-launcher.js +424 -0
  42. package/.claude/hooks/feedback-orchestrator.js +367 -0
  43. package/.claude/hooks/gentyr-splash.js +47 -0
  44. package/.claude/hooks/gentyr-sync.js +389 -0
  45. package/.claude/hooks/hourly-automation.js +3340 -0
  46. package/.claude/hooks/key-sync.js +899 -0
  47. package/.claude/hooks/lib/approval-utils.js +731 -0
  48. package/.claude/hooks/lib/feature-branch-helper.js +102 -0
  49. package/.claude/hooks/lib/worktree-manager.js +330 -0
  50. package/.claude/hooks/mapping-validator.js +285 -0
  51. package/.claude/hooks/plan-executor.js +398 -0
  52. package/.claude/hooks/playwright-cli-guard.js +104 -0
  53. package/.claude/hooks/playwright-health-check.js +71 -0
  54. package/.claude/hooks/pre-commit-review.js +725 -0
  55. package/.claude/hooks/prompts/local-spec-enforcement.md +310 -0
  56. package/.claude/hooks/prompts/mapping-fix.md +92 -0
  57. package/.claude/hooks/prompts/mapping-review.md +140 -0
  58. package/.claude/hooks/prompts/schema-mapper.md +185 -0
  59. package/.claude/hooks/prompts/spec-enforcement.md +233 -0
  60. package/.claude/hooks/protected-action-approval-hook.js +336 -0
  61. package/.claude/hooks/protected-action-gate.js +562 -0
  62. package/.claude/hooks/protected-actions.json +208 -0
  63. package/.claude/hooks/protected-actions.json.template +122 -0
  64. package/.claude/hooks/quota-monitor.js +490 -0
  65. package/.claude/hooks/reporters/jest-failure-reporter.js +401 -0
  66. package/.claude/hooks/reporters/playwright-failure-reporter.js +446 -0
  67. package/.claude/hooks/reporters/vitest-failure-reporter.js +443 -0
  68. package/.claude/hooks/schema-mapper-hook.js +544 -0
  69. package/.claude/hooks/secret-leak-detector.js +216 -0
  70. package/.claude/hooks/session-reviver.js +514 -0
  71. package/.claude/hooks/slash-command-prefetch.js +1145 -0
  72. package/.claude/hooks/stale-work-detector.js +205 -0
  73. package/.claude/hooks/stop-continue-hook.js +414 -0
  74. package/.claude/hooks/todo-maintenance.js +522 -0
  75. package/.claude/hooks/todo-processing-prompt.md +75 -0
  76. package/.claude/hooks/usage-optimizer.js +791 -0
  77. package/.claude/mcp/README.md +246 -0
  78. package/.claude/settings.json.template +168 -0
  79. package/.mcp.json.template +207 -0
  80. package/CLAUDE.md +340 -0
  81. package/CLAUDE.md.gentyr-section +89 -0
  82. package/LICENSE +21 -0
  83. package/README.md +297 -0
  84. package/cli/commands/init.js +471 -0
  85. package/cli/commands/migrate.js +132 -0
  86. package/cli/commands/protect.js +271 -0
  87. package/cli/commands/scaffold.js +48 -0
  88. package/cli/commands/status.js +133 -0
  89. package/cli/commands/sync.js +101 -0
  90. package/cli/commands/uninstall.js +207 -0
  91. package/cli/index.js +111 -0
  92. package/cli/lib/config-gen.js +214 -0
  93. package/cli/lib/resolve-framework.js +97 -0
  94. package/cli/lib/state.js +140 -0
  95. package/cli/lib/symlinks.js +260 -0
  96. package/docs/AUTOMATION-SYSTEMS.md +484 -0
  97. package/docs/BINARY-PATCHING.md +212 -0
  98. package/docs/CHANGELOG.md +2830 -0
  99. package/docs/CREDENTIAL-DETECTION.md +151 -0
  100. package/docs/CTO-DASHBOARD.md +476 -0
  101. package/docs/DEPLOYMENT-FLOW.md +477 -0
  102. package/docs/DEVELOPER.md +116 -0
  103. package/docs/Executive.md +372 -0
  104. package/docs/SECRET-PATHS.md +77 -0
  105. package/docs/SETUP-GUIDE.md +419 -0
  106. package/docs/STACK.md +109 -0
  107. package/docs/TESTING.md +440 -0
  108. package/docs/assets/claude-logo.svg +3 -0
  109. package/docs/sessions/2026-01-24-spec-suite-implementation.md +190 -0
  110. package/docs/sessions/2026-02-15-feedback-e2e-audit.md +484 -0
  111. package/docs/sessions/2026-02-20-credential-rotation-experiments.md +340 -0
  112. package/docs/sessions/TEST-COVERAGE-REPORT-2026-02-20.md +168 -0
  113. package/docs/shared/EPHEMERAL-STATE-FILES.md +115 -0
  114. package/docs/shared/PROTECTION-SYSTEM.md +341 -0
  115. package/husky/post-commit +10 -0
  116. package/husky/pre-commit +40 -0
  117. package/husky/pre-push +94 -0
  118. package/package.json +43 -0
  119. package/packages/cto-dashboard/package-lock.json +3510 -0
  120. package/packages/cto-dashboard/package.json +41 -0
  121. package/packages/cto-dashboard/pnpm-lock.yaml +2168 -0
  122. package/packages/mcp-servers/dist/__testUtils__/fixtures.d.ts +220 -0
  123. package/packages/mcp-servers/dist/__testUtils__/fixtures.d.ts.map +1 -0
  124. package/packages/mcp-servers/dist/__testUtils__/fixtures.js +376 -0
  125. package/packages/mcp-servers/dist/__testUtils__/fixtures.js.map +1 -0
  126. package/packages/mcp-servers/dist/__testUtils__/index.d.ts +121 -0
  127. package/packages/mcp-servers/dist/__testUtils__/index.d.ts.map +1 -0
  128. package/packages/mcp-servers/dist/__testUtils__/index.js +180 -0
  129. package/packages/mcp-servers/dist/__testUtils__/index.js.map +1 -0
  130. package/packages/mcp-servers/dist/__testUtils__/schemas.d.ts +84 -0
  131. package/packages/mcp-servers/dist/__testUtils__/schemas.d.ts.map +1 -0
  132. package/packages/mcp-servers/dist/__testUtils__/schemas.js +309 -0
  133. package/packages/mcp-servers/dist/__testUtils__/schemas.js.map +1 -0
  134. package/packages/mcp-servers/dist/agent-reports/index.d.ts +7 -0
  135. package/packages/mcp-servers/dist/agent-reports/index.d.ts.map +1 -0
  136. package/packages/mcp-servers/dist/agent-reports/index.js +8 -0
  137. package/packages/mcp-servers/dist/agent-reports/index.js.map +1 -0
  138. package/packages/mcp-servers/dist/agent-reports/server.d.ts +22 -0
  139. package/packages/mcp-servers/dist/agent-reports/server.d.ts.map +1 -0
  140. package/packages/mcp-servers/dist/agent-reports/server.js +535 -0
  141. package/packages/mcp-servers/dist/agent-reports/server.js.map +1 -0
  142. package/packages/mcp-servers/dist/agent-reports/types.d.ts +258 -0
  143. package/packages/mcp-servers/dist/agent-reports/types.d.ts.map +1 -0
  144. package/packages/mcp-servers/dist/agent-reports/types.js +81 -0
  145. package/packages/mcp-servers/dist/agent-reports/types.js.map +1 -0
  146. package/packages/mcp-servers/dist/agent-tracker/index.d.ts +5 -0
  147. package/packages/mcp-servers/dist/agent-tracker/index.d.ts.map +1 -0
  148. package/packages/mcp-servers/dist/agent-tracker/index.js +5 -0
  149. package/packages/mcp-servers/dist/agent-tracker/index.js.map +1 -0
  150. package/packages/mcp-servers/dist/agent-tracker/server.d.ts +12 -0
  151. package/packages/mcp-servers/dist/agent-tracker/server.d.ts.map +1 -0
  152. package/packages/mcp-servers/dist/agent-tracker/server.js +919 -0
  153. package/packages/mcp-servers/dist/agent-tracker/server.js.map +1 -0
  154. package/packages/mcp-servers/dist/agent-tracker/types.d.ts +328 -0
  155. package/packages/mcp-servers/dist/agent-tracker/types.d.ts.map +1 -0
  156. package/packages/mcp-servers/dist/agent-tracker/types.js +128 -0
  157. package/packages/mcp-servers/dist/agent-tracker/types.js.map +1 -0
  158. package/packages/mcp-servers/dist/chrome-bridge/browser-tips.d.ts +27 -0
  159. package/packages/mcp-servers/dist/chrome-bridge/browser-tips.d.ts.map +1 -0
  160. package/packages/mcp-servers/dist/chrome-bridge/browser-tips.js +167 -0
  161. package/packages/mcp-servers/dist/chrome-bridge/browser-tips.js.map +1 -0
  162. package/packages/mcp-servers/dist/chrome-bridge/index.d.ts +6 -0
  163. package/packages/mcp-servers/dist/chrome-bridge/index.d.ts.map +1 -0
  164. package/packages/mcp-servers/dist/chrome-bridge/index.js +6 -0
  165. package/packages/mcp-servers/dist/chrome-bridge/index.js.map +1 -0
  166. package/packages/mcp-servers/dist/chrome-bridge/server.d.ts +13 -0
  167. package/packages/mcp-servers/dist/chrome-bridge/server.d.ts.map +1 -0
  168. package/packages/mcp-servers/dist/chrome-bridge/server.js +959 -0
  169. package/packages/mcp-servers/dist/chrome-bridge/server.js.map +1 -0
  170. package/packages/mcp-servers/dist/chrome-bridge/types.d.ts +41 -0
  171. package/packages/mcp-servers/dist/chrome-bridge/types.d.ts.map +1 -0
  172. package/packages/mcp-servers/dist/chrome-bridge/types.js +8 -0
  173. package/packages/mcp-servers/dist/chrome-bridge/types.js.map +1 -0
  174. package/packages/mcp-servers/dist/cloudflare/index.d.ts +8 -0
  175. package/packages/mcp-servers/dist/cloudflare/index.d.ts.map +1 -0
  176. package/packages/mcp-servers/dist/cloudflare/index.js +8 -0
  177. package/packages/mcp-servers/dist/cloudflare/index.js.map +1 -0
  178. package/packages/mcp-servers/dist/cloudflare/server.d.ts +16 -0
  179. package/packages/mcp-servers/dist/cloudflare/server.d.ts.map +1 -0
  180. package/packages/mcp-servers/dist/cloudflare/server.js +253 -0
  181. package/packages/mcp-servers/dist/cloudflare/server.js.map +1 -0
  182. package/packages/mcp-servers/dist/cloudflare/types.d.ts +141 -0
  183. package/packages/mcp-servers/dist/cloudflare/types.d.ts.map +1 -0
  184. package/packages/mcp-servers/dist/cloudflare/types.js +53 -0
  185. package/packages/mcp-servers/dist/cloudflare/types.js.map +1 -0
  186. package/packages/mcp-servers/dist/codecov/index.d.ts +7 -0
  187. package/packages/mcp-servers/dist/codecov/index.d.ts.map +1 -0
  188. package/packages/mcp-servers/dist/codecov/index.js +7 -0
  189. package/packages/mcp-servers/dist/codecov/index.js.map +1 -0
  190. package/packages/mcp-servers/dist/codecov/server.d.ts +21 -0
  191. package/packages/mcp-servers/dist/codecov/server.d.ts.map +1 -0
  192. package/packages/mcp-servers/dist/codecov/server.js +376 -0
  193. package/packages/mcp-servers/dist/codecov/server.js.map +1 -0
  194. package/packages/mcp-servers/dist/codecov/types.d.ts +269 -0
  195. package/packages/mcp-servers/dist/codecov/types.d.ts.map +1 -0
  196. package/packages/mcp-servers/dist/codecov/types.js +128 -0
  197. package/packages/mcp-servers/dist/codecov/types.js.map +1 -0
  198. package/packages/mcp-servers/dist/cto-report/index.d.ts +9 -0
  199. package/packages/mcp-servers/dist/cto-report/index.d.ts.map +1 -0
  200. package/packages/mcp-servers/dist/cto-report/index.js +9 -0
  201. package/packages/mcp-servers/dist/cto-report/index.js.map +1 -0
  202. package/packages/mcp-servers/dist/cto-report/server.d.ts +14 -0
  203. package/packages/mcp-servers/dist/cto-report/server.d.ts.map +1 -0
  204. package/packages/mcp-servers/dist/cto-report/server.js +859 -0
  205. package/packages/mcp-servers/dist/cto-report/server.js.map +1 -0
  206. package/packages/mcp-servers/dist/cto-report/types.d.ts +213 -0
  207. package/packages/mcp-servers/dist/cto-report/types.d.ts.map +1 -0
  208. package/packages/mcp-servers/dist/cto-report/types.js +29 -0
  209. package/packages/mcp-servers/dist/cto-report/types.js.map +1 -0
  210. package/packages/mcp-servers/dist/cto-reports/index.d.ts +7 -0
  211. package/packages/mcp-servers/dist/cto-reports/index.d.ts.map +1 -0
  212. package/packages/mcp-servers/dist/cto-reports/index.js +8 -0
  213. package/packages/mcp-servers/dist/cto-reports/index.js.map +1 -0
  214. package/packages/mcp-servers/dist/cto-reports/server.d.ts +20 -0
  215. package/packages/mcp-servers/dist/cto-reports/server.d.ts.map +1 -0
  216. package/packages/mcp-servers/dist/cto-reports/server.js +538 -0
  217. package/packages/mcp-servers/dist/cto-reports/server.js.map +1 -0
  218. package/packages/mcp-servers/dist/cto-reports/types.d.ts +236 -0
  219. package/packages/mcp-servers/dist/cto-reports/types.d.ts.map +1 -0
  220. package/packages/mcp-servers/dist/cto-reports/types.js +77 -0
  221. package/packages/mcp-servers/dist/cto-reports/types.js.map +1 -0
  222. package/packages/mcp-servers/dist/deputy-cto/index.d.ts +7 -0
  223. package/packages/mcp-servers/dist/deputy-cto/index.d.ts.map +1 -0
  224. package/packages/mcp-servers/dist/deputy-cto/index.js +8 -0
  225. package/packages/mcp-servers/dist/deputy-cto/index.js.map +1 -0
  226. package/packages/mcp-servers/dist/deputy-cto/server.d.ts +23 -0
  227. package/packages/mcp-servers/dist/deputy-cto/server.d.ts.map +1 -0
  228. package/packages/mcp-servers/dist/deputy-cto/server.js +1700 -0
  229. package/packages/mcp-servers/dist/deputy-cto/server.js.map +1 -0
  230. package/packages/mcp-servers/dist/deputy-cto/types.d.ts +439 -0
  231. package/packages/mcp-servers/dist/deputy-cto/types.d.ts.map +1 -0
  232. package/packages/mcp-servers/dist/deputy-cto/types.js +102 -0
  233. package/packages/mcp-servers/dist/deputy-cto/types.js.map +1 -0
  234. package/packages/mcp-servers/dist/elastic-logs/index.d.ts +5 -0
  235. package/packages/mcp-servers/dist/elastic-logs/index.d.ts.map +1 -0
  236. package/packages/mcp-servers/dist/elastic-logs/index.js +5 -0
  237. package/packages/mcp-servers/dist/elastic-logs/index.js.map +1 -0
  238. package/packages/mcp-servers/dist/elastic-logs/server.d.ts +18 -0
  239. package/packages/mcp-servers/dist/elastic-logs/server.d.ts.map +1 -0
  240. package/packages/mcp-servers/dist/elastic-logs/server.js +259 -0
  241. package/packages/mcp-servers/dist/elastic-logs/server.js.map +1 -0
  242. package/packages/mcp-servers/dist/elastic-logs/types.d.ts +107 -0
  243. package/packages/mcp-servers/dist/elastic-logs/types.d.ts.map +1 -0
  244. package/packages/mcp-servers/dist/elastic-logs/types.js +31 -0
  245. package/packages/mcp-servers/dist/elastic-logs/types.js.map +1 -0
  246. package/packages/mcp-servers/dist/feedback-explorer/index.d.ts +2 -0
  247. package/packages/mcp-servers/dist/feedback-explorer/index.d.ts.map +1 -0
  248. package/packages/mcp-servers/dist/feedback-explorer/index.js +2 -0
  249. package/packages/mcp-servers/dist/feedback-explorer/index.js.map +1 -0
  250. package/packages/mcp-servers/dist/feedback-explorer/server.d.ts +21 -0
  251. package/packages/mcp-servers/dist/feedback-explorer/server.d.ts.map +1 -0
  252. package/packages/mcp-servers/dist/feedback-explorer/server.js +580 -0
  253. package/packages/mcp-servers/dist/feedback-explorer/server.js.map +1 -0
  254. package/packages/mcp-servers/dist/feedback-explorer/types.d.ts +331 -0
  255. package/packages/mcp-servers/dist/feedback-explorer/types.d.ts.map +1 -0
  256. package/packages/mcp-servers/dist/feedback-explorer/types.js +40 -0
  257. package/packages/mcp-servers/dist/feedback-explorer/types.js.map +1 -0
  258. package/packages/mcp-servers/dist/feedback-reporter/index.d.ts +9 -0
  259. package/packages/mcp-servers/dist/feedback-reporter/index.d.ts.map +1 -0
  260. package/packages/mcp-servers/dist/feedback-reporter/index.js +9 -0
  261. package/packages/mcp-servers/dist/feedback-reporter/index.js.map +1 -0
  262. package/packages/mcp-servers/dist/feedback-reporter/server.d.ts +36 -0
  263. package/packages/mcp-servers/dist/feedback-reporter/server.d.ts.map +1 -0
  264. package/packages/mcp-servers/dist/feedback-reporter/server.js +392 -0
  265. package/packages/mcp-servers/dist/feedback-reporter/server.js.map +1 -0
  266. package/packages/mcp-servers/dist/feedback-reporter/types.d.ts +152 -0
  267. package/packages/mcp-servers/dist/feedback-reporter/types.d.ts.map +1 -0
  268. package/packages/mcp-servers/dist/feedback-reporter/types.js +67 -0
  269. package/packages/mcp-servers/dist/feedback-reporter/types.js.map +1 -0
  270. package/packages/mcp-servers/dist/github/index.d.ts +7 -0
  271. package/packages/mcp-servers/dist/github/index.d.ts.map +1 -0
  272. package/packages/mcp-servers/dist/github/index.js +7 -0
  273. package/packages/mcp-servers/dist/github/index.js.map +1 -0
  274. package/packages/mcp-servers/dist/github/server.d.ts +15 -0
  275. package/packages/mcp-servers/dist/github/server.d.ts.map +1 -0
  276. package/packages/mcp-servers/dist/github/server.js +686 -0
  277. package/packages/mcp-servers/dist/github/server.js.map +1 -0
  278. package/packages/mcp-servers/dist/github/types.d.ts +660 -0
  279. package/packages/mcp-servers/dist/github/types.d.ts.map +1 -0
  280. package/packages/mcp-servers/dist/github/types.js +209 -0
  281. package/packages/mcp-servers/dist/github/types.js.map +1 -0
  282. package/packages/mcp-servers/dist/index.d.ts +30 -0
  283. package/packages/mcp-servers/dist/index.d.ts.map +1 -0
  284. package/packages/mcp-servers/dist/index.js +32 -0
  285. package/packages/mcp-servers/dist/index.js.map +1 -0
  286. package/packages/mcp-servers/dist/makerkit-docs/index.d.ts +5 -0
  287. package/packages/mcp-servers/dist/makerkit-docs/index.d.ts.map +1 -0
  288. package/packages/mcp-servers/dist/makerkit-docs/index.js +5 -0
  289. package/packages/mcp-servers/dist/makerkit-docs/index.js.map +1 -0
  290. package/packages/mcp-servers/dist/makerkit-docs/server.d.ts +15 -0
  291. package/packages/mcp-servers/dist/makerkit-docs/server.d.ts.map +1 -0
  292. package/packages/mcp-servers/dist/makerkit-docs/server.js +252 -0
  293. package/packages/mcp-servers/dist/makerkit-docs/server.js.map +1 -0
  294. package/packages/mcp-servers/dist/makerkit-docs/types.d.ts +74 -0
  295. package/packages/mcp-servers/dist/makerkit-docs/types.d.ts.map +1 -0
  296. package/packages/mcp-servers/dist/makerkit-docs/types.js +20 -0
  297. package/packages/mcp-servers/dist/makerkit-docs/types.js.map +1 -0
  298. package/packages/mcp-servers/dist/onepassword/index.d.ts +2 -0
  299. package/packages/mcp-servers/dist/onepassword/index.d.ts.map +1 -0
  300. package/packages/mcp-servers/dist/onepassword/index.js +2 -0
  301. package/packages/mcp-servers/dist/onepassword/index.js.map +1 -0
  302. package/packages/mcp-servers/dist/onepassword/server.d.ts +2 -0
  303. package/packages/mcp-servers/dist/onepassword/server.d.ts.map +1 -0
  304. package/packages/mcp-servers/dist/onepassword/server.js +159 -0
  305. package/packages/mcp-servers/dist/onepassword/server.js.map +1 -0
  306. package/packages/mcp-servers/dist/onepassword/types.d.ts +55 -0
  307. package/packages/mcp-servers/dist/onepassword/types.d.ts.map +1 -0
  308. package/packages/mcp-servers/dist/onepassword/types.js +22 -0
  309. package/packages/mcp-servers/dist/onepassword/types.js.map +1 -0
  310. package/packages/mcp-servers/dist/playwright/helpers.d.ts +20 -0
  311. package/packages/mcp-servers/dist/playwright/helpers.d.ts.map +1 -0
  312. package/packages/mcp-servers/dist/playwright/helpers.js +31 -0
  313. package/packages/mcp-servers/dist/playwright/helpers.js.map +1 -0
  314. package/packages/mcp-servers/dist/playwright/index.d.ts +5 -0
  315. package/packages/mcp-servers/dist/playwright/index.d.ts.map +1 -0
  316. package/packages/mcp-servers/dist/playwright/index.js +5 -0
  317. package/packages/mcp-servers/dist/playwright/index.js.map +1 -0
  318. package/packages/mcp-servers/dist/playwright/server.d.ts +13 -0
  319. package/packages/mcp-servers/dist/playwright/server.d.ts.map +1 -0
  320. package/packages/mcp-servers/dist/playwright/server.js +1201 -0
  321. package/packages/mcp-servers/dist/playwright/server.js.map +1 -0
  322. package/packages/mcp-servers/dist/playwright/types.d.ts +216 -0
  323. package/packages/mcp-servers/dist/playwright/types.d.ts.map +1 -0
  324. package/packages/mcp-servers/dist/playwright/types.js +172 -0
  325. package/packages/mcp-servers/dist/playwright/types.js.map +1 -0
  326. package/packages/mcp-servers/dist/playwright-feedback/browser-manager.d.ts +39 -0
  327. package/packages/mcp-servers/dist/playwright-feedback/browser-manager.d.ts.map +1 -0
  328. package/packages/mcp-servers/dist/playwright-feedback/browser-manager.js +71 -0
  329. package/packages/mcp-servers/dist/playwright-feedback/browser-manager.js.map +1 -0
  330. package/packages/mcp-servers/dist/playwright-feedback/index.d.ts +5 -0
  331. package/packages/mcp-servers/dist/playwright-feedback/index.d.ts.map +1 -0
  332. package/packages/mcp-servers/dist/playwright-feedback/index.js +5 -0
  333. package/packages/mcp-servers/dist/playwright-feedback/index.js.map +1 -0
  334. package/packages/mcp-servers/dist/playwright-feedback/server.d.ts +34 -0
  335. package/packages/mcp-servers/dist/playwright-feedback/server.d.ts.map +1 -0
  336. package/packages/mcp-servers/dist/playwright-feedback/server.js +538 -0
  337. package/packages/mcp-servers/dist/playwright-feedback/server.js.map +1 -0
  338. package/packages/mcp-servers/dist/playwright-feedback/types.d.ts +305 -0
  339. package/packages/mcp-servers/dist/playwright-feedback/types.d.ts.map +1 -0
  340. package/packages/mcp-servers/dist/playwright-feedback/types.js +123 -0
  341. package/packages/mcp-servers/dist/playwright-feedback/types.js.map +1 -0
  342. package/packages/mcp-servers/dist/product-manager/server.d.ts +17 -0
  343. package/packages/mcp-servers/dist/product-manager/server.d.ts.map +1 -0
  344. package/packages/mcp-servers/dist/product-manager/server.js +690 -0
  345. package/packages/mcp-servers/dist/product-manager/server.js.map +1 -0
  346. package/packages/mcp-servers/dist/product-manager/types.d.ts +286 -0
  347. package/packages/mcp-servers/dist/product-manager/types.d.ts.map +1 -0
  348. package/packages/mcp-servers/dist/product-manager/types.js +99 -0
  349. package/packages/mcp-servers/dist/product-manager/types.js.map +1 -0
  350. package/packages/mcp-servers/dist/programmatic-feedback/index.d.ts +7 -0
  351. package/packages/mcp-servers/dist/programmatic-feedback/index.d.ts.map +1 -0
  352. package/packages/mcp-servers/dist/programmatic-feedback/index.js +7 -0
  353. package/packages/mcp-servers/dist/programmatic-feedback/index.js.map +1 -0
  354. package/packages/mcp-servers/dist/programmatic-feedback/sandbox.d.ts +19 -0
  355. package/packages/mcp-servers/dist/programmatic-feedback/sandbox.d.ts.map +1 -0
  356. package/packages/mcp-servers/dist/programmatic-feedback/sandbox.js +174 -0
  357. package/packages/mcp-servers/dist/programmatic-feedback/sandbox.js.map +1 -0
  358. package/packages/mcp-servers/dist/programmatic-feedback/server.d.ts +35 -0
  359. package/packages/mcp-servers/dist/programmatic-feedback/server.d.ts.map +1 -0
  360. package/packages/mcp-servers/dist/programmatic-feedback/server.js +465 -0
  361. package/packages/mcp-servers/dist/programmatic-feedback/server.js.map +1 -0
  362. package/packages/mcp-servers/dist/programmatic-feedback/types.d.ts +127 -0
  363. package/packages/mcp-servers/dist/programmatic-feedback/types.d.ts.map +1 -0
  364. package/packages/mcp-servers/dist/programmatic-feedback/types.js +80 -0
  365. package/packages/mcp-servers/dist/programmatic-feedback/types.js.map +1 -0
  366. package/packages/mcp-servers/dist/render/index.d.ts +8 -0
  367. package/packages/mcp-servers/dist/render/index.d.ts.map +1 -0
  368. package/packages/mcp-servers/dist/render/index.js +8 -0
  369. package/packages/mcp-servers/dist/render/index.js.map +1 -0
  370. package/packages/mcp-servers/dist/render/server.d.ts +15 -0
  371. package/packages/mcp-servers/dist/render/server.d.ts.map +1 -0
  372. package/packages/mcp-servers/dist/render/server.js +428 -0
  373. package/packages/mcp-servers/dist/render/server.js.map +1 -0
  374. package/packages/mcp-servers/dist/render/types.d.ts +273 -0
  375. package/packages/mcp-servers/dist/render/types.d.ts.map +1 -0
  376. package/packages/mcp-servers/dist/render/types.js +102 -0
  377. package/packages/mcp-servers/dist/render/types.js.map +1 -0
  378. package/packages/mcp-servers/dist/resend/index.d.ts +7 -0
  379. package/packages/mcp-servers/dist/resend/index.d.ts.map +1 -0
  380. package/packages/mcp-servers/dist/resend/index.js +7 -0
  381. package/packages/mcp-servers/dist/resend/index.js.map +1 -0
  382. package/packages/mcp-servers/dist/resend/server.d.ts +15 -0
  383. package/packages/mcp-servers/dist/resend/server.d.ts.map +1 -0
  384. package/packages/mcp-servers/dist/resend/server.js +298 -0
  385. package/packages/mcp-servers/dist/resend/server.js.map +1 -0
  386. package/packages/mcp-servers/dist/resend/types.d.ts +222 -0
  387. package/packages/mcp-servers/dist/resend/types.d.ts.map +1 -0
  388. package/packages/mcp-servers/dist/resend/types.js +58 -0
  389. package/packages/mcp-servers/dist/resend/types.js.map +1 -0
  390. package/packages/mcp-servers/dist/review-queue/index.d.ts +6 -0
  391. package/packages/mcp-servers/dist/review-queue/index.d.ts.map +1 -0
  392. package/packages/mcp-servers/dist/review-queue/index.js +6 -0
  393. package/packages/mcp-servers/dist/review-queue/index.js.map +1 -0
  394. package/packages/mcp-servers/dist/review-queue/server.d.ts +17 -0
  395. package/packages/mcp-servers/dist/review-queue/server.d.ts.map +1 -0
  396. package/packages/mcp-servers/dist/review-queue/server.js +348 -0
  397. package/packages/mcp-servers/dist/review-queue/server.js.map +1 -0
  398. package/packages/mcp-servers/dist/review-queue/types.d.ts +162 -0
  399. package/packages/mcp-servers/dist/review-queue/types.d.ts.map +1 -0
  400. package/packages/mcp-servers/dist/review-queue/types.js +56 -0
  401. package/packages/mcp-servers/dist/review-queue/types.js.map +1 -0
  402. package/packages/mcp-servers/dist/secret-sync/server.d.ts +19 -0
  403. package/packages/mcp-servers/dist/secret-sync/server.d.ts.map +1 -0
  404. package/packages/mcp-servers/dist/secret-sync/server.js +1139 -0
  405. package/packages/mcp-servers/dist/secret-sync/server.js.map +1 -0
  406. package/packages/mcp-servers/dist/secret-sync/types.d.ts +442 -0
  407. package/packages/mcp-servers/dist/secret-sync/types.d.ts.map +1 -0
  408. package/packages/mcp-servers/dist/secret-sync/types.js +113 -0
  409. package/packages/mcp-servers/dist/secret-sync/types.js.map +1 -0
  410. package/packages/mcp-servers/dist/session-events/index.d.ts +5 -0
  411. package/packages/mcp-servers/dist/session-events/index.d.ts.map +1 -0
  412. package/packages/mcp-servers/dist/session-events/index.js +5 -0
  413. package/packages/mcp-servers/dist/session-events/index.js.map +1 -0
  414. package/packages/mcp-servers/dist/session-events/server.d.ts +11 -0
  415. package/packages/mcp-servers/dist/session-events/server.d.ts.map +1 -0
  416. package/packages/mcp-servers/dist/session-events/server.js +290 -0
  417. package/packages/mcp-servers/dist/session-events/server.js.map +1 -0
  418. package/packages/mcp-servers/dist/session-events/types.d.ts +213 -0
  419. package/packages/mcp-servers/dist/session-events/types.d.ts.map +1 -0
  420. package/packages/mcp-servers/dist/session-events/types.js +69 -0
  421. package/packages/mcp-servers/dist/session-events/types.js.map +1 -0
  422. package/packages/mcp-servers/dist/session-restart/index.d.ts +9 -0
  423. package/packages/mcp-servers/dist/session-restart/index.d.ts.map +1 -0
  424. package/packages/mcp-servers/dist/session-restart/index.js +9 -0
  425. package/packages/mcp-servers/dist/session-restart/index.js.map +1 -0
  426. package/packages/mcp-servers/dist/session-restart/server.d.ts +20 -0
  427. package/packages/mcp-servers/dist/session-restart/server.d.ts.map +1 -0
  428. package/packages/mcp-servers/dist/session-restart/server.js +411 -0
  429. package/packages/mcp-servers/dist/session-restart/server.js.map +1 -0
  430. package/packages/mcp-servers/dist/session-restart/types.d.ts +26 -0
  431. package/packages/mcp-servers/dist/session-restart/types.d.ts.map +1 -0
  432. package/packages/mcp-servers/dist/session-restart/types.js +16 -0
  433. package/packages/mcp-servers/dist/session-restart/types.js.map +1 -0
  434. package/packages/mcp-servers/dist/setup-helper/index.d.ts +5 -0
  435. package/packages/mcp-servers/dist/setup-helper/index.d.ts.map +1 -0
  436. package/packages/mcp-servers/dist/setup-helper/index.js +5 -0
  437. package/packages/mcp-servers/dist/setup-helper/index.js.map +1 -0
  438. package/packages/mcp-servers/dist/setup-helper/server.d.ts +14 -0
  439. package/packages/mcp-servers/dist/setup-helper/server.d.ts.map +1 -0
  440. package/packages/mcp-servers/dist/setup-helper/server.js +454 -0
  441. package/packages/mcp-servers/dist/setup-helper/server.js.map +1 -0
  442. package/packages/mcp-servers/dist/setup-helper/types.d.ts +81 -0
  443. package/packages/mcp-servers/dist/setup-helper/types.d.ts.map +1 -0
  444. package/packages/mcp-servers/dist/setup-helper/types.js +41 -0
  445. package/packages/mcp-servers/dist/setup-helper/types.js.map +1 -0
  446. package/packages/mcp-servers/dist/shared/audited-server.d.ts +31 -0
  447. package/packages/mcp-servers/dist/shared/audited-server.d.ts.map +1 -0
  448. package/packages/mcp-servers/dist/shared/audited-server.js +126 -0
  449. package/packages/mcp-servers/dist/shared/audited-server.js.map +1 -0
  450. package/packages/mcp-servers/dist/shared/constants.d.ts +26 -0
  451. package/packages/mcp-servers/dist/shared/constants.d.ts.map +1 -0
  452. package/packages/mcp-servers/dist/shared/constants.js +41 -0
  453. package/packages/mcp-servers/dist/shared/constants.js.map +1 -0
  454. package/packages/mcp-servers/dist/shared/index.d.ts +6 -0
  455. package/packages/mcp-servers/dist/shared/index.d.ts.map +1 -0
  456. package/packages/mcp-servers/dist/shared/index.js +6 -0
  457. package/packages/mcp-servers/dist/shared/index.js.map +1 -0
  458. package/packages/mcp-servers/dist/shared/readonly-db.d.ts +11 -0
  459. package/packages/mcp-servers/dist/shared/readonly-db.d.ts.map +1 -0
  460. package/packages/mcp-servers/dist/shared/readonly-db.js +47 -0
  461. package/packages/mcp-servers/dist/shared/readonly-db.js.map +1 -0
  462. package/packages/mcp-servers/dist/shared/resolve-framework.d.ts +20 -0
  463. package/packages/mcp-servers/dist/shared/resolve-framework.d.ts.map +1 -0
  464. package/packages/mcp-servers/dist/shared/resolve-framework.js +65 -0
  465. package/packages/mcp-servers/dist/shared/resolve-framework.js.map +1 -0
  466. package/packages/mcp-servers/dist/shared/server.d.ts +86 -0
  467. package/packages/mcp-servers/dist/shared/server.d.ts.map +1 -0
  468. package/packages/mcp-servers/dist/shared/server.js +291 -0
  469. package/packages/mcp-servers/dist/shared/server.js.map +1 -0
  470. package/packages/mcp-servers/dist/shared/types.d.ts +113 -0
  471. package/packages/mcp-servers/dist/shared/types.d.ts.map +1 -0
  472. package/packages/mcp-servers/dist/shared/types.js +36 -0
  473. package/packages/mcp-servers/dist/shared/types.js.map +1 -0
  474. package/packages/mcp-servers/dist/show/server.d.ts +12 -0
  475. package/packages/mcp-servers/dist/show/server.d.ts.map +1 -0
  476. package/packages/mcp-servers/dist/show/server.js +97 -0
  477. package/packages/mcp-servers/dist/show/server.js.map +1 -0
  478. package/packages/mcp-servers/dist/show/types.d.ts +19 -0
  479. package/packages/mcp-servers/dist/show/types.d.ts.map +1 -0
  480. package/packages/mcp-servers/dist/show/types.js +32 -0
  481. package/packages/mcp-servers/dist/show/types.js.map +1 -0
  482. package/packages/mcp-servers/dist/specs-browser/index.d.ts +5 -0
  483. package/packages/mcp-servers/dist/specs-browser/index.d.ts.map +1 -0
  484. package/packages/mcp-servers/dist/specs-browser/index.js +5 -0
  485. package/packages/mcp-servers/dist/specs-browser/index.js.map +1 -0
  486. package/packages/mcp-servers/dist/specs-browser/server.d.ts +13 -0
  487. package/packages/mcp-servers/dist/specs-browser/server.d.ts.map +1 -0
  488. package/packages/mcp-servers/dist/specs-browser/server.js +692 -0
  489. package/packages/mcp-servers/dist/specs-browser/server.js.map +1 -0
  490. package/packages/mcp-servers/dist/specs-browser/types.d.ts +337 -0
  491. package/packages/mcp-servers/dist/specs-browser/types.d.ts.map +1 -0
  492. package/packages/mcp-servers/dist/specs-browser/types.js +134 -0
  493. package/packages/mcp-servers/dist/specs-browser/types.js.map +1 -0
  494. package/packages/mcp-servers/dist/supabase/index.d.ts +10 -0
  495. package/packages/mcp-servers/dist/supabase/index.d.ts.map +1 -0
  496. package/packages/mcp-servers/dist/supabase/index.js +10 -0
  497. package/packages/mcp-servers/dist/supabase/index.js.map +1 -0
  498. package/packages/mcp-servers/dist/supabase/server.d.ts +20 -0
  499. package/packages/mcp-servers/dist/supabase/server.d.ts.map +1 -0
  500. package/packages/mcp-servers/dist/supabase/server.js +451 -0
  501. package/packages/mcp-servers/dist/supabase/server.js.map +1 -0
  502. package/packages/mcp-servers/dist/supabase/types.d.ts +196 -0
  503. package/packages/mcp-servers/dist/supabase/types.d.ts.map +1 -0
  504. package/packages/mcp-servers/dist/supabase/types.js +76 -0
  505. package/packages/mcp-servers/dist/supabase/types.js.map +1 -0
  506. package/packages/mcp-servers/dist/todo-db/index.d.ts +5 -0
  507. package/packages/mcp-servers/dist/todo-db/index.d.ts.map +1 -0
  508. package/packages/mcp-servers/dist/todo-db/index.js +5 -0
  509. package/packages/mcp-servers/dist/todo-db/index.js.map +1 -0
  510. package/packages/mcp-servers/dist/todo-db/server.d.ts +13 -0
  511. package/packages/mcp-servers/dist/todo-db/server.d.ts.map +1 -0
  512. package/packages/mcp-servers/dist/todo-db/server.js +649 -0
  513. package/packages/mcp-servers/dist/todo-db/server.js.map +1 -0
  514. package/packages/mcp-servers/dist/todo-db/types.d.ts +225 -0
  515. package/packages/mcp-servers/dist/todo-db/types.d.ts.map +1 -0
  516. package/packages/mcp-servers/dist/todo-db/types.js +69 -0
  517. package/packages/mcp-servers/dist/todo-db/types.js.map +1 -0
  518. package/packages/mcp-servers/dist/user-feedback/index.d.ts +7 -0
  519. package/packages/mcp-servers/dist/user-feedback/index.d.ts.map +1 -0
  520. package/packages/mcp-servers/dist/user-feedback/index.js +8 -0
  521. package/packages/mcp-servers/dist/user-feedback/index.js.map +1 -0
  522. package/packages/mcp-servers/dist/user-feedback/server.d.ts +25 -0
  523. package/packages/mcp-servers/dist/user-feedback/server.d.ts.map +1 -0
  524. package/packages/mcp-servers/dist/user-feedback/server.js +914 -0
  525. package/packages/mcp-servers/dist/user-feedback/server.js.map +1 -0
  526. package/packages/mcp-servers/dist/user-feedback/types.d.ts +415 -0
  527. package/packages/mcp-servers/dist/user-feedback/types.d.ts.map +1 -0
  528. package/packages/mcp-servers/dist/user-feedback/types.js +132 -0
  529. package/packages/mcp-servers/dist/user-feedback/types.js.map +1 -0
  530. package/packages/mcp-servers/dist/vercel/index.d.ts +9 -0
  531. package/packages/mcp-servers/dist/vercel/index.d.ts.map +1 -0
  532. package/packages/mcp-servers/dist/vercel/index.js +9 -0
  533. package/packages/mcp-servers/dist/vercel/index.js.map +1 -0
  534. package/packages/mcp-servers/dist/vercel/server.d.ts +17 -0
  535. package/packages/mcp-servers/dist/vercel/server.d.ts.map +1 -0
  536. package/packages/mcp-servers/dist/vercel/server.js +265 -0
  537. package/packages/mcp-servers/dist/vercel/server.js.map +1 -0
  538. package/packages/mcp-servers/dist/vercel/types.d.ts +189 -0
  539. package/packages/mcp-servers/dist/vercel/types.d.ts.map +1 -0
  540. package/packages/mcp-servers/dist/vercel/types.js +65 -0
  541. package/packages/mcp-servers/dist/vercel/types.js.map +1 -0
  542. package/packages/mcp-servers/package-lock.json +3765 -0
  543. package/packages/mcp-servers/package.json +64 -0
  544. package/packages/mcp-servers/test/reporters/test-failure-reporter.ts +372 -0
  545. package/packages/mcp-servers/vitest.config.ts +27 -0
  546. package/scripts/__tests__/README.md +163 -0
  547. package/scripts/apply-credential-hardening.sh +271 -0
  548. package/scripts/credential-providers/manual.js +56 -0
  549. package/scripts/credential-providers/onepassword.js +85 -0
  550. package/scripts/credential-providers/provider-interface.js +104 -0
  551. package/scripts/encrypt-credential.js +337 -0
  552. package/scripts/feedback-launcher.js +338 -0
  553. package/scripts/feedback-orchestrator.js +373 -0
  554. package/scripts/fix-mcp-launcher-issues.sh +97 -0
  555. package/scripts/force-spawn-tasks.js +651 -0
  556. package/scripts/force-triage-reports.js +560 -0
  557. package/scripts/generate-protected-actions-spec.js +142 -0
  558. package/scripts/generate-proxy-certs.sh +158 -0
  559. package/scripts/grant-chrome-ext-permissions.sh +242 -0
  560. package/scripts/mcp-launcher.js +125 -0
  561. package/scripts/merge-settings.cjs +167 -0
  562. package/scripts/patch-clawd.py +844 -0
  563. package/scripts/patch-credential-cache.py +313 -0
  564. package/scripts/patches/credential-file-guard-patched.mjs +573 -0
  565. package/scripts/patches/credential-file-guard.js.patched +573 -0
  566. package/scripts/patches/verify-tokenizer.mjs +132 -0
  567. package/scripts/protect-framework.sh +478 -0
  568. package/scripts/readme-chrome.template +12 -0
  569. package/scripts/reap-completed-agents.js +439 -0
  570. package/scripts/reinstall.sh +86 -0
  571. package/scripts/resign-node.sh +185 -0
  572. package/scripts/rotation-proxy.js +656 -0
  573. package/scripts/rotation-stress-monitor.mjs +862 -0
  574. package/scripts/setup-automation-service.sh +648 -0
  575. package/scripts/setup-check.js +251 -0
  576. package/scripts/watch-claude-version.js +142 -0
  577. package/specs/framework/CORE-INVARIANTS.md +161 -0
  578. package/specs/patterns/AGENT-PATTERNS.md +223 -0
  579. package/specs/patterns/HOOK-PATTERNS.md +242 -0
  580. package/specs/patterns/MCP-SERVER-PATTERNS.md +144 -0
  581. package/templates/config/gitignore.template +14 -0
  582. package/templates/config/merge-chain-check.yml.template +51 -0
  583. package/templates/config/package.json.template +18 -0
  584. package/templates/config/pnpm-workspace.yaml +5 -0
  585. package/templates/config/services.json.template +18 -0
  586. package/templates/config/tsconfig.base.json +17 -0
  587. package/templates/scaffold/integrations/_template/.gitkeep +0 -0
  588. package/templates/scaffold/packages/logger/package.json +17 -0
  589. package/templates/scaffold/packages/logger/src/logger.ts +44 -0
  590. package/templates/scaffold/packages/shared/package.json +17 -0
  591. package/templates/scaffold/packages/shared/src/errors.ts +43 -0
  592. package/templates/scaffold/products/_product/apps/backend/package.json +21 -0
  593. package/templates/scaffold/products/_product/apps/backend/src/index.ts +17 -0
  594. package/templates/scaffold/products/_product/apps/extension/.gitkeep +0 -0
  595. package/templates/scaffold/products/_product/apps/web/.gitkeep +0 -0
  596. package/templates/scaffold/specs/global/.gitkeep +0 -0
  597. package/templates/scaffold/specs/local/.gitkeep +0 -0
  598. package/templates/scaffold/specs/reference/.gitkeep +0 -0
  599. 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