@manehorizons/cadence-core 1.1.1

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 (476) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/bin/cadence.cjs +4 -0
  4. package/dist/build/record.d.ts +16 -0
  5. package/dist/build/record.d.ts.map +1 -0
  6. package/dist/build/record.js +33 -0
  7. package/dist/build/record.js.map +1 -0
  8. package/dist/checks/boundary.d.ts +35 -0
  9. package/dist/checks/boundary.d.ts.map +1 -0
  10. package/dist/checks/boundary.js +29 -0
  11. package/dist/checks/boundary.js.map +1 -0
  12. package/dist/checks/skill-audit.d.ts +29 -0
  13. package/dist/checks/skill-audit.d.ts.map +1 -0
  14. package/dist/checks/skill-audit.js +57 -0
  15. package/dist/checks/skill-audit.js.map +1 -0
  16. package/dist/classify/tier.d.ts +9 -0
  17. package/dist/classify/tier.d.ts.map +1 -0
  18. package/dist/classify/tier.js +15 -0
  19. package/dist/classify/tier.js.map +1 -0
  20. package/dist/cli/commands/assumption.d.ts +3 -0
  21. package/dist/cli/commands/assumption.d.ts.map +1 -0
  22. package/dist/cli/commands/assumption.js +313 -0
  23. package/dist/cli/commands/assumption.js.map +1 -0
  24. package/dist/cli/commands/block.d.ts +3 -0
  25. package/dist/cli/commands/block.d.ts.map +1 -0
  26. package/dist/cli/commands/block.js +23 -0
  27. package/dist/cli/commands/block.js.map +1 -0
  28. package/dist/cli/commands/build.d.ts +3 -0
  29. package/dist/cli/commands/build.d.ts.map +1 -0
  30. package/dist/cli/commands/build.js +89 -0
  31. package/dist/cli/commands/build.js.map +1 -0
  32. package/dist/cli/commands/config.d.ts +3 -0
  33. package/dist/cli/commands/config.d.ts.map +1 -0
  34. package/dist/cli/commands/config.js +91 -0
  35. package/dist/cli/commands/config.js.map +1 -0
  36. package/dist/cli/commands/context.d.ts +3 -0
  37. package/dist/cli/commands/context.d.ts.map +1 -0
  38. package/dist/cli/commands/context.js +31 -0
  39. package/dist/cli/commands/context.js.map +1 -0
  40. package/dist/cli/commands/decision.d.ts +3 -0
  41. package/dist/cli/commands/decision.d.ts.map +1 -0
  42. package/dist/cli/commands/decision.js +390 -0
  43. package/dist/cli/commands/decision.js.map +1 -0
  44. package/dist/cli/commands/done.d.ts +3 -0
  45. package/dist/cli/commands/done.d.ts.map +1 -0
  46. package/dist/cli/commands/done.js +23 -0
  47. package/dist/cli/commands/done.js.map +1 -0
  48. package/dist/cli/commands/draft-new.d.ts +4 -0
  49. package/dist/cli/commands/draft-new.d.ts.map +1 -0
  50. package/dist/cli/commands/draft-new.js +108 -0
  51. package/dist/cli/commands/draft-new.js.map +1 -0
  52. package/dist/cli/commands/draft.d.ts +4 -0
  53. package/dist/cli/commands/draft.d.ts.map +1 -0
  54. package/dist/cli/commands/draft.js +125 -0
  55. package/dist/cli/commands/draft.js.map +1 -0
  56. package/dist/cli/commands/hook.d.ts +3 -0
  57. package/dist/cli/commands/hook.d.ts.map +1 -0
  58. package/dist/cli/commands/hook.js +50 -0
  59. package/dist/cli/commands/hook.js.map +1 -0
  60. package/dist/cli/commands/init.d.ts +21 -0
  61. package/dist/cli/commands/init.d.ts.map +1 -0
  62. package/dist/cli/commands/init.js +255 -0
  63. package/dist/cli/commands/init.js.map +1 -0
  64. package/dist/cli/commands/inspect.d.ts +3 -0
  65. package/dist/cli/commands/inspect.d.ts.map +1 -0
  66. package/dist/cli/commands/inspect.js +24 -0
  67. package/dist/cli/commands/inspect.js.map +1 -0
  68. package/dist/cli/commands/intelligence.d.ts +3 -0
  69. package/dist/cli/commands/intelligence.d.ts.map +1 -0
  70. package/dist/cli/commands/intelligence.js +173 -0
  71. package/dist/cli/commands/intelligence.js.map +1 -0
  72. package/dist/cli/commands/milestone.d.ts +3 -0
  73. package/dist/cli/commands/milestone.d.ts.map +1 -0
  74. package/dist/cli/commands/milestone.js +119 -0
  75. package/dist/cli/commands/milestone.js.map +1 -0
  76. package/dist/cli/commands/needs-context.d.ts +3 -0
  77. package/dist/cli/commands/needs-context.d.ts.map +1 -0
  78. package/dist/cli/commands/needs-context.js +23 -0
  79. package/dist/cli/commands/needs-context.js.map +1 -0
  80. package/dist/cli/commands/progress.d.ts +3 -0
  81. package/dist/cli/commands/progress.d.ts.map +1 -0
  82. package/dist/cli/commands/progress.js +21 -0
  83. package/dist/cli/commands/progress.js.map +1 -0
  84. package/dist/cli/commands/recommend.d.ts +3 -0
  85. package/dist/cli/commands/recommend.d.ts.map +1 -0
  86. package/dist/cli/commands/recommend.js +24 -0
  87. package/dist/cli/commands/recommend.js.map +1 -0
  88. package/dist/cli/commands/recommendation.d.ts +3 -0
  89. package/dist/cli/commands/recommendation.d.ts.map +1 -0
  90. package/dist/cli/commands/recommendation.js +360 -0
  91. package/dist/cli/commands/recommendation.js.map +1 -0
  92. package/dist/cli/commands/settle.d.ts +3 -0
  93. package/dist/cli/commands/settle.d.ts.map +1 -0
  94. package/dist/cli/commands/settle.js +453 -0
  95. package/dist/cli/commands/settle.js.map +1 -0
  96. package/dist/cli/commands/spec.d.ts +10 -0
  97. package/dist/cli/commands/spec.d.ts.map +1 -0
  98. package/dist/cli/commands/spec.js +246 -0
  99. package/dist/cli/commands/spec.js.map +1 -0
  100. package/dist/cli/commands/status.d.ts +11 -0
  101. package/dist/cli/commands/status.d.ts.map +1 -0
  102. package/dist/cli/commands/status.js +211 -0
  103. package/dist/cli/commands/status.js.map +1 -0
  104. package/dist/cli/index.d.ts +3 -0
  105. package/dist/cli/index.d.ts.map +1 -0
  106. package/dist/cli/index.js +21 -0
  107. package/dist/cli/index.js.map +1 -0
  108. package/dist/cli/register.d.ts +3 -0
  109. package/dist/cli/register.d.ts.map +1 -0
  110. package/dist/cli/register.js +43 -0
  111. package/dist/cli/register.js.map +1 -0
  112. package/dist/coherence/check.d.ts +11 -0
  113. package/dist/coherence/check.d.ts.map +1 -0
  114. package/dist/coherence/check.js +34 -0
  115. package/dist/coherence/check.js.map +1 -0
  116. package/dist/config/loader.d.ts +4 -0
  117. package/dist/config/loader.d.ts.map +1 -0
  118. package/dist/config/loader.js +40 -0
  119. package/dist/config/loader.js.map +1 -0
  120. package/dist/errors.d.ts +23 -0
  121. package/dist/errors.d.ts.map +1 -0
  122. package/dist/errors.js +31 -0
  123. package/dist/errors.js.map +1 -0
  124. package/dist/gates/approve.d.ts +20 -0
  125. package/dist/gates/approve.d.ts.map +1 -0
  126. package/dist/gates/approve.js +55 -0
  127. package/dist/gates/approve.js.map +1 -0
  128. package/dist/gates/build-context.d.ts +17 -0
  129. package/dist/gates/build-context.d.ts.map +1 -0
  130. package/dist/gates/build-context.js +81 -0
  131. package/dist/gates/build-context.js.map +1 -0
  132. package/dist/gates/build-test-must-pass.d.ts +12 -0
  133. package/dist/gates/build-test-must-pass.d.ts.map +1 -0
  134. package/dist/gates/build-test-must-pass.js +23 -0
  135. package/dist/gates/build-test-must-pass.js.map +1 -0
  136. package/dist/gates/build-types.d.ts +54 -0
  137. package/dist/gates/build-types.d.ts.map +1 -0
  138. package/dist/gates/build-types.js +2 -0
  139. package/dist/gates/build-types.js.map +1 -0
  140. package/dist/gates/code-review.d.ts +20 -0
  141. package/dist/gates/code-review.d.ts.map +1 -0
  142. package/dist/gates/code-review.js +137 -0
  143. package/dist/gates/code-review.js.map +1 -0
  144. package/dist/gates/coherence.d.ts +26 -0
  145. package/dist/gates/coherence.d.ts.map +1 -0
  146. package/dist/gates/coherence.js +59 -0
  147. package/dist/gates/coherence.js.map +1 -0
  148. package/dist/gates/coverage.d.ts +8 -0
  149. package/dist/gates/coverage.d.ts.map +1 -0
  150. package/dist/gates/coverage.js +26 -0
  151. package/dist/gates/coverage.js.map +1 -0
  152. package/dist/gates/deep-verify.d.ts +7 -0
  153. package/dist/gates/deep-verify.d.ts.map +1 -0
  154. package/dist/gates/deep-verify.js +77 -0
  155. package/dist/gates/deep-verify.js.map +1 -0
  156. package/dist/gates/draft-context.d.ts +20 -0
  157. package/dist/gates/draft-context.d.ts.map +1 -0
  158. package/dist/gates/draft-context.js +87 -0
  159. package/dist/gates/draft-context.js.map +1 -0
  160. package/dist/gates/draft-read.d.ts +10 -0
  161. package/dist/gates/draft-read.d.ts.map +1 -0
  162. package/dist/gates/draft-read.js +24 -0
  163. package/dist/gates/draft-read.js.map +1 -0
  164. package/dist/gates/draft-types.d.ts +75 -0
  165. package/dist/gates/draft-types.d.ts.map +1 -0
  166. package/dist/gates/draft-types.js +2 -0
  167. package/dist/gates/draft-types.js.map +1 -0
  168. package/dist/gates/engine.d.ts +21 -0
  169. package/dist/gates/engine.d.ts.map +1 -0
  170. package/dist/gates/engine.js +98 -0
  171. package/dist/gates/engine.js.map +1 -0
  172. package/dist/gates/interactive.d.ts +11 -0
  173. package/dist/gates/interactive.d.ts.map +1 -0
  174. package/dist/gates/interactive.js +55 -0
  175. package/dist/gates/interactive.js.map +1 -0
  176. package/dist/gates/per-task-verify.d.ts +12 -0
  177. package/dist/gates/per-task-verify.d.ts.map +1 -0
  178. package/dist/gates/per-task-verify.js +52 -0
  179. package/dist/gates/per-task-verify.js.map +1 -0
  180. package/dist/gates/plan-review.d.ts +13 -0
  181. package/dist/gates/plan-review.d.ts.map +1 -0
  182. package/dist/gates/plan-review.js +98 -0
  183. package/dist/gates/plan-review.js.map +1 -0
  184. package/dist/gates/registry.d.ts +53 -0
  185. package/dist/gates/registry.d.ts.map +1 -0
  186. package/dist/gates/registry.js +66 -0
  187. package/dist/gates/registry.js.map +1 -0
  188. package/dist/gates/security-audit.d.ts +11 -0
  189. package/dist/gates/security-audit.d.ts.map +1 -0
  190. package/dist/gates/security-audit.js +40 -0
  191. package/dist/gates/security-audit.js.map +1 -0
  192. package/dist/gates/structural-verifier.d.ts +8 -0
  193. package/dist/gates/structural-verifier.d.ts.map +1 -0
  194. package/dist/gates/structural-verifier.js +25 -0
  195. package/dist/gates/structural-verifier.js.map +1 -0
  196. package/dist/gates/types.d.ts +202 -0
  197. package/dist/gates/types.d.ts.map +1 -0
  198. package/dist/gates/types.js +12 -0
  199. package/dist/gates/types.js.map +1 -0
  200. package/dist/hooks/dispatcher.d.ts +8 -0
  201. package/dist/hooks/dispatcher.d.ts.map +1 -0
  202. package/dist/hooks/dispatcher.js +31 -0
  203. package/dist/hooks/dispatcher.js.map +1 -0
  204. package/dist/hooks/handlers.d.ts +21 -0
  205. package/dist/hooks/handlers.d.ts.map +1 -0
  206. package/dist/hooks/handlers.js +121 -0
  207. package/dist/hooks/handlers.js.map +1 -0
  208. package/dist/index.d.ts +2 -0
  209. package/dist/index.d.ts.map +1 -0
  210. package/dist/index.js +2 -0
  211. package/dist/index.js.map +1 -0
  212. package/dist/init/claude-md-template.d.ts +34 -0
  213. package/dist/init/claude-md-template.d.ts.map +1 -0
  214. package/dist/init/claude-md-template.js +72 -0
  215. package/dist/init/claude-md-template.js.map +1 -0
  216. package/dist/intelligence/backend/cadence.d.ts +21 -0
  217. package/dist/intelligence/backend/cadence.d.ts.map +1 -0
  218. package/dist/intelligence/backend/cadence.js +127 -0
  219. package/dist/intelligence/backend/cadence.js.map +1 -0
  220. package/dist/intelligence/context.d.ts +11 -0
  221. package/dist/intelligence/context.d.ts.map +1 -0
  222. package/dist/intelligence/context.js +197 -0
  223. package/dist/intelligence/context.js.map +1 -0
  224. package/dist/intelligence/graph-decision.d.ts +9 -0
  225. package/dist/intelligence/graph-decision.d.ts.map +1 -0
  226. package/dist/intelligence/graph-decision.js +55 -0
  227. package/dist/intelligence/graph-decision.js.map +1 -0
  228. package/dist/intelligence/inspect.d.ts +9 -0
  229. package/dist/intelligence/inspect.d.ts.map +1 -0
  230. package/dist/intelligence/inspect.js +93 -0
  231. package/dist/intelligence/inspect.js.map +1 -0
  232. package/dist/intelligence/milestone.d.ts +40 -0
  233. package/dist/intelligence/milestone.d.ts.map +1 -0
  234. package/dist/intelligence/milestone.js +312 -0
  235. package/dist/intelligence/milestone.js.map +1 -0
  236. package/dist/intelligence/recommend.d.ts +20 -0
  237. package/dist/intelligence/recommend.d.ts.map +1 -0
  238. package/dist/intelligence/recommend.js +185 -0
  239. package/dist/intelligence/recommend.js.map +1 -0
  240. package/dist/intelligence/render-assumption-detail.d.ts +3 -0
  241. package/dist/intelligence/render-assumption-detail.d.ts.map +1 -0
  242. package/dist/intelligence/render-assumption-detail.js +16 -0
  243. package/dist/intelligence/render-assumption-detail.js.map +1 -0
  244. package/dist/intelligence/render-assumption.d.ts +3 -0
  245. package/dist/intelligence/render-assumption.d.ts.map +1 -0
  246. package/dist/intelligence/render-assumption.js +37 -0
  247. package/dist/intelligence/render-assumption.js.map +1 -0
  248. package/dist/intelligence/render-context.d.ts +3 -0
  249. package/dist/intelligence/render-context.d.ts.map +1 -0
  250. package/dist/intelligence/render-context.js +92 -0
  251. package/dist/intelligence/render-context.js.map +1 -0
  252. package/dist/intelligence/render-decision-detail.d.ts +3 -0
  253. package/dist/intelligence/render-decision-detail.d.ts.map +1 -0
  254. package/dist/intelligence/render-decision-detail.js +30 -0
  255. package/dist/intelligence/render-decision-detail.js.map +1 -0
  256. package/dist/intelligence/render-decision-graph.d.ts +3 -0
  257. package/dist/intelligence/render-decision-graph.d.ts.map +1 -0
  258. package/dist/intelligence/render-decision-graph.js +49 -0
  259. package/dist/intelligence/render-decision-graph.js.map +1 -0
  260. package/dist/intelligence/render-decision.d.ts +3 -0
  261. package/dist/intelligence/render-decision.d.ts.map +1 -0
  262. package/dist/intelligence/render-decision.js +45 -0
  263. package/dist/intelligence/render-decision.js.map +1 -0
  264. package/dist/intelligence/render-inspection.d.ts +3 -0
  265. package/dist/intelligence/render-inspection.d.ts.map +1 -0
  266. package/dist/intelligence/render-inspection.js +69 -0
  267. package/dist/intelligence/render-inspection.js.map +1 -0
  268. package/dist/intelligence/render-intelligence-audit.d.ts +5 -0
  269. package/dist/intelligence/render-intelligence-audit.d.ts.map +1 -0
  270. package/dist/intelligence/render-intelligence-audit.js +93 -0
  271. package/dist/intelligence/render-intelligence-audit.js.map +1 -0
  272. package/dist/intelligence/render-intelligence-stats.d.ts +6 -0
  273. package/dist/intelligence/render-intelligence-stats.d.ts.map +1 -0
  274. package/dist/intelligence/render-intelligence-stats.js +76 -0
  275. package/dist/intelligence/render-intelligence-stats.js.map +1 -0
  276. package/dist/intelligence/render-milestone.d.ts +3 -0
  277. package/dist/intelligence/render-milestone.d.ts.map +1 -0
  278. package/dist/intelligence/render-milestone.js +80 -0
  279. package/dist/intelligence/render-milestone.js.map +1 -0
  280. package/dist/intelligence/render-recommend.d.ts +3 -0
  281. package/dist/intelligence/render-recommend.d.ts.map +1 -0
  282. package/dist/intelligence/render-recommend.js +62 -0
  283. package/dist/intelligence/render-recommend.js.map +1 -0
  284. package/dist/intelligence/render-recommendation-detail.d.ts +7 -0
  285. package/dist/intelligence/render-recommendation-detail.d.ts.map +1 -0
  286. package/dist/intelligence/render-recommendation-detail.js +93 -0
  287. package/dist/intelligence/render-recommendation-detail.js.map +1 -0
  288. package/dist/intelligence/render.d.ts +3 -0
  289. package/dist/intelligence/render.d.ts.map +1 -0
  290. package/dist/intelligence/render.js +57 -0
  291. package/dist/intelligence/render.js.map +1 -0
  292. package/dist/intelligence/scan.d.ts +3 -0
  293. package/dist/intelligence/scan.d.ts.map +1 -0
  294. package/dist/intelligence/scan.js +103 -0
  295. package/dist/intelligence/scan.js.map +1 -0
  296. package/dist/intelligence/store.d.ts +143 -0
  297. package/dist/intelligence/store.d.ts.map +1 -0
  298. package/dist/intelligence/store.js +701 -0
  299. package/dist/intelligence/store.js.map +1 -0
  300. package/dist/notify/code-review.d.ts +34 -0
  301. package/dist/notify/code-review.d.ts.map +1 -0
  302. package/dist/notify/code-review.js +56 -0
  303. package/dist/notify/code-review.js.map +1 -0
  304. package/dist/notify/collect.d.ts +31 -0
  305. package/dist/notify/collect.d.ts.map +1 -0
  306. package/dist/notify/collect.js +127 -0
  307. package/dist/notify/collect.js.map +1 -0
  308. package/dist/notify/emit-unconverged.d.ts +26 -0
  309. package/dist/notify/emit-unconverged.d.ts.map +1 -0
  310. package/dist/notify/emit-unconverged.js +31 -0
  311. package/dist/notify/emit-unconverged.js.map +1 -0
  312. package/dist/notify/factory.d.ts +12 -0
  313. package/dist/notify/factory.d.ts.map +1 -0
  314. package/dist/notify/factory.js +29 -0
  315. package/dist/notify/factory.js.map +1 -0
  316. package/dist/notify/file.d.ts +13 -0
  317. package/dist/notify/file.d.ts.map +1 -0
  318. package/dist/notify/file.js +21 -0
  319. package/dist/notify/file.js.map +1 -0
  320. package/dist/notify/loop-violation.d.ts +10 -0
  321. package/dist/notify/loop-violation.d.ts.map +1 -0
  322. package/dist/notify/loop-violation.js +46 -0
  323. package/dist/notify/loop-violation.js.map +1 -0
  324. package/dist/notify/notifier.d.ts +13 -0
  325. package/dist/notify/notifier.d.ts.map +1 -0
  326. package/dist/notify/notifier.js +2 -0
  327. package/dist/notify/notifier.js.map +1 -0
  328. package/dist/notify/null.d.ts +11 -0
  329. package/dist/notify/null.d.ts.map +1 -0
  330. package/dist/notify/null.js +11 -0
  331. package/dist/notify/null.js.map +1 -0
  332. package/dist/notify/plan-review.d.ts +20 -0
  333. package/dist/notify/plan-review.d.ts.map +1 -0
  334. package/dist/notify/plan-review.js +15 -0
  335. package/dist/notify/plan-review.js.map +1 -0
  336. package/dist/notify/skill-audit.d.ts +18 -0
  337. package/dist/notify/skill-audit.d.ts.map +1 -0
  338. package/dist/notify/skill-audit.js +33 -0
  339. package/dist/notify/skill-audit.js.map +1 -0
  340. package/dist/notify/spec-review.d.ts +20 -0
  341. package/dist/notify/spec-review.d.ts.map +1 -0
  342. package/dist/notify/spec-review.js +15 -0
  343. package/dist/notify/spec-review.js.map +1 -0
  344. package/dist/notify/stderr.d.ts +17 -0
  345. package/dist/notify/stderr.d.ts.map +1 -0
  346. package/dist/notify/stderr.js +17 -0
  347. package/dist/notify/stderr.js.map +1 -0
  348. package/dist/notify/webhook.d.ts +33 -0
  349. package/dist/notify/webhook.d.ts.map +1 -0
  350. package/dist/notify/webhook.js +55 -0
  351. package/dist/notify/webhook.js.map +1 -0
  352. package/dist/parse/draft-parser.d.ts +3 -0
  353. package/dist/parse/draft-parser.d.ts.map +1 -0
  354. package/dist/parse/draft-parser.js +99 -0
  355. package/dist/parse/draft-parser.js.map +1 -0
  356. package/dist/parse/draft-scaffold.d.ts +14 -0
  357. package/dist/parse/draft-scaffold.d.ts.map +1 -0
  358. package/dist/parse/draft-scaffold.js +31 -0
  359. package/dist/parse/draft-scaffold.js.map +1 -0
  360. package/dist/parse/spec-parser.d.ts +3 -0
  361. package/dist/parse/spec-parser.d.ts.map +1 -0
  362. package/dist/parse/spec-parser.js +68 -0
  363. package/dist/parse/spec-parser.js.map +1 -0
  364. package/dist/parse/summary-writer.d.ts +3 -0
  365. package/dist/parse/summary-writer.d.ts.map +1 -0
  366. package/dist/parse/summary-writer.js +41 -0
  367. package/dist/parse/summary-writer.js.map +1 -0
  368. package/dist/progress.d.ts +7 -0
  369. package/dist/progress.d.ts.map +1 -0
  370. package/dist/progress.js +37 -0
  371. package/dist/progress.js.map +1 -0
  372. package/dist/render/state-md.d.ts +3 -0
  373. package/dist/render/state-md.d.ts.map +1 -0
  374. package/dist/render/state-md.js +33 -0
  375. package/dist/render/state-md.js.map +1 -0
  376. package/dist/state/atomic-write.d.ts +3 -0
  377. package/dist/state/atomic-write.d.ts.map +1 -0
  378. package/dist/state/atomic-write.js +52 -0
  379. package/dist/state/atomic-write.js.map +1 -0
  380. package/dist/state/backend.d.ts +13 -0
  381. package/dist/state/backend.d.ts.map +1 -0
  382. package/dist/state/backend.js +2 -0
  383. package/dist/state/backend.js.map +1 -0
  384. package/dist/state/simple.d.ts +18 -0
  385. package/dist/state/simple.d.ts.map +1 -0
  386. package/dist/state/simple.js +67 -0
  387. package/dist/state/simple.js.map +1 -0
  388. package/dist/status.d.ts +47 -0
  389. package/dist/status.d.ts.map +1 -0
  390. package/dist/status.js +209 -0
  391. package/dist/status.js.map +1 -0
  392. package/dist/verify/anthropic-verifier.d.ts +28 -0
  393. package/dist/verify/anthropic-verifier.d.ts.map +1 -0
  394. package/dist/verify/anthropic-verifier.js +109 -0
  395. package/dist/verify/anthropic-verifier.js.map +1 -0
  396. package/dist/verify/code-review-factory.d.ts +103 -0
  397. package/dist/verify/code-review-factory.d.ts.map +1 -0
  398. package/dist/verify/code-review-factory.js +11 -0
  399. package/dist/verify/code-review-factory.js.map +1 -0
  400. package/dist/verify/code-review.d.ts +65 -0
  401. package/dist/verify/code-review.d.ts.map +1 -0
  402. package/dist/verify/code-review.js +189 -0
  403. package/dist/verify/code-review.js.map +1 -0
  404. package/dist/verify/converge.d.ts +14 -0
  405. package/dist/verify/converge.d.ts.map +1 -0
  406. package/dist/verify/converge.js +17 -0
  407. package/dist/verify/converge.js.map +1 -0
  408. package/dist/verify/coverage.d.ts +31 -0
  409. package/dist/verify/coverage.d.ts.map +1 -0
  410. package/dist/verify/coverage.js +125 -0
  411. package/dist/verify/coverage.js.map +1 -0
  412. package/dist/verify/factory.d.ts +107 -0
  413. package/dist/verify/factory.d.ts.map +1 -0
  414. package/dist/verify/factory.js +17 -0
  415. package/dist/verify/factory.js.map +1 -0
  416. package/dist/verify/interactive.d.ts +22 -0
  417. package/dist/verify/interactive.d.ts.map +1 -0
  418. package/dist/verify/interactive.js +61 -0
  419. package/dist/verify/interactive.js.map +1 -0
  420. package/dist/verify/local-client.d.ts +13 -0
  421. package/dist/verify/local-client.d.ts.map +1 -0
  422. package/dist/verify/local-client.js +73 -0
  423. package/dist/verify/local-client.js.map +1 -0
  424. package/dist/verify/mock-verifier.d.ts +16 -0
  425. package/dist/verify/mock-verifier.d.ts.map +1 -0
  426. package/dist/verify/mock-verifier.js +30 -0
  427. package/dist/verify/mock-verifier.js.map +1 -0
  428. package/dist/verify/per-task-factory.d.ts +103 -0
  429. package/dist/verify/per-task-factory.d.ts.map +1 -0
  430. package/dist/verify/per-task-factory.js +11 -0
  431. package/dist/verify/per-task-factory.js.map +1 -0
  432. package/dist/verify/per-task.d.ts +69 -0
  433. package/dist/verify/per-task.d.ts.map +1 -0
  434. package/dist/verify/per-task.js +154 -0
  435. package/dist/verify/per-task.js.map +1 -0
  436. package/dist/verify/plan-review-factory.d.ts +103 -0
  437. package/dist/verify/plan-review-factory.d.ts.map +1 -0
  438. package/dist/verify/plan-review-factory.js +11 -0
  439. package/dist/verify/plan-review-factory.js.map +1 -0
  440. package/dist/verify/plan-review.d.ts +67 -0
  441. package/dist/verify/plan-review.d.ts.map +1 -0
  442. package/dist/verify/plan-review.js +196 -0
  443. package/dist/verify/plan-review.js.map +1 -0
  444. package/dist/verify/prompter.d.ts +40 -0
  445. package/dist/verify/prompter.d.ts.map +1 -0
  446. package/dist/verify/prompter.js +48 -0
  447. package/dist/verify/prompter.js.map +1 -0
  448. package/dist/verify/security-audit-factory.d.ts +103 -0
  449. package/dist/verify/security-audit-factory.d.ts.map +1 -0
  450. package/dist/verify/security-audit-factory.js +11 -0
  451. package/dist/verify/security-audit-factory.js.map +1 -0
  452. package/dist/verify/security-audit.d.ts +63 -0
  453. package/dist/verify/security-audit.d.ts.map +1 -0
  454. package/dist/verify/security-audit.js +196 -0
  455. package/dist/verify/security-audit.js.map +1 -0
  456. package/dist/verify/skill-match.d.ts +10 -0
  457. package/dist/verify/skill-match.d.ts.map +1 -0
  458. package/dist/verify/skill-match.js +15 -0
  459. package/dist/verify/skill-match.js.map +1 -0
  460. package/dist/verify/spec-review-factory.d.ts +103 -0
  461. package/dist/verify/spec-review-factory.d.ts.map +1 -0
  462. package/dist/verify/spec-review-factory.js +11 -0
  463. package/dist/verify/spec-review-factory.js.map +1 -0
  464. package/dist/verify/spec-review.d.ts +63 -0
  465. package/dist/verify/spec-review.d.ts.map +1 -0
  466. package/dist/verify/spec-review.js +182 -0
  467. package/dist/verify/spec-review.js.map +1 -0
  468. package/dist/verify/verifier-factory.d.ts +45 -0
  469. package/dist/verify/verifier-factory.d.ts.map +1 -0
  470. package/dist/verify/verifier-factory.js +38 -0
  471. package/dist/verify/verifier-factory.js.map +1 -0
  472. package/dist/verify/verifier.d.ts +63 -0
  473. package/dist/verify/verifier.d.ts.map +1 -0
  474. package/dist/verify/verifier.js +32 -0
  475. package/dist/verify/verifier.js.map +1 -0
  476. package/package.json +62 -0
@@ -0,0 +1,34 @@
1
+ const DO_NOT_RE = /DO NOT\s+(?:edit|change|modify|touch)\s+`?([^\s`\n]+?)(?:`|\.(?:\s|$)|$)/gi;
2
+ export function coherenceCheck(draft, state, projectMd) {
3
+ const issues = [];
4
+ const touched = new Set(draft.tasks.flatMap((t) => t.files));
5
+ for (const d of state.decisions) {
6
+ for (const f of touched) {
7
+ if (d.title.includes(f)) {
8
+ issues.push({
9
+ severity: 'warn',
10
+ code: 'DECISION_TOUCH',
11
+ message: `Draft touches ${f} which is the subject of decision ${d.id}: "${d.title}". Review before approving.`,
12
+ });
13
+ }
14
+ }
15
+ }
16
+ const forbidden = new Set();
17
+ let m;
18
+ DO_NOT_RE.lastIndex = 0;
19
+ while ((m = DO_NOT_RE.exec(projectMd)) !== null) {
20
+ if (m[1])
21
+ forbidden.add(m[1]);
22
+ }
23
+ for (const f of touched) {
24
+ if (forbidden.has(f)) {
25
+ issues.push({
26
+ severity: 'block',
27
+ code: 'PROJECT_FORBIDDEN',
28
+ message: `Draft touches ${f} which PROJECT.md marks DO NOT edit.`,
29
+ });
30
+ }
31
+ }
32
+ return { issues };
33
+ }
34
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/coherence/check.ts"],"names":[],"mappings":"AAYA,MAAM,SAAS,GAAG,4EAA4E,CAAC;AAE/F,MAAM,UAAU,cAAc,CAAC,KAAY,EAAE,KAAmB,EAAE,SAAiB;IACjF,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAE7D,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAChC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,MAAM;oBAChB,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,iBAAiB,CAAC,qCAAqC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,6BAA6B;iBAC/G,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,IAAI,CAAyB,CAAC;IAC9B,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC;IACxB,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,CAAC,CAAC,CAAC;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,iBAAiB,CAAC,sCAAsC;aAClE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type CadenceConfig } from '@manehorizons/cadence-types';
2
+ export declare function loadConfig(repoRoot: string): Promise<CadenceConfig>;
3
+ export declare function writeConfig(repoRoot: string, config: CadenceConfig): Promise<void>;
4
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiC,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAIhG,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA0BzE;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxF"}
@@ -0,0 +1,40 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { CadenceConfigZ, defaultConfig } from '@manehorizons/cadence-types';
5
+ import { ConfigInvalidError } from '../errors.js';
6
+ import { atomicWriteJSON } from '../state/atomic-write.js';
7
+ export async function loadConfig(repoRoot) {
8
+ const path = join(repoRoot, '.cadence', 'config.json');
9
+ if (!existsSync(path)) {
10
+ return defaultConfig;
11
+ }
12
+ let parsed;
13
+ try {
14
+ parsed = JSON.parse(await readFile(path, 'utf8'));
15
+ }
16
+ catch (err) {
17
+ throw new ConfigInvalidError(`config.json is not valid JSON: ${err.message}`);
18
+ }
19
+ const p = parsed;
20
+ const merged = { ...defaultConfig };
21
+ for (const [k, v] of Object.entries(p)) {
22
+ if (v !== null && typeof v === 'object' && !Array.isArray(v) &&
23
+ merged[k] !== null && typeof merged[k] === 'object' && !Array.isArray(merged[k])) {
24
+ merged[k] = { ...merged[k], ...v };
25
+ }
26
+ else {
27
+ merged[k] = v;
28
+ }
29
+ }
30
+ const result = CadenceConfigZ.safeParse(merged);
31
+ if (!result.success) {
32
+ throw new ConfigInvalidError(`config.json failed schema validation: ${result.error.message}`);
33
+ }
34
+ return result.data;
35
+ }
36
+ export async function writeConfig(repoRoot, config) {
37
+ CadenceConfigZ.parse(config);
38
+ await atomicWriteJSON(join(repoRoot, '.cadence', 'config.json'), config);
39
+ }
40
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAsB,MAAM,6BAA6B,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,kBAAkB,CAAC,kCAAmC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,CAAC,GAAG,MAAiC,CAAC;IAC5C,MAAM,MAAM,GAA4B,EAAE,GAAG,aAAa,EAAE,CAAC;IAC7D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,GAAI,MAAM,CAAC,CAAC,CAA6B,EAAE,GAAI,CAA6B,EAAE,CAAC;QAC/F,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,kBAAkB,CAAC,yCAAyC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,MAAqB;IACvE,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,23 @@
1
+ export type CadenceErrorCode = 'GENERIC' | 'STATE_CORRUPT' | 'CONFIG_INVALID' | 'LOOP_VIOLATION' | 'COHERENCE_FAILED' | 'HOOK_FAILED';
2
+ export declare class CadenceError extends Error {
3
+ readonly code: CadenceErrorCode;
4
+ constructor(message: string, code?: CadenceErrorCode);
5
+ }
6
+ export declare class StateCorruptError extends CadenceError {
7
+ constructor(message: string);
8
+ }
9
+ export declare class ConfigInvalidError extends CadenceError {
10
+ constructor(message: string);
11
+ }
12
+ export interface LoopViolationOptions {
13
+ /** Loop position the operation expected. */
14
+ expected?: string;
15
+ /** Loop position the state actually had. */
16
+ actual?: string;
17
+ }
18
+ export declare class LoopViolationError extends CadenceError {
19
+ readonly expected: string | undefined;
20
+ readonly actual: string | undefined;
21
+ constructor(message: string, opts?: LoopViolationOptions);
22
+ }
23
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,aAAa,CAAC;AAElB,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;gBACpB,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,gBAA4B;CAKhE;AAED,qBAAa,iBAAkB,SAAQ,YAAY;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,oBAAoB;IACnC,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;gBAExB,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,oBAAyB;CAM7D"}
package/dist/errors.js ADDED
@@ -0,0 +1,31 @@
1
+ export class CadenceError extends Error {
2
+ code;
3
+ constructor(message, code = 'GENERIC') {
4
+ super(message);
5
+ this.name = 'CadenceError';
6
+ this.code = code;
7
+ }
8
+ }
9
+ export class StateCorruptError extends CadenceError {
10
+ constructor(message) {
11
+ super(message, 'STATE_CORRUPT');
12
+ this.name = 'StateCorruptError';
13
+ }
14
+ }
15
+ export class ConfigInvalidError extends CadenceError {
16
+ constructor(message) {
17
+ super(message, 'CONFIG_INVALID');
18
+ this.name = 'ConfigInvalidError';
19
+ }
20
+ }
21
+ export class LoopViolationError extends CadenceError {
22
+ expected;
23
+ actual;
24
+ constructor(message, opts = {}) {
25
+ super(message, 'LOOP_VIOLATION');
26
+ this.name = 'LoopViolationError';
27
+ this.expected = opts.expected;
28
+ this.actual = opts.actual;
29
+ }
30
+ }
31
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAmB;IAChC,YAAY,OAAe,EAAE,OAAyB,SAAS;QAC7D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IAClD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AASD,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IACzC,QAAQ,CAAqB;IAC7B,MAAM,CAAqB;IAEpC,YAAY,OAAe,EAAE,OAA6B,EAAE;QAC1D,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import type { Prompter } from '../verify/prompter.js';
2
+ import type { DraftGateImpl } from './draft-types.js';
3
+ /**
4
+ * Phase 24.1 — manual approve gate prompt walker. Accepts y/yes/n/no
5
+ * (case-insensitive); 3 retries before refuse. Mirrors the 3-retry pattern
6
+ * from `verify/interactive.ts` askVerdict. Re-exported from `draft.ts` for the
7
+ * `ask-approve-verdict` suite.
8
+ */
9
+ export declare function askApproveVerdict(prompter: Prompter): Promise<'yes' | 'no'>;
10
+ /**
11
+ * Manual approve gate (Phase 24.1). Extracted from draft.ts (Phase 39.7).
12
+ * Fires when `'approve'` is in the effective gate set and `--no-approve`
13
+ * (`opts.approve === false`) was not passed. Builds the prompter via the port
14
+ * (a non-TTY throw → refuse with the `manual-approve: …` line), runs the verdict
15
+ * walker, refuses on `no`. Coherence blockers + soft cap already refused in the
16
+ * router before this gate, so the prompt only appears for otherwise-passable
17
+ * approvals.
18
+ */
19
+ export declare const runApproveGate: DraftGateImpl;
20
+ //# sourceMappingURL=approve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve.d.ts","sourceRoot":"","sources":["../../src/gates/approve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAWvB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,EAAE,aAyB5B,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Phase 24.1 — manual approve gate prompt walker. Accepts y/yes/n/no
3
+ * (case-insensitive); 3 retries before refuse. Mirrors the 3-retry pattern
4
+ * from `verify/interactive.ts` askVerdict. Re-exported from `draft.ts` for the
5
+ * `ask-approve-verdict` suite.
6
+ */
7
+ export async function askApproveVerdict(prompter) {
8
+ for (let attempt = 1; attempt <= 3; attempt++) {
9
+ const question = attempt === 1
10
+ ? 'Approve and enter BUILD? [y/n]: '
11
+ : `Please answer y or n (attempt ${attempt}/3): `;
12
+ const raw = (await prompter.ask(question)).trim().toLowerCase();
13
+ if (raw === 'y' || raw === 'yes')
14
+ return 'yes';
15
+ if (raw === 'n' || raw === 'no')
16
+ return 'no';
17
+ }
18
+ return 'no';
19
+ }
20
+ /**
21
+ * Manual approve gate (Phase 24.1). Extracted from draft.ts (Phase 39.7).
22
+ * Fires when `'approve'` is in the effective gate set and `--no-approve`
23
+ * (`opts.approve === false`) was not passed. Builds the prompter via the port
24
+ * (a non-TTY throw → refuse with the `manual-approve: …` line), runs the verdict
25
+ * walker, refuses on `no`. Coherence blockers + soft cap already refused in the
26
+ * router before this gate, so the prompt only appears for otherwise-passable
27
+ * approvals.
28
+ */
29
+ export const runApproveGate = async (ctx) => {
30
+ if (!ctx.gateSet.gates.includes('approve') || ctx.opts.approve === false) {
31
+ return { outcome: 'pass' };
32
+ }
33
+ let prompter;
34
+ try {
35
+ prompter = ctx.prompter.create();
36
+ }
37
+ catch (err) {
38
+ const msg = err instanceof Error ? err.message : String(err);
39
+ ctx.io.err(`manual-approve: ${msg} Pass --no-approve to bypass the manual approve gate.\n`);
40
+ return { outcome: 'refuse' };
41
+ }
42
+ let verdict;
43
+ try {
44
+ verdict = await askApproveVerdict(prompter);
45
+ }
46
+ finally {
47
+ await prompter.close?.();
48
+ }
49
+ if (verdict === 'no') {
50
+ ctx.io.err('draft approve refused: user declined manual approve gate.\n');
51
+ return { outcome: 'refuse' };
52
+ }
53
+ return { outcome: 'pass' };
54
+ };
55
+ //# sourceMappingURL=approve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/gates/approve.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAkB;IAElB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC9C,MAAM,QAAQ,GACZ,OAAO,KAAK,CAAC;YACX,CAAC,CAAC,kCAAkC;YACpC,CAAC,CAAC,iCAAiC,OAAO,OAAO,CAAC;QACtD,MAAM,GAAG,GAAG,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAChE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC;QAC/C,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAkB,KAAK,EAAE,GAAG,EAAuB,EAAE;IAC9E,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QACzE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,GAAG,CAAC,EAAE,CAAC,GAAG,CACR,mBAAmB,GAAG,yDAAyD,CAChF,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,OAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;YAAS,CAAC;QACT,MAAM,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;IAC3B,CAAC;IACD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC1E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { CadenceConfig, CadenceState, Draft, GateSet } from '@manehorizons/cadence-types';
2
+ import type { BuildGateContext, BuildGateOpts } from './build-types.js';
3
+ /**
4
+ * Build the `BuildGateContext` the per-task-verify gate consumes (Phase 39.7).
5
+ * The build command router owns construction; the gate reaches git/verifier/
6
+ * notifier only through the ports built here.
7
+ */
8
+ export declare function buildBuildContext(args: {
9
+ cwd: string;
10
+ state: CadenceState;
11
+ draft: Draft;
12
+ config: CadenceConfig | null;
13
+ gateSet: GateSet;
14
+ taskId: string;
15
+ opts: BuildGateOpts;
16
+ }): BuildGateContext;
17
+ //# sourceMappingURL=build-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-context.d.ts","sourceRoot":"","sources":["../../src/gates/build-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,aAAa,EACb,YAAY,EACZ,KAAK,EACL,OAAO,EACR,MAAM,6BAA6B,CAAC;AAGrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAExE;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,aAAa,CAAC;CACrB,GAAG,gBAAgB,CAenB"}
@@ -0,0 +1,81 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { selectNotifier } from '../notify/factory.js';
3
+ import { selectPerTaskVerifier } from '../verify/per-task-factory.js';
4
+ /**
5
+ * Build the `BuildGateContext` the per-task-verify gate consumes (Phase 39.7).
6
+ * The build command router owns construction; the gate reaches git/verifier/
7
+ * notifier only through the ports built here.
8
+ */
9
+ export function buildBuildContext(args) {
10
+ const { cwd, state, draft, config, gateSet, taskId, opts } = args;
11
+ return {
12
+ cwd,
13
+ state,
14
+ draft,
15
+ config,
16
+ gateSet,
17
+ taskId,
18
+ opts,
19
+ diff: (files) => collectDiff(cwd, files),
20
+ verifiers: { perTask: selectPerTaskVerifier(config) },
21
+ emit: { perTaskFail: (info) => emitPerTaskFail(config, info) },
22
+ io: { err: (s) => process.stderr.write(s) },
23
+ };
24
+ }
25
+ /**
26
+ * `git diff HEAD -- <files>` via execSync. Empty string when the repo isn't a
27
+ * git workdir, when there's no diff, or on error — the mock verifier reads an
28
+ * empty diff as `'concerns'`, the right conservative default for non-git.
29
+ */
30
+ function collectDiff(cwd, files) {
31
+ if (files.length === 0)
32
+ return '';
33
+ try {
34
+ const args = ['diff', '--no-color', 'HEAD', '--', ...files];
35
+ return execSync(`git ${args.map(shellQuote).join(' ')}`, {
36
+ cwd,
37
+ encoding: 'utf8',
38
+ stdio: ['ignore', 'pipe', 'ignore'],
39
+ maxBuffer: 16 * 1024 * 1024,
40
+ });
41
+ }
42
+ catch {
43
+ return '';
44
+ }
45
+ }
46
+ function shellQuote(arg) {
47
+ if (/^[A-Za-z0-9._/=:@+-]+$/.test(arg))
48
+ return arg;
49
+ return `"${arg.replace(/(["\\$`])/g, '\\$1')}"`;
50
+ }
51
+ /**
52
+ * Emit a `per-task-fail` anomaly. Mirrors the Phase 24.2 inline emitter:
53
+ * returns early on a null config (degraded path), dispatches unconditionally
54
+ * otherwise (the notifier transport drops it on opted-out profiles), and turns
55
+ * a transport failure into one stderr warning rather than throwing.
56
+ */
57
+ async function emitPerTaskFail(config, info) {
58
+ if (!config)
59
+ return;
60
+ const notifier = selectNotifier(config);
61
+ const event = {
62
+ type: 'per-task-fail',
63
+ severity: 'error',
64
+ message: `per-task-verify ${info.bypassed ? 'bypassed' : 'refused'} for ${info.taskId}: ${info.reason}`,
65
+ context: {
66
+ taskId: info.taskId,
67
+ provider: info.provider,
68
+ reason: info.reason,
69
+ bypassed: info.bypassed,
70
+ },
71
+ ts: new Date().toISOString(),
72
+ };
73
+ try {
74
+ await notifier.notify([event]);
75
+ }
76
+ catch (err) {
77
+ const msg = err instanceof Error ? err.message : String(err);
78
+ process.stderr.write(`cadence-notify: ${notifier.name} transport failed — ${msg} (continuing)\n`);
79
+ }
80
+ }
81
+ //# sourceMappingURL=build-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-context.js","sourceRoot":"","sources":["../../src/gates/build-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAQ9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAGtE;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAQjC;IACC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAClE,OAAO;QACL,GAAG;QACH,KAAK;QACL,KAAK;QACL,MAAM;QACN,OAAO;QACP,MAAM;QACN,IAAI;QACJ,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC;QACxC,SAAS,EAAE,EAAE,OAAO,EAAE,qBAAqB,CAAC,MAAM,CAAC,EAAE;QACrD,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;QAC9D,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;KAC5C,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,GAAW,EAAE,KAAe;IAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;QAC5D,OAAO,QAAQ,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;YACvD,GAAG;YACH,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;YACnC,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACnD,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,eAAe,CAC5B,MAA4B,EAC5B,IAA6E;IAE7E,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,KAAK,GAAiB;QAC1B,IAAI,EAAE,eAAe;QACrB,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,mBAAmB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,QAAQ,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE;QACvG,OAAO,EAAE;YACP,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB;QACD,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC7B,CAAC;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mBAAmB,QAAQ,CAAC,IAAI,uBAAuB,GAAG,iBAAiB,CAC5E,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { GateImpl } from './types.js';
2
+ /**
3
+ * Build/test-must-pass gate (DESIGN.md §4.1 always-fire). Wired for real in
4
+ * Phase 39.2: runs `config.verification.testCommand` via the injected runner
5
+ * port and refuses on a non-zero exit, unless --allow-failing-build / --force.
6
+ * When no testCommand is configured (`ran:false`), the gate cannot enforce and
7
+ * passes *silently* — like any other gate that passes, it adds no output, so a
8
+ * settle on an unconfigured repo stays bit-identical (AC-7). The subprocess is
9
+ * reached only through `ctx.runner` — the gate never imports child_process.
10
+ */
11
+ export declare const runBuildTestGate: GateImpl;
12
+ //# sourceMappingURL=build-test-must-pass.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-test-must-pass.d.ts","sourceRoot":"","sources":["../../src/gates/build-test-must-pass.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,YAAY,CAAC;AAEvD;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAc9B,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Build/test-must-pass gate (DESIGN.md §4.1 always-fire). Wired for real in
3
+ * Phase 39.2: runs `config.verification.testCommand` via the injected runner
4
+ * port and refuses on a non-zero exit, unless --allow-failing-build / --force.
5
+ * When no testCommand is configured (`ran:false`), the gate cannot enforce and
6
+ * passes *silently* — like any other gate that passes, it adds no output, so a
7
+ * settle on an unconfigured repo stays bit-identical (AC-7). The subprocess is
8
+ * reached only through `ctx.runner` — the gate never imports child_process.
9
+ */
10
+ export const runBuildTestGate = async (ctx) => {
11
+ const res = await ctx.runner.test();
12
+ if (!res.ran) {
13
+ return { outcome: 'pass' };
14
+ }
15
+ if (!res.ok && !ctx.opts.allowFailingBuild && !ctx.opts.force) {
16
+ ctx.io.err(`build-test-must-pass: ${res.command} exited ${res.exitCode}\n`);
17
+ ctx.io.err('settle run refused: the test suite must pass before settle. ' +
18
+ 'Pass --allow-failing-build to bypass, or --force to settle anyway.\n');
19
+ return { outcome: 'refuse' };
20
+ }
21
+ return { outcome: 'pass' };
22
+ };
23
+ //# sourceMappingURL=build-test-must-pass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-test-must-pass.js","sourceRoot":"","sources":["../../src/gates/build-test-must-pass.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAa,KAAK,EAAE,GAAG,EAAuB,EAAE;IAC3E,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9D,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,yBAAyB,GAAG,CAAC,OAAO,WAAW,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC;QAC5E,GAAG,CAAC,EAAE,CAAC,GAAG,CACR,8DAA8D;YAC5D,sEAAsE,CACzE,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC,CAAC"}
@@ -0,0 +1,54 @@
1
+ import type { CadenceConfig, CadenceState, Draft, GateSet } from '@manehorizons/cadence-types';
2
+ import type { PerTaskInput, PerTaskResult } from '../verify/per-task.js';
3
+ import type { PerTaskVerifyRecord } from '../build/record.js';
4
+ import type { GateResult, IoPort } from './types.js';
5
+ /**
6
+ * Build-surface gate contract (Phase 39.7). For the per-task-verify gate that
7
+ * fires at `build task` time on DONE outcomes. Reuses the shared `GateResult`
8
+ * shape parameterized with `BuildProducts` so the gate can hand its
9
+ * `PerTaskVerifyRecord` back to the router (which threads it into
10
+ * `recordTaskOutcome`). The build command router owns context construction.
11
+ */
12
+ /** The product a build gate contributes back to the router. */
13
+ export interface BuildProducts {
14
+ perTaskRecord?: PerTaskVerifyRecord;
15
+ }
16
+ /** The subset of `build task` flags the build gates read. */
17
+ export interface BuildGateOpts {
18
+ readonly allowPerTaskFailure?: boolean;
19
+ }
20
+ /** Per-task verifier port (Phase 39.7); lazily `selectPerTaskVerifier`. */
21
+ export interface BuildVerifierPorts {
22
+ readonly perTask: {
23
+ verify(input: PerTaskInput): Promise<PerTaskResult>;
24
+ };
25
+ }
26
+ /** Notification collaborator for the build gates. */
27
+ export interface BuildEmitPort {
28
+ /** per-task-fail anomaly (Phase 24.2). Dispatched UNCONDITIONALLY (the
29
+ * notifier transport drops it on opted-out profiles — see the original
30
+ * build.ts note); not under the anomaly-notify guard. */
31
+ perTaskFail(info: {
32
+ taskId: string;
33
+ provider: string;
34
+ reason: string;
35
+ bypassed: boolean;
36
+ }): Promise<void>;
37
+ }
38
+ /** Everything a build gate may read. Built once by the build router. Readonly. */
39
+ export interface BuildGateContext {
40
+ readonly cwd: string;
41
+ readonly state: CadenceState;
42
+ readonly draft: Draft;
43
+ readonly config: CadenceConfig | null;
44
+ readonly gateSet: GateSet;
45
+ readonly taskId: string;
46
+ readonly opts: BuildGateOpts;
47
+ /** `git diff --no-color HEAD -- <files>`; empty string on any error / no git. */
48
+ diff(files: string[]): string;
49
+ readonly verifiers: BuildVerifierPorts;
50
+ readonly emit: BuildEmitPort;
51
+ readonly io: IoPort;
52
+ }
53
+ export type BuildGateImpl = (ctx: BuildGateContext) => Promise<GateResult<BuildProducts>>;
54
+ //# sourceMappingURL=build-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-types.d.ts","sourceRoot":"","sources":["../../src/gates/build-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,KAAK,EACL,OAAO,EACR,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;;GAMG;AAEH,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAED,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,2EAA2E;AAC3E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE;QAAE,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;KAAE,CAAC;CAC3E;AAED,qDAAqD;AACrD,MAAM,WAAW,aAAa;IAC5B;;8DAE0D;IAC1D,WAAW,CAAC,IAAI,EAAE;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,OAAO,CAAC;KACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnB;AAED,kFAAkF;AAClF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,iFAAiF;IACjF,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,GAAG,EAAE,gBAAgB,KAClB,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=build-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-types.js","sourceRoot":"","sources":["../../src/gates/build-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import type { Finding } from '@manehorizons/cadence-types';
2
+ import type { GateImpl } from './types.js';
3
+ /** HIGH-only finding flattener. The convergence boolean + sidecar findingsCount
4
+ * are HIGH-only (Phase 37.1 spec) — a conscious divergence from the 35.1
5
+ * source which counts total findings. Moved from settle.ts verbatim. */
6
+ export declare function collectHighFindings(findings: Record<string, Finding[]>): Array<{
7
+ file: string;
8
+ line?: number;
9
+ message: string;
10
+ }>;
11
+ /**
12
+ * Code-review verifier gate (Phase 24.3) + bounded convergence (Phase 37.1).
13
+ * Extracted from settle.ts verbatim (Phase 39.4). Fires on membership
14
+ * ('code-review'). Runs the reviewer over the touched-file diff; "no HIGH
15
+ * finding" is the convergence pass. Advances the CODE-REVIEW.json sidecar via
16
+ * nextConvergence and branches bypass / reloop / escalate. Reaches git, the
17
+ * reviewer, the notifier, and the sidecar only through ctx ports.
18
+ */
19
+ export declare const runCodeReviewGate: GateImpl;
20
+ //# sourceMappingURL=code-review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-review.d.ts","sourceRoot":"","sources":["../../src/gates/code-review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAE3D,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,YAAY,CAAC;AAEvD;;yEAEyE;AACzE,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,GAClC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAazD;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,EAAE,QA8H/B,CAAC"}
@@ -0,0 +1,137 @@
1
+ import { nextConvergence } from '../verify/converge.js';
2
+ /** HIGH-only finding flattener. The convergence boolean + sidecar findingsCount
3
+ * are HIGH-only (Phase 37.1 spec) — a conscious divergence from the 35.1
4
+ * source which counts total findings. Moved from settle.ts verbatim. */
5
+ export function collectHighFindings(findings) {
6
+ const out = [];
7
+ for (const [file, list] of Object.entries(findings)) {
8
+ for (const f of list) {
9
+ if (f.severity !== 'high')
10
+ continue;
11
+ out.push({
12
+ file,
13
+ ...(f.line !== undefined ? { line: f.line } : {}),
14
+ message: f.message,
15
+ });
16
+ }
17
+ }
18
+ return out;
19
+ }
20
+ /**
21
+ * Code-review verifier gate (Phase 24.3) + bounded convergence (Phase 37.1).
22
+ * Extracted from settle.ts verbatim (Phase 39.4). Fires on membership
23
+ * ('code-review'). Runs the reviewer over the touched-file diff; "no HIGH
24
+ * finding" is the convergence pass. Advances the CODE-REVIEW.json sidecar via
25
+ * nextConvergence and branches bypass / reloop / escalate. Reaches git, the
26
+ * reviewer, the notifier, and the sidecar only through ctx ports.
27
+ */
28
+ export const runCodeReviewGate = async (ctx) => {
29
+ const touched = [...ctx.touchedFiles];
30
+ const diff = ctx.diff();
31
+ try {
32
+ const result = await ctx.verifiers.codeReview.verify({ files: touched, diff });
33
+ const codeReviewFindings = result.findings;
34
+ const highs = collectHighFindings(result.findings);
35
+ const pass = highs.length === 0;
36
+ const { attemptsSoFar, history } = await ctx.codeReviewSidecar.read();
37
+ const maxAttempts = ctx.config?.convergence?.maxAttempts ?? 3;
38
+ const nv = nextConvergence(pass, attemptsSoFar, maxAttempts);
39
+ const now = new Date().toISOString();
40
+ // Phase 24.3 contract preserved (NOT narrowed): --force OR
41
+ // --allow-code-review-failure bypasses ANY failing code-review.
42
+ const bypassed = !pass && (ctx.opts.allowCodeReviewFailure === true || ctx.opts.force === true);
43
+ history.push({
44
+ at: now,
45
+ pass,
46
+ findingsCount: highs.length,
47
+ provider: result.provider,
48
+ ...(result.model ? { model: result.model } : {}),
49
+ verdict: nv.verdict,
50
+ ...(bypassed ? { bypassed: true } : {}),
51
+ });
52
+ await ctx.codeReviewSidecar.write(JSON.stringify({
53
+ draftId: ctx.state.activeDraft,
54
+ converged: pass,
55
+ attempts: nv.verdict === 'pass' ? attemptsSoFar : nv.attempt,
56
+ maxAttempts,
57
+ history,
58
+ pass,
59
+ provider: result.provider,
60
+ ...(result.model ? { model: result.model } : {}),
61
+ findings: highs.length,
62
+ at: now,
63
+ }, null, 2) + '\n');
64
+ if (!pass) {
65
+ for (const h of highs) {
66
+ ctx.io.err(`code-review: ${h.file}${h.line !== undefined ? `:${h.line}` : ''} high — ${h.message}\n`);
67
+ }
68
+ if (bypassed) {
69
+ const flag = ctx.opts.force === true ? '--force' : '--allow-code-review-failure';
70
+ ctx.io.err(`code-review: ${flag} set; proceeding past ${highs.length} HIGH finding(s).\n`);
71
+ if (ctx.gateSet.gates.includes('anomaly-notify')) {
72
+ await ctx.emit.codeReviewHigh(result.findings, {
73
+ provider: result.provider,
74
+ bypassed: true,
75
+ });
76
+ }
77
+ if (nv.verdict === 'escalate') {
78
+ await ctx.emit.codeReviewUnconverged({
79
+ draftId: ctx.state.activeDraft,
80
+ attempts: nv.attempt,
81
+ maxAttempts,
82
+ findings: highs.length,
83
+ provider: result.provider,
84
+ ...(result.model ? { model: result.model } : {}),
85
+ bypassed: true,
86
+ });
87
+ }
88
+ // fall through → SUMMARY.codeReview recorded downstream.
89
+ }
90
+ else if (nv.verdict === 'reloop') {
91
+ if (ctx.gateSet.gates.includes('anomaly-notify')) {
92
+ await ctx.emit.codeReviewHigh(result.findings, {
93
+ provider: result.provider,
94
+ bypassed: false,
95
+ });
96
+ }
97
+ ctx.io.err(`code-review: attempt ${nv.attempt}/${maxAttempts} did not pass — ` +
98
+ 'fix the flagged code and re-run `cadence settle run`, ' +
99
+ 'or pass --allow-code-review-failure to proceed anyway.\n');
100
+ return { outcome: 'refuse', summaryPatch: { codeReview: codeReviewFindings } };
101
+ }
102
+ else {
103
+ // nv.verdict === 'escalate', no bypass flag → hard refuse.
104
+ if (ctx.gateSet.gates.includes('anomaly-notify')) {
105
+ await ctx.emit.codeReviewHigh(result.findings, {
106
+ provider: result.provider,
107
+ bypassed: false,
108
+ });
109
+ }
110
+ await ctx.emit.codeReviewUnconverged({
111
+ draftId: ctx.state.activeDraft,
112
+ attempts: nv.attempt,
113
+ maxAttempts,
114
+ findings: highs.length,
115
+ provider: result.provider,
116
+ ...(result.model ? { model: result.model } : {}),
117
+ });
118
+ ctx.io.err('settle run refused: code-review did NOT converge after ' +
119
+ `${maxAttempts} attempts — a human decision is required. ` +
120
+ 'Fix the flagged code, or pass --allow-code-review-failure ' +
121
+ 'to proceed anyway.\n');
122
+ return { outcome: 'refuse', summaryPatch: { codeReview: codeReviewFindings } };
123
+ }
124
+ }
125
+ // pass (converged) OR bypass fall-through → record findings, proceed.
126
+ return { outcome: 'pass', summaryPatch: { codeReview: codeReviewFindings } };
127
+ }
128
+ catch (err) {
129
+ const message = err instanceof Error ? err.message : String(err);
130
+ ctx.io.err(`code-review: verifier failed — ${message}. Pass --allow-code-review-failure to continue.\n`);
131
+ if (ctx.opts.allowCodeReviewFailure !== true && ctx.opts.force !== true) {
132
+ return { outcome: 'refuse' };
133
+ }
134
+ return { outcome: 'pass' };
135
+ }
136
+ };
137
+ //# sourceMappingURL=code-review.js.map