claude-ketchup 0.7.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 (353) hide show
  1. package/README.md +172 -0
  2. package/bin/cli.ts +6 -0
  3. package/bin/postinstall.ts +8 -0
  4. package/bin/preuninstall.ts +8 -0
  5. package/commands/ketchup.md +107 -0
  6. package/dist/bin/cli.d.ts +3 -0
  7. package/dist/bin/cli.d.ts.map +1 -0
  8. package/dist/bin/cli.js +7 -0
  9. package/dist/bin/cli.js.map +1 -0
  10. package/dist/bin/postinstall.d.ts +3 -0
  11. package/dist/bin/postinstall.d.ts.map +1 -0
  12. package/dist/bin/postinstall.js +9 -0
  13. package/dist/bin/postinstall.js.map +1 -0
  14. package/dist/bin/preuninstall.d.ts +3 -0
  15. package/dist/bin/preuninstall.d.ts.map +1 -0
  16. package/dist/bin/preuninstall.js +9 -0
  17. package/dist/bin/preuninstall.js.map +1 -0
  18. package/dist/scripts/auto-continue.d.ts +3 -0
  19. package/dist/scripts/auto-continue.d.ts.map +1 -0
  20. package/dist/scripts/auto-continue.js +62 -0
  21. package/dist/scripts/auto-continue.js.map +1 -0
  22. package/dist/scripts/generate-changeset.d.ts +13 -0
  23. package/dist/scripts/generate-changeset.d.ts.map +1 -0
  24. package/dist/scripts/generate-changeset.js +322 -0
  25. package/dist/scripts/generate-changeset.js.map +1 -0
  26. package/dist/scripts/pre-tool-use.d.ts +3 -0
  27. package/dist/scripts/pre-tool-use.d.ts.map +1 -0
  28. package/dist/scripts/pre-tool-use.js +68 -0
  29. package/dist/scripts/pre-tool-use.js.map +1 -0
  30. package/dist/scripts/session-start.d.ts +3 -0
  31. package/dist/scripts/session-start.d.ts.map +1 -0
  32. package/dist/scripts/session-start.js +71 -0
  33. package/dist/scripts/session-start.js.map +1 -0
  34. package/dist/scripts/user-prompt-submit.d.ts +3 -0
  35. package/dist/scripts/user-prompt-submit.d.ts.map +1 -0
  36. package/dist/scripts/user-prompt-submit.js +71 -0
  37. package/dist/scripts/user-prompt-submit.js.map +1 -0
  38. package/dist/src/activity-logger.d.ts +2 -0
  39. package/dist/src/activity-logger.d.ts.map +1 -0
  40. package/dist/src/activity-logger.js +47 -0
  41. package/dist/src/activity-logger.js.map +1 -0
  42. package/dist/src/activity-logger.test.d.ts +2 -0
  43. package/dist/src/activity-logger.test.d.ts.map +1 -0
  44. package/dist/src/activity-logger.test.js +121 -0
  45. package/dist/src/activity-logger.test.js.map +1 -0
  46. package/dist/src/clean-logs.d.ts +6 -0
  47. package/dist/src/clean-logs.d.ts.map +1 -0
  48. package/dist/src/clean-logs.js +38 -0
  49. package/dist/src/clean-logs.js.map +1 -0
  50. package/dist/src/clean-logs.test.d.ts +2 -0
  51. package/dist/src/clean-logs.test.d.ts.map +1 -0
  52. package/dist/src/clean-logs.test.js +101 -0
  53. package/dist/src/clean-logs.test.js.map +1 -0
  54. package/dist/src/cli/cli.d.ts +3 -0
  55. package/dist/src/cli/cli.d.ts.map +1 -0
  56. package/dist/src/cli/cli.js +26 -0
  57. package/dist/src/cli/cli.js.map +1 -0
  58. package/dist/src/cli/cli.test.d.ts +2 -0
  59. package/dist/src/cli/cli.test.d.ts.map +1 -0
  60. package/dist/src/cli/cli.test.js +20 -0
  61. package/dist/src/cli/cli.test.js.map +1 -0
  62. package/dist/src/cli/doctor.d.ts +7 -0
  63. package/dist/src/cli/doctor.d.ts.map +1 -0
  64. package/dist/src/cli/doctor.js +67 -0
  65. package/dist/src/cli/doctor.js.map +1 -0
  66. package/dist/src/cli/doctor.test.d.ts +2 -0
  67. package/dist/src/cli/doctor.test.d.ts.map +1 -0
  68. package/dist/src/cli/doctor.test.js +87 -0
  69. package/dist/src/cli/doctor.test.js.map +1 -0
  70. package/dist/src/cli/install.d.ts +8 -0
  71. package/dist/src/cli/install.d.ts.map +1 -0
  72. package/dist/src/cli/install.js +8 -0
  73. package/dist/src/cli/install.js.map +1 -0
  74. package/dist/src/cli/install.test.d.ts +2 -0
  75. package/dist/src/cli/install.test.d.ts.map +1 -0
  76. package/dist/src/cli/install.test.js +106 -0
  77. package/dist/src/cli/install.test.js.map +1 -0
  78. package/dist/src/cli/reminders.d.ts +12 -0
  79. package/dist/src/cli/reminders.d.ts.map +1 -0
  80. package/dist/src/cli/reminders.js +52 -0
  81. package/dist/src/cli/reminders.js.map +1 -0
  82. package/dist/src/cli/reminders.test.d.ts +2 -0
  83. package/dist/src/cli/reminders.test.d.ts.map +1 -0
  84. package/dist/src/cli/reminders.test.js +72 -0
  85. package/dist/src/cli/reminders.test.js.map +1 -0
  86. package/dist/src/cli/repair.d.ts +11 -0
  87. package/dist/src/cli/repair.d.ts.map +1 -0
  88. package/dist/src/cli/repair.js +91 -0
  89. package/dist/src/cli/repair.js.map +1 -0
  90. package/dist/src/cli/repair.test.d.ts +2 -0
  91. package/dist/src/cli/repair.test.d.ts.map +1 -0
  92. package/dist/src/cli/repair.test.js +96 -0
  93. package/dist/src/cli/repair.test.js.map +1 -0
  94. package/dist/src/cli/status.d.ts +10 -0
  95. package/dist/src/cli/status.d.ts.map +1 -0
  96. package/dist/src/cli/status.js +55 -0
  97. package/dist/src/cli/status.js.map +1 -0
  98. package/dist/src/cli/status.test.d.ts +2 -0
  99. package/dist/src/cli/status.test.d.ts.map +1 -0
  100. package/dist/src/cli/status.test.js +83 -0
  101. package/dist/src/cli/status.test.js.map +1 -0
  102. package/dist/src/clue-collector.d.ts +23 -0
  103. package/dist/src/clue-collector.d.ts.map +1 -0
  104. package/dist/src/clue-collector.js +221 -0
  105. package/dist/src/clue-collector.js.map +1 -0
  106. package/dist/src/clue-collector.test.d.ts +2 -0
  107. package/dist/src/clue-collector.test.d.ts.map +1 -0
  108. package/dist/src/clue-collector.test.js +278 -0
  109. package/dist/src/clue-collector.test.js.map +1 -0
  110. package/dist/src/commit-validator.d.ts +35 -0
  111. package/dist/src/commit-validator.d.ts.map +1 -0
  112. package/dist/src/commit-validator.js +147 -0
  113. package/dist/src/commit-validator.js.map +1 -0
  114. package/dist/src/commit-validator.test.d.ts +2 -0
  115. package/dist/src/commit-validator.test.d.ts.map +1 -0
  116. package/dist/src/commit-validator.test.js +443 -0
  117. package/dist/src/commit-validator.test.js.map +1 -0
  118. package/dist/src/config-loader.d.ts +15 -0
  119. package/dist/src/config-loader.d.ts.map +1 -0
  120. package/dist/src/config-loader.js +12 -0
  121. package/dist/src/config-loader.js.map +1 -0
  122. package/dist/src/config-loader.test.d.ts +2 -0
  123. package/dist/src/config-loader.test.d.ts.map +1 -0
  124. package/dist/src/config-loader.test.js +69 -0
  125. package/dist/src/config-loader.test.js.map +1 -0
  126. package/dist/src/debug-logger.d.ts +2 -0
  127. package/dist/src/debug-logger.d.ts.map +1 -0
  128. package/dist/src/debug-logger.js +23 -0
  129. package/dist/src/debug-logger.js.map +1 -0
  130. package/dist/src/debug-logger.test.d.ts +2 -0
  131. package/dist/src/debug-logger.test.d.ts.map +1 -0
  132. package/dist/src/debug-logger.test.js +63 -0
  133. package/dist/src/debug-logger.test.js.map +1 -0
  134. package/dist/src/default-validators.test.d.ts +2 -0
  135. package/dist/src/default-validators.test.d.ts.map +1 -0
  136. package/dist/src/default-validators.test.js +119 -0
  137. package/dist/src/default-validators.test.js.map +1 -0
  138. package/dist/src/deny-list.d.ts +3 -0
  139. package/dist/src/deny-list.d.ts.map +1 -0
  140. package/dist/src/deny-list.js +62 -0
  141. package/dist/src/deny-list.js.map +1 -0
  142. package/dist/src/deny-list.test.d.ts +2 -0
  143. package/dist/src/deny-list.test.d.ts.map +1 -0
  144. package/dist/src/deny-list.test.js +93 -0
  145. package/dist/src/deny-list.test.js.map +1 -0
  146. package/dist/src/e2e.test.d.ts +2 -0
  147. package/dist/src/e2e.test.d.ts.map +1 -0
  148. package/dist/src/e2e.test.js +89 -0
  149. package/dist/src/e2e.test.js.map +1 -0
  150. package/dist/src/gitignore-manager.d.ts +2 -0
  151. package/dist/src/gitignore-manager.d.ts.map +1 -0
  152. package/dist/src/gitignore-manager.js +45 -0
  153. package/dist/src/gitignore-manager.js.map +1 -0
  154. package/dist/src/gitignore-manager.test.d.ts +2 -0
  155. package/dist/src/gitignore-manager.test.d.ts.map +1 -0
  156. package/dist/src/gitignore-manager.test.js +65 -0
  157. package/dist/src/gitignore-manager.test.js.map +1 -0
  158. package/dist/src/hook-input.d.ts +9 -0
  159. package/dist/src/hook-input.d.ts.map +1 -0
  160. package/dist/src/hook-input.js +7 -0
  161. package/dist/src/hook-input.js.map +1 -0
  162. package/dist/src/hook-input.test.d.ts +2 -0
  163. package/dist/src/hook-input.test.d.ts.map +1 -0
  164. package/dist/src/hook-input.test.js +20 -0
  165. package/dist/src/hook-input.test.js.map +1 -0
  166. package/dist/src/hook-logger.d.ts +16 -0
  167. package/dist/src/hook-logger.d.ts.map +1 -0
  168. package/dist/src/hook-logger.js +91 -0
  169. package/dist/src/hook-logger.js.map +1 -0
  170. package/dist/src/hook-logger.test.d.ts +2 -0
  171. package/dist/src/hook-logger.test.d.ts.map +1 -0
  172. package/dist/src/hook-logger.test.js +184 -0
  173. package/dist/src/hook-logger.test.js.map +1 -0
  174. package/dist/src/hook-state.d.ts +43 -0
  175. package/dist/src/hook-state.d.ts.map +1 -0
  176. package/dist/src/hook-state.js +124 -0
  177. package/dist/src/hook-state.js.map +1 -0
  178. package/dist/src/hook-state.test.d.ts +2 -0
  179. package/dist/src/hook-state.test.d.ts.map +1 -0
  180. package/dist/src/hook-state.test.js +190 -0
  181. package/dist/src/hook-state.test.js.map +1 -0
  182. package/dist/src/hooks/auto-continue.d.ts +21 -0
  183. package/dist/src/hooks/auto-continue.d.ts.map +1 -0
  184. package/dist/src/hooks/auto-continue.js +70 -0
  185. package/dist/src/hooks/auto-continue.js.map +1 -0
  186. package/dist/src/hooks/auto-continue.test.d.ts +2 -0
  187. package/dist/src/hooks/auto-continue.test.d.ts.map +1 -0
  188. package/dist/src/hooks/auto-continue.test.js +171 -0
  189. package/dist/src/hooks/auto-continue.test.js.map +1 -0
  190. package/dist/src/hooks/pre-tool-use.d.ts +14 -0
  191. package/dist/src/hooks/pre-tool-use.d.ts.map +1 -0
  192. package/dist/src/hooks/pre-tool-use.js +62 -0
  193. package/dist/src/hooks/pre-tool-use.js.map +1 -0
  194. package/dist/src/hooks/pre-tool-use.test.d.ts +2 -0
  195. package/dist/src/hooks/pre-tool-use.test.d.ts.map +1 -0
  196. package/dist/src/hooks/pre-tool-use.test.js +168 -0
  197. package/dist/src/hooks/pre-tool-use.test.js.map +1 -0
  198. package/dist/src/hooks/session-start.d.ts +20 -0
  199. package/dist/src/hooks/session-start.d.ts.map +1 -0
  200. package/dist/src/hooks/session-start.js +27 -0
  201. package/dist/src/hooks/session-start.js.map +1 -0
  202. package/dist/src/hooks/session-start.test.d.ts +2 -0
  203. package/dist/src/hooks/session-start.test.d.ts.map +1 -0
  204. package/dist/src/hooks/session-start.test.js +125 -0
  205. package/dist/src/hooks/session-start.test.js.map +1 -0
  206. package/dist/src/hooks/user-prompt-submit.d.ts +17 -0
  207. package/dist/src/hooks/user-prompt-submit.d.ts.map +1 -0
  208. package/dist/src/hooks/user-prompt-submit.js +28 -0
  209. package/dist/src/hooks/user-prompt-submit.js.map +1 -0
  210. package/dist/src/hooks/user-prompt-submit.test.d.ts +2 -0
  211. package/dist/src/hooks/user-prompt-submit.test.d.ts.map +1 -0
  212. package/dist/src/hooks/user-prompt-submit.test.js +119 -0
  213. package/dist/src/hooks/user-prompt-submit.test.js.map +1 -0
  214. package/dist/src/hooks/validate-commit.d.ts +12 -0
  215. package/dist/src/hooks/validate-commit.d.ts.map +1 -0
  216. package/dist/src/hooks/validate-commit.js +58 -0
  217. package/dist/src/hooks/validate-commit.js.map +1 -0
  218. package/dist/src/hooks/validate-commit.test.d.ts +2 -0
  219. package/dist/src/hooks/validate-commit.test.d.ts.map +1 -0
  220. package/dist/src/hooks/validate-commit.test.js +150 -0
  221. package/dist/src/hooks/validate-commit.test.js.map +1 -0
  222. package/dist/src/index.d.ts +15 -0
  223. package/dist/src/index.d.ts.map +1 -0
  224. package/dist/src/index.js +39 -0
  225. package/dist/src/index.js.map +1 -0
  226. package/dist/src/linker.d.ts +6 -0
  227. package/dist/src/linker.d.ts.map +1 -0
  228. package/dist/src/linker.js +78 -0
  229. package/dist/src/linker.js.map +1 -0
  230. package/dist/src/linker.test.d.ts +2 -0
  231. package/dist/src/linker.test.d.ts.map +1 -0
  232. package/dist/src/linker.test.js +192 -0
  233. package/dist/src/linker.test.js.map +1 -0
  234. package/dist/src/logger.d.ts +21 -0
  235. package/dist/src/logger.d.ts.map +1 -0
  236. package/dist/src/logger.js +117 -0
  237. package/dist/src/logger.js.map +1 -0
  238. package/dist/src/logger.test.d.ts +2 -0
  239. package/dist/src/logger.test.d.ts.map +1 -0
  240. package/dist/src/logger.test.js +159 -0
  241. package/dist/src/logger.test.js.map +1 -0
  242. package/dist/src/npm-install.test.d.ts +2 -0
  243. package/dist/src/npm-install.test.d.ts.map +1 -0
  244. package/dist/src/npm-install.test.js +70 -0
  245. package/dist/src/npm-install.test.js.map +1 -0
  246. package/dist/src/path-resolver.d.ts +11 -0
  247. package/dist/src/path-resolver.d.ts.map +1 -0
  248. package/dist/src/path-resolver.js +65 -0
  249. package/dist/src/path-resolver.js.map +1 -0
  250. package/dist/src/postinstall.d.ts +8 -0
  251. package/dist/src/postinstall.d.ts.map +1 -0
  252. package/dist/src/postinstall.js +112 -0
  253. package/dist/src/postinstall.js.map +1 -0
  254. package/dist/src/postinstall.test.d.ts +2 -0
  255. package/dist/src/postinstall.test.d.ts.map +1 -0
  256. package/dist/src/postinstall.test.js +203 -0
  257. package/dist/src/postinstall.test.js.map +1 -0
  258. package/dist/src/preuninstall.d.ts +3 -0
  259. package/dist/src/preuninstall.d.ts.map +1 -0
  260. package/dist/src/preuninstall.js +85 -0
  261. package/dist/src/preuninstall.js.map +1 -0
  262. package/dist/src/preuninstall.test.d.ts +2 -0
  263. package/dist/src/preuninstall.test.d.ts.map +1 -0
  264. package/dist/src/preuninstall.test.js +114 -0
  265. package/dist/src/preuninstall.test.js.map +1 -0
  266. package/dist/src/reminder-loader.d.ts +24 -0
  267. package/dist/src/reminder-loader.d.ts.map +1 -0
  268. package/dist/src/reminder-loader.js +84 -0
  269. package/dist/src/reminder-loader.js.map +1 -0
  270. package/dist/src/reminder-loader.test.d.ts +2 -0
  271. package/dist/src/reminder-loader.test.d.ts.map +1 -0
  272. package/dist/src/reminder-loader.test.js +152 -0
  273. package/dist/src/reminder-loader.test.js.map +1 -0
  274. package/dist/src/root-finder.d.ts +2 -0
  275. package/dist/src/root-finder.d.ts.map +1 -0
  276. package/dist/src/root-finder.js +71 -0
  277. package/dist/src/root-finder.js.map +1 -0
  278. package/dist/src/root-finder.test.d.ts +2 -0
  279. package/dist/src/root-finder.test.d.ts.map +1 -0
  280. package/dist/src/root-finder.test.js +111 -0
  281. package/dist/src/root-finder.test.js.map +1 -0
  282. package/dist/src/settings-merger.d.ts +2 -0
  283. package/dist/src/settings-merger.d.ts.map +1 -0
  284. package/dist/src/settings-merger.js +133 -0
  285. package/dist/src/settings-merger.js.map +1 -0
  286. package/dist/src/settings-merger.test.d.ts +2 -0
  287. package/dist/src/settings-merger.test.d.ts.map +1 -0
  288. package/dist/src/settings-merger.test.js +379 -0
  289. package/dist/src/settings-merger.test.js.map +1 -0
  290. package/dist/src/settings-template.test.d.ts +2 -0
  291. package/dist/src/settings-template.test.d.ts.map +1 -0
  292. package/dist/src/settings-template.test.js +88 -0
  293. package/dist/src/settings-template.test.js.map +1 -0
  294. package/dist/src/state-manager.d.ts +5 -0
  295. package/dist/src/state-manager.d.ts.map +1 -0
  296. package/dist/src/state-manager.js +55 -0
  297. package/dist/src/state-manager.js.map +1 -0
  298. package/dist/src/state-manager.test.d.ts +2 -0
  299. package/dist/src/state-manager.test.d.ts.map +1 -0
  300. package/dist/src/state-manager.test.js +85 -0
  301. package/dist/src/state-manager.test.js.map +1 -0
  302. package/dist/src/subagent-classifier.d.ts +4 -0
  303. package/dist/src/subagent-classifier.d.ts.map +1 -0
  304. package/dist/src/subagent-classifier.js +53 -0
  305. package/dist/src/subagent-classifier.js.map +1 -0
  306. package/dist/src/subagent-classifier.test.d.ts +2 -0
  307. package/dist/src/subagent-classifier.test.d.ts.map +1 -0
  308. package/dist/src/subagent-classifier.test.js +84 -0
  309. package/dist/src/subagent-classifier.test.js.map +1 -0
  310. package/dist/src/validator-loader.d.ts +9 -0
  311. package/dist/src/validator-loader.d.ts.map +1 -0
  312. package/dist/src/validator-loader.js +71 -0
  313. package/dist/src/validator-loader.js.map +1 -0
  314. package/dist/src/validator-loader.test.d.ts +2 -0
  315. package/dist/src/validator-loader.test.d.ts.map +1 -0
  316. package/dist/src/validator-loader.test.js +140 -0
  317. package/dist/src/validator-loader.test.js.map +1 -0
  318. package/package.json +90 -0
  319. package/reminders/ketchup.md +24 -0
  320. package/reminders/reminder-documentation.md +30 -0
  321. package/reminders/reminder-emergent-design.md +41 -0
  322. package/reminders/reminder-extreme-ownership.md +27 -0
  323. package/reminders/reminder-ide-diagnostics.md +25 -0
  324. package/reminders/reminder-ketchup.md +145 -0
  325. package/reminders/reminder-parallelization.md +27 -0
  326. package/reminders/reminder-rethink-after-revert.md +25 -0
  327. package/reminders/reminder-sub-agent-rules.md +27 -0
  328. package/reminders/reminder-test-title-matches-spec.md +37 -0
  329. package/scripts/auto-continue.ts +34 -0
  330. package/scripts/generate-changeset.ts +405 -0
  331. package/scripts/pre-tool-use.ts +35 -0
  332. package/scripts/session-start.ts +38 -0
  333. package/scripts/tail-logs.sh +17 -0
  334. package/scripts/test-hooks.sh +910 -0
  335. package/scripts/user-prompt-submit.ts +38 -0
  336. package/templates/settings.json +48 -0
  337. package/validators/appeal-system.md +55 -0
  338. package/validators/backwards-compat.md +33 -0
  339. package/validators/burst-atomicity.md +37 -0
  340. package/validators/coverage-rules.md +34 -0
  341. package/validators/dead-code.md +36 -0
  342. package/validators/hygiene.md +34 -0
  343. package/validators/infra-commit-format.md +37 -0
  344. package/validators/ketchup-plan-format.md +42 -0
  345. package/validators/new-code-requires-tests.md +36 -0
  346. package/validators/no-comments.md +35 -0
  347. package/validators/no-dangerous-git.md +35 -0
  348. package/validators/tcr-workflow.md +31 -0
  349. package/validators/testing-no-state-peeking.md +37 -0
  350. package/validators/testing-structure.md +37 -0
  351. package/validators/testing-stubs-over-mocks.md +42 -0
  352. package/validators/testing-weak-assertions.md +36 -0
  353. package/validators/type-organization.md +30 -0
package/README.md ADDED
@@ -0,0 +1,172 @@
1
+ # Claude Ketchup
2
+
3
+ **Stop Babysitting. Start Parallelizing.**
4
+
5
+ [![License](https://img.shields.io/badge/license-MIT-blue?style=flat-square)](LICENSE) [![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue?style=flat-square)]()
6
+
7
+ ---
8
+
9
+ ## The Problem: You're an AI Babysitter
10
+
11
+ AI-assisted coding captured your cognitive load.
12
+
13
+ Every session demands your full attention. Watching, nudging, correcting. You can't walk away because you don't trust the system.
14
+
15
+ - You can't context-switch while supervising
16
+ - One task at a time, full attention required
17
+ - The bottleneck is your attention, not AI's speed
18
+
19
+ That's not multiplication. That's marginally faster serial work.
20
+
21
+ ---
22
+
23
+ ## The Solution: The Quality Stack
24
+
25
+ Claude Ketchup creates trust. Trust enables parallelization.
26
+
27
+ | Component | What It Does | Result |
28
+ | ------------------ | -------------------------------------------- | ------------------------------- |
29
+ | **Auto-Planner** | Generates plan from your requirements | No need to specify every detail |
30
+ | **Supervisor AI** | Validates every commit against your criteria | Automated review |
31
+ | **TCR Discipline** | Test && Commit \|\| Revert | Bad code auto-reverts |
32
+ | **Auto-Continue** | Keeps going until the plan is done | No nudging required |
33
+
34
+ The system is trustworthy. That's what frees you.
35
+
36
+ ---
37
+
38
+ ## The Multiplier: Git Worktrees
39
+
40
+ Git worktrees let you run multiple isolated workspaces from the same repo.
41
+
42
+ ```bash
43
+ # Create worktrees for parallel features
44
+ git worktree add ../feature-auth feature/auth
45
+ git worktree add ../feature-payments feature/payments
46
+ git worktree add ../feature-dashboard feature/dashboard
47
+ ```
48
+
49
+ Each runs a Ketchup instance. All quality-validated.
50
+
51
+ | Approach | Features/Week |
52
+ | ------------------------- | ------------- |
53
+ | Manual coding | 1 |
54
+ | AI-assisted (babysitting) | 1-2 |
55
+ | **Ketchup + Worktrees** | **5-10** |
56
+
57
+ ---
58
+
59
+ ## Three Steps
60
+
61
+ ### 1. Install
62
+
63
+ ```bash
64
+ npx claude-ketchup install
65
+ ```
66
+
67
+ Feed your requirements. Ketchup auto-generates the plan with Bottles, Bursts, and Dependencies.
68
+
69
+ ### 2. Release
70
+
71
+ Start execution and walk away. The Supervisor validates every commit. Auto-continue keeps it going until done.
72
+
73
+ ### 3. Multiply
74
+
75
+ Open another worktree. Start another instance. Three features. Five features. All in parallel.
76
+
77
+ ---
78
+
79
+ ## The Transformation
80
+
81
+ | Before (Babysitter) | After (Bionic) |
82
+ | -------------------------------- | ------------------------------ |
83
+ | Watching one AI session | Directing multiple workstreams |
84
+ | Nudging, correcting in real-time | Defining, approving, releasing |
85
+ | Serial productivity | Parallel productivity |
86
+ | Marginal gains (1.5x) | Multiplicative gains (5-10x) |
87
+ | Brain captured by supervision | Brain freed for the next thing |
88
+
89
+ From Babysitter to Bionic.
90
+
91
+ ---
92
+
93
+ ## Installation
94
+
95
+ ```bash
96
+ # Install Claude Ketchup
97
+ npx claude-ketchup install
98
+
99
+ # Verify installation
100
+ npx claude-ketchup doctor
101
+
102
+ # You're ready to become Bionic
103
+ ```
104
+
105
+ After installation, claude-ketchup automatically:
106
+
107
+ - Injects hooks that validate every commit
108
+ - Creates reminders that inject your guidelines
109
+ - Sets up file protection via deny-lists
110
+ - Merges settings with smart project/local overrides
111
+
112
+ ---
113
+
114
+ ## Authority: Battle-Tested
115
+
116
+ Built on foundations from Kent Beck's TCR and Extreme Programming principles. Refined through production features at Auto.
117
+
118
+ The on.auto team ships 5-10 features per week. Not 1-2.
119
+
120
+ **[Read the origin story →](./docs/origin-story.md)**
121
+
122
+ ---
123
+
124
+ ## CLI Reference
125
+
126
+ | Command | Description |
127
+ | ------------------------- | --------------------------------------------------- |
128
+ | `claude-ketchup install` | Install and configure claude-ketchup in your project |
129
+ | `claude-ketchup init` | Initialize ketchup configuration |
130
+ | `claude-ketchup status` | Show symlink status for hook scripts and reminders |
131
+ | `claude-ketchup doctor` | Diagnose installation health |
132
+ | `claude-ketchup repair` | Recreate broken or missing symlinks |
133
+ | `claude-ketchup reminders`| List active reminders with metadata |
134
+ | `claude-ketchup clean-logs`| Remove old log files (use `--older-than=N` to keep N recent logs) |
135
+
136
+ ---
137
+
138
+ ## Documentation
139
+
140
+ | Guide | Description |
141
+ | ------------------------------------------------ | ------------------------------- |
142
+ | [Getting Started](./docs/getting-started.md) | 5-minute transformation |
143
+ | [Installation](./docs/installation.md) | Detailed installation guide |
144
+ | [The Quality Stack](./docs/ketchup-technique.md) | Why you can walk away |
145
+ | [Configuration](./docs/configuration.md) | All configuration options |
146
+ | [Hooks Guide](./docs/hooks-guide.md) | Configure your supervision |
147
+ | [Reminders Guide](./docs/reminders-guide.md) | Context injection system |
148
+ | [Validators Guide](./docs/validators-guide.md) | Commit validation rules |
149
+ | [API Reference](./docs/api-reference.md) | Programmatic access |
150
+ | [Architecture](./docs/architecture.md) | System design internals |
151
+
152
+ ---
153
+
154
+ ## Development
155
+
156
+ ```bash
157
+ git clone https://github.com/BeOnAuto/claude-ketchup.git
158
+ cd claude-ketchup
159
+ pnpm install
160
+ pnpm test
161
+ pnpm build
162
+ ```
163
+
164
+ ---
165
+
166
+ ## License
167
+
168
+ MIT © 2025 BeOnAuto, Inc.
169
+
170
+ See [LICENSE](LICENSE) for details.
171
+
172
+ ---
package/bin/cli.ts ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { createCli } from '../src/cli/cli.js';
4
+
5
+ const program = createCli();
6
+ program.parse();
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env npx tsx
2
+
3
+ import { runPostinstall } from '../src/postinstall.js';
4
+
5
+ runPostinstall().catch((err) => {
6
+ console.error('Postinstall failed:', err);
7
+ process.exit(1);
8
+ });
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env npx tsx
2
+
3
+ import { runPreuninstall } from '../src/preuninstall.js';
4
+
5
+ runPreuninstall().catch((err) => {
6
+ console.error('Preuninstall failed:', err);
7
+ process.exit(1);
8
+ });
@@ -0,0 +1,107 @@
1
+ # /ketchup - Ketchup Status & Control
2
+
3
+ Check the status of your claude-ketchup installation and manage symlinks.
4
+
5
+ ## Commands
6
+
7
+ ### `/ketchup` or `/ketchup status`
8
+
9
+ Show the current status of all managed symlinks.
10
+
11
+ ### `/ketchup doctor`
12
+
13
+ Run diagnostics to check for issues with the installation.
14
+
15
+ ### `/ketchup repair`
16
+
17
+ Fix any broken or missing symlinks.
18
+
19
+ ### `/ketchup skills`
20
+
21
+ List all active skills with their metadata.
22
+
23
+ ## Implementation
24
+
25
+ When the user runs `/ketchup <command>`, you should:
26
+
27
+ 1. Determine the package directory (node_modules/claude-ketchup)
28
+ 2. Determine the .claude directory (project root/.claude)
29
+ 3. Run the appropriate command function
30
+ 4. Display the results
31
+
32
+ ### Response Format
33
+
34
+ **For `/ketchup status`:**
35
+
36
+ ```
37
+ ╭─────────────────────────────────────────╮
38
+ │ 🥫 Ketchup Status │
39
+ ├─────────────────────────────────────────┤
40
+ │ Symlinks: │
41
+ │ ✓ scripts/session-start.ts │
42
+ │ ✓ scripts/pre-tool-use.ts │
43
+ │ ✓ skills/coding.md │
44
+ ├─────────────────────────────────────────┤
45
+ │ All symlinks healthy │
46
+ ╰─────────────────────────────────────────╯
47
+ ```
48
+
49
+ **For `/ketchup doctor`:**
50
+
51
+ ```
52
+ ╭─────────────────────────────────────────╮
53
+ │ 🩺 Ketchup Doctor │
54
+ ├─────────────────────────────────────────┤
55
+ │ ✓ All symlinks valid │
56
+ │ ✓ Settings merged │
57
+ │ ✓ Gitignore updated │
58
+ ├─────────────────────────────────────────┤
59
+ │ Status: Healthy │
60
+ ╰─────────────────────────────────────────╯
61
+ ```
62
+
63
+ **For `/ketchup repair`:**
64
+
65
+ ```
66
+ ╭─────────────────────────────────────────╮
67
+ │ 🔧 Ketchup Repair │
68
+ ├─────────────────────────────────────────┤
69
+ │ Repaired: │
70
+ │ ↻ scripts/session-start.ts │
71
+ │ ↻ skills/coding.md │
72
+ ├─────────────────────────────────────────┤
73
+ │ 2 symlinks repaired │
74
+ ╰─────────────────────────────────────────╯
75
+ ```
76
+
77
+ **For `/ketchup skills`:**
78
+
79
+ ```
80
+ ╭─────────────────────────────────────────╮
81
+ │ 📚 Active Skills │
82
+ ├─────────────────────────────────────────┤
83
+ │ coding.md │
84
+ │ Hook: SessionStart │
85
+ │ Priority: 10 │
86
+ │ │
87
+ │ reminder.md │
88
+ │ Hook: UserPromptSubmit │
89
+ │ Priority: 5 │
90
+ ├─────────────────────────────────────────┤
91
+ │ 2 skills active │
92
+ ╰─────────────────────────────────────────╯
93
+ ```
94
+
95
+ **For `/ketchup help`:**
96
+
97
+ ```
98
+ /ketchup - Ketchup Status & Control
99
+
100
+ Commands:
101
+ /ketchup Show symlink status
102
+ /ketchup status Show symlink status
103
+ /ketchup doctor Run diagnostics
104
+ /ketchup repair Fix broken symlinks
105
+ /ketchup skills List active skills
106
+ /ketchup help Show this help
107
+ ```
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const cli_js_1 = require("../src/cli/cli.js");
5
+ const program = (0, cli_js_1.createCli)();
6
+ program.parse();
7
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":";;;AAEA,8CAA8C;AAE9C,MAAM,OAAO,GAAG,IAAA,kBAAS,GAAE,CAAC;AAC5B,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env npx tsx
2
+ export {};
3
+ //# sourceMappingURL=postinstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postinstall.d.ts","sourceRoot":"","sources":["../../bin/postinstall.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env npx tsx
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const postinstall_js_1 = require("../src/postinstall.js");
5
+ (0, postinstall_js_1.runPostinstall)().catch((err) => {
6
+ console.error('Postinstall failed:', err);
7
+ process.exit(1);
8
+ });
9
+ //# sourceMappingURL=postinstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postinstall.js","sourceRoot":"","sources":["../../bin/postinstall.ts"],"names":[],"mappings":";;;AAEA,0DAAuD;AAEvD,IAAA,+BAAc,GAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7B,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env npx tsx
2
+ export {};
3
+ //# sourceMappingURL=preuninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preuninstall.d.ts","sourceRoot":"","sources":["../../bin/preuninstall.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env npx tsx
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const preuninstall_js_1 = require("../src/preuninstall.js");
5
+ (0, preuninstall_js_1.runPreuninstall)().catch((err) => {
6
+ console.error('Preuninstall failed:', err);
7
+ process.exit(1);
8
+ });
9
+ //# sourceMappingURL=preuninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preuninstall.js","sourceRoot":"","sources":["../../bin/preuninstall.ts"],"names":[],"mappings":";;;AAEA,4DAAyD;AAEzD,IAAA,iCAAe,GAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;IAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env npx tsx
2
+ export {};
3
+ //# sourceMappingURL=auto-continue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-continue.d.ts","sourceRoot":"","sources":["../../scripts/auto-continue.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env npx tsx
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ const hook_logger_js_1 = require("../src/hook-logger.js");
40
+ const auto_continue_js_1 = require("../src/hooks/auto-continue.js");
41
+ const projectDir = process.cwd();
42
+ const claudeDir = path.resolve(projectDir, '.claude');
43
+ const stdin = fs.readFileSync(0, 'utf8').trim();
44
+ if (!stdin) {
45
+ process.exit(0);
46
+ }
47
+ const input = JSON.parse(stdin);
48
+ const startTime = Date.now();
49
+ const result = (0, auto_continue_js_1.handleStop)(projectDir, input);
50
+ const output = result.decision === 'block' ? { stopReason: result.reason, forceResult: { behaviour: 'block' } } : null;
51
+ (0, hook_logger_js_1.writeHookLog)(claudeDir, {
52
+ hookName: 'auto-continue',
53
+ timestamp: new Date().toISOString(),
54
+ input,
55
+ output: output ?? { decision: result.decision, reason: result.reason },
56
+ durationMs: Date.now() - startTime,
57
+ });
58
+ if (output) {
59
+ console.log(JSON.stringify(output));
60
+ }
61
+ process.exit(0);
62
+ //# sourceMappingURL=auto-continue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-continue.js","sourceRoot":"","sources":["../../scripts/auto-continue.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,4CAA8B;AAC9B,gDAAkC;AAElC,0DAAqD;AACrD,oEAA+E;AAE/E,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AACtD,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAEhD,IAAI,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,KAAK,GAAkB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC7B,MAAM,MAAM,GAAG,IAAA,6BAAU,EAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAE7C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAEvH,IAAA,6BAAY,EAAC,SAAS,EAAE;IACtB,QAAQ,EAAE,eAAe;IACzB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IACnC,KAAK;IACL,MAAM,EAAE,MAAM,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;IACtE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;CACnC,CAAC,CAAC;AAEH,IAAI,MAAM,EAAE,CAAC;IACX,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * AI-powered changeset generation script
4
+ *
5
+ * This script:
6
+ * 1. Gets commits since last changeset/tag
7
+ * 2. Parses conventional commits (feat/fix/etc)
8
+ * 3. Determines bump type (breaking→major, feat→minor, else→patch)
9
+ * 4. Generates changelog via Claude CLI (with simple fallback)
10
+ * 5. Creates .changeset/*.md file
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=generate-changeset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-changeset.d.ts","sourceRoot":"","sources":["../../scripts/generate-changeset.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}