@isaacriehm/cairn 0.1.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 (562) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +37 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/backprop/id.d.ts +14 -0
  5. package/dist/backprop/id.js +40 -0
  6. package/dist/backprop/id.js.map +1 -0
  7. package/dist/backprop/index.d.ts +23 -0
  8. package/dist/backprop/index.js +21 -0
  9. package/dist/backprop/index.js.map +1 -0
  10. package/dist/backprop/prompt.d.ts +16 -0
  11. package/dist/backprop/prompt.js +101 -0
  12. package/dist/backprop/prompt.js.map +1 -0
  13. package/dist/backprop/runner.d.ts +18 -0
  14. package/dist/backprop/runner.js +95 -0
  15. package/dist/backprop/runner.js.map +1 -0
  16. package/dist/backprop/schema.d.ts +61 -0
  17. package/dist/backprop/schema.js +55 -0
  18. package/dist/backprop/schema.js.map +1 -0
  19. package/dist/backprop/types.d.ts +101 -0
  20. package/dist/backprop/types.js +24 -0
  21. package/dist/backprop/types.js.map +1 -0
  22. package/dist/backprop/writer.d.ts +27 -0
  23. package/dist/backprop/writer.js +301 -0
  24. package/dist/backprop/writer.js.map +1 -0
  25. package/dist/claude/error.d.ts +33 -0
  26. package/dist/claude/error.js +58 -0
  27. package/dist/claude/error.js.map +1 -0
  28. package/dist/claude/index.d.ts +3 -0
  29. package/dist/claude/index.js +3 -0
  30. package/dist/claude/index.js.map +1 -0
  31. package/dist/claude/runner.d.ts +11 -0
  32. package/dist/claude/runner.js +132 -0
  33. package/dist/claude/runner.js.map +1 -0
  34. package/dist/claude/types.d.ts +52 -0
  35. package/dist/claude/types.js +14 -0
  36. package/dist/claude/types.js.map +1 -0
  37. package/dist/cli/attention.d.ts +11 -0
  38. package/dist/cli/attention.js +234 -0
  39. package/dist/cli/attention.js.map +1 -0
  40. package/dist/cli/daemon.d.ts +54 -0
  41. package/dist/cli/daemon.js +351 -0
  42. package/dist/cli/daemon.js.map +1 -0
  43. package/dist/cli/doctor.d.ts +8 -0
  44. package/dist/cli/doctor.js +116 -0
  45. package/dist/cli/doctor.js.map +1 -0
  46. package/dist/cli/gc.d.ts +15 -0
  47. package/dist/cli/gc.js +139 -0
  48. package/dist/cli/gc.js.map +1 -0
  49. package/dist/cli/hook.d.ts +18 -0
  50. package/dist/cli/hook.js +57 -0
  51. package/dist/cli/hook.js.map +1 -0
  52. package/dist/cli/index.d.ts +2 -0
  53. package/dist/cli/index.js +127 -0
  54. package/dist/cli/index.js.map +1 -0
  55. package/dist/cli/init.d.ts +1 -0
  56. package/dist/cli/init.js +77 -0
  57. package/dist/cli/init.js.map +1 -0
  58. package/dist/cli/install.d.ts +52 -0
  59. package/dist/cli/install.js +308 -0
  60. package/dist/cli/install.js.map +1 -0
  61. package/dist/cli/join.d.ts +1 -0
  62. package/dist/cli/join.js +84 -0
  63. package/dist/cli/join.js.map +1 -0
  64. package/dist/cli/mcp.d.ts +1 -0
  65. package/dist/cli/mcp.js +62 -0
  66. package/dist/cli/mcp.js.map +1 -0
  67. package/dist/cli/mirror.d.ts +1 -0
  68. package/dist/cli/mirror.js +97 -0
  69. package/dist/cli/mirror.js.map +1 -0
  70. package/dist/cli/run.d.ts +1 -0
  71. package/dist/cli/run.js +174 -0
  72. package/dist/cli/run.js.map +1 -0
  73. package/dist/cli/scope.d.ts +8 -0
  74. package/dist/cli/scope.js +65 -0
  75. package/dist/cli/scope.js.map +1 -0
  76. package/dist/cli/task.d.ts +18 -0
  77. package/dist/cli/task.js +137 -0
  78. package/dist/cli/task.js.map +1 -0
  79. package/dist/cli/watch.d.ts +1 -0
  80. package/dist/cli/watch.js +73 -0
  81. package/dist/cli/watch.js.map +1 -0
  82. package/dist/decision-capture/capture.d.ts +57 -0
  83. package/dist/decision-capture/capture.js +186 -0
  84. package/dist/decision-capture/capture.js.map +1 -0
  85. package/dist/decision-capture/extractor.d.ts +20 -0
  86. package/dist/decision-capture/extractor.js +103 -0
  87. package/dist/decision-capture/extractor.js.map +1 -0
  88. package/dist/decision-capture/id.d.ts +14 -0
  89. package/dist/decision-capture/id.js +44 -0
  90. package/dist/decision-capture/id.js.map +1 -0
  91. package/dist/decision-capture/index.d.ts +25 -0
  92. package/dist/decision-capture/index.js +21 -0
  93. package/dist/decision-capture/index.js.map +1 -0
  94. package/dist/decision-capture/prompt.d.ts +15 -0
  95. package/dist/decision-capture/prompt.js +68 -0
  96. package/dist/decision-capture/prompt.js.map +1 -0
  97. package/dist/decision-capture/refinement-prompt.d.ts +25 -0
  98. package/dist/decision-capture/refinement-prompt.js +146 -0
  99. package/dist/decision-capture/refinement-prompt.js.map +1 -0
  100. package/dist/decision-capture/refinement-schema.d.ts +52 -0
  101. package/dist/decision-capture/refinement-schema.js +61 -0
  102. package/dist/decision-capture/refinement-schema.js.map +1 -0
  103. package/dist/decision-capture/refinement.d.ts +60 -0
  104. package/dist/decision-capture/refinement.js +439 -0
  105. package/dist/decision-capture/refinement.js.map +1 -0
  106. package/dist/decision-capture/schema.d.ts +70 -0
  107. package/dist/decision-capture/schema.js +71 -0
  108. package/dist/decision-capture/schema.js.map +1 -0
  109. package/dist/decision-capture/types.d.ts +201 -0
  110. package/dist/decision-capture/types.js +20 -0
  111. package/dist/decision-capture/types.js.map +1 -0
  112. package/dist/decision-capture/writer.d.ts +90 -0
  113. package/dist/decision-capture/writer.js +267 -0
  114. package/dist/decision-capture/writer.js.map +1 -0
  115. package/dist/frontend/discord/acl.d.ts +6 -0
  116. package/dist/frontend/discord/acl.js +19 -0
  117. package/dist/frontend/discord/acl.js.map +1 -0
  118. package/dist/frontend/discord/channels.d.ts +29 -0
  119. package/dist/frontend/discord/channels.js +58 -0
  120. package/dist/frontend/discord/channels.js.map +1 -0
  121. package/dist/frontend/discord/classifier.d.ts +16 -0
  122. package/dist/frontend/discord/classifier.js +29 -0
  123. package/dist/frontend/discord/classifier.js.map +1 -0
  124. package/dist/frontend/discord/index.d.ts +118 -0
  125. package/dist/frontend/discord/index.js +1104 -0
  126. package/dist/frontend/discord/index.js.map +1 -0
  127. package/dist/frontend/discord/slash.d.ts +18 -0
  128. package/dist/frontend/discord/slash.js +90 -0
  129. package/dist/frontend/discord/slash.js.map +1 -0
  130. package/dist/frontend/inbox.d.ts +17 -0
  131. package/dist/frontend/inbox.js +30 -0
  132. package/dist/frontend/inbox.js.map +1 -0
  133. package/dist/frontend/index.d.ts +8 -0
  134. package/dist/frontend/index.js +6 -0
  135. package/dist/frontend/index.js.map +1 -0
  136. package/dist/frontend/stub/index.d.ts +58 -0
  137. package/dist/frontend/stub/index.js +144 -0
  138. package/dist/frontend/stub/index.js.map +1 -0
  139. package/dist/frontend/types.d.ts +247 -0
  140. package/dist/frontend/types.js +15 -0
  141. package/dist/frontend/types.js.map +1 -0
  142. package/dist/gc/apply.d.ts +26 -0
  143. package/dist/gc/apply.js +48 -0
  144. package/dist/gc/apply.js.map +1 -0
  145. package/dist/gc/canary.d.ts +42 -0
  146. package/dist/gc/canary.js +134 -0
  147. package/dist/gc/canary.js.map +1 -0
  148. package/dist/gc/classify.d.ts +25 -0
  149. package/dist/gc/classify.js +89 -0
  150. package/dist/gc/classify.js.map +1 -0
  151. package/dist/gc/doc-gardening.d.ts +29 -0
  152. package/dist/gc/doc-gardening.js +146 -0
  153. package/dist/gc/doc-gardening.js.map +1 -0
  154. package/dist/gc/frontmatter.d.ts +35 -0
  155. package/dist/gc/frontmatter.js +111 -0
  156. package/dist/gc/frontmatter.js.map +1 -0
  157. package/dist/gc/generator-drift.d.ts +28 -0
  158. package/dist/gc/generator-drift.js +53 -0
  159. package/dist/gc/generator-drift.js.map +1 -0
  160. package/dist/gc/index.d.ts +35 -0
  161. package/dist/gc/index.js +26 -0
  162. package/dist/gc/index.js.map +1 -0
  163. package/dist/gc/quality-update.d.ts +23 -0
  164. package/dist/gc/quality-update.js +69 -0
  165. package/dist/gc/quality-update.js.map +1 -0
  166. package/dist/gc/stub-hits.d.ts +31 -0
  167. package/dist/gc/stub-hits.js +125 -0
  168. package/dist/gc/stub-hits.js.map +1 -0
  169. package/dist/gc/sweep.d.ts +56 -0
  170. package/dist/gc/sweep.js +178 -0
  171. package/dist/gc/sweep.js.map +1 -0
  172. package/dist/gc/types.d.ts +129 -0
  173. package/dist/gc/types.js +26 -0
  174. package/dist/gc/types.js.map +1 -0
  175. package/dist/ground/drift.d.ts +8 -0
  176. package/dist/ground/drift.js +23 -0
  177. package/dist/ground/drift.js.map +1 -0
  178. package/dist/ground/frontmatter.d.ts +20 -0
  179. package/dist/ground/frontmatter.js +49 -0
  180. package/dist/ground/frontmatter.js.map +1 -0
  181. package/dist/ground/glob.d.ts +10 -0
  182. package/dist/ground/glob.js +46 -0
  183. package/dist/ground/glob.js.map +1 -0
  184. package/dist/ground/index.d.ts +14 -0
  185. package/dist/ground/index.js +10 -0
  186. package/dist/ground/index.js.map +1 -0
  187. package/dist/ground/ledgers.d.ts +18 -0
  188. package/dist/ground/ledgers.js +103 -0
  189. package/dist/ground/ledgers.js.map +1 -0
  190. package/dist/ground/manifest.d.ts +10 -0
  191. package/dist/ground/manifest.js +88 -0
  192. package/dist/ground/manifest.js.map +1 -0
  193. package/dist/ground/paths.d.ts +20 -0
  194. package/dist/ground/paths.js +61 -0
  195. package/dist/ground/paths.js.map +1 -0
  196. package/dist/ground/quality-grades.d.ts +11 -0
  197. package/dist/ground/quality-grades.js +98 -0
  198. package/dist/ground/quality-grades.js.map +1 -0
  199. package/dist/ground/schemas.d.ts +306 -0
  200. package/dist/ground/schemas.js +188 -0
  201. package/dist/ground/schemas.js.map +1 -0
  202. package/dist/ground/walk.d.ts +7 -0
  203. package/dist/ground/walk.js +53 -0
  204. package/dist/ground/walk.js.map +1 -0
  205. package/dist/index.d.ts +8 -0
  206. package/dist/index.js +9 -0
  207. package/dist/index.js.map +1 -0
  208. package/dist/init/detect.d.ts +25 -0
  209. package/dist/init/detect.js +336 -0
  210. package/dist/init/detect.js.map +1 -0
  211. package/dist/init/index.d.ts +14 -0
  212. package/dist/init/index.js +9 -0
  213. package/dist/init/index.js.map +1 -0
  214. package/dist/init/init.d.ts +68 -0
  215. package/dist/init/init.js +673 -0
  216. package/dist/init/init.js.map +1 -0
  217. package/dist/init/mapper.d.ts +160 -0
  218. package/dist/init/mapper.js +248 -0
  219. package/dist/init/mapper.js.map +1 -0
  220. package/dist/init/prompts.d.ts +70 -0
  221. package/dist/init/prompts.js +80 -0
  222. package/dist/init/prompts.js.map +1 -0
  223. package/dist/init/secrets.d.ts +18 -0
  224. package/dist/init/secrets.js +76 -0
  225. package/dist/init/secrets.js.map +1 -0
  226. package/dist/init/seed.d.ts +21 -0
  227. package/dist/init/seed.js +75 -0
  228. package/dist/init/seed.js.map +1 -0
  229. package/dist/init/setup-runners.d.ts +17 -0
  230. package/dist/init/setup-runners.js +70 -0
  231. package/dist/init/setup-runners.js.map +1 -0
  232. package/dist/init/types.d.ts +59 -0
  233. package/dist/init/types.js +10 -0
  234. package/dist/init/types.js.map +1 -0
  235. package/dist/init/walker.d.ts +53 -0
  236. package/dist/init/walker.js +460 -0
  237. package/dist/init/walker.js.map +1 -0
  238. package/dist/init/workflow-block.d.ts +34 -0
  239. package/dist/init/workflow-block.js +110 -0
  240. package/dist/init/workflow-block.js.map +1 -0
  241. package/dist/logger.d.ts +3 -0
  242. package/dist/logger.js +23 -0
  243. package/dist/logger.js.map +1 -0
  244. package/dist/mcp/context.d.ts +16 -0
  245. package/dist/mcp/context.js +8 -0
  246. package/dist/mcp/context.js.map +1 -0
  247. package/dist/mcp/errors.d.ts +17 -0
  248. package/dist/mcp/errors.js +23 -0
  249. package/dist/mcp/errors.js.map +1 -0
  250. package/dist/mcp/index.d.ts +10 -0
  251. package/dist/mcp/index.js +7 -0
  252. package/dist/mcp/index.js.map +1 -0
  253. package/dist/mcp/path-allowlist.d.ts +25 -0
  254. package/dist/mcp/path-allowlist.js +66 -0
  255. package/dist/mcp/path-allowlist.js.map +1 -0
  256. package/dist/mcp/result.d.ts +8 -0
  257. package/dist/mcp/result.js +18 -0
  258. package/dist/mcp/result.js.map +1 -0
  259. package/dist/mcp/schemas.d.ts +153 -0
  260. package/dist/mcp/schemas.js +135 -0
  261. package/dist/mcp/schemas.js.map +1 -0
  262. package/dist/mcp/server.d.ts +11 -0
  263. package/dist/mcp/server.js +58 -0
  264. package/dist/mcp/server.js.map +1 -0
  265. package/dist/mcp/telemetry.d.ts +15 -0
  266. package/dist/mcp/telemetry.js +13 -0
  267. package/dist/mcp/telemetry.js.map +1 -0
  268. package/dist/mcp/tools/append.d.ts +8 -0
  269. package/dist/mcp/tools/append.js +33 -0
  270. package/dist/mcp/tools/append.js.map +1 -0
  271. package/dist/mcp/tools/archive.d.ts +8 -0
  272. package/dist/mcp/tools/archive.js +49 -0
  273. package/dist/mcp/tools/archive.js.map +1 -0
  274. package/dist/mcp/tools/ask-operator.d.ts +34 -0
  275. package/dist/mcp/tools/ask-operator.js +93 -0
  276. package/dist/mcp/tools/ask-operator.js.map +1 -0
  277. package/dist/mcp/tools/canonical-for-topic.d.ts +6 -0
  278. package/dist/mcp/tools/canonical-for-topic.js +40 -0
  279. package/dist/mcp/tools/canonical-for-topic.js.map +1 -0
  280. package/dist/mcp/tools/decision-get.d.ts +6 -0
  281. package/dist/mcp/tools/decision-get.js +49 -0
  282. package/dist/mcp/tools/decision-get.js.map +1 -0
  283. package/dist/mcp/tools/decisions-for-symbol.d.ts +7 -0
  284. package/dist/mcp/tools/decisions-for-symbol.js +42 -0
  285. package/dist/mcp/tools/decisions-for-symbol.js.map +1 -0
  286. package/dist/mcp/tools/decisions-in-scope.d.ts +7 -0
  287. package/dist/mcp/tools/decisions-in-scope.js +47 -0
  288. package/dist/mcp/tools/decisions-in-scope.js.map +1 -0
  289. package/dist/mcp/tools/drop-task.d.ts +12 -0
  290. package/dist/mcp/tools/drop-task.js +47 -0
  291. package/dist/mcp/tools/drop-task.js.map +1 -0
  292. package/dist/mcp/tools/get-full.d.ts +7 -0
  293. package/dist/mcp/tools/get-full.js +46 -0
  294. package/dist/mcp/tools/get-full.js.map +1 -0
  295. package/dist/mcp/tools/ground-get.d.ts +7 -0
  296. package/dist/mcp/tools/ground-get.js +80 -0
  297. package/dist/mcp/tools/ground-get.js.map +1 -0
  298. package/dist/mcp/tools/index.d.ts +3 -0
  299. package/dist/mcp/tools/index.js +44 -0
  300. package/dist/mcp/tools/index.js.map +1 -0
  301. package/dist/mcp/tools/invariant-get.d.ts +6 -0
  302. package/dist/mcp/tools/invariant-get.js +49 -0
  303. package/dist/mcp/tools/invariant-get.js.map +1 -0
  304. package/dist/mcp/tools/invariants-in-scope.d.ts +7 -0
  305. package/dist/mcp/tools/invariants-in-scope.js +65 -0
  306. package/dist/mcp/tools/invariants-in-scope.js.map +1 -0
  307. package/dist/mcp/tools/query-history.d.ts +9 -0
  308. package/dist/mcp/tools/query-history.js +33 -0
  309. package/dist/mcp/tools/query-history.js.map +1 -0
  310. package/dist/mcp/tools/record-decision.d.ts +14 -0
  311. package/dist/mcp/tools/record-decision.js +101 -0
  312. package/dist/mcp/tools/record-decision.js.map +1 -0
  313. package/dist/mcp/tools/record-run-event.d.ts +10 -0
  314. package/dist/mcp/tools/record-run-event.js +28 -0
  315. package/dist/mcp/tools/record-run-event.js.map +1 -0
  316. package/dist/mcp/tools/search.d.ts +9 -0
  317. package/dist/mcp/tools/search.js +165 -0
  318. package/dist/mcp/tools/search.js.map +1 -0
  319. package/dist/mcp/tools/supersedes-chain.d.ts +6 -0
  320. package/dist/mcp/tools/supersedes-chain.js +66 -0
  321. package/dist/mcp/tools/supersedes-chain.js.map +1 -0
  322. package/dist/mcp/tools/timeline.d.ts +9 -0
  323. package/dist/mcp/tools/timeline.js +65 -0
  324. package/dist/mcp/tools/timeline.js.map +1 -0
  325. package/dist/mcp/tools/types.d.ts +9 -0
  326. package/dist/mcp/tools/types.js +2 -0
  327. package/dist/mcp/tools/types.js.map +1 -0
  328. package/dist/mirror/clone.d.ts +6 -0
  329. package/dist/mirror/clone.js +48 -0
  330. package/dist/mirror/clone.js.map +1 -0
  331. package/dist/mirror/dirty-overlap.d.ts +13 -0
  332. package/dist/mirror/dirty-overlap.js +77 -0
  333. package/dist/mirror/dirty-overlap.js.map +1 -0
  334. package/dist/mirror/index.d.ts +7 -0
  335. package/dist/mirror/index.js +7 -0
  336. package/dist/mirror/index.js.map +1 -0
  337. package/dist/mirror/paths.d.ts +18 -0
  338. package/dist/mirror/paths.js +45 -0
  339. package/dist/mirror/paths.js.map +1 -0
  340. package/dist/mirror/push.d.ts +9 -0
  341. package/dist/mirror/push.js +27 -0
  342. package/dist/mirror/push.js.map +1 -0
  343. package/dist/mirror/state.d.ts +4 -0
  344. package/dist/mirror/state.js +36 -0
  345. package/dist/mirror/state.js.map +1 -0
  346. package/dist/mirror/sync.d.ts +9 -0
  347. package/dist/mirror/sync.js +33 -0
  348. package/dist/mirror/sync.js.map +1 -0
  349. package/dist/mirror/types.d.ts +77 -0
  350. package/dist/mirror/types.js +2 -0
  351. package/dist/mirror/types.js.map +1 -0
  352. package/dist/orchestrator/activity-summarizer.d.ts +33 -0
  353. package/dist/orchestrator/activity-summarizer.js +120 -0
  354. package/dist/orchestrator/activity-summarizer.js.map +1 -0
  355. package/dist/orchestrator/inbox.d.ts +78 -0
  356. package/dist/orchestrator/inbox.js +115 -0
  357. package/dist/orchestrator/inbox.js.map +1 -0
  358. package/dist/orchestrator/index.d.ts +9 -0
  359. package/dist/orchestrator/index.js +7 -0
  360. package/dist/orchestrator/index.js.map +1 -0
  361. package/dist/orchestrator/orchestrator.d.ts +154 -0
  362. package/dist/orchestrator/orchestrator.js +2437 -0
  363. package/dist/orchestrator/orchestrator.js.map +1 -0
  364. package/dist/orchestrator/prompt.d.ts +19 -0
  365. package/dist/orchestrator/prompt.js +50 -0
  366. package/dist/orchestrator/prompt.js.map +1 -0
  367. package/dist/orchestrator/queue.d.ts +21 -0
  368. package/dist/orchestrator/queue.js +80 -0
  369. package/dist/orchestrator/queue.js.map +1 -0
  370. package/dist/orchestrator/run-log.d.ts +53 -0
  371. package/dist/orchestrator/run-log.js +92 -0
  372. package/dist/orchestrator/run-log.js.map +1 -0
  373. package/dist/orchestrator/runner.d.ts +56 -0
  374. package/dist/orchestrator/runner.js +172 -0
  375. package/dist/orchestrator/runner.js.map +1 -0
  376. package/dist/orchestrator/tool-digest.d.ts +35 -0
  377. package/dist/orchestrator/tool-digest.js +116 -0
  378. package/dist/orchestrator/tool-digest.js.map +1 -0
  379. package/dist/orchestrator/types.d.ts +263 -0
  380. package/dist/orchestrator/types.js +2 -0
  381. package/dist/orchestrator/types.js.map +1 -0
  382. package/dist/orchestrator/workspace.d.ts +21 -0
  383. package/dist/orchestrator/workspace.js +31 -0
  384. package/dist/orchestrator/workspace.js.map +1 -0
  385. package/dist/profiles/index.d.ts +3 -0
  386. package/dist/profiles/index.js +3 -0
  387. package/dist/profiles/index.js.map +1 -0
  388. package/dist/profiles/registry.d.ts +5 -0
  389. package/dist/profiles/registry.js +31 -0
  390. package/dist/profiles/registry.js.map +1 -0
  391. package/dist/profiles/types.d.ts +48 -0
  392. package/dist/profiles/types.js +11 -0
  393. package/dist/profiles/types.js.map +1 -0
  394. package/dist/profiles/unknown.d.ts +9 -0
  395. package/dist/profiles/unknown.js +17 -0
  396. package/dist/profiles/unknown.js.map +1 -0
  397. package/dist/reviewer/index.d.ts +6 -0
  398. package/dist/reviewer/index.js +5 -0
  399. package/dist/reviewer/index.js.map +1 -0
  400. package/dist/reviewer/prompt.d.ts +11 -0
  401. package/dist/reviewer/prompt.js +132 -0
  402. package/dist/reviewer/prompt.js.map +1 -0
  403. package/dist/reviewer/remediation.d.ts +15 -0
  404. package/dist/reviewer/remediation.js +61 -0
  405. package/dist/reviewer/remediation.js.map +1 -0
  406. package/dist/reviewer/reviewer.d.ts +9 -0
  407. package/dist/reviewer/reviewer.js +89 -0
  408. package/dist/reviewer/reviewer.js.map +1 -0
  409. package/dist/reviewer/schema.d.ts +45 -0
  410. package/dist/reviewer/schema.js +43 -0
  411. package/dist/reviewer/schema.js.map +1 -0
  412. package/dist/reviewer/types.d.ts +74 -0
  413. package/dist/reviewer/types.js +14 -0
  414. package/dist/reviewer/types.js.map +1 -0
  415. package/dist/sensors/attestation.d.ts +44 -0
  416. package/dist/sensors/attestation.js +262 -0
  417. package/dist/sensors/attestation.js.map +1 -0
  418. package/dist/sensors/catalog.d.ts +41 -0
  419. package/dist/sensors/catalog.js +123 -0
  420. package/dist/sensors/catalog.js.map +1 -0
  421. package/dist/sensors/decisions.d.ts +30 -0
  422. package/dist/sensors/decisions.js +393 -0
  423. package/dist/sensors/decisions.js.map +1 -0
  424. package/dist/sensors/diff.d.ts +27 -0
  425. package/dist/sensors/diff.js +148 -0
  426. package/dist/sensors/diff.js.map +1 -0
  427. package/dist/sensors/index.d.ts +13 -0
  428. package/dist/sensors/index.js +9 -0
  429. package/dist/sensors/index.js.map +1 -0
  430. package/dist/sensors/remediation.d.ts +20 -0
  431. package/dist/sensors/remediation.js +65 -0
  432. package/dist/sensors/remediation.js.map +1 -0
  433. package/dist/sensors/runner.d.ts +44 -0
  434. package/dist/sensors/runner.js +95 -0
  435. package/dist/sensors/runner.js.map +1 -0
  436. package/dist/sensors/structural.d.ts +30 -0
  437. package/dist/sensors/structural.js +204 -0
  438. package/dist/sensors/structural.js.map +1 -0
  439. package/dist/sensors/stub-catalog.d.ts +39 -0
  440. package/dist/sensors/stub-catalog.js +115 -0
  441. package/dist/sensors/stub-catalog.js.map +1 -0
  442. package/dist/sensors/types.d.ts +135 -0
  443. package/dist/sensors/types.js +14 -0
  444. package/dist/sensors/types.js.map +1 -0
  445. package/dist/tier0/classify.d.ts +5 -0
  446. package/dist/tier0/classify.js +91 -0
  447. package/dist/tier0/classify.js.map +1 -0
  448. package/dist/tier0/index.d.ts +3 -0
  449. package/dist/tier0/index.js +3 -0
  450. package/dist/tier0/index.js.map +1 -0
  451. package/dist/tier0/ollama.d.ts +22 -0
  452. package/dist/tier0/ollama.js +63 -0
  453. package/dist/tier0/ollama.js.map +1 -0
  454. package/dist/tier0/types.d.ts +24 -0
  455. package/dist/tier0/types.js +7 -0
  456. package/dist/tier0/types.js.map +1 -0
  457. package/dist/tightener/index.d.ts +4 -0
  458. package/dist/tightener/index.js +4 -0
  459. package/dist/tightener/index.js.map +1 -0
  460. package/dist/tightener/prompt.d.ts +3 -0
  461. package/dist/tightener/prompt.js +67 -0
  462. package/dist/tightener/prompt.js.map +1 -0
  463. package/dist/tightener/schema.d.ts +68 -0
  464. package/dist/tightener/schema.js +44 -0
  465. package/dist/tightener/schema.js.map +1 -0
  466. package/dist/tightener/tighten.d.ts +2 -0
  467. package/dist/tightener/tighten.js +66 -0
  468. package/dist/tightener/tighten.js.map +1 -0
  469. package/dist/tightener/types.d.ts +74 -0
  470. package/dist/tightener/types.js +6 -0
  471. package/dist/tightener/types.js.map +1 -0
  472. package/dist/uat/bundle.d.ts +68 -0
  473. package/dist/uat/bundle.js +168 -0
  474. package/dist/uat/bundle.js.map +1 -0
  475. package/dist/uat/index.d.ts +15 -0
  476. package/dist/uat/index.js +10 -0
  477. package/dist/uat/index.js.map +1 -0
  478. package/dist/uat/persistent.d.ts +64 -0
  479. package/dist/uat/persistent.js +206 -0
  480. package/dist/uat/persistent.js.map +1 -0
  481. package/dist/uat/probes/cli.d.ts +11 -0
  482. package/dist/uat/probes/cli.js +107 -0
  483. package/dist/uat/probes/cli.js.map +1 -0
  484. package/dist/uat/probes/http.d.ts +12 -0
  485. package/dist/uat/probes/http.js +139 -0
  486. package/dist/uat/probes/http.js.map +1 -0
  487. package/dist/uat/probes/index.d.ts +21 -0
  488. package/dist/uat/probes/index.js +30 -0
  489. package/dist/uat/probes/index.js.map +1 -0
  490. package/dist/uat/probes/integration.d.ts +18 -0
  491. package/dist/uat/probes/integration.js +188 -0
  492. package/dist/uat/probes/integration.js.map +1 -0
  493. package/dist/uat/probes/sql/config.d.ts +14 -0
  494. package/dist/uat/probes/sql/config.js +57 -0
  495. package/dist/uat/probes/sql/config.js.map +1 -0
  496. package/dist/uat/probes/sql/index.d.ts +29 -0
  497. package/dist/uat/probes/sql/index.js +43 -0
  498. package/dist/uat/probes/sql/index.js.map +1 -0
  499. package/dist/uat/probes/sql/mysql.d.ts +12 -0
  500. package/dist/uat/probes/sql/mysql.js +96 -0
  501. package/dist/uat/probes/sql/mysql.js.map +1 -0
  502. package/dist/uat/probes/sql/pg.d.ts +20 -0
  503. package/dist/uat/probes/sql/pg.js +102 -0
  504. package/dist/uat/probes/sql/pg.js.map +1 -0
  505. package/dist/uat/probes/sql/sqlite.d.ts +9 -0
  506. package/dist/uat/probes/sql/sqlite.js +58 -0
  507. package/dist/uat/probes/sql/sqlite.js.map +1 -0
  508. package/dist/uat/probes/sql/types.d.ts +46 -0
  509. package/dist/uat/probes/sql/types.js +10 -0
  510. package/dist/uat/probes/sql/types.js.map +1 -0
  511. package/dist/uat/probes/sql.d.ts +9 -0
  512. package/dist/uat/probes/sql.js +119 -0
  513. package/dist/uat/probes/sql.js.map +1 -0
  514. package/dist/uat/probes/ui.d.ts +19 -0
  515. package/dist/uat/probes/ui.js +244 -0
  516. package/dist/uat/probes/ui.js.map +1 -0
  517. package/dist/uat/prompt.d.ts +10 -0
  518. package/dist/uat/prompt.js +85 -0
  519. package/dist/uat/prompt.js.map +1 -0
  520. package/dist/uat/question.d.ts +50 -0
  521. package/dist/uat/question.js +139 -0
  522. package/dist/uat/question.js.map +1 -0
  523. package/dist/uat/rejection.d.ts +58 -0
  524. package/dist/uat/rejection.js +163 -0
  525. package/dist/uat/rejection.js.map +1 -0
  526. package/dist/uat/runner.d.ts +6 -0
  527. package/dist/uat/runner.js +96 -0
  528. package/dist/uat/runner.js.map +1 -0
  529. package/dist/uat/schema.d.ts +322 -0
  530. package/dist/uat/schema.js +189 -0
  531. package/dist/uat/schema.js.map +1 -0
  532. package/dist/uat/types.d.ts +268 -0
  533. package/dist/uat/types.js +18 -0
  534. package/dist/uat/types.js.map +1 -0
  535. package/dist/uat/uat.d.ts +89 -0
  536. package/dist/uat/uat.js +256 -0
  537. package/dist/uat/uat.js.map +1 -0
  538. package/dist/voice/index.d.ts +4 -0
  539. package/dist/voice/index.js +4 -0
  540. package/dist/voice/index.js.map +1 -0
  541. package/dist/voice/model.d.ts +23 -0
  542. package/dist/voice/model.js +46 -0
  543. package/dist/voice/model.js.map +1 -0
  544. package/dist/voice/pipe.d.ts +9 -0
  545. package/dist/voice/pipe.js +47 -0
  546. package/dist/voice/pipe.js.map +1 -0
  547. package/dist/voice/transcribe.d.ts +3 -0
  548. package/dist/voice/transcribe.js +43 -0
  549. package/dist/voice/transcribe.js.map +1 -0
  550. package/dist/voice/types.d.ts +26 -0
  551. package/dist/voice/types.js +9 -0
  552. package/dist/voice/types.js.map +1 -0
  553. package/dist/watch/daemon.d.ts +21 -0
  554. package/dist/watch/daemon.js +143 -0
  555. package/dist/watch/daemon.js.map +1 -0
  556. package/dist/watch/index.d.ts +4 -0
  557. package/dist/watch/index.js +3 -0
  558. package/dist/watch/index.js.map +1 -0
  559. package/dist/watch/regenerate.d.ts +25 -0
  560. package/dist/watch/regenerate.js +51 -0
  561. package/dist/watch/regenerate.js.map +1 -0
  562. package/package.json +75 -0
@@ -0,0 +1,301 @@
1
+ /**
2
+ * Writers for the invariant file + the generated sensor / E2E.
3
+ *
4
+ * The agent supplies content; the harness mints the id, materializes the
5
+ * frontmatter, and emits the boilerplate around the regex / E2E so the
6
+ * surface is uniform regardless of which agent wrote which invariant.
7
+ */
8
+ import { mkdirSync, writeFileSync } from "node:fs";
9
+ import { dirname, join, resolve } from "node:path";
10
+ import { stringify as stringifyYaml } from "yaml";
11
+ import { invariantsDir } from "../ground/paths.js";
12
+ /**
13
+ * Materialize V<N>.md + the matching enforcement artifact. Returns
14
+ * repo-relative paths for both. Idempotent at the *path* level — if a file
15
+ * already exists at the target path the writer overwrites; the id allocator
16
+ * is responsible for picking a fresh id.
17
+ */
18
+ export function writeInvariantArtifacts(args) {
19
+ const invariantPath = writeInvariantFile(args);
20
+ const sensorPath = writeEnforcement(args);
21
+ return { invariant_path: invariantPath, sensor_path: sensorPath };
22
+ }
23
+ function writeInvariantFile(args) {
24
+ const dir = invariantsDir(args.repoRoot);
25
+ mkdirSync(dir, { recursive: true });
26
+ const filename = `${args.invariantId}.md`;
27
+ const abs = join(dir, filename);
28
+ const rel = `.harness/ground/invariants/${filename}`;
29
+ const sensorRel = predictSensorRelPath(args);
30
+ const frontmatter = {
31
+ id: args.invariantId,
32
+ title: args.output.title,
33
+ type: "invariant",
34
+ status: "active",
35
+ audience: "dual",
36
+ generated: new Date().toISOString(),
37
+ "verified-at": new Date().toISOString(),
38
+ source_run: args.runId,
39
+ introduced_for_bug: args.output.introduced_for_bug,
40
+ sensor: sensorRel,
41
+ naming_convention: `${args.invariantId.toLowerCase()}_${args.output.slug}`,
42
+ ...(args.output.source_decision_ids && args.output.source_decision_ids.length > 0
43
+ ? { source_decisions: args.output.source_decision_ids }
44
+ : {}),
45
+ };
46
+ const yaml = stringifyYaml(frontmatter);
47
+ const body = ensureTrailingNewline(args.output.body_markdown.trim());
48
+ const fileContent = `---\n${yaml}---\n\n# ${args.invariantId} — ${args.output.title}\n\n${body}\n\n## Enforcement\n\nThis invariant is enforced by [\`${sensorRel}\`](../../../${sensorRel}).\n`;
49
+ writeFileSync(abs, fileContent, "utf8");
50
+ return rel;
51
+ }
52
+ /**
53
+ * Compute what the sensor / E2E path WILL be, before writing it. Used by
54
+ * writeInvariantFile to embed the relative link inside the invariant
55
+ * markdown body.
56
+ */
57
+ function predictSensorRelPath(args) {
58
+ const kind = args.output.enforcement.kind;
59
+ if (kind === "regex_sensor") {
60
+ const filename = `check-${args.invariantId.toLowerCase()}-${args.output.slug}.ts`;
61
+ return `harness/scripts/${filename}`;
62
+ }
63
+ if (kind === "named_e2e") {
64
+ const customPath = args.output.enforcement.e2e_path;
65
+ return isValidE2eRel(customPath)
66
+ ? customPath
67
+ : `e2e/${args.invariantId}_${args.output.slug}.spec.ts`;
68
+ }
69
+ throw new Error(`unknown enforcement kind: ${kind}`);
70
+ }
71
+ function writeEnforcement(args) {
72
+ const kind = args.output.enforcement.kind;
73
+ if (kind === "regex_sensor")
74
+ return writeRegexSensor(args);
75
+ if (kind === "named_e2e")
76
+ return writeE2eStub(args);
77
+ // Defensive: schema-checked, but TS exhaustive switch guard.
78
+ throw new Error(`unknown enforcement kind: ${kind}`);
79
+ }
80
+ function writeRegexSensor(args) {
81
+ const { invariantId, output } = args;
82
+ const slug = output.slug;
83
+ const filename = `check-${invariantId.toLowerCase()}-${slug}.ts`;
84
+ const rel = `harness/scripts/${filename}`;
85
+ const abs = resolve(args.repoRoot, rel);
86
+ mkdirSync(dirname(abs), { recursive: true });
87
+ const regex = output.enforcement.regex ?? "(?!.*)"; // never matches
88
+ const targetGlobs = output.enforcement.target_globs ?? ["**/*.ts"];
89
+ const language = output.enforcement.language ?? "typescript";
90
+ const failureMessage = output.enforcement.failure_message ??
91
+ `${invariantId} violation — see .harness/ground/invariants/${invariantId}.md`;
92
+ const escapedRegex = JSON.stringify(regex);
93
+ const escapedGlobs = JSON.stringify(targetGlobs);
94
+ const escapedMessage = JSON.stringify(failureMessage);
95
+ const content = `#!/usr/bin/env tsx
96
+ /**
97
+ * Sensor for invariant ${invariantId} — ${output.title}.
98
+ *
99
+ * Generated by the backprop subagent during run ${args.runId}.
100
+ * Source: .harness/ground/invariants/${invariantId}.md
101
+ *
102
+ * Mechanically scans repo files matching the target globs for a regex that
103
+ * indicates an invariant violation. Exits 0 when no hits, 1 on any hit.
104
+ *
105
+ * Per PRIMER §13: "every fix introduces a permanent invariant" — touching
106
+ * this file requires either fixing the regression OR superseding the
107
+ * invariant via a new V-id.
108
+ */
109
+
110
+ import { type Dirent, readdirSync, readFileSync, statSync } from "node:fs";
111
+ import { relative, resolve } from "node:path";
112
+
113
+ const REGEX = new RegExp(${escapedRegex}, "gm");
114
+ const TARGET_GLOBS = ${escapedGlobs} as const;
115
+ const LANGUAGE = ${JSON.stringify(language)};
116
+ const FAILURE_MESSAGE = ${escapedMessage};
117
+
118
+ const SKIP_DIRS = new Set([
119
+ ".git",
120
+ "node_modules",
121
+ ".pnpm-store",
122
+ "dist",
123
+ "build",
124
+ ".next",
125
+ ".turbo",
126
+ ".cache",
127
+ ".archive",
128
+ "coverage",
129
+ ]);
130
+
131
+ const LANGUAGE_EXTS: Record<string, readonly string[]> = {
132
+ typescript: [".ts", ".tsx", ".cts", ".mts"],
133
+ javascript: [".js", ".jsx", ".cjs", ".mjs"],
134
+ python: [".py"],
135
+ ruby: [".rb"],
136
+ go: [".go"],
137
+ rust: [".rs"],
138
+ sql: [".sql"],
139
+ };
140
+
141
+ function compileGlob(glob: string): RegExp {
142
+ let re = "^";
143
+ for (let i = 0; i < glob.length; i++) {
144
+ const c = glob[i];
145
+ if (c === "*") {
146
+ if (glob[i + 1] === "*") {
147
+ i += 1;
148
+ if (glob[i + 1] === "/") {
149
+ i += 1;
150
+ re += "(?:.*/)?";
151
+ } else {
152
+ re += ".*";
153
+ }
154
+ } else {
155
+ re += "[^/]*";
156
+ }
157
+ } else if (c === "?") {
158
+ re += "[^/]";
159
+ } else if (c !== undefined && /[.+^\${}()|[\\]\\\\]/.test(c)) {
160
+ re += \`\\\\\${c}\`;
161
+ } else {
162
+ re += c ?? "";
163
+ }
164
+ }
165
+ re += "$";
166
+ return new RegExp(re);
167
+ }
168
+
169
+ const GLOB_RE = TARGET_GLOBS.map(compileGlob);
170
+
171
+ function matchesGlobs(rel: string): boolean {
172
+ return GLOB_RE.some((g) => g.test(rel));
173
+ }
174
+
175
+ function lineOf(text: string, charIndex: number): number {
176
+ let line = 1;
177
+ for (let i = 0; i < charIndex && i < text.length; i++) {
178
+ if (text.charCodeAt(i) === 10) line += 1;
179
+ }
180
+ return line;
181
+ }
182
+
183
+ function walk(repoRoot: string): string[] {
184
+ const out: string[] = [];
185
+ const stack: string[] = [repoRoot];
186
+ while (stack.length > 0) {
187
+ const dir = stack.pop();
188
+ if (dir === undefined) break;
189
+ let entries: Dirent[];
190
+ try {
191
+ entries = readdirSync(dir, { withFileTypes: true, encoding: "utf8" });
192
+ } catch {
193
+ continue;
194
+ }
195
+ for (const entry of entries) {
196
+ const abs = resolve(dir, entry.name);
197
+ if (entry.isDirectory()) {
198
+ if (SKIP_DIRS.has(entry.name)) continue;
199
+ stack.push(abs);
200
+ } else if (entry.isFile()) {
201
+ out.push(relative(repoRoot, abs).replace(/\\\\/g, "/"));
202
+ }
203
+ }
204
+ }
205
+ out.sort();
206
+ return out;
207
+ }
208
+
209
+ function detectLanguage(rel: string): string | undefined {
210
+ const lower = rel.toLowerCase();
211
+ for (const [lang, exts] of Object.entries(LANGUAGE_EXTS)) {
212
+ if (exts.some((e) => lower.endsWith(e))) return lang;
213
+ }
214
+ return undefined;
215
+ }
216
+
217
+ function main(): void {
218
+ const repoRoot = process.argv[2] ?? process.cwd();
219
+ void statSync(repoRoot); // throws if missing
220
+ const files = walk(repoRoot).filter((rel) => matchesGlobs(rel) && detectLanguage(rel) === LANGUAGE);
221
+ const hits: { path: string; line: number; matched: string }[] = [];
222
+ for (const rel of files) {
223
+ let content: string;
224
+ try {
225
+ content = readFileSync(resolve(repoRoot, rel), "utf8");
226
+ } catch {
227
+ continue;
228
+ }
229
+ REGEX.lastIndex = 0;
230
+ let m: RegExpExecArray | null;
231
+ while ((m = REGEX.exec(content)) !== null) {
232
+ hits.push({
233
+ path: rel,
234
+ line: lineOf(content, m.index),
235
+ matched: m[0].slice(0, 200),
236
+ });
237
+ if (REGEX.lastIndex === m.index) REGEX.lastIndex += 1;
238
+ }
239
+ }
240
+ if (hits.length === 0) {
241
+ console.log(\`${invariantId}: ok — 0 hits across \${files.length} files\`);
242
+ process.exit(0);
243
+ }
244
+ console.error(\`${invariantId}: FAIL — \${hits.length} hit(s)\`);
245
+ console.error(\` \${FAILURE_MESSAGE}\`);
246
+ for (const h of hits) {
247
+ console.error(\` \${h.path}:\${h.line} → \${h.matched}\`);
248
+ }
249
+ process.exit(1);
250
+ }
251
+
252
+ main();
253
+ `;
254
+ writeFileSync(abs, content, "utf8");
255
+ return rel;
256
+ }
257
+ function writeE2eStub(args) {
258
+ const { invariantId, output } = args;
259
+ const customPath = output.enforcement.e2e_path;
260
+ // Default: e2e/V<N>_<slug>.spec.ts. Honor the agent-supplied path only if it
261
+ // is repo-relative and ends in .spec.ts; otherwise fall back to default.
262
+ const defaultRel = `e2e/${invariantId}_${output.slug}.spec.ts`;
263
+ const rel = isValidE2eRel(customPath) ? customPath : defaultRel;
264
+ const abs = resolve(args.repoRoot, rel);
265
+ mkdirSync(dirname(abs), { recursive: true });
266
+ const content = `/**
267
+ * E2E case for invariant ${invariantId} — ${output.title}.
268
+ *
269
+ * Generated by the backprop subagent during run ${args.runId}.
270
+ * Source: .harness/ground/invariants/${invariantId}.md
271
+ *
272
+ * STUB — flesh out with the project's E2E harness. The presence of this
273
+ * file is itself a contract: removing it without superseding ${invariantId}
274
+ * is an invariant violation.
275
+ */
276
+
277
+ // TODO: import the project's E2E harness and write a case that asserts
278
+ // ${output.title.replace(/\*/g, "")}.
279
+ //
280
+ // The failure mode this guards: ${output.introduced_for_bug.replace(/\n/g, " ").slice(0, 200)}
281
+ //
282
+ // Naming convention: this file's path encodes the invariant id (${invariantId})
283
+ // per PRIMER §13.1. Cite the id in any commit that touches it.
284
+ export const ${invariantId.toLowerCase()}_invariant = ${JSON.stringify(invariantId)};
285
+ `;
286
+ writeFileSync(abs, content, "utf8");
287
+ return rel;
288
+ }
289
+ function isValidE2eRel(p) {
290
+ if (typeof p !== "string" || p.length === 0)
291
+ return false;
292
+ if (p.startsWith("/") || p.startsWith(".."))
293
+ return false;
294
+ if (!p.endsWith(".spec.ts") && !p.endsWith(".spec.tsx"))
295
+ return false;
296
+ return true;
297
+ }
298
+ function ensureTrailingNewline(s) {
299
+ return s.endsWith("\n") ? s : `${s}\n`;
300
+ }
301
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/backprop/writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Claude subprocess error classification.
3
+ *
4
+ * The CLI surfaces rate-limit / overload / auth failures via stderr +
5
+ * non-zero exit. Classifying lets the orchestrator distinguish:
6
+ * - `rate_limit` / `overloaded` → pause dispatch after N consecutive,
7
+ * don't burn the operator's coding-plan quota on doomed retries
8
+ * - `auth` → stop trying immediately + page operator
9
+ * - `other` → ordinary failure, dispatch normally
10
+ *
11
+ * Used by both `claude/runner.ts` (one-shot calls) and
12
+ * `orchestrator/runner.ts` (stream-json implementer runs).
13
+ */
14
+ export type ClaudeErrorKind = "rate_limit" | "overloaded" | "auth" | "other";
15
+ export declare class ClaudeError extends Error {
16
+ readonly kind: ClaudeErrorKind;
17
+ readonly exitCode: number | undefined;
18
+ readonly stderr: string | undefined;
19
+ constructor(args: {
20
+ message: string;
21
+ kind: ClaudeErrorKind;
22
+ exitCode?: number | null;
23
+ stderr?: string;
24
+ });
25
+ }
26
+ export declare function classifyClaudeError(args: {
27
+ message: string;
28
+ exitCode?: number | null;
29
+ stderr?: string;
30
+ }): ClaudeErrorKind;
31
+ /** True when the kind warrants a dispatch pause (vs a per-task fail). */
32
+ export declare function isQuotaKind(kind: ClaudeErrorKind): boolean;
33
+ export declare function asClaudeError(err: unknown, fallbackStderr?: string): ClaudeError;
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Claude subprocess error classification.
3
+ *
4
+ * The CLI surfaces rate-limit / overload / auth failures via stderr +
5
+ * non-zero exit. Classifying lets the orchestrator distinguish:
6
+ * - `rate_limit` / `overloaded` → pause dispatch after N consecutive,
7
+ * don't burn the operator's coding-plan quota on doomed retries
8
+ * - `auth` → stop trying immediately + page operator
9
+ * - `other` → ordinary failure, dispatch normally
10
+ *
11
+ * Used by both `claude/runner.ts` (one-shot calls) and
12
+ * `orchestrator/runner.ts` (stream-json implementer runs).
13
+ */
14
+ export class ClaudeError extends Error {
15
+ kind;
16
+ exitCode;
17
+ stderr;
18
+ constructor(args) {
19
+ super(args.message);
20
+ this.name = "ClaudeError";
21
+ this.kind = args.kind;
22
+ this.exitCode =
23
+ typeof args.exitCode === "number" ? args.exitCode : undefined;
24
+ this.stderr = args.stderr;
25
+ }
26
+ }
27
+ const RATE_LIMIT_RE = /rate[\s_-]?limit|\b429\b|too many requests|usage_limit/i;
28
+ const OVERLOADED_RE = /overloaded|\b529\b|temporarily unavailable|service.?unavailable|\b503\b/i;
29
+ const AUTH_RE = /unauthorized|forbidden|\b401\b|\b403\b|authentication|please[\s_-]+log[\s_-]?in|not[\s_-]+authenticated|invalid[\s_-]+api[\s_-]+key|api[\s_-]+key[\s_-]+expired|credit[\s_-]+balance[\s_-]+is[\s_-]+too[\s_-]+low/i;
30
+ export function classifyClaudeError(args) {
31
+ const text = `${args.message}\n${args.stderr ?? ""}`;
32
+ if (RATE_LIMIT_RE.test(text))
33
+ return "rate_limit";
34
+ if (OVERLOADED_RE.test(text))
35
+ return "overloaded";
36
+ if (AUTH_RE.test(text))
37
+ return "auth";
38
+ return "other";
39
+ }
40
+ /** True when the kind warrants a dispatch pause (vs a per-task fail). */
41
+ export function isQuotaKind(kind) {
42
+ return kind === "rate_limit" || kind === "overloaded";
43
+ }
44
+ export function asClaudeError(err, fallbackStderr) {
45
+ if (err instanceof ClaudeError)
46
+ return err;
47
+ const message = err instanceof Error ? err.message : String(err);
48
+ const kind = classifyClaudeError({
49
+ message,
50
+ ...(fallbackStderr !== undefined ? { stderr: fallbackStderr } : {}),
51
+ });
52
+ return new ClaudeError({
53
+ message,
54
+ kind,
55
+ ...(fallbackStderr !== undefined ? { stderr: fallbackStderr } : {}),
56
+ });
57
+ }
58
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/claude/error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,CAAkB;IACtB,QAAQ,CAAqB;IAC7B,MAAM,CAAqB;IAEpC,YAAY,IAKX;QACC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ;YACX,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,aAAa,GAAG,yDAAyD,CAAC;AAChF,MAAM,aAAa,GAAG,0EAA0E,CAAC;AACjG,MAAM,OAAO,GACX,oNAAoN,CAAC;AAEvN,MAAM,UAAU,mBAAmB,CAAC,IAInC;IACC,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;IACrD,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,YAAY,CAAC;IAClD,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,YAAY,CAAC;IAClD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACtC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,WAAW,CAAC,IAAqB;IAC/C,OAAO,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,YAAY,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAY,EAAE,cAAuB;IACjE,IAAI,GAAG,YAAY,WAAW;QAAE,OAAO,GAAG,CAAC;IAC3C,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,mBAAmB,CAAC;QAC/B,OAAO;QACP,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC,CAAC;IACH,OAAO,IAAI,WAAW,CAAC;QACrB,OAAO;QACP,IAAI;QACJ,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { claudeIsAvailable, runClaude } from "./runner.js";
2
+ export type { ClaudeTier, ClaudeUsage, RunClaudeOptions, RunClaudeResult, } from "./types.js";
3
+ export { asClaudeError, ClaudeError, classifyClaudeError, isQuotaKind, type ClaudeErrorKind, } from "./error.js";
@@ -0,0 +1,3 @@
1
+ export { claudeIsAvailable, runClaude } from "./runner.js";
2
+ export { asClaudeError, ClaudeError, classifyClaudeError, isQuotaKind, } from "./error.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/claude/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAO3D,OAAO,EACL,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,WAAW,GAEZ,MAAM,YAAY,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { RunClaudeOptions, RunClaudeResult } from "./types.js";
2
+ /** Returns true when `claude --version` succeeds. Used at startup + smoke. */
3
+ export declare function claudeIsAvailable(): boolean;
4
+ /**
5
+ * Run a single non-interactive Claude Code call via subprocess.
6
+ *
7
+ * Auth path: relies on the operator's existing Claude Code login (OAuth /
8
+ * keychain). No `--bare`, no `ANTHROPIC_API_KEY`. The whole point is to use
9
+ * the operator's coding-plan subscription quota per L42.
10
+ */
11
+ export declare function runClaude(opts: RunClaudeOptions): Promise<RunClaudeResult>;
@@ -0,0 +1,132 @@
1
+ import { spawn, spawnSync } from "node:child_process";
2
+ import { logger } from "../logger.js";
3
+ import { ClaudeError, classifyClaudeError } from "./error.js";
4
+ const log = logger("claude.runner");
5
+ /** Tier → model alias passed to `claude --model`. */
6
+ const TIER_MODEL = {
7
+ haiku: "haiku",
8
+ sonnet: "sonnet",
9
+ opus: "opus",
10
+ };
11
+ /** Returns true when `claude --version` succeeds. Used at startup + smoke. */
12
+ export function claudeIsAvailable() {
13
+ try {
14
+ const result = spawnSync("claude", ["--version"], { encoding: "utf8" });
15
+ return result.status === 0;
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ /**
22
+ * Run a single non-interactive Claude Code call via subprocess.
23
+ *
24
+ * Auth path: relies on the operator's existing Claude Code login (OAuth /
25
+ * keychain). No `--bare`, no `ANTHROPIC_API_KEY`. The whole point is to use
26
+ * the operator's coding-plan subscription quota per L42.
27
+ */
28
+ export async function runClaude(opts) {
29
+ const model = TIER_MODEL[opts.tier];
30
+ const args = [
31
+ "--print",
32
+ "--output-format",
33
+ "json",
34
+ "--no-session-persistence",
35
+ "--model",
36
+ model,
37
+ ];
38
+ if (opts.system !== undefined) {
39
+ args.push("--system-prompt", opts.system);
40
+ }
41
+ if (opts.jsonSchema !== undefined) {
42
+ args.push("--json-schema", JSON.stringify(opts.jsonSchema));
43
+ }
44
+ if (opts.extraArgs && opts.extraArgs.length > 0) {
45
+ args.push(...opts.extraArgs);
46
+ }
47
+ const startedAt = Date.now();
48
+ const ctrl = new AbortController();
49
+ const timeoutMs = opts.timeoutMs ?? 120_000;
50
+ const timer = setTimeout(() => ctrl.abort(), timeoutMs);
51
+ return new Promise((resolve, reject) => {
52
+ const child = spawn("claude", args, {
53
+ cwd: opts.cwd ?? process.cwd(),
54
+ stdio: ["pipe", "pipe", "pipe"],
55
+ signal: ctrl.signal,
56
+ });
57
+ const stdoutChunks = [];
58
+ const stderrChunks = [];
59
+ child.stdout.on("data", (chunk) => stdoutChunks.push(chunk));
60
+ child.stderr.on("data", (chunk) => stderrChunks.push(chunk));
61
+ child.on("error", (err) => {
62
+ clearTimeout(timer);
63
+ reject(err);
64
+ });
65
+ child.on("close", (code) => {
66
+ clearTimeout(timer);
67
+ const stdout = Buffer.concat(stdoutChunks).toString("utf8");
68
+ const stderr = Buffer.concat(stderrChunks).toString("utf8");
69
+ if (code !== 0) {
70
+ const message = `claude exited ${code}${stderr ? `: ${stderr.trim()}` : ""}`;
71
+ const kind = classifyClaudeError({ message, exitCode: code, stderr });
72
+ reject(new ClaudeError({ message, kind, exitCode: code, stderr }));
73
+ return;
74
+ }
75
+ let envelope;
76
+ try {
77
+ envelope = JSON.parse(stdout);
78
+ }
79
+ catch {
80
+ reject(new ClaudeError({
81
+ message: `claude output not JSON: ${stdout.slice(0, 200)}`,
82
+ kind: "other",
83
+ exitCode: code,
84
+ stderr,
85
+ }));
86
+ return;
87
+ }
88
+ const text = typeof envelope["result"] === "string" ? envelope["result"] : "";
89
+ let parsed;
90
+ if (opts.jsonSchema !== undefined) {
91
+ // The CLI puts schema-validated payload in `structured_output`, not
92
+ // in `result` (which holds the conversational ack). Prefer that;
93
+ // fall back to parsing the result text in case future versions
94
+ // change the placement.
95
+ if (envelope["structured_output"] !== undefined) {
96
+ parsed = envelope["structured_output"];
97
+ }
98
+ else if (text.length > 0) {
99
+ try {
100
+ parsed = JSON.parse(text);
101
+ }
102
+ catch (err) {
103
+ log.warn({ err: String(err), preview: text.slice(0, 200) }, "claude json output parse failed despite --json-schema");
104
+ }
105
+ }
106
+ }
107
+ const usageRaw = envelope["usage"];
108
+ const usage = typeof usageRaw === "object" && usageRaw !== null
109
+ ? usageRaw
110
+ : undefined;
111
+ const durationMs = Date.now() - startedAt;
112
+ log.info({
113
+ model,
114
+ durationMs,
115
+ input_tokens: usage?.["input_tokens"],
116
+ output_tokens: usage?.["output_tokens"],
117
+ }, "claude call complete");
118
+ resolve({
119
+ text,
120
+ ...(parsed !== undefined ? { parsed } : {}),
121
+ durationMs,
122
+ tier: opts.tier,
123
+ model,
124
+ envelope,
125
+ ...(usage !== undefined ? { usage } : {}),
126
+ });
127
+ });
128
+ child.stdin.write(opts.prompt);
129
+ child.stdin.end();
130
+ });
131
+ }
132
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/claude/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Subprocess wrapper for the `claude` CLI.
3
+ *
4
+ * Per L42 + operator answer T1: every Tier-1/2/3 LLM call goes through the
5
+ * operator's Claude Code coding-plan subscription via `claude --print
6
+ * --model <tier> --output-format json`. No direct Anthropic SDK calls.
7
+ *
8
+ * Tier mapping is hardcoded (no env vars per operator profile). The CLI's
9
+ * model alias resolution maps `haiku|sonnet|opus` to the latest model id
10
+ * for that family — we don't pin specific snapshots here so the wrapper
11
+ * keeps tracking newer models as Anthropic ships them.
12
+ */
13
+ export type ClaudeTier = "haiku" | "sonnet" | "opus";
14
+ export interface RunClaudeOptions {
15
+ tier: ClaudeTier;
16
+ /** User prompt — sent on stdin so it can be arbitrary length. */
17
+ prompt: string;
18
+ /** Optional system prompt override (replaces default Claude Code system). */
19
+ system?: string;
20
+ /**
21
+ * Optional JSON Schema for structured output. When provided, the CLI
22
+ * enforces the shape and the wrapper parses + returns under `parsed`.
23
+ */
24
+ jsonSchema?: object;
25
+ /** Working directory for the subprocess. Default = process.cwd(). */
26
+ cwd?: string;
27
+ /** Hard timeout in ms. Default 120000. */
28
+ timeoutMs?: number;
29
+ /**
30
+ * Extra CLI flags. Useful for `--add-dir`, `--disable-slash-commands`,
31
+ * etc. when the caller knows what they want.
32
+ */
33
+ extraArgs?: string[];
34
+ }
35
+ export interface ClaudeUsage {
36
+ input_tokens?: number;
37
+ output_tokens?: number;
38
+ cache_creation_input_tokens?: number;
39
+ cache_read_input_tokens?: number;
40
+ }
41
+ export interface RunClaudeResult {
42
+ text: string;
43
+ /** Parsed JSON when `jsonSchema` was set. */
44
+ parsed?: unknown;
45
+ durationMs: number;
46
+ tier: ClaudeTier;
47
+ model: string;
48
+ /** Raw JSON envelope from `--output-format json`. */
49
+ envelope?: Record<string, unknown>;
50
+ /** Usage stats lifted from the envelope when present. */
51
+ usage?: ClaudeUsage;
52
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Subprocess wrapper for the `claude` CLI.
3
+ *
4
+ * Per L42 + operator answer T1: every Tier-1/2/3 LLM call goes through the
5
+ * operator's Claude Code coding-plan subscription via `claude --print
6
+ * --model <tier> --output-format json`. No direct Anthropic SDK calls.
7
+ *
8
+ * Tier mapping is hardcoded (no env vars per operator profile). The CLI's
9
+ * model alias resolution maps `haiku|sonnet|opus` to the latest model id
10
+ * for that family — we don't pin specific snapshots here so the wrapper
11
+ * keeps tracking newer models as Anthropic ships them.
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/claude/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `cairn attention` — show pending operator review items.
3
+ *
4
+ * Reads two sources from the adopted project:
5
+ * 1. `.cairn/ground/decisions/_inbox/*.draft.md` — DEC drafts awaiting confirm
6
+ * 2. `.cairn/baseline/sensor-audit-*.yaml` (latest) — pre-Cairn sensor findings
7
+ *
8
+ * Prints a structured summary; exits 0 when there are no pending items, 2 when
9
+ * any are present (so scripts can branch on attention).
10
+ */
11
+ export declare function attentionCli(argv: string[]): Promise<void>;