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