@deftai/directive-core 0.55.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 (861) hide show
  1. package/dist/architecture/sor-preflight.d.ts +66 -0
  2. package/dist/architecture/sor-preflight.js +903 -0
  3. package/dist/branch/evaluate.d.ts +23 -0
  4. package/dist/branch/evaluate.js +136 -0
  5. package/dist/branch/git.d.ts +15 -0
  6. package/dist/branch/git.js +42 -0
  7. package/dist/branch/index.d.ts +3 -0
  8. package/dist/branch/index.js +3 -0
  9. package/dist/cache/cli.d.ts +3 -0
  10. package/dist/cache/cli.js +8 -0
  11. package/dist/cache/constants.d.ts +12 -0
  12. package/dist/cache/constants.js +14 -0
  13. package/dist/cache/errors.d.ts +34 -0
  14. package/dist/cache/errors.js +52 -0
  15. package/dist/cache/fetch.d.ts +101 -0
  16. package/dist/cache/fetch.js +413 -0
  17. package/dist/cache/index.d.ts +14 -0
  18. package/dist/cache/index.js +14 -0
  19. package/dist/cache/io.d.ts +15 -0
  20. package/dist/cache/io.js +53 -0
  21. package/dist/cache/json.d.ts +11 -0
  22. package/dist/cache/json.js +32 -0
  23. package/dist/cache/main.d.ts +3 -0
  24. package/dist/cache/main.js +319 -0
  25. package/dist/cache/operations.d.ts +34 -0
  26. package/dist/cache/operations.js +348 -0
  27. package/dist/cache/paths.d.ts +7 -0
  28. package/dist/cache/paths.js +27 -0
  29. package/dist/cache/quota.d.ts +56 -0
  30. package/dist/cache/quota.js +191 -0
  31. package/dist/cache/scanner.d.ts +28 -0
  32. package/dist/cache/scanner.js +362 -0
  33. package/dist/cache/test-helpers.d.ts +10 -0
  34. package/dist/cache/test-helpers.js +17 -0
  35. package/dist/cache/time.d.ts +9 -0
  36. package/dist/cache/time.js +20 -0
  37. package/dist/cache/types.d.ts +50 -0
  38. package/dist/cache/types.js +2 -0
  39. package/dist/cache/validate.d.ts +3 -0
  40. package/dist/cache/validate.js +118 -0
  41. package/dist/capacity/backfill.d.ts +52 -0
  42. package/dist/capacity/backfill.js +429 -0
  43. package/dist/capacity/index.d.ts +3 -0
  44. package/dist/capacity/index.js +3 -0
  45. package/dist/capacity/show.d.ts +73 -0
  46. package/dist/capacity/show.js +387 -0
  47. package/dist/check/index.d.ts +3 -0
  48. package/dist/check/index.js +2 -0
  49. package/dist/check/orchestrator.d.ts +51 -0
  50. package/dist/check/orchestrator.js +71 -0
  51. package/dist/codebase/constants.d.ts +2 -0
  52. package/dist/codebase/constants.js +2 -0
  53. package/dist/codebase/default-extractor.d.ts +28 -0
  54. package/dist/codebase/default-extractor.js +713 -0
  55. package/dist/codebase/index.d.ts +8 -0
  56. package/dist/codebase/index.js +8 -0
  57. package/dist/codebase/json.d.ts +14 -0
  58. package/dist/codebase/json.js +45 -0
  59. package/dist/codebase/map-fresh.d.ts +11 -0
  60. package/dist/codebase/map-fresh.js +125 -0
  61. package/dist/codebase/map.d.ts +19 -0
  62. package/dist/codebase/map.js +345 -0
  63. package/dist/codebase/projection-registry.d.ts +25 -0
  64. package/dist/codebase/projection-registry.js +93 -0
  65. package/dist/codebase/provider.d.ts +30 -0
  66. package/dist/codebase/provider.js +696 -0
  67. package/dist/content-contracts/skills/greptile-detector.d.ts +56 -0
  68. package/dist/content-contracts/skills/greptile-detector.js +368 -0
  69. package/dist/content-contracts/skills/helpers.d.ts +24 -0
  70. package/dist/content-contracts/skills/helpers.js +73 -0
  71. package/dist/content-contracts/skills/skill-frontmatter.d.ts +7 -0
  72. package/dist/content-contracts/skills/skill-frontmatter.js +65 -0
  73. package/dist/content-contracts/standards/_helpers.d.ts +49 -0
  74. package/dist/content-contracts/standards/_helpers.js +227 -0
  75. package/dist/content-contracts/standards/_shapes.d.ts +12 -0
  76. package/dist/content-contracts/standards/_shapes.js +45 -0
  77. package/dist/content-contracts/standards/_taskfile-helpers.d.ts +12 -0
  78. package/dist/content-contracts/standards/_taskfile-helpers.js +61 -0
  79. package/dist/content-root.d.ts +47 -0
  80. package/dist/content-root.js +89 -0
  81. package/dist/doctor/agents-md.d.ts +14 -0
  82. package/dist/doctor/agents-md.js +263 -0
  83. package/dist/doctor/checks.d.ts +16 -0
  84. package/dist/doctor/checks.js +351 -0
  85. package/dist/doctor/cli.d.ts +2 -0
  86. package/dist/doctor/cli.js +7 -0
  87. package/dist/doctor/constants.d.ts +15 -0
  88. package/dist/doctor/constants.js +40 -0
  89. package/dist/doctor/doctor-state.d.ts +16 -0
  90. package/dist/doctor/doctor-state.js +117 -0
  91. package/dist/doctor/flags.d.ts +5 -0
  92. package/dist/doctor/flags.js +63 -0
  93. package/dist/doctor/index.d.ts +14 -0
  94. package/dist/doctor/index.js +14 -0
  95. package/dist/doctor/json.d.ts +3 -0
  96. package/dist/doctor/json.js +21 -0
  97. package/dist/doctor/main.d.ts +3 -0
  98. package/dist/doctor/main.js +387 -0
  99. package/dist/doctor/manifest.d.ts +11 -0
  100. package/dist/doctor/manifest.js +114 -0
  101. package/dist/doctor/output.d.ts +19 -0
  102. package/dist/doctor/output.js +49 -0
  103. package/dist/doctor/paths.d.ts +16 -0
  104. package/dist/doctor/paths.js +106 -0
  105. package/dist/doctor/payload-staleness.d.ts +13 -0
  106. package/dist/doctor/payload-staleness.js +165 -0
  107. package/dist/doctor/taskfile.d.ts +6 -0
  108. package/dist/doctor/taskfile.js +65 -0
  109. package/dist/doctor/types.d.ts +76 -0
  110. package/dist/doctor/types.js +4 -0
  111. package/dist/doctor/which.d.ts +3 -0
  112. package/dist/doctor/which.js +17 -0
  113. package/dist/encoding/evaluate.d.ts +19 -0
  114. package/dist/encoding/evaluate.js +155 -0
  115. package/dist/encoding/git.d.ts +11 -0
  116. package/dist/encoding/git.js +36 -0
  117. package/dist/encoding/index.d.ts +6 -0
  118. package/dist/encoding/index.js +6 -0
  119. package/dist/encoding/patterns.d.ts +29 -0
  120. package/dist/encoding/patterns.js +109 -0
  121. package/dist/encoding/scan.d.ts +24 -0
  122. package/dist/encoding/scan.js +182 -0
  123. package/dist/encoding/text.d.ts +21 -0
  124. package/dist/encoding/text.js +111 -0
  125. package/dist/index.d.ts +54 -0
  126. package/dist/index.js +55 -0
  127. package/dist/intake/candidates-log.d.ts +20 -0
  128. package/dist/intake/candidates-log.js +224 -0
  129. package/dist/intake/github-auth-modes-cli.d.ts +3 -0
  130. package/dist/intake/github-auth-modes-cli.js +23 -0
  131. package/dist/intake/github-auth-modes.d.ts +54 -0
  132. package/dist/intake/github-auth-modes.js +275 -0
  133. package/dist/intake/github-body-cli.d.ts +3 -0
  134. package/dist/intake/github-body-cli.js +30 -0
  135. package/dist/intake/github-body.d.ts +48 -0
  136. package/dist/intake/github-body.js +151 -0
  137. package/dist/intake/index.d.ts +15 -0
  138. package/dist/intake/index.js +15 -0
  139. package/dist/intake/issue-emit-cli.d.ts +3 -0
  140. package/dist/intake/issue-emit-cli.js +34 -0
  141. package/dist/intake/issue-emit.d.ts +63 -0
  142. package/dist/intake/issue-emit.js +351 -0
  143. package/dist/intake/issue-ingest-cli.d.ts +3 -0
  144. package/dist/intake/issue-ingest-cli.js +33 -0
  145. package/dist/intake/issue-ingest.d.ts +53 -0
  146. package/dist/intake/issue-ingest.js +477 -0
  147. package/dist/intake/markdown-scanners.d.ts +23 -0
  148. package/dist/intake/markdown-scanners.js +247 -0
  149. package/dist/intake/parity-scenarios.d.ts +22 -0
  150. package/dist/intake/parity-scenarios.js +32 -0
  151. package/dist/intake/platform-capabilities.d.ts +11 -0
  152. package/dist/intake/platform-capabilities.js +34 -0
  153. package/dist/intake/reconcile-issues-cli.d.ts +3 -0
  154. package/dist/intake/reconcile-issues-cli.js +31 -0
  155. package/dist/intake/reconcile-issues.d.ts +60 -0
  156. package/dist/intake/reconcile-issues.js +756 -0
  157. package/dist/integration-e2e/bootstrap-cache-module.d.ts +5 -0
  158. package/dist/integration-e2e/bootstrap-cache-module.js +21 -0
  159. package/dist/integration-e2e/helpers.d.ts +28 -0
  160. package/dist/integration-e2e/helpers.js +157 -0
  161. package/dist/lifecycle/event-detect.d.ts +32 -0
  162. package/dist/lifecycle/event-detect.js +172 -0
  163. package/dist/lifecycle/events.d.ts +45 -0
  164. package/dist/lifecycle/events.js +340 -0
  165. package/dist/lifecycle/index.d.ts +4 -0
  166. package/dist/lifecycle/index.js +4 -0
  167. package/dist/lifecycle/lifecycle-hygiene.d.ts +59 -0
  168. package/dist/lifecycle/lifecycle-hygiene.js +388 -0
  169. package/dist/orchestration/index.d.ts +7 -0
  170. package/dist/orchestration/index.js +7 -0
  171. package/dist/orchestration/judgment-policy.d.ts +23 -0
  172. package/dist/orchestration/judgment-policy.js +228 -0
  173. package/dist/orchestration/pathspec.d.ts +11 -0
  174. package/dist/orchestration/pathspec.js +95 -0
  175. package/dist/orchestration/probe-session.d.ts +74 -0
  176. package/dist/orchestration/probe-session.js +478 -0
  177. package/dist/orchestration/subagent-monitor.d.ts +64 -0
  178. package/dist/orchestration/subagent-monitor.js +405 -0
  179. package/dist/orchestration/verify-investigation.d.ts +27 -0
  180. package/dist/orchestration/verify-investigation.js +314 -0
  181. package/dist/orchestration/verify-judgment-gates.d.ts +66 -0
  182. package/dist/orchestration/verify-judgment-gates.js +710 -0
  183. package/dist/packs/index.d.ts +4 -0
  184. package/dist/packs/index.js +4 -0
  185. package/dist/packs/pack-render.d.ts +31 -0
  186. package/dist/packs/pack-render.js +357 -0
  187. package/dist/packs/packs-slice.d.ts +58 -0
  188. package/dist/packs/packs-slice.js +649 -0
  189. package/dist/packs/quarantine-ext.d.ts +7 -0
  190. package/dist/packs/quarantine-ext.js +164 -0
  191. package/dist/platform/agents-md.d.ts +31 -0
  192. package/dist/platform/agents-md.js +320 -0
  193. package/dist/platform/changelog-cli.d.ts +3 -0
  194. package/dist/platform/changelog-cli.js +64 -0
  195. package/dist/platform/constants.d.ts +20 -0
  196. package/dist/platform/constants.js +27 -0
  197. package/dist/platform/index.d.ts +9 -0
  198. package/dist/platform/index.js +9 -0
  199. package/dist/platform/ip-risk.d.ts +10 -0
  200. package/dist/platform/ip-risk.js +235 -0
  201. package/dist/platform/linear-scan.d.ts +36 -0
  202. package/dist/platform/linear-scan.js +174 -0
  203. package/dist/platform/platform-capabilities.d.ts +45 -0
  204. package/dist/platform/platform-capabilities.js +190 -0
  205. package/dist/platform/resolve-changelog-unreleased.d.ts +24 -0
  206. package/dist/platform/resolve-changelog-unreleased.js +364 -0
  207. package/dist/platform/resolve-version.d.ts +22 -0
  208. package/dist/platform/resolve-version.js +303 -0
  209. package/dist/platform/slug-normalize.d.ts +9 -0
  210. package/dist/platform/slug-normalize.js +110 -0
  211. package/dist/policy/autonomy.d.ts +43 -0
  212. package/dist/policy/autonomy.js +220 -0
  213. package/dist/policy/capacity.d.ts +45 -0
  214. package/dist/policy/capacity.js +251 -0
  215. package/dist/policy/decisions.d.ts +26 -0
  216. package/dist/policy/decisions.js +114 -0
  217. package/dist/policy/disclosure.d.ts +4 -0
  218. package/dist/policy/disclosure.js +19 -0
  219. package/dist/policy/index.d.ts +43 -0
  220. package/dist/policy/index.js +298 -0
  221. package/dist/policy/resolve.d.ts +38 -0
  222. package/dist/policy/resolve.js +228 -0
  223. package/dist/policy/wip.d.ts +15 -0
  224. package/dist/policy/wip.js +81 -0
  225. package/dist/pr-closing-keywords/constants.d.ts +6 -0
  226. package/dist/pr-closing-keywords/constants.js +6 -0
  227. package/dist/pr-closing-keywords/detect.d.ts +5 -0
  228. package/dist/pr-closing-keywords/detect.js +113 -0
  229. package/dist/pr-closing-keywords/gh.d.ts +6 -0
  230. package/dist/pr-closing-keywords/gh.js +129 -0
  231. package/dist/pr-closing-keywords/index.d.ts +7 -0
  232. package/dist/pr-closing-keywords/index.js +6 -0
  233. package/dist/pr-closing-keywords/io.d.ts +3 -0
  234. package/dist/pr-closing-keywords/io.js +22 -0
  235. package/dist/pr-closing-keywords/main.d.ts +9 -0
  236. package/dist/pr-closing-keywords/main.js +246 -0
  237. package/dist/pr-closing-keywords/types.d.ts +23 -0
  238. package/dist/pr-closing-keywords/types.js +2 -0
  239. package/dist/pr-merge-readiness/compute.d.ts +7 -0
  240. package/dist/pr-merge-readiness/compute.js +210 -0
  241. package/dist/pr-merge-readiness/constants.d.ts +20 -0
  242. package/dist/pr-merge-readiness/constants.js +32 -0
  243. package/dist/pr-merge-readiness/evaluate.d.ts +5 -0
  244. package/dist/pr-merge-readiness/evaluate.js +48 -0
  245. package/dist/pr-merge-readiness/gh.d.ts +22 -0
  246. package/dist/pr-merge-readiness/gh.js +281 -0
  247. package/dist/pr-merge-readiness/index.d.ts +9 -0
  248. package/dist/pr-merge-readiness/index.js +8 -0
  249. package/dist/pr-merge-readiness/main.d.ts +14 -0
  250. package/dist/pr-merge-readiness/main.js +67 -0
  251. package/dist/pr-merge-readiness/output.d.ts +7 -0
  252. package/dist/pr-merge-readiness/output.js +98 -0
  253. package/dist/pr-merge-readiness/parse.d.ts +6 -0
  254. package/dist/pr-merge-readiness/parse.js +83 -0
  255. package/dist/pr-merge-readiness/types.d.ts +29 -0
  256. package/dist/pr-merge-readiness/types.js +2 -0
  257. package/dist/pr-monitor/cadence.d.ts +3 -0
  258. package/dist/pr-monitor/cadence.js +12 -0
  259. package/dist/pr-monitor/constants.d.ts +8 -0
  260. package/dist/pr-monitor/constants.js +12 -0
  261. package/dist/pr-monitor/index.d.ts +7 -0
  262. package/dist/pr-monitor/index.js +6 -0
  263. package/dist/pr-monitor/main.d.ts +17 -0
  264. package/dist/pr-monitor/main.js +169 -0
  265. package/dist/pr-monitor/monitor.d.ts +9 -0
  266. package/dist/pr-monitor/monitor.js +106 -0
  267. package/dist/pr-monitor/readiness.d.ts +6 -0
  268. package/dist/pr-monitor/readiness.js +64 -0
  269. package/dist/pr-monitor/types.d.ts +30 -0
  270. package/dist/pr-monitor/types.js +2 -0
  271. package/dist/pr-protected-issues/constants.d.ts +7 -0
  272. package/dist/pr-protected-issues/constants.js +7 -0
  273. package/dist/pr-protected-issues/gh.d.ts +9 -0
  274. package/dist/pr-protected-issues/gh.js +96 -0
  275. package/dist/pr-protected-issues/index.d.ts +6 -0
  276. package/dist/pr-protected-issues/index.js +5 -0
  277. package/dist/pr-protected-issues/main.d.ts +14 -0
  278. package/dist/pr-protected-issues/main.js +128 -0
  279. package/dist/pr-protected-issues/parse.d.ts +6 -0
  280. package/dist/pr-protected-issues/parse.js +21 -0
  281. package/dist/pr-protected-issues/types.d.ts +8 -0
  282. package/dist/pr-protected-issues/types.js +2 -0
  283. package/dist/pr-wait-mergeable/cascade.d.ts +12 -0
  284. package/dist/pr-wait-mergeable/cascade.js +107 -0
  285. package/dist/pr-wait-mergeable/classify.d.ts +5 -0
  286. package/dist/pr-wait-mergeable/classify.js +47 -0
  287. package/dist/pr-wait-mergeable/constants.d.ts +5 -0
  288. package/dist/pr-wait-mergeable/constants.js +5 -0
  289. package/dist/pr-wait-mergeable/index.d.ts +8 -0
  290. package/dist/pr-wait-mergeable/index.js +7 -0
  291. package/dist/pr-wait-mergeable/main.d.ts +18 -0
  292. package/dist/pr-wait-mergeable/main.js +213 -0
  293. package/dist/pr-wait-mergeable/result.d.ts +9 -0
  294. package/dist/pr-wait-mergeable/result.js +38 -0
  295. package/dist/pr-wait-mergeable/types.d.ts +16 -0
  296. package/dist/pr-wait-mergeable/types.js +2 -0
  297. package/dist/pr-wait-mergeable/wrappers.d.ts +26 -0
  298. package/dist/pr-wait-mergeable/wrappers.js +103 -0
  299. package/dist/preflight/evaluate.d.ts +22 -0
  300. package/dist/preflight/evaluate.js +137 -0
  301. package/dist/preflight/index.d.ts +3 -0
  302. package/dist/preflight/index.js +2 -0
  303. package/dist/preflight-cache/evaluate.d.ts +40 -0
  304. package/dist/preflight-cache/evaluate.js +481 -0
  305. package/dist/preflight-cache/index.d.ts +3 -0
  306. package/dist/preflight-cache/index.js +2 -0
  307. package/dist/preflight-gh/classifier.d.ts +56 -0
  308. package/dist/preflight-gh/classifier.js +415 -0
  309. package/dist/preflight-gh/index.d.ts +3 -0
  310. package/dist/preflight-gh/index.js +2 -0
  311. package/dist/release/changelog.d.ts +9 -0
  312. package/dist/release/changelog.js +105 -0
  313. package/dist/release/cli.d.ts +2 -0
  314. package/dist/release/cli.js +7 -0
  315. package/dist/release/constants.d.ts +22 -0
  316. package/dist/release/constants.js +85 -0
  317. package/dist/release/flags.d.ts +4 -0
  318. package/dist/release/flags.js +131 -0
  319. package/dist/release/gh.d.ts +16 -0
  320. package/dist/release/gh.js +210 -0
  321. package/dist/release/git.d.ts +11 -0
  322. package/dist/release/git.js +84 -0
  323. package/dist/release/index.d.ts +14 -0
  324. package/dist/release/index.js +15 -0
  325. package/dist/release/main.d.ts +3 -0
  326. package/dist/release/main.js +47 -0
  327. package/dist/release/paths.d.ts +6 -0
  328. package/dist/release/paths.js +39 -0
  329. package/dist/release/pipeline.d.ts +6 -0
  330. package/dist/release/pipeline.js +314 -0
  331. package/dist/release/pyproject-sync.d.ts +6 -0
  332. package/dist/release/pyproject-sync.js +52 -0
  333. package/dist/release/pyproject.d.ts +3 -0
  334. package/dist/release/pyproject.js +33 -0
  335. package/dist/release/python-bridge.d.ts +7 -0
  336. package/dist/release/python-bridge.js +144 -0
  337. package/dist/release/spawn.d.ts +8 -0
  338. package/dist/release/spawn.js +44 -0
  339. package/dist/release/types.d.ts +58 -0
  340. package/dist/release/types.js +2 -0
  341. package/dist/release/version.d.ts +11 -0
  342. package/dist/release/version.js +74 -0
  343. package/dist/release-e2e/constants.d.ts +22 -0
  344. package/dist/release-e2e/constants.js +43 -0
  345. package/dist/release-e2e/entrypoint-worker-thread.d.ts +2 -0
  346. package/dist/release-e2e/entrypoint-worker-thread.js +22 -0
  347. package/dist/release-e2e/entrypoint-worker.d.ts +13 -0
  348. package/dist/release-e2e/entrypoint-worker.js +50 -0
  349. package/dist/release-e2e/entrypoint.d.ts +40 -0
  350. package/dist/release-e2e/entrypoint.js +257 -0
  351. package/dist/release-e2e/flags.d.ts +5 -0
  352. package/dist/release-e2e/flags.js +80 -0
  353. package/dist/release-e2e/gh-ops.d.ts +5 -0
  354. package/dist/release-e2e/gh-ops.js +72 -0
  355. package/dist/release-e2e/git-ops.d.ts +6 -0
  356. package/dist/release-e2e/git-ops.js +47 -0
  357. package/dist/release-e2e/index.d.ts +10 -0
  358. package/dist/release-e2e/index.js +10 -0
  359. package/dist/release-e2e/main.d.ts +4 -0
  360. package/dist/release-e2e/main.js +78 -0
  361. package/dist/release-e2e/npm-ops.d.ts +29 -0
  362. package/dist/release-e2e/npm-ops.js +149 -0
  363. package/dist/release-e2e/rehearsal.d.ts +3 -0
  364. package/dist/release-e2e/rehearsal.js +51 -0
  365. package/dist/release-e2e/rollback-bridge.d.ts +3 -0
  366. package/dist/release-e2e/rollback-bridge.js +20 -0
  367. package/dist/release-e2e/types.d.ts +40 -0
  368. package/dist/release-e2e/types.js +2 -0
  369. package/dist/release-publish/cli.d.ts +2 -0
  370. package/dist/release-publish/cli.js +7 -0
  371. package/dist/release-publish/constants.d.ts +4 -0
  372. package/dist/release-publish/constants.js +24 -0
  373. package/dist/release-publish/flags.d.ts +5 -0
  374. package/dist/release-publish/flags.js +67 -0
  375. package/dist/release-publish/gh-api.d.ts +6 -0
  376. package/dist/release-publish/gh-api.js +102 -0
  377. package/dist/release-publish/index.d.ts +7 -0
  378. package/dist/release-publish/index.js +8 -0
  379. package/dist/release-publish/main.d.ts +3 -0
  380. package/dist/release-publish/main.js +38 -0
  381. package/dist/release-publish/pipeline.d.ts +4 -0
  382. package/dist/release-publish/pipeline.js +46 -0
  383. package/dist/release-publish/types.d.ts +25 -0
  384. package/dist/release-publish/types.js +2 -0
  385. package/dist/release-rollback/constants.d.ts +18 -0
  386. package/dist/release-rollback/constants.js +55 -0
  387. package/dist/release-rollback/flags.d.ts +4 -0
  388. package/dist/release-rollback/flags.js +136 -0
  389. package/dist/release-rollback/gh.d.ts +5 -0
  390. package/dist/release-rollback/gh.js +71 -0
  391. package/dist/release-rollback/git.d.ts +9 -0
  392. package/dist/release-rollback/git.js +87 -0
  393. package/dist/release-rollback/guard.d.ts +12 -0
  394. package/dist/release-rollback/guard.js +97 -0
  395. package/dist/release-rollback/index.d.ts +9 -0
  396. package/dist/release-rollback/index.js +10 -0
  397. package/dist/release-rollback/main.d.ts +3 -0
  398. package/dist/release-rollback/main.js +51 -0
  399. package/dist/release-rollback/pipeline.d.ts +7 -0
  400. package/dist/release-rollback/pipeline.js +221 -0
  401. package/dist/release-rollback/types.d.ts +41 -0
  402. package/dist/release-rollback/types.js +2 -0
  403. package/dist/render/constants.d.ts +16 -0
  404. package/dist/render/constants.js +78 -0
  405. package/dist/render/framework-commands.d.ts +41 -0
  406. package/dist/render/framework-commands.js +416 -0
  407. package/dist/render/index.d.ts +15 -0
  408. package/dist/render/index.js +15 -0
  409. package/dist/render/prd-render.d.ts +14 -0
  410. package/dist/render/prd-render.js +79 -0
  411. package/dist/render/project-render.d.ts +20 -0
  412. package/dist/render/project-render.js +169 -0
  413. package/dist/render/roadmap-render.d.ts +8 -0
  414. package/dist/render/roadmap-render.js +387 -0
  415. package/dist/render/spec-render.d.ts +13 -0
  416. package/dist/render/spec-render.js +362 -0
  417. package/dist/render/spec-validate.d.ts +6 -0
  418. package/dist/render/spec-validate.js +157 -0
  419. package/dist/render/text-utils.d.ts +8 -0
  420. package/dist/render/text-utils.js +72 -0
  421. package/dist/scm/argv.d.ts +7 -0
  422. package/dist/scm/argv.js +54 -0
  423. package/dist/scm/binary.d.ts +11 -0
  424. package/dist/scm/binary.js +35 -0
  425. package/dist/scm/build-command.d.ts +11 -0
  426. package/dist/scm/build-command.js +23 -0
  427. package/dist/scm/call.d.ts +25 -0
  428. package/dist/scm/call.js +38 -0
  429. package/dist/scm/cli.d.ts +3 -0
  430. package/dist/scm/cli.js +7 -0
  431. package/dist/scm/constants.d.ts +11 -0
  432. package/dist/scm/constants.js +11 -0
  433. package/dist/scm/errors.d.ts +5 -0
  434. package/dist/scm/errors.js +8 -0
  435. package/dist/scm/gh-rest.d.ts +74 -0
  436. package/dist/scm/gh-rest.js +326 -0
  437. package/dist/scm/index.d.ts +11 -0
  438. package/dist/scm/index.js +11 -0
  439. package/dist/scm/main.d.ts +12 -0
  440. package/dist/scm/main.js +65 -0
  441. package/dist/scm/py-format.d.ts +9 -0
  442. package/dist/scm/py-format.js +31 -0
  443. package/dist/scm/rest-dispatch.d.ts +14 -0
  444. package/dist/scm/rest-dispatch.js +175 -0
  445. package/dist/scope/audit-log.d.ts +14 -0
  446. package/dist/scope/audit-log.js +186 -0
  447. package/dist/scope/capacity-stamp.d.ts +3 -0
  448. package/dist/scope/capacity-stamp.js +45 -0
  449. package/dist/scope/cli.d.ts +4 -0
  450. package/dist/scope/cli.js +11 -0
  451. package/dist/scope/constants.d.ts +19 -0
  452. package/dist/scope/constants.js +44 -0
  453. package/dist/scope/decompose.d.ts +42 -0
  454. package/dist/scope/decompose.js +1016 -0
  455. package/dist/scope/decomposed-refs.d.ts +6 -0
  456. package/dist/scope/decomposed-refs.js +173 -0
  457. package/dist/scope/demote.d.ts +24 -0
  458. package/dist/scope/demote.js +209 -0
  459. package/dist/scope/index.d.ts +12 -0
  460. package/dist/scope/index.js +12 -0
  461. package/dist/scope/main.d.ts +30 -0
  462. package/dist/scope/main.js +365 -0
  463. package/dist/scope/project-context.d.ts +6 -0
  464. package/dist/scope/project-context.js +55 -0
  465. package/dist/scope/project-definition-sync.d.ts +3 -0
  466. package/dist/scope/project-definition-sync.js +157 -0
  467. package/dist/scope/transition.d.ts +10 -0
  468. package/dist/scope/transition.js +133 -0
  469. package/dist/scope/undo.d.ts +25 -0
  470. package/dist/scope/undo.js +334 -0
  471. package/dist/scope/vbrief-json.d.ts +4 -0
  472. package/dist/scope/vbrief-json.js +8 -0
  473. package/dist/scope/vbrief-ref.d.ts +11 -0
  474. package/dist/scope/vbrief-ref.js +100 -0
  475. package/dist/scope/wip-cap-check.d.ts +11 -0
  476. package/dist/scope/wip-cap-check.js +23 -0
  477. package/dist/session/git.d.ts +14 -0
  478. package/dist/session/git.js +49 -0
  479. package/dist/session/index.d.ts +9 -0
  480. package/dist/session/index.js +9 -0
  481. package/dist/session/json.d.ts +7 -0
  482. package/dist/session/json.js +29 -0
  483. package/dist/session/resume-conditions.d.ts +56 -0
  484. package/dist/session/resume-conditions.js +486 -0
  485. package/dist/session/ritual-entrypoint.d.ts +20 -0
  486. package/dist/session/ritual-entrypoint.js +86 -0
  487. package/dist/session/ritual-sentinel.d.ts +58 -0
  488. package/dist/session/ritual-sentinel.js +338 -0
  489. package/dist/session/session-start-hook.d.ts +14 -0
  490. package/dist/session/session-start-hook.js +53 -0
  491. package/dist/session/session-start.d.ts +41 -0
  492. package/dist/session/session-start.js +290 -0
  493. package/dist/session/staleness.d.ts +8 -0
  494. package/dist/session/staleness.js +91 -0
  495. package/dist/session/time.d.ts +5 -0
  496. package/dist/session/time.js +19 -0
  497. package/dist/session/verify-session-ritual.d.ts +29 -0
  498. package/dist/session/verify-session-ritual.js +222 -0
  499. package/dist/slice/cli.d.ts +21 -0
  500. package/dist/slice/cli.js +248 -0
  501. package/dist/slice/constants.d.ts +18 -0
  502. package/dist/slice/constants.js +30 -0
  503. package/dist/slice/errors.d.ts +9 -0
  504. package/dist/slice/errors.js +15 -0
  505. package/dist/slice/existing.d.ts +53 -0
  506. package/dist/slice/existing.js +344 -0
  507. package/dist/slice/index.d.ts +10 -0
  508. package/dist/slice/index.js +10 -0
  509. package/dist/slice/json.d.ts +7 -0
  510. package/dist/slice/json.js +25 -0
  511. package/dist/slice/lock.d.ts +9 -0
  512. package/dist/slice/lock.js +59 -0
  513. package/dist/slice/project-context.d.ts +15 -0
  514. package/dist/slice/project-context.js +87 -0
  515. package/dist/slice/record.d.ts +50 -0
  516. package/dist/slice/record.js +139 -0
  517. package/dist/slice/validate.d.ts +3 -0
  518. package/dist/slice/validate.js +86 -0
  519. package/dist/story-ready/allocation.d.ts +14 -0
  520. package/dist/story-ready/allocation.js +61 -0
  521. package/dist/story-ready/evaluate.d.ts +23 -0
  522. package/dist/story-ready/evaluate.js +161 -0
  523. package/dist/story-ready/git.d.ts +6 -0
  524. package/dist/story-ready/git.js +26 -0
  525. package/dist/story-ready/index.d.ts +4 -0
  526. package/dist/story-ready/index.js +4 -0
  527. package/dist/subprocess/max-buffer.d.ts +18 -0
  528. package/dist/subprocess/max-buffer.js +18 -0
  529. package/dist/swarm/complete-cohort-cli.d.ts +3 -0
  530. package/dist/swarm/complete-cohort-cli.js +42 -0
  531. package/dist/swarm/complete-cohort.d.ts +34 -0
  532. package/dist/swarm/complete-cohort.js +407 -0
  533. package/dist/swarm/constants.d.ts +18 -0
  534. package/dist/swarm/constants.js +24 -0
  535. package/dist/swarm/index.d.ts +18 -0
  536. package/dist/swarm/index.js +18 -0
  537. package/dist/swarm/launch-cli.d.ts +5 -0
  538. package/dist/swarm/launch-cli.js +111 -0
  539. package/dist/swarm/launch.d.ts +78 -0
  540. package/dist/swarm/launch.js +587 -0
  541. package/dist/swarm/readiness-cli.d.ts +3 -0
  542. package/dist/swarm/readiness-cli.js +25 -0
  543. package/dist/swarm/readiness.d.ts +24 -0
  544. package/dist/swarm/readiness.js +606 -0
  545. package/dist/swarm/routing-set-cli.d.ts +3 -0
  546. package/dist/swarm/routing-set-cli.js +82 -0
  547. package/dist/swarm/routing-verify-cli.d.ts +3 -0
  548. package/dist/swarm/routing-verify-cli.js +51 -0
  549. package/dist/swarm/routing-verify.d.ts +20 -0
  550. package/dist/swarm/routing-verify.js +104 -0
  551. package/dist/swarm/routing.d.ts +57 -0
  552. package/dist/swarm/routing.js +173 -0
  553. package/dist/swarm/subagent-backend.d.ts +22 -0
  554. package/dist/swarm/subagent-backend.js +162 -0
  555. package/dist/swarm/subprocess.d.ts +10 -0
  556. package/dist/swarm/subprocess.js +34 -0
  557. package/dist/swarm/verify-review-clean-cli.d.ts +3 -0
  558. package/dist/swarm/verify-review-clean-cli.js +38 -0
  559. package/dist/swarm/verify-review-clean.d.ts +40 -0
  560. package/dist/swarm/verify-review-clean.js +240 -0
  561. package/dist/swarm/worktrees-cli.d.ts +9 -0
  562. package/dist/swarm/worktrees-cli.js +57 -0
  563. package/dist/swarm/worktrees.d.ts +39 -0
  564. package/dist/swarm/worktrees.js +178 -0
  565. package/dist/text/redos-safe.d.ts +29 -0
  566. package/dist/text/redos-safe.js +338 -0
  567. package/dist/triage/actions/candidates-log.d.ts +8 -0
  568. package/dist/triage/actions/candidates-log.js +195 -0
  569. package/dist/triage/actions/errors.d.ts +17 -0
  570. package/dist/triage/actions/errors.js +29 -0
  571. package/dist/triage/actions/index.d.ts +19 -0
  572. package/dist/triage/actions/index.js +305 -0
  573. package/dist/triage/actions/resume-on.d.ts +3 -0
  574. package/dist/triage/actions/resume-on.js +65 -0
  575. package/dist/triage/actions/types.d.ts +57 -0
  576. package/dist/triage/actions/types.js +2 -0
  577. package/dist/triage/bootstrap/gitignore.d.ts +16 -0
  578. package/dist/triage/bootstrap/gitignore.js +414 -0
  579. package/dist/triage/bootstrap/index.d.ts +44 -0
  580. package/dist/triage/bootstrap/index.js +572 -0
  581. package/dist/triage/bootstrap/types.d.ts +60 -0
  582. package/dist/triage/bootstrap/types.js +2 -0
  583. package/dist/triage/bulk/index.d.ts +99 -0
  584. package/dist/triage/bulk/index.js +454 -0
  585. package/dist/triage/classify/index.d.ts +88 -0
  586. package/dist/triage/classify/index.js +738 -0
  587. package/dist/triage/help/index.d.ts +25 -0
  588. package/dist/triage/help/index.js +212 -0
  589. package/dist/triage/help/registry-data.d.ts +555 -0
  590. package/dist/triage/help/registry-data.js +841 -0
  591. package/dist/triage/index.d.ts +23 -0
  592. package/dist/triage/index.js +23 -0
  593. package/dist/triage/queue/audit.d.ts +12 -0
  594. package/dist/triage/queue/audit.js +47 -0
  595. package/dist/triage/queue/build-queue.d.ts +9 -0
  596. package/dist/triage/queue/build-queue.js +133 -0
  597. package/dist/triage/queue/cache.d.ts +20 -0
  598. package/dist/triage/queue/cache.js +169 -0
  599. package/dist/triage/queue/constants.d.ts +22 -0
  600. package/dist/triage/queue/constants.js +28 -0
  601. package/dist/triage/queue/derive-group.d.ts +7 -0
  602. package/dist/triage/queue/derive-group.js +20 -0
  603. package/dist/triage/queue/index.d.ts +12 -0
  604. package/dist/triage/queue/index.js +12 -0
  605. package/dist/triage/queue/project.d.ts +6 -0
  606. package/dist/triage/queue/project.js +18 -0
  607. package/dist/triage/queue/ranking-labels.d.ts +10 -0
  608. package/dist/triage/queue/ranking-labels.js +54 -0
  609. package/dist/triage/queue/render.d.ts +9 -0
  610. package/dist/triage/queue/render.js +35 -0
  611. package/dist/triage/queue/repo.d.ts +5 -0
  612. package/dist/triage/queue/repo.js +36 -0
  613. package/dist/triage/queue/scope-walk.d.ts +13 -0
  614. package/dist/triage/queue/scope-walk.js +170 -0
  615. package/dist/triage/queue/selection.d.ts +28 -0
  616. package/dist/triage/queue/selection.js +109 -0
  617. package/dist/triage/queue/types.d.ts +58 -0
  618. package/dist/triage/queue/types.js +2 -0
  619. package/dist/triage/reconcile/audit.d.ts +4 -0
  620. package/dist/triage/reconcile/audit.js +62 -0
  621. package/dist/triage/reconcile/index.d.ts +5 -0
  622. package/dist/triage/reconcile/index.js +5 -0
  623. package/dist/triage/reconcile/parse-uri.d.ts +4 -0
  624. package/dist/triage/reconcile/parse-uri.js +43 -0
  625. package/dist/triage/reconcile/reconcile.d.ts +17 -0
  626. package/dist/triage/reconcile/reconcile.js +163 -0
  627. package/dist/triage/reconcile/types.d.ts +23 -0
  628. package/dist/triage/reconcile/types.js +70 -0
  629. package/dist/triage/refresh/drift.d.ts +15 -0
  630. package/dist/triage/refresh/drift.js +72 -0
  631. package/dist/triage/refresh/extract.d.ts +3 -0
  632. package/dist/triage/refresh/extract.js +43 -0
  633. package/dist/triage/refresh/index.d.ts +5 -0
  634. package/dist/triage/refresh/index.js +5 -0
  635. package/dist/triage/refresh/refresh.d.ts +16 -0
  636. package/dist/triage/refresh/refresh.js +95 -0
  637. package/dist/triage/refresh/types.d.ts +18 -0
  638. package/dist/triage/refresh/types.js +7 -0
  639. package/dist/triage/scope/cli.d.ts +23 -0
  640. package/dist/triage/scope/cli.js +257 -0
  641. package/dist/triage/scope/constants.d.ts +16 -0
  642. package/dist/triage/scope/constants.js +25 -0
  643. package/dist/triage/scope/coverage.d.ts +24 -0
  644. package/dist/triage/scope/coverage.js +96 -0
  645. package/dist/triage/scope/duration.d.ts +6 -0
  646. package/dist/triage/scope/duration.js +44 -0
  647. package/dist/triage/scope/evaluate.d.ts +18 -0
  648. package/dist/triage/scope/evaluate.js +161 -0
  649. package/dist/triage/scope/index.d.ts +14 -0
  650. package/dist/triage/scope/index.js +14 -0
  651. package/dist/triage/scope/milestone.d.ts +13 -0
  652. package/dist/triage/scope/milestone.js +178 -0
  653. package/dist/triage/scope/mutations-core.d.ts +24 -0
  654. package/dist/triage/scope/mutations-core.js +216 -0
  655. package/dist/triage/scope/mutations.d.ts +21 -0
  656. package/dist/triage/scope/mutations.js +203 -0
  657. package/dist/triage/scope/normalize.d.ts +5 -0
  658. package/dist/triage/scope/normalize.js +45 -0
  659. package/dist/triage/scope/python-repr.d.ts +7 -0
  660. package/dist/triage/scope/python-repr.js +25 -0
  661. package/dist/triage/scope/renderers.d.ts +9 -0
  662. package/dist/triage/scope/renderers.js +177 -0
  663. package/dist/triage/scope/resolve.d.ts +15 -0
  664. package/dist/triage/scope/resolve.js +122 -0
  665. package/dist/triage/scope/time.d.ts +6 -0
  666. package/dist/triage/scope/time.js +18 -0
  667. package/dist/triage/scope/validate.d.ts +11 -0
  668. package/dist/triage/scope/validate.js +272 -0
  669. package/dist/triage/scope-drift/add-ignore.d.ts +10 -0
  670. package/dist/triage/scope-drift/add-ignore.js +78 -0
  671. package/dist/triage/scope-drift/cache-walker.d.ts +8 -0
  672. package/dist/triage/scope-drift/cache-walker.js +103 -0
  673. package/dist/triage/scope-drift/compute.d.ts +9 -0
  674. package/dist/triage/scope-drift/compute.js +92 -0
  675. package/dist/triage/scope-drift/index.d.ts +6 -0
  676. package/dist/triage/scope-drift/index.js +6 -0
  677. package/dist/triage/scope-drift/render.d.ts +4 -0
  678. package/dist/triage/scope-drift/render.js +45 -0
  679. package/dist/triage/scope-drift/scope-rules.d.ts +16 -0
  680. package/dist/triage/scope-drift/scope-rules.js +149 -0
  681. package/dist/triage/scope-drift/types.d.ts +13 -0
  682. package/dist/triage/scope-drift/types.js +8 -0
  683. package/dist/triage/smoketest/index.d.ts +81 -0
  684. package/dist/triage/smoketest/index.js +335 -0
  685. package/dist/triage/subscribe/index.d.ts +38 -0
  686. package/dist/triage/subscribe/index.js +303 -0
  687. package/dist/triage/summary/index.d.ts +70 -0
  688. package/dist/triage/summary/index.js +431 -0
  689. package/dist/triage/summary/reconcilable.d.ts +12 -0
  690. package/dist/triage/summary/reconcilable.js +150 -0
  691. package/dist/triage/summary/scope-drift.d.ts +5 -0
  692. package/dist/triage/summary/scope-drift.js +219 -0
  693. package/dist/triage/welcome/constants.d.ts +24 -0
  694. package/dist/triage/welcome/constants.js +34 -0
  695. package/dist/triage/welcome/default-mode.d.ts +21 -0
  696. package/dist/triage/welcome/default-mode.js +48 -0
  697. package/dist/triage/welcome/index.d.ts +6 -0
  698. package/dist/triage/welcome/index.js +6 -0
  699. package/dist/triage/welcome/prior-state.d.ts +17 -0
  700. package/dist/triage/welcome/prior-state.js +170 -0
  701. package/dist/triage/welcome/summary.d.ts +23 -0
  702. package/dist/triage/welcome/summary.js +303 -0
  703. package/dist/triage/welcome/writers.d.ts +17 -0
  704. package/dist/triage/welcome/writers.js +157 -0
  705. package/dist/ts-check-lane/index.d.ts +3 -0
  706. package/dist/ts-check-lane/index.js +2 -0
  707. package/dist/ts-check-lane/run-lane.d.ts +53 -0
  708. package/dist/ts-check-lane/run-lane.js +98 -0
  709. package/dist/validate-content/capacity-policy.d.ts +82 -0
  710. package/dist/validate-content/capacity-policy.js +399 -0
  711. package/dist/validate-content/capacity-show.d.ts +60 -0
  712. package/dist/validate-content/capacity-show.js +336 -0
  713. package/dist/validate-content/filename.d.ts +3 -0
  714. package/dist/validate-content/filename.js +54 -0
  715. package/dist/validate-content/index.d.ts +9 -0
  716. package/dist/validate-content/index.js +9 -0
  717. package/dist/validate-content/link-parser.d.ts +5 -0
  718. package/dist/validate-content/link-parser.js +42 -0
  719. package/dist/validate-content/types.d.ts +8 -0
  720. package/dist/validate-content/types.js +2 -0
  721. package/dist/validate-content/validate-links.d.ts +17 -0
  722. package/dist/validate-content/validate-links.js +114 -0
  723. package/dist/validate-content/validate-strategy-output.d.ts +11 -0
  724. package/dist/validate-content/validate-strategy-output.js +120 -0
  725. package/dist/validate-content/verify-capacity.d.ts +14 -0
  726. package/dist/validate-content/verify-capacity.js +96 -0
  727. package/dist/vbrief-activate/activate.d.ts +13 -0
  728. package/dist/vbrief-activate/activate.js +184 -0
  729. package/dist/vbrief-activate/constants.d.ts +9 -0
  730. package/dist/vbrief-activate/constants.js +11 -0
  731. package/dist/vbrief-activate/index.d.ts +6 -0
  732. package/dist/vbrief-activate/index.js +4 -0
  733. package/dist/vbrief-activate/main.d.ts +14 -0
  734. package/dist/vbrief-activate/main.js +33 -0
  735. package/dist/vbrief-build/build.d.ts +13 -0
  736. package/dist/vbrief-build/build.js +123 -0
  737. package/dist/vbrief-build/constants.d.ts +13 -0
  738. package/dist/vbrief-build/constants.js +34 -0
  739. package/dist/vbrief-build/index.d.ts +12 -0
  740. package/dist/vbrief-build/index.js +11 -0
  741. package/dist/vbrief-build/json.d.ts +3 -0
  742. package/dist/vbrief-build/json.js +5 -0
  743. package/dist/vbrief-build/main.d.ts +5 -0
  744. package/dist/vbrief-build/main.js +65 -0
  745. package/dist/vbrief-build/parity-scenarios.d.ts +19 -0
  746. package/dist/vbrief-build/parity-scenarios.js +321 -0
  747. package/dist/vbrief-build/project-definition-io.d.ts +13 -0
  748. package/dist/vbrief-build/project-definition-io.js +117 -0
  749. package/dist/vbrief-build/routing.d.ts +13 -0
  750. package/dist/vbrief-build/routing.js +110 -0
  751. package/dist/vbrief-build/sources.d.ts +16 -0
  752. package/dist/vbrief-build/sources.js +294 -0
  753. package/dist/vbrief-build/speckit.d.ts +23 -0
  754. package/dist/vbrief-build/speckit.js +212 -0
  755. package/dist/vbrief-build/types.d.ts +18 -0
  756. package/dist/vbrief-build/types.js +7 -0
  757. package/dist/vbrief-reconcile/graph.d.ts +11 -0
  758. package/dist/vbrief-reconcile/graph.js +171 -0
  759. package/dist/vbrief-reconcile/index.d.ts +10 -0
  760. package/dist/vbrief-reconcile/index.js +9 -0
  761. package/dist/vbrief-reconcile/labels.d.ts +22 -0
  762. package/dist/vbrief-reconcile/labels.js +252 -0
  763. package/dist/vbrief-reconcile/main.d.ts +18 -0
  764. package/dist/vbrief-reconcile/main.js +149 -0
  765. package/dist/vbrief-reconcile/parity-scenarios.d.ts +16 -0
  766. package/dist/vbrief-reconcile/parity-scenarios.js +385 -0
  767. package/dist/vbrief-reconcile/py-repr.d.ts +3 -0
  768. package/dist/vbrief-reconcile/py-repr.js +5 -0
  769. package/dist/vbrief-reconcile/reconciliation.d.ts +20 -0
  770. package/dist/vbrief-reconcile/reconciliation.js +542 -0
  771. package/dist/vbrief-reconcile/swarm-deps.d.ts +8 -0
  772. package/dist/vbrief-reconcile/swarm-deps.js +142 -0
  773. package/dist/vbrief-reconcile/types.d.ts +128 -0
  774. package/dist/vbrief-reconcile/types.js +2 -0
  775. package/dist/vbrief-reconcile/umbrellas.d.ts +48 -0
  776. package/dist/vbrief-reconcile/umbrellas.js +462 -0
  777. package/dist/vbrief-validate/conformance.d.ts +26 -0
  778. package/dist/vbrief-validate/conformance.js +273 -0
  779. package/dist/vbrief-validate/constants.d.ts +13 -0
  780. package/dist/vbrief-validate/constants.js +36 -0
  781. package/dist/vbrief-validate/decomposition.d.ts +3 -0
  782. package/dist/vbrief-validate/decomposition.js +38 -0
  783. package/dist/vbrief-validate/epic-links.d.ts +4 -0
  784. package/dist/vbrief-validate/epic-links.js +152 -0
  785. package/dist/vbrief-validate/filename.d.ts +5 -0
  786. package/dist/vbrief-validate/filename.js +62 -0
  787. package/dist/vbrief-validate/folder-status.d.ts +4 -0
  788. package/dist/vbrief-validate/folder-status.js +30 -0
  789. package/dist/vbrief-validate/index.d.ts +14 -0
  790. package/dist/vbrief-validate/index.js +11 -0
  791. package/dist/vbrief-validate/main.d.ts +17 -0
  792. package/dist/vbrief-validate/main.js +127 -0
  793. package/dist/vbrief-validate/origin.d.ts +4 -0
  794. package/dist/vbrief-validate/origin.js +76 -0
  795. package/dist/vbrief-validate/paths.d.ts +11 -0
  796. package/dist/vbrief-validate/paths.js +83 -0
  797. package/dist/vbrief-validate/placeholders.d.ts +3 -0
  798. package/dist/vbrief-validate/placeholders.js +33 -0
  799. package/dist/vbrief-validate/plan-hooks.d.ts +9 -0
  800. package/dist/vbrief-validate/plan-hooks.js +145 -0
  801. package/dist/vbrief-validate/precutover.d.ts +7 -0
  802. package/dist/vbrief-validate/precutover.js +30 -0
  803. package/dist/vbrief-validate/project-definition.d.ts +4 -0
  804. package/dist/vbrief-validate/project-definition.js +166 -0
  805. package/dist/vbrief-validate/schema.d.ts +8 -0
  806. package/dist/vbrief-validate/schema.js +150 -0
  807. package/dist/vbrief-validate/staleness.d.ts +3 -0
  808. package/dist/vbrief-validate/staleness.js +106 -0
  809. package/dist/vbrief-validate/validate-all.d.ts +17 -0
  810. package/dist/vbrief-validate/validate-all.js +119 -0
  811. package/dist/vbrief-validation/fidelity.d.ts +22 -0
  812. package/dist/vbrief-validation/fidelity.js +508 -0
  813. package/dist/vbrief-validation/index.d.ts +11 -0
  814. package/dist/vbrief-validation/index.js +8 -0
  815. package/dist/vbrief-validation/legacy-sections.d.ts +13 -0
  816. package/dist/vbrief-validation/legacy-sections.js +124 -0
  817. package/dist/vbrief-validation/main.d.ts +5 -0
  818. package/dist/vbrief-validation/main.js +65 -0
  819. package/dist/vbrief-validation/normalize.d.ts +22 -0
  820. package/dist/vbrief-validation/normalize.js +126 -0
  821. package/dist/vbrief-validation/parity-scenarios.d.ts +14 -0
  822. package/dist/vbrief-validation/parity-scenarios.js +523 -0
  823. package/dist/vbrief-validation/safety.d.ts +38 -0
  824. package/dist/vbrief-validation/safety.js +422 -0
  825. package/dist/vbrief-validation/story-quality.d.ts +29 -0
  826. package/dist/vbrief-validation/story-quality.js +452 -0
  827. package/dist/vbrief-validation/types.d.ts +58 -0
  828. package/dist/vbrief-validation/types.js +2 -0
  829. package/dist/vbrief-validation/validation.d.ts +15 -0
  830. package/dist/vbrief-validation/validation.js +123 -0
  831. package/dist/verify-env/index.d.ts +6 -0
  832. package/dist/verify-env/index.js +6 -0
  833. package/dist/verify-env/node-runtime.d.ts +6 -0
  834. package/dist/verify-env/node-runtime.js +11 -0
  835. package/dist/verify-env/toolchain-check.d.ts +28 -0
  836. package/dist/verify-env/toolchain-check.js +68 -0
  837. package/dist/verify-env/verify-hooks-installed.d.ts +21 -0
  838. package/dist/verify-env/verify-hooks-installed.js +162 -0
  839. package/dist/verify-env/verify-no-task-runtime.d.ts +20 -0
  840. package/dist/verify-env/verify-no-task-runtime.js +383 -0
  841. package/dist/verify-env/verify-tools.d.ts +59 -0
  842. package/dist/verify-env/verify-tools.js +354 -0
  843. package/dist/verify-source/code-structure-validate.d.ts +48 -0
  844. package/dist/verify-source/code-structure-validate.js +678 -0
  845. package/dist/verify-source/content-manifest.d.ts +102 -0
  846. package/dist/verify-source/content-manifest.js +282 -0
  847. package/dist/verify-source/index.d.ts +7 -0
  848. package/dist/verify-source/index.js +7 -0
  849. package/dist/verify-source/python-call-scan.d.ts +14 -0
  850. package/dist/verify-source/python-call-scan.js +137 -0
  851. package/dist/verify-source/rule-ownership-lint.d.ts +33 -0
  852. package/dist/verify-source/rule-ownership-lint.js +179 -0
  853. package/dist/verify-source/scm-boundary.d.ts +26 -0
  854. package/dist/verify-source/scm-boundary.js +170 -0
  855. package/dist/verify-source/verify-stubs.d.ts +19 -0
  856. package/dist/verify-source/verify-stubs.js +185 -0
  857. package/dist/wip-cap/evaluate.d.ts +17 -0
  858. package/dist/wip-cap/evaluate.js +62 -0
  859. package/dist/wip-cap/index.d.ts +2 -0
  860. package/dist/wip-cap/index.js +2 -0
  861. package/package.json +206 -0
@@ -0,0 +1,903 @@
1
+ /**
2
+ * architecture/sor-preflight.ts -- System-of-record architecture preflight gate.
3
+ *
4
+ * Faithful TypeScript port of scripts/preflight_architecture_sor.py and
5
+ * scripts/_sor_gate_diff.py. Answers one question:
6
+ * "Is this the correct system of record for this kind of state?"
7
+ *
8
+ * Two modes:
9
+ * - Story/spec mode: validates the story's architecture.systemOfRecord design record.
10
+ * - Diff mode: scans changed runtime code for risky persistence signals and requires
11
+ * a matching design record.
12
+ *
13
+ * Exit codes: 0 pass / 1 architecture violation / 2 gate misconfigured
14
+ */
15
+ import { spawnSync } from "node:child_process";
16
+ import { existsSync, readFileSync, statSync } from "node:fs";
17
+ import { basename, extname, join, resolve } from "node:path";
18
+ // ---------------------------------------------------------------------------
19
+ // Classification constants
20
+ // ---------------------------------------------------------------------------
21
+ export const STATE_CLASSIFICATIONS = new Set([
22
+ "durable_product_state",
23
+ "auth_session_state",
24
+ "authorization_state",
25
+ "audit_event_state",
26
+ "external_integration_state",
27
+ "canonical_artifact",
28
+ "cache",
29
+ "projection",
30
+ "import_export_artifact",
31
+ "dev_only_fixture",
32
+ "ephemeral_ui_state",
33
+ ]);
34
+ export const DURABLE_CLASSIFICATIONS = new Set([
35
+ "durable_product_state",
36
+ "auth_session_state",
37
+ "authorization_state",
38
+ "audit_event_state",
39
+ "external_integration_state",
40
+ ]);
41
+ export const SECURITY_CLASSIFICATIONS = new Set(["auth_session_state", "authorization_state"]);
42
+ export const LOCAL_STORAGE_CLASSES = new Set([
43
+ "json_file",
44
+ "yaml_file",
45
+ "toml_file",
46
+ "sqlite_file",
47
+ "browser_storage",
48
+ "in_memory",
49
+ "local_config",
50
+ "filesystem",
51
+ ]);
52
+ export const FILE_STORAGE_CLASSES = new Set(["json_file", "yaml_file", "toml_file", "filesystem"]);
53
+ export const DB_STORAGE_ALIASES = new Set([
54
+ "application_database",
55
+ "database",
56
+ "db",
57
+ "postgres",
58
+ "postgresql",
59
+ "mysql",
60
+ "mariadb",
61
+ "sqlite",
62
+ "sqlite_file",
63
+ "sql",
64
+ "dynamodb",
65
+ "firestore",
66
+ "cosmosdb",
67
+ ]);
68
+ export const EXTERNAL_STORAGE_ALIASES = new Set([
69
+ "external_service",
70
+ "service",
71
+ "provider",
72
+ "external_provider",
73
+ "third_party_provider",
74
+ "api_provider",
75
+ ]);
76
+ const STORAGE_ALIASES = {
77
+ json_file: new Set(["json", "json_file", "local_json", "mutable_json"]),
78
+ yaml_file: new Set(["yaml", "yml", "yaml_file", "local_yaml", "mutable_yaml"]),
79
+ toml_file: new Set(["toml", "toml_file", "local_toml", "mutable_toml"]),
80
+ sqlite_file: new Set(["sqlite", "sqlite_file", "sqlite_db", "db_file", "local_db"]),
81
+ browser_storage: new Set([
82
+ "browser_storage",
83
+ "local_storage",
84
+ "session_storage",
85
+ "indexeddb",
86
+ "indexed_db",
87
+ ]),
88
+ in_memory: new Set(["in_memory", "memory", "process_memory", "process_local"]),
89
+ filesystem: new Set(["filesystem", "file", "files", "local_file", "local_files"]),
90
+ database: DB_STORAGE_ALIASES,
91
+ external_service: EXTERNAL_STORAGE_ALIASES,
92
+ };
93
+ export const DURABLE_REQUIRED_FIELDS = [
94
+ "owner",
95
+ "approvedStorage",
96
+ "permissionBoundary",
97
+ "migrationRequired",
98
+ "auditRequired",
99
+ "concurrencyRequired",
100
+ "concurrencySemantics",
101
+ "transactionBoundary",
102
+ "recoverySemantics",
103
+ "conflictDetection",
104
+ "deleteSemantics",
105
+ "migrationPath",
106
+ ];
107
+ export const LOW_RISK_PATH_PREFIXES = [
108
+ ".github/",
109
+ "docs/",
110
+ "history/",
111
+ "meta/",
112
+ "references/",
113
+ "templates/",
114
+ "tests/",
115
+ "vbrief/",
116
+ ];
117
+ export const LOW_RISK_SUFFIXES = new Set([".md", ".rst", ".txt"]);
118
+ export const SCANNER_EXEMPT_PATHS = new Set([
119
+ "scripts/preflight_architecture_sor.py",
120
+ "scripts/_sor_gate_diff.py",
121
+ ]);
122
+ // ---------------------------------------------------------------------------
123
+ // Normalization helpers
124
+ // ---------------------------------------------------------------------------
125
+ export function norm(value) {
126
+ let text = String(value ?? "")
127
+ .trim()
128
+ .toLowerCase();
129
+ text = text.replace(/[\s./:-]+/g, "_");
130
+ text = text.replace(/_+/g, "_");
131
+ return text.replace(/^_+|_+$/g, "");
132
+ }
133
+ function asStringList(value) {
134
+ if (typeof value === "string")
135
+ return [value];
136
+ if (Array.isArray(value))
137
+ return value.filter((item) => typeof item === "string");
138
+ return [];
139
+ }
140
+ function nonEmpty(value) {
141
+ if (typeof value === "string")
142
+ return value.trim().length > 0;
143
+ if (Array.isArray(value) || (typeof value === "object" && value !== null)) {
144
+ return Object.keys(value).length > 0 || (Array.isArray(value) && value.length > 0);
145
+ }
146
+ if (typeof value === "boolean")
147
+ return true;
148
+ return value !== null && value !== undefined;
149
+ }
150
+ function truthyFlag(value) {
151
+ if (typeof value === "boolean")
152
+ return value;
153
+ if (typeof value === "string") {
154
+ return ["1", "true", "yes", "on", "guarded", "excluded"].includes(value.trim().toLowerCase());
155
+ }
156
+ return false;
157
+ }
158
+ function _containsAny(text, tokens) {
159
+ const normalised = norm(text);
160
+ for (const token of tokens) {
161
+ if (normalised.includes(token))
162
+ return true;
163
+ }
164
+ return false;
165
+ }
166
+ export function storageMatches(storage, declared) {
167
+ const wanted = norm(storage);
168
+ const aliases = new Set([wanted]);
169
+ const baseAliases = STORAGE_ALIASES[wanted];
170
+ if (baseAliases)
171
+ for (const a of baseAliases)
172
+ aliases.add(a);
173
+ if (DB_STORAGE_ALIASES.has(wanted))
174
+ for (const a of DB_STORAGE_ALIASES)
175
+ aliases.add(a);
176
+ if (EXTERNAL_STORAGE_ALIASES.has(wanted))
177
+ for (const a of EXTERNAL_STORAGE_ALIASES)
178
+ aliases.add(a);
179
+ const longAliases = new Set([...aliases].filter((a) => a.length > 6));
180
+ for (const item of asStringList(declared)) {
181
+ const token = norm(item);
182
+ if (aliases.has(token))
183
+ return true;
184
+ if (token.length > 6 && [...longAliases].some((alias) => token.includes(alias)))
185
+ return true;
186
+ }
187
+ return false;
188
+ }
189
+ function approvedStorageText(surface) {
190
+ const values = asStringList(surface.approvedStorage);
191
+ return values.length > 0 ? values.join(", ") : "<missing>";
192
+ }
193
+ function storageIsLocalUnsafe(value) {
194
+ for (const item of asStringList(value)) {
195
+ const token = norm(item);
196
+ if (LOCAL_STORAGE_CLASSES.has(token))
197
+ return true;
198
+ if ([...LOCAL_STORAGE_CLASSES].some((alias) => token.includes(alias)))
199
+ return true;
200
+ }
201
+ return false;
202
+ }
203
+ function _approvedDatabase(value) {
204
+ return asStringList(value).some((item) => storageMatches("database", item));
205
+ }
206
+ function _approvedExternal(value) {
207
+ return asStringList(value).some((item) => storageMatches("external_service", item));
208
+ }
209
+ // ---------------------------------------------------------------------------
210
+ // JSON loading
211
+ // ---------------------------------------------------------------------------
212
+ function loadJsonFile(path) {
213
+ if (!existsSync(path)) {
214
+ return [
215
+ null,
216
+ {
217
+ code: 2,
218
+ message: `system-of-record gate misconfigured: story path not found: ${path}`,
219
+ findings: [],
220
+ },
221
+ ];
222
+ }
223
+ if (!statSync(path).isFile()) {
224
+ return [
225
+ null,
226
+ {
227
+ code: 2,
228
+ message: `system-of-record gate misconfigured: story path is not a file: ${path}`,
229
+ findings: [],
230
+ },
231
+ ];
232
+ }
233
+ let raw;
234
+ try {
235
+ raw = readFileSync(path, "utf8");
236
+ }
237
+ catch (err) {
238
+ return [
239
+ null,
240
+ {
241
+ code: 2,
242
+ message: `system-of-record gate misconfigured: could not read ${path}: ${String(err)}`,
243
+ findings: [],
244
+ },
245
+ ];
246
+ }
247
+ let payload;
248
+ try {
249
+ payload = JSON.parse(raw);
250
+ }
251
+ catch (err) {
252
+ const e = err;
253
+ return [
254
+ null,
255
+ {
256
+ code: 2,
257
+ message: `system-of-record gate misconfigured: ${path} is not valid JSON: ${e.message ?? String(err)}`,
258
+ findings: [],
259
+ },
260
+ ];
261
+ }
262
+ if (typeof payload !== "object" || payload === null || Array.isArray(payload)) {
263
+ return [
264
+ null,
265
+ {
266
+ code: 2,
267
+ message: `system-of-record gate misconfigured: ${path} top-level value is not an object`,
268
+ findings: [],
269
+ },
270
+ ];
271
+ }
272
+ return [payload, null];
273
+ }
274
+ // ---------------------------------------------------------------------------
275
+ // Record extraction
276
+ // ---------------------------------------------------------------------------
277
+ export function systemOfRecord(payload) {
278
+ const architecture = payload.architecture;
279
+ if (typeof architecture === "object" && architecture !== null && !Array.isArray(architecture)) {
280
+ const sor = architecture.systemOfRecord;
281
+ if (typeof sor === "object" && sor !== null && !Array.isArray(sor))
282
+ return sor;
283
+ }
284
+ const plan = payload.plan;
285
+ if (typeof plan === "object" && plan !== null && !Array.isArray(plan)) {
286
+ const planArch = plan.architecture;
287
+ if (typeof planArch === "object" && planArch !== null && !Array.isArray(planArch)) {
288
+ const sor = planArch.systemOfRecord;
289
+ if (typeof sor === "object" && sor !== null && !Array.isArray(sor))
290
+ return sor;
291
+ }
292
+ }
293
+ return null;
294
+ }
295
+ function storyMentionsReferenceApp(payload) {
296
+ const text = JSON.stringify(payload).toLowerCase();
297
+ return /reference[- ]app|reference application|modeled after|modelled after|parity/.test(text);
298
+ }
299
+ function recordSurfaces(record) {
300
+ const surfaces = record.stateSurfaces;
301
+ if (!Array.isArray(surfaces))
302
+ return [];
303
+ return surfaces.filter((s) => typeof s === "object" && s !== null && !Array.isArray(s));
304
+ }
305
+ function surfaceName(surface) {
306
+ const name = surface.name;
307
+ return typeof name === "string" && name.trim().length > 0 ? name.trim() : "<unnamed>";
308
+ }
309
+ function surfaceClassification(surface) {
310
+ const raw = surface.classification;
311
+ if (typeof raw !== "string")
312
+ return "";
313
+ return norm(raw);
314
+ }
315
+ function surfaceAllowsStorage(surface, storage) {
316
+ const approvedList = surface.approvedStorage;
317
+ if (storageMatches(storage, approvedList))
318
+ return true;
319
+ const forbiddenList = surface.forbiddenStorage;
320
+ if (storageMatches(storage, forbiddenList))
321
+ return false;
322
+ return false;
323
+ }
324
+ // ---------------------------------------------------------------------------
325
+ // Surface validation
326
+ // ---------------------------------------------------------------------------
327
+ function formatFailure(findings) {
328
+ const lines = ["FAIL system-of-record gate: architecture violations found."];
329
+ for (const finding of findings) {
330
+ lines.push(` Violation: ${finding.reason}`);
331
+ lines.push(` Fix: ${finding.requiredFix}`);
332
+ if (finding.stateSurface)
333
+ lines.push(` Surface: ${finding.stateSurface}`);
334
+ if (finding.detectedStorage)
335
+ lines.push(` Detected storage: ${finding.detectedStorage}`);
336
+ if (finding.approvedStorage)
337
+ lines.push(` Approved storage: ${finding.approvedStorage}`);
338
+ }
339
+ return lines.join("\n");
340
+ }
341
+ function validateSurface(surface, findings) {
342
+ const name = surfaceName(surface);
343
+ const classification = surfaceClassification(surface);
344
+ if (!STATE_CLASSIFICATIONS.has(classification)) {
345
+ findings.push({
346
+ stateSurface: name,
347
+ reason: `Unknown or missing classification '${classification}' for state surface '${name}'.`,
348
+ requiredFix: `Set classification to one of: ${[...STATE_CLASSIFICATIONS].join(", ")}.`,
349
+ });
350
+ return;
351
+ }
352
+ if (DURABLE_CLASSIFICATIONS.has(classification)) {
353
+ const approvedList = surface.approvedStorage;
354
+ if (!approvedList || (Array.isArray(approvedList) && approvedList.length === 0)) {
355
+ findings.push({
356
+ stateSurface: name,
357
+ classification,
358
+ reason: `Durable state surface '${name}' has no approvedStorage.`,
359
+ requiredFix: "Declare the approved storage system (e.g., database, external_service).",
360
+ });
361
+ }
362
+ if (storageIsLocalUnsafe(approvedList)) {
363
+ findings.push({
364
+ stateSurface: name,
365
+ classification,
366
+ detectedStorage: approvedStorageText(surface),
367
+ reason: `Durable state surface '${name}' approves unsafe local storage.`,
368
+ requiredFix: "Durable state must use a database or external service, not local file/memory storage.",
369
+ });
370
+ }
371
+ for (const field of DURABLE_REQUIRED_FIELDS) {
372
+ if (!nonEmpty(surface[field])) {
373
+ findings.push({
374
+ stateSurface: name,
375
+ classification,
376
+ reason: `Durable state surface '${name}' is missing required field '${field}'.`,
377
+ requiredFix: `Add '${field}' to the design record surface for '${name}'.`,
378
+ });
379
+ }
380
+ }
381
+ }
382
+ if (classification === "cache") {
383
+ const approvedList = surface.approvedStorage;
384
+ if (approvedList && FILE_STORAGE_CLASSES.has(norm(asStringList(approvedList)[0] ?? ""))) {
385
+ if (!nonEmpty(surface.invalidationRules)) {
386
+ findings.push({
387
+ stateSurface: name,
388
+ classification,
389
+ reason: `Cache surface '${name}' uses file storage but has no invalidation rules.`,
390
+ requiredFix: "Add invalidationRules describing when the cache is invalidated.",
391
+ });
392
+ }
393
+ }
394
+ }
395
+ if (classification === "import_export_artifact" &&
396
+ (truthyFlag(surface.liveState) || truthyFlag(surface.authoritative))) {
397
+ findings.push({
398
+ stateSurface: name,
399
+ classification,
400
+ reason: "Import/export artifact is marked as live or authoritative state.",
401
+ requiredFix: "Use it only as a temporary transfer artifact, not live application state.",
402
+ });
403
+ }
404
+ if (classification === "canonical_artifact" &&
405
+ (truthyFlag(surface.mutable) || truthyFlag(surface.authoritative))) {
406
+ findings.push({
407
+ stateSurface: name,
408
+ classification,
409
+ reason: "Canonical artifact is marked mutable or authoritative app persistence.",
410
+ requiredFix: "Use canonical artifacts as evidence/source-authored input, not mutable app records.",
411
+ });
412
+ }
413
+ }
414
+ const REFERENCE_EVIDENCE_GROUPS = {
415
+ persistence: new Set(["persistence", "database", "schema", "storage", "repository"]),
416
+ auth: new Set(["auth", "authentication", "session", "identity"]),
417
+ permission: new Set(["permission", "authorization", "ownership", "membership", "role"]),
418
+ };
419
+ function validateReferenceApps(record, storyPayload, findings) {
420
+ if (!storyMentionsReferenceApp({ ...(record ?? {}), ...(storyPayload ?? {}) }))
421
+ return;
422
+ const refs = record.referenceApplicationComparisons;
423
+ if (!Array.isArray(refs) || refs.length === 0) {
424
+ findings.push({
425
+ reason: "Reference-application parity story missing referenceApplicationComparisons.",
426
+ requiredFix: "Add referenceApplicationComparisons documenting how this implementation compares to the reference app's persistence, auth, and permission handling.",
427
+ });
428
+ return;
429
+ }
430
+ for (const group of Object.keys(REFERENCE_EVIDENCE_GROUPS)) {
431
+ const groupTerms = REFERENCE_EVIDENCE_GROUPS[group];
432
+ const covered = refs.some((ref) => {
433
+ const text = JSON.stringify(ref).toLowerCase();
434
+ return [...groupTerms].some((term) => text.includes(term));
435
+ });
436
+ if (!covered) {
437
+ findings.push({
438
+ reason: `Reference-application parity story is missing '${group}' comparison in referenceApplicationComparisons.`,
439
+ requiredFix: `Add a comparison entry covering ${group} semantics.`,
440
+ });
441
+ }
442
+ }
443
+ }
444
+ // ---------------------------------------------------------------------------
445
+ // Signal validation
446
+ // ---------------------------------------------------------------------------
447
+ function signalLocation(signal) {
448
+ return signal.line !== null ? `${signal.path}:${signal.line}` : signal.path;
449
+ }
450
+ function validateSignals(record, signals) {
451
+ const surfaces = recordSurfaces(record);
452
+ const findings = [];
453
+ const durableSurfaces = surfaces.filter((s) => DURABLE_CLASSIFICATIONS.has(surfaceClassification(s)));
454
+ const authSurfaces = surfaces.filter((s) => SECURITY_CLASSIFICATIONS.has(surfaceClassification(s)));
455
+ for (const signal of signals) {
456
+ if (signal.storage) {
457
+ const matchingSurfaces = surfaces.filter((s) => surfaceAllowsStorage(s, signal.storage));
458
+ const forbiddenMatches = surfaces.filter((s) => asStringList(s.forbiddenStorage).some((item) => storageMatches(signal.storage, item)));
459
+ if (forbiddenMatches.length > 0) {
460
+ const surface = forbiddenMatches[0];
461
+ findings.push({
462
+ stateSurface: surfaceName(surface),
463
+ classification: surfaceClassification(surface),
464
+ detectedStorage: signal.storage,
465
+ approvedStorage: approvedStorageText(surface),
466
+ reason: `The diff implements ${signal.storage} at ${signalLocation(signal)}, but the design record forbids that storage.`,
467
+ requiredFix: "Move the implementation to the approved system of record or update the design record before implementation.",
468
+ });
469
+ }
470
+ else if (matchingSurfaces.length === 0) {
471
+ findings.push({
472
+ detectedStorage: signal.storage,
473
+ reason: `The diff implements ${signal.storage} at ${signalLocation(signal)} without a state surface that approves it.`,
474
+ requiredFix: "Declare a matching state surface, or move the implementation to the approved system of record.",
475
+ });
476
+ }
477
+ }
478
+ if (signal.kind === "mutation_endpoint" && durableSurfaces.length === 0) {
479
+ findings.push({
480
+ reason: `Stateful create/update/delete API signal at ${signalLocation(signal)} has no durable owner in the design record.`,
481
+ requiredFix: "Declare the durable state surface that owns this mutation, including permission and recovery semantics.",
482
+ });
483
+ }
484
+ if (signal.kind === "auth_state" && authSurfaces.length === 0) {
485
+ findings.push({
486
+ reason: `Auth/session/permission signal at ${signalLocation(signal)} has no auth_session_state or authorization_state surface.`,
487
+ requiredFix: "Declare the approved auth/session or authorization system of record.",
488
+ });
489
+ }
490
+ if (signal.kind === "workflow_state" && durableSurfaces.length === 0) {
491
+ findings.push({
492
+ reason: `Workflow/job/runtime state signal at ${signalLocation(signal)} has no durable or service-backed owner.`,
493
+ requiredFix: "Declare the job/workflow state owner and recovery semantics.",
494
+ });
495
+ }
496
+ }
497
+ return findings;
498
+ }
499
+ // ---------------------------------------------------------------------------
500
+ // validate_record
501
+ // ---------------------------------------------------------------------------
502
+ export function validateRecord(record, opts = {}) {
503
+ if (record === null) {
504
+ const finding = {
505
+ reason: "Triggered story has no architecture.systemOfRecord design record.",
506
+ requiredFix: "Add a system-of-record block classifying each state surface before implementation.",
507
+ };
508
+ return { code: 1, message: formatFailure([finding]), findings: [finding] };
509
+ }
510
+ const findings = [];
511
+ const surfaces = recordSurfaces(record);
512
+ if (!Array.isArray(record.stateSurfaces) || surfaces.length === 0) {
513
+ findings.push({
514
+ reason: "systemOfRecord.stateSurfaces is missing or empty.",
515
+ requiredFix: "Declare at least one state surface with classification and approvedStorage.",
516
+ });
517
+ }
518
+ for (const surface of surfaces) {
519
+ validateSurface(surface, findings);
520
+ }
521
+ validateReferenceApps(record, opts.storyPayload ?? null, findings);
522
+ if (opts.signals && opts.signals.length > 0) {
523
+ findings.push(...validateSignals(record, opts.signals));
524
+ }
525
+ if (findings.length > 0) {
526
+ return { code: 1, message: formatFailure(findings), findings };
527
+ }
528
+ return { code: 0, message: "OK system-of-record gate passed.", findings: [] };
529
+ }
530
+ // ---------------------------------------------------------------------------
531
+ // Diff scanner (port of _sor_gate_diff.py)
532
+ // ---------------------------------------------------------------------------
533
+ function isLowRiskPath(path) {
534
+ const clean = path.replace(/^\.\//, "");
535
+ if (SCANNER_EXEMPT_PATHS.has(clean))
536
+ return true;
537
+ if (LOW_RISK_SUFFIXES.has(extname(clean).toLowerCase()))
538
+ return true;
539
+ return LOW_RISK_PATH_PREFIXES.some((prefix) => clean.startsWith(prefix));
540
+ }
541
+ function storageFromLine(path, line) {
542
+ const text = `${path} ${line}`.toLowerCase();
543
+ if (/\.ya?ml\b/.test(text))
544
+ return "yaml_file";
545
+ if (/\.toml\b/.test(text))
546
+ return "toml_file";
547
+ if (/\.(sqlite|sqlite3|db)\b/.test(text))
548
+ return "sqlite_file";
549
+ if (/\.json\b/.test(text))
550
+ return "json_file";
551
+ return "filesystem";
552
+ }
553
+ function pathNameSignal(path) {
554
+ if (isLowRiskPath(path))
555
+ return null;
556
+ const name = basename(path).toLowerCase();
557
+ if (/(registry|repository|store|manager|service)/.test(name) &&
558
+ /\.(py|js|jsx|ts|tsx|go|rb|java|kt)$/.test(name)) {
559
+ return { kind: "state_module", path, line: null, detail: "stateful module name" };
560
+ }
561
+ if (/migrations?\//.test(path) || /\bmigration/.test(name)) {
562
+ return {
563
+ kind: "database_model",
564
+ path,
565
+ line: null,
566
+ detail: "database migration path",
567
+ storage: "database",
568
+ };
569
+ }
570
+ return null;
571
+ }
572
+ function looksLikeWorkflowStateChange(stripped) {
573
+ if (/^(#|\/\/|\/\*|\*)/.test(stripped))
574
+ return false;
575
+ const term = "(workflow|workflows|job|jobs|queue|queues|runtime|orchestration|job_queue|workflow_queue|runtime_state|orchestration_state|worker_state|run_state)";
576
+ const action = "(create|schedule|enqueue|dequeue|start|complete|fail|cancel|retry|update|delete|upsert|persist|save|load|restore|claim|lease|dispatch)";
577
+ const patterns = [
578
+ new RegExp(`\\b(def|function|func)\\s+(${action}_${term}|${term}_${action})\\b`, "i"),
579
+ /\b(class|type)\s+\w*(Workflow|Job|Queue|Runtime|Orchestration|WorkerState|RunState)\w*/,
580
+ new RegExp(`\\b(${term})\\.(append|add|put|enqueue|dequeue|submit|dispatch|schedule|start|complete|fail|cancel|retry|update|delete|save|persist)\\s*\\(`, "i"),
581
+ new RegExp(`\\b(${term})\\s*\\[[^\\]]+\\]\\s*=`, "i"),
582
+ new RegExp(`\\b(${term})\\s*=\\s*(new\\s+Map\\(|\\{\\}|\\[\\])`, "i"),
583
+ new RegExp(`\\b(${action}_${term}|${term}_${action})\\s*\\(`, "i"),
584
+ ];
585
+ return patterns.some((p) => p.test(stripped));
586
+ }
587
+ function lineSignals(path, lineNo, line) {
588
+ if (isLowRiskPath(path))
589
+ return [];
590
+ const stripped = line.trim();
591
+ const signals = [];
592
+ if (/write_text|write_bytes|fs\.(writeFile|writeFileSync|appendFile|createWriteStream)|Deno\.write(Text)?File|os\.WriteFile|ioutil\.WriteFile|Files\.write|open\([^)]*,\s*['"][^'"]*[wax]/.test(stripped)) {
593
+ signals.push({
594
+ kind: "filesystem_write",
595
+ path,
596
+ line: lineNo,
597
+ detail: stripped,
598
+ storage: storageFromLine(path, stripped),
599
+ });
600
+ }
601
+ if (/\b(localStorage|sessionStorage|indexedDB|caches\.open)\b/.test(stripped)) {
602
+ signals.push({
603
+ kind: "browser_storage",
604
+ path,
605
+ line: lineNo,
606
+ detail: stripped,
607
+ storage: "browser_storage",
608
+ });
609
+ }
610
+ const pathName = basename(path).toLowerCase();
611
+ if (/(registry|repository|store|manager)/.test(pathName) &&
612
+ /(new\s+Map\(|=\s*\{\}\s*(#|\/\/|$)|:\s*dict\[)/.test(stripped)) {
613
+ signals.push({
614
+ kind: "in_memory_state",
615
+ path,
616
+ line: lineNo,
617
+ detail: stripped,
618
+ storage: "in_memory",
619
+ });
620
+ }
621
+ if (/@\w+\.(post|put|patch|delete)\b|\b(router|app)\.(post|put|patch|delete)\s*\(|\b(def|function|func)\s+(create|select|update|delete|upsert)_?/i.test(stripped)) {
622
+ signals.push({ kind: "mutation_endpoint", path, line: lineNo, detail: stripped });
623
+ }
624
+ if (/CREATE\s+TABLE|ALTER\s+TABLE|sqlalchemy|db\.Column|models\.Model|prisma|typeorm|sequelize|ActiveRecord/i.test(stripped)) {
625
+ signals.push({
626
+ kind: "database_model",
627
+ path,
628
+ line: lineNo,
629
+ detail: stripped,
630
+ storage: "database",
631
+ });
632
+ }
633
+ if (/\b(auth|session|permission|membership|role|grant|tenant|organization)\b/i.test(stripped)) {
634
+ signals.push({ kind: "auth_state", path, line: lineNo, detail: stripped });
635
+ }
636
+ if (looksLikeWorkflowStateChange(stripped)) {
637
+ signals.push({ kind: "workflow_state", path, line: lineNo, detail: stripped });
638
+ }
639
+ return signals;
640
+ }
641
+ export function scanDiff(diffText) {
642
+ const signals = [];
643
+ const changedPaths = [];
644
+ let currentPath = null;
645
+ let newLineNo = null;
646
+ for (const rawLine of diffText.split("\n")) {
647
+ if (rawLine.startsWith("diff --git ")) {
648
+ const parts = rawLine.split(/\s+/);
649
+ if (parts.length >= 4) {
650
+ const candidate = parts[3] ?? "";
651
+ currentPath = candidate.startsWith("b/") ? candidate.slice(2) : candidate;
652
+ if (!changedPaths.includes(currentPath)) {
653
+ changedPaths.push(currentPath);
654
+ const ps = pathNameSignal(currentPath);
655
+ if (ps)
656
+ signals.push(ps);
657
+ }
658
+ }
659
+ newLineNo = null;
660
+ continue;
661
+ }
662
+ if (rawLine.startsWith("+++ ")) {
663
+ const target = rawLine.slice(4).trim();
664
+ if (target === "/dev/null") {
665
+ currentPath = null;
666
+ continue;
667
+ }
668
+ currentPath = target.startsWith("b/") ? target.slice(2) : target;
669
+ if (!changedPaths.includes(currentPath)) {
670
+ changedPaths.push(currentPath);
671
+ const ps = pathNameSignal(currentPath);
672
+ if (ps)
673
+ signals.push(ps);
674
+ }
675
+ continue;
676
+ }
677
+ if (rawLine.startsWith("@@ ")) {
678
+ const m = rawLine.match(/\+(\d+)/);
679
+ newLineNo = m ? parseInt(m[1], 10) : null;
680
+ continue;
681
+ }
682
+ if (currentPath === null)
683
+ continue;
684
+ if (rawLine.startsWith("+") && !rawLine.startsWith("+++")) {
685
+ const line = rawLine.slice(1);
686
+ signals.push(...lineSignals(currentPath, newLineNo, line));
687
+ if (newLineNo !== null)
688
+ newLineNo += 1;
689
+ }
690
+ else if (rawLine.startsWith("-") && !rawLine.startsWith("---")) {
691
+ // skip removed lines
692
+ }
693
+ else if (newLineNo !== null) {
694
+ newLineNo += 1;
695
+ }
696
+ }
697
+ return [signals, changedPaths];
698
+ }
699
+ function changedStoryRecords(projectRoot, changedPaths) {
700
+ const records = [];
701
+ for (const rel of changedPaths) {
702
+ if (!rel.endsWith(".vbrief.json"))
703
+ continue;
704
+ if (!rel.startsWith("vbrief/active/") &&
705
+ !rel.startsWith("vbrief/pending/") &&
706
+ !rel.startsWith("vbrief/proposed/"))
707
+ continue;
708
+ const path = join(resolve(projectRoot), rel);
709
+ const [payload, error] = loadJsonFile(path);
710
+ if (error !== null)
711
+ return [[], error];
712
+ if (payload !== null) {
713
+ const record = systemOfRecord(payload);
714
+ if (record !== null)
715
+ records.push([path, payload, record]);
716
+ }
717
+ }
718
+ return [records, null];
719
+ }
720
+ export function evaluateDiffText(diffText, opts) {
721
+ const [signals, changedPaths] = scanDiff(diffText);
722
+ if (signals.length === 0) {
723
+ return {
724
+ code: 0,
725
+ message: "OK system-of-record gate passed: no stateful diff signals detected.",
726
+ findings: [],
727
+ };
728
+ }
729
+ let payload = null;
730
+ let record = null;
731
+ if (opts.storyPath) {
732
+ const [p, error] = loadJsonFile(opts.storyPath);
733
+ if (error !== null)
734
+ return error;
735
+ payload = p;
736
+ if (payload)
737
+ record = systemOfRecord(payload);
738
+ }
739
+ else {
740
+ const [records, error] = changedStoryRecords(opts.projectRoot, changedPaths);
741
+ if (error !== null)
742
+ return error;
743
+ if (records.length === 1) {
744
+ [, payload, record] = records[0];
745
+ }
746
+ else if (records.length > 1) {
747
+ return {
748
+ code: 2,
749
+ message: "system-of-record gate misconfigured: multiple changed vBRIEFs contain system-of-record records; pass --story-path.",
750
+ findings: [],
751
+ };
752
+ }
753
+ }
754
+ if (record === null) {
755
+ const finding = {
756
+ reason: "Diff contains stateful persistence signals, but no matching architecture.systemOfRecord design record was supplied or changed.",
757
+ requiredFix: "Run `task architecture:sor-preflight -- --story-path <path>` after adding the design record, or pass --story-path to this diff gate.",
758
+ detectedStorage: signals[0]?.storage,
759
+ };
760
+ return { code: 1, message: formatFailure([finding]), findings: [finding] };
761
+ }
762
+ const result = validateRecord(record, { storyPayload: payload, signals });
763
+ if (result.code === 0) {
764
+ return {
765
+ code: 0,
766
+ message: `OK system-of-record gate passed: ${signals.length} stateful diff signal(s) matched.`,
767
+ findings: [],
768
+ };
769
+ }
770
+ return result;
771
+ }
772
+ function gitDiff(projectRoot, baseRef) {
773
+ const result = spawnSync("git", ["diff", "--unified=0", "--no-ext-diff", baseRef, "--"], {
774
+ cwd: resolve(projectRoot),
775
+ encoding: "utf8",
776
+ timeout: 30_000,
777
+ });
778
+ if (result.error) {
779
+ return [
780
+ null,
781
+ {
782
+ code: 2,
783
+ message: `system-of-record gate misconfigured: could not run git diff: ${result.error.message}`,
784
+ findings: [],
785
+ },
786
+ ];
787
+ }
788
+ if (result.status !== 0) {
789
+ const detail = (result.stderr ?? "").trim() ||
790
+ (result.stdout ?? "").trim() ||
791
+ `git diff exited ${result.status}`;
792
+ return [
793
+ null,
794
+ {
795
+ code: 2,
796
+ message: `system-of-record gate misconfigured: could not diff against ${baseRef}: ${detail}`,
797
+ findings: [],
798
+ },
799
+ ];
800
+ }
801
+ return [result.stdout ?? "", null];
802
+ }
803
+ export function evaluateDiff(projectRoot, baseRef, opts = {}) {
804
+ const [diffText, error] = gitDiff(projectRoot, baseRef);
805
+ if (error !== null)
806
+ return error;
807
+ return evaluateDiffText(diffText, { projectRoot, ...opts });
808
+ }
809
+ export function evaluateStory(storyPath) {
810
+ const [payload, error] = loadJsonFile(storyPath);
811
+ if (error !== null)
812
+ return error;
813
+ return validateRecord(systemOfRecord(payload), { storyPayload: payload });
814
+ }
815
+ // ---------------------------------------------------------------------------
816
+ // CLI
817
+ // ---------------------------------------------------------------------------
818
+ function emitJson(result) {
819
+ return JSON.stringify({
820
+ ok: result.code === 0,
821
+ exit_code: result.code,
822
+ message: result.message,
823
+ findings: result.findings.map((f) => ({
824
+ state_surface: f.stateSurface ?? null,
825
+ classification: f.classification ?? null,
826
+ detected_storage: f.detectedStorage ?? null,
827
+ approved_storage: f.approvedStorage ?? null,
828
+ reason: f.reason,
829
+ required_fix: f.requiredFix,
830
+ })),
831
+ });
832
+ }
833
+ function parseSorArgs(argv) {
834
+ let storyPath;
835
+ let baseRef;
836
+ let projectRoot = ".";
837
+ let doEmitJson = false;
838
+ for (let i = 0; i < argv.length; i += 1) {
839
+ const arg = argv[i];
840
+ if (arg === "--story-path") {
841
+ storyPath = argv[i + 1];
842
+ i += 1;
843
+ }
844
+ else if (arg?.startsWith("--story-path=")) {
845
+ storyPath = arg.slice("--story-path=".length);
846
+ }
847
+ else if (arg === "--base-ref") {
848
+ baseRef = argv[i + 1];
849
+ i += 1;
850
+ }
851
+ else if (arg?.startsWith("--base-ref=")) {
852
+ baseRef = arg.slice("--base-ref=".length);
853
+ }
854
+ else if (arg === "--project-root") {
855
+ projectRoot = argv[i + 1] ?? ".";
856
+ i += 1;
857
+ }
858
+ else if (arg?.startsWith("--project-root=")) {
859
+ projectRoot = arg.slice("--project-root=".length);
860
+ }
861
+ else if (arg === "--json") {
862
+ doEmitJson = true;
863
+ }
864
+ else {
865
+ return { projectRoot, emitJson: doEmitJson, error: `unrecognized argument: ${arg}` };
866
+ }
867
+ }
868
+ return { storyPath, baseRef, projectRoot, emitJson: doEmitJson };
869
+ }
870
+ /** CLI entry for architecture-preflight-sor (mirrors preflight_architecture_sor.py main()). */
871
+ export function architecturePreflightSorMain(argv) {
872
+ const parsed = parseSorArgs(argv);
873
+ if (parsed.error !== undefined) {
874
+ process.stderr.write(`Error: ${parsed.error}\n`);
875
+ return 2;
876
+ }
877
+ const { storyPath, baseRef, projectRoot, emitJson: doEmitJson } = parsed;
878
+ let result;
879
+ if (baseRef !== undefined) {
880
+ result = evaluateDiff(projectRoot, baseRef, { storyPath });
881
+ }
882
+ else if (storyPath !== undefined) {
883
+ result = evaluateStory(storyPath);
884
+ }
885
+ else {
886
+ result = {
887
+ code: 2,
888
+ message: "system-of-record gate misconfigured: pass --story-path, --base-ref, or both.",
889
+ findings: [],
890
+ };
891
+ }
892
+ if (doEmitJson) {
893
+ process.stdout.write(`${emitJson(result)}\n`);
894
+ }
895
+ else if (result.code === 0) {
896
+ process.stdout.write(`${result.message}\n`);
897
+ }
898
+ else {
899
+ process.stderr.write(`${result.message}\n`);
900
+ }
901
+ return result.code;
902
+ }
903
+ //# sourceMappingURL=sor-preflight.js.map