@dommaker/harness 1.6.0 → 1.8.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 (560) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/bin/harness.js +17 -1
  3. package/dist/agents/index.d.ts +6 -2
  4. package/dist/agents/index.d.ts.map +1 -1
  5. package/dist/agents/index.js +6 -16
  6. package/dist/agents/index.js.map +1 -1
  7. package/dist/cli/commands/__tests__/gate-decision.d.ts +18 -0
  8. package/dist/cli/commands/__tests__/gate-decision.d.ts.map +1 -0
  9. package/dist/cli/commands/__tests__/gate-decision.js +26 -0
  10. package/dist/cli/commands/__tests__/gate-decision.js.map +1 -0
  11. package/dist/cli/commands/acceptance.d.ts.map +1 -1
  12. package/dist/cli/commands/acceptance.js +17 -28
  13. package/dist/cli/commands/acceptance.js.map +1 -1
  14. package/dist/cli/commands/check.d.ts +11 -3
  15. package/dist/cli/commands/check.d.ts.map +1 -1
  16. package/dist/cli/commands/check.js +26 -11
  17. package/dist/cli/commands/check.js.map +1 -1
  18. package/dist/cli/commands/command.d.ts +0 -1
  19. package/dist/cli/commands/command.d.ts.map +1 -1
  20. package/dist/cli/commands/command.js +8 -6
  21. package/dist/cli/commands/command.js.map +1 -1
  22. package/dist/cli/commands/constraints-retire.d.ts.map +1 -1
  23. package/dist/cli/commands/constraints-retire.js +36 -57
  24. package/dist/cli/commands/constraints-retire.js.map +1 -1
  25. package/dist/cli/commands/contract.d.ts.map +1 -1
  26. package/dist/cli/commands/contract.js +36 -42
  27. package/dist/cli/commands/contract.js.map +1 -1
  28. package/dist/cli/commands/definitions.d.ts +2 -0
  29. package/dist/cli/commands/definitions.d.ts.map +1 -1
  30. package/dist/cli/commands/definitions.js +11 -6
  31. package/dist/cli/commands/definitions.js.map +1 -1
  32. package/dist/cli/commands/failure.d.ts.map +1 -1
  33. package/dist/cli/commands/failure.js +16 -2
  34. package/dist/cli/commands/failure.js.map +1 -1
  35. package/dist/cli/commands/init.d.ts +14 -8
  36. package/dist/cli/commands/init.d.ts.map +1 -1
  37. package/dist/cli/commands/init.js +172 -364
  38. package/dist/cli/commands/init.js.map +1 -1
  39. package/dist/cli/commands/knowledge-view.d.ts +90 -0
  40. package/dist/cli/commands/knowledge-view.d.ts.map +1 -0
  41. package/dist/cli/commands/knowledge-view.js +198 -0
  42. package/dist/cli/commands/knowledge-view.js.map +1 -0
  43. package/dist/cli/commands/knowledge.d.ts +137 -52
  44. package/dist/cli/commands/knowledge.d.ts.map +1 -1
  45. package/dist/cli/commands/knowledge.js +534 -400
  46. package/dist/cli/commands/knowledge.js.map +1 -1
  47. package/dist/cli/commands/passes-gate.d.ts +4 -1
  48. package/dist/cli/commands/passes-gate.d.ts.map +1 -1
  49. package/dist/cli/commands/passes-gate.js +11 -2
  50. package/dist/cli/commands/passes-gate.js.map +1 -1
  51. package/dist/cli/commands/performance.d.ts.map +1 -1
  52. package/dist/cli/commands/performance.js +19 -31
  53. package/dist/cli/commands/performance.js.map +1 -1
  54. package/dist/cli/commands/report.d.ts.map +1 -1
  55. package/dist/cli/commands/report.js +2 -1
  56. package/dist/cli/commands/report.js.map +1 -1
  57. package/dist/cli/commands/review.d.ts.map +1 -1
  58. package/dist/cli/commands/review.js +13 -25
  59. package/dist/cli/commands/review.js.map +1 -1
  60. package/dist/cli/commands/scaffold-templates.d.ts +73 -0
  61. package/dist/cli/commands/scaffold-templates.d.ts.map +1 -0
  62. package/dist/cli/commands/scaffold-templates.js +424 -0
  63. package/dist/cli/commands/scaffold-templates.js.map +1 -0
  64. package/dist/cli/commands/scaffold.d.ts +105 -0
  65. package/dist/cli/commands/scaffold.d.ts.map +1 -0
  66. package/dist/cli/commands/scaffold.js +263 -0
  67. package/dist/cli/commands/scaffold.js.map +1 -0
  68. package/dist/cli/commands/security.d.ts.map +1 -1
  69. package/dist/cli/commands/security.js +22 -24
  70. package/dist/cli/commands/security.js.map +1 -1
  71. package/dist/cli/commands/spec-baseline-check.d.ts +43 -0
  72. package/dist/cli/commands/spec-baseline-check.d.ts.map +1 -1
  73. package/dist/cli/commands/spec-baseline-check.js +109 -34
  74. package/dist/cli/commands/spec-baseline-check.js.map +1 -1
  75. package/dist/cli/commands/sync-docs/context-syncer.d.ts +21 -2
  76. package/dist/cli/commands/sync-docs/context-syncer.d.ts.map +1 -1
  77. package/dist/cli/commands/sync-docs/context-syncer.js +112 -28
  78. package/dist/cli/commands/sync-docs/context-syncer.js.map +1 -1
  79. package/dist/cli/commands/sync-docs/index.d.ts +1 -1
  80. package/dist/cli/commands/sync-docs/index.d.ts.map +1 -1
  81. package/dist/cli/commands/sync-docs/index.js +86 -27
  82. package/dist/cli/commands/sync-docs/index.js.map +1 -1
  83. package/dist/cli/commands/sync-docs/project-reader.d.ts +24 -1
  84. package/dist/cli/commands/sync-docs/project-reader.d.ts.map +1 -1
  85. package/dist/cli/commands/sync-docs/project-reader.js +33 -7
  86. package/dist/cli/commands/sync-docs/project-reader.js.map +1 -1
  87. package/dist/cli/commands/validate.d.ts +0 -16
  88. package/dist/cli/commands/validate.d.ts.map +1 -1
  89. package/dist/cli/commands/validate.js +2 -97
  90. package/dist/cli/commands/validate.js.map +1 -1
  91. package/dist/cli/gate-command.d.ts +37 -0
  92. package/dist/cli/gate-command.d.ts.map +1 -0
  93. package/dist/cli/gate-command.js +64 -0
  94. package/dist/cli/gate-command.js.map +1 -0
  95. package/dist/completion-checkers/index.d.ts +1 -1
  96. package/dist/completion-checkers/index.d.ts.map +1 -1
  97. package/dist/completion-checkers/index.js +0 -15
  98. package/dist/completion-checkers/index.js.map +1 -1
  99. package/dist/context/knowledge-injector.d.ts +4 -2
  100. package/dist/context/knowledge-injector.d.ts.map +1 -1
  101. package/dist/context/knowledge-injector.js +13 -6
  102. package/dist/context/knowledge-injector.js.map +1 -1
  103. package/dist/core/constraints/agent-prompt-renderer.js +2 -2
  104. package/dist/core/constraints/agent-prompt-renderer.js.map +1 -1
  105. package/dist/core/constraints/capabilities-reconcile.d.ts +20 -0
  106. package/dist/core/constraints/capabilities-reconcile.d.ts.map +1 -1
  107. package/dist/core/constraints/capabilities-reconcile.js +26 -4
  108. package/dist/core/constraints/capabilities-reconcile.js.map +1 -1
  109. package/dist/core/constraints/check-cache.d.ts +1 -1
  110. package/dist/core/constraints/check-cache.js +1 -1
  111. package/dist/core/constraints/checker.d.ts +8 -3
  112. package/dist/core/constraints/checker.d.ts.map +1 -1
  113. package/dist/core/constraints/checker.js +30 -19
  114. package/dist/core/constraints/checker.js.map +1 -1
  115. package/dist/core/constraints/checkers/capability-sync.d.ts +3 -1
  116. package/dist/core/constraints/checkers/capability-sync.d.ts.map +1 -1
  117. package/dist/core/constraints/checkers/capability-sync.js +17 -24
  118. package/dist/core/constraints/checkers/capability-sync.js.map +1 -1
  119. package/dist/core/constraints/checkers/context-doc-sync.d.ts +1 -1
  120. package/dist/core/constraints/checkers/context-doc-sync.d.ts.map +1 -1
  121. package/dist/core/constraints/checkers/context-doc-sync.js +9 -6
  122. package/dist/core/constraints/checkers/context-doc-sync.js.map +1 -1
  123. package/dist/core/constraints/checkers/docs-freshness.d.ts.map +1 -1
  124. package/dist/core/constraints/checkers/docs-freshness.js +24 -30
  125. package/dist/core/constraints/checkers/docs-freshness.js.map +1 -1
  126. package/dist/core/constraints/checkers/governance-presence.d.ts.map +1 -1
  127. package/dist/core/constraints/checkers/governance-presence.js +10 -4
  128. package/dist/core/constraints/checkers/governance-presence.js.map +1 -1
  129. package/dist/core/constraints/checkers/types.d.ts +10 -6
  130. package/dist/core/constraints/checkers/types.d.ts.map +1 -1
  131. package/dist/core/constraints/checkers/types.js +7 -3
  132. package/dist/core/constraints/checkers/types.js.map +1 -1
  133. package/dist/core/constraints/context-builder.d.ts +11 -10
  134. package/dist/core/constraints/context-builder.d.ts.map +1 -1
  135. package/dist/core/constraints/context-builder.js +31 -27
  136. package/dist/core/constraints/context-builder.js.map +1 -1
  137. package/dist/core/constraints/context-reconcile.d.ts +75 -0
  138. package/dist/core/constraints/context-reconcile.d.ts.map +1 -0
  139. package/dist/core/constraints/context-reconcile.js +161 -0
  140. package/dist/core/constraints/context-reconcile.js.map +1 -0
  141. package/dist/core/constraints/doc-freshness/runner.d.ts +7 -0
  142. package/dist/core/constraints/doc-freshness/runner.d.ts.map +1 -1
  143. package/dist/core/constraints/doc-freshness/runner.js +8 -3
  144. package/dist/core/constraints/doc-freshness/runner.js.map +1 -1
  145. package/dist/core/constraints/git-evidence.js +1 -1
  146. package/dist/core/constraints/git-evidence.js.map +1 -1
  147. package/dist/core/constraints/injection-drift.d.ts +7 -2
  148. package/dist/core/constraints/injection-drift.d.ts.map +1 -1
  149. package/dist/core/constraints/injection-drift.js +13 -7
  150. package/dist/core/constraints/injection-drift.js.map +1 -1
  151. package/dist/core/constraints/run-env.d.ts +92 -0
  152. package/dist/core/constraints/run-env.d.ts.map +1 -0
  153. package/dist/core/constraints/run-env.js +175 -0
  154. package/dist/core/constraints/run-env.js.map +1 -0
  155. package/dist/core/constraints/triggers.d.ts +22 -0
  156. package/dist/core/constraints/triggers.d.ts.map +1 -0
  157. package/dist/core/constraints/triggers.js +31 -0
  158. package/dist/core/constraints/triggers.js.map +1 -0
  159. package/dist/core/effective-constraints.d.ts +13 -4
  160. package/dist/core/effective-constraints.d.ts.map +1 -1
  161. package/dist/core/effective-constraints.js +16 -6
  162. package/dist/core/effective-constraints.js.map +1 -1
  163. package/dist/core/effective-set.d.ts +8 -15
  164. package/dist/core/effective-set.d.ts.map +1 -1
  165. package/dist/core/effective-set.js +7 -12
  166. package/dist/core/effective-set.js.map +1 -1
  167. package/dist/core/index.d.ts +2 -1
  168. package/dist/core/index.d.ts.map +1 -1
  169. package/dist/core/index.js.map +1 -1
  170. package/dist/core/project-config-loader.d.ts +39 -17
  171. package/dist/core/project-config-loader.d.ts.map +1 -1
  172. package/dist/core/project-config-loader.js +51 -122
  173. package/dist/core/project-config-loader.js.map +1 -1
  174. package/dist/core/validators/check-handlers/http.d.ts +2 -2
  175. package/dist/core/validators/check-handlers/http.d.ts.map +1 -1
  176. package/dist/core/validators/check-handlers/http.js +12 -7
  177. package/dist/core/validators/check-handlers/http.js.map +1 -1
  178. package/dist/core/validators/index.d.ts +1 -1
  179. package/dist/core/validators/index.d.ts.map +1 -1
  180. package/dist/core/validators/passes-gate.d.ts.map +1 -1
  181. package/dist/core/validators/passes-gate.js +2 -2
  182. package/dist/core/validators/passes-gate.js.map +1 -1
  183. package/dist/failure/classifier.d.ts +1 -1
  184. package/dist/failure/classifier.d.ts.map +1 -1
  185. package/dist/failure/classifier.js +8 -8
  186. package/dist/failure/classifier.js.map +1 -1
  187. package/dist/failure/index.d.ts +2 -1
  188. package/dist/failure/index.d.ts.map +1 -1
  189. package/dist/failure/index.js +9 -17
  190. package/dist/failure/index.js.map +1 -1
  191. package/dist/failure/recorder.d.ts +1 -1
  192. package/dist/failure/recorder.d.ts.map +1 -1
  193. package/dist/gates/checker-gate.d.ts +2 -1
  194. package/dist/gates/checker-gate.d.ts.map +1 -1
  195. package/dist/gates/checker-gate.js +3 -2
  196. package/dist/gates/checker-gate.js.map +1 -1
  197. package/dist/gates/command.d.ts +10 -4
  198. package/dist/gates/command.d.ts.map +1 -1
  199. package/dist/gates/command.js +36 -62
  200. package/dist/gates/command.js.map +1 -1
  201. package/dist/gates/contract.d.ts.map +1 -1
  202. package/dist/gates/contract.js +0 -4
  203. package/dist/gates/contract.js.map +1 -1
  204. package/dist/gates/definitions.d.ts +2 -1
  205. package/dist/gates/definitions.d.ts.map +1 -1
  206. package/dist/gates/definitions.js +6 -5
  207. package/dist/gates/definitions.js.map +1 -1
  208. package/dist/gates/index.d.ts +0 -4
  209. package/dist/gates/index.d.ts.map +1 -1
  210. package/dist/gates/index.js +1 -6
  211. package/dist/gates/index.js.map +1 -1
  212. package/dist/gates/performance.d.ts.map +1 -1
  213. package/dist/gates/performance.js +0 -4
  214. package/dist/gates/performance.js.map +1 -1
  215. package/dist/gates/runner.d.ts +1 -1
  216. package/dist/gates/runner.js +1 -1
  217. package/dist/gates/security.d.ts +1 -1
  218. package/dist/gates/security.d.ts.map +1 -1
  219. package/dist/gates/security.js +5 -6
  220. package/dist/gates/security.js.map +1 -1
  221. package/dist/gates/types.d.ts +14 -17
  222. package/dist/gates/types.d.ts.map +1 -1
  223. package/dist/gates/types.js.map +1 -1
  224. package/dist/hooks/bootstrap.d.ts +6 -4
  225. package/dist/hooks/bootstrap.d.ts.map +1 -1
  226. package/dist/hooks/bootstrap.js +25 -13
  227. package/dist/hooks/bootstrap.js.map +1 -1
  228. package/dist/hooks/config.d.ts +6 -2
  229. package/dist/hooks/config.d.ts.map +1 -1
  230. package/dist/hooks/config.js +5 -1
  231. package/dist/hooks/config.js.map +1 -1
  232. package/dist/hooks/index.d.ts +1 -1
  233. package/dist/hooks/index.d.ts.map +1 -1
  234. package/dist/hooks/index.js +0 -15
  235. package/dist/hooks/index.js.map +1 -1
  236. package/dist/hooks/pipeline.d.ts.map +1 -1
  237. package/dist/hooks/pipeline.js +2 -4
  238. package/dist/hooks/pipeline.js.map +1 -1
  239. package/dist/hooks/registry.d.ts +11 -8
  240. package/dist/hooks/registry.d.ts.map +1 -1
  241. package/dist/hooks/registry.js +22 -7
  242. package/dist/hooks/registry.js.map +1 -1
  243. package/dist/hooks/types.d.ts +23 -7
  244. package/dist/hooks/types.d.ts.map +1 -1
  245. package/dist/index.d.ts +4 -4
  246. package/dist/index.d.ts.map +1 -1
  247. package/dist/index.js +3 -4
  248. package/dist/index.js.map +1 -1
  249. package/dist/knowledge/audit-scoring.d.ts +87 -0
  250. package/dist/knowledge/audit-scoring.d.ts.map +1 -0
  251. package/dist/knowledge/audit-scoring.js +470 -0
  252. package/dist/knowledge/audit-scoring.js.map +1 -0
  253. package/dist/knowledge/audit.d.ts +11 -59
  254. package/dist/knowledge/audit.d.ts.map +1 -1
  255. package/dist/knowledge/audit.js +47 -522
  256. package/dist/knowledge/audit.js.map +1 -1
  257. package/dist/knowledge/import.d.ts.map +1 -1
  258. package/dist/knowledge/import.js +2 -0
  259. package/dist/knowledge/import.js.map +1 -1
  260. package/dist/knowledge/index-generator.d.ts.map +1 -1
  261. package/dist/knowledge/index-generator.js +4 -5
  262. package/dist/knowledge/index-generator.js.map +1 -1
  263. package/dist/knowledge/index.d.ts +3 -2
  264. package/dist/knowledge/index.d.ts.map +1 -1
  265. package/dist/knowledge/index.js +3 -16
  266. package/dist/knowledge/index.js.map +1 -1
  267. package/dist/knowledge/ingest.js +1 -1
  268. package/dist/knowledge/ingest.js.map +1 -1
  269. package/dist/knowledge/lifecycle.d.ts.map +1 -1
  270. package/dist/knowledge/lifecycle.js +4 -2
  271. package/dist/knowledge/lifecycle.js.map +1 -1
  272. package/dist/knowledge/migration.d.ts +3 -0
  273. package/dist/knowledge/migration.d.ts.map +1 -1
  274. package/dist/knowledge/migration.js +8 -2
  275. package/dist/knowledge/migration.js.map +1 -1
  276. package/dist/knowledge/query.d.ts +6 -0
  277. package/dist/knowledge/query.d.ts.map +1 -1
  278. package/dist/knowledge/query.js +8 -2
  279. package/dist/knowledge/query.js.map +1 -1
  280. package/dist/knowledge/reference-tracker.d.ts.map +1 -1
  281. package/dist/knowledge/reference-tracker.js +4 -6
  282. package/dist/knowledge/reference-tracker.js.map +1 -1
  283. package/dist/knowledge/store.d.ts +22 -16
  284. package/dist/knowledge/store.d.ts.map +1 -1
  285. package/dist/knowledge/store.js +53 -12
  286. package/dist/knowledge/store.js.map +1 -1
  287. package/dist/knowledge/tree-walker.d.ts +19 -0
  288. package/dist/knowledge/tree-walker.d.ts.map +1 -0
  289. package/dist/knowledge/tree-walker.js +30 -0
  290. package/dist/knowledge/tree-walker.js.map +1 -0
  291. package/dist/knowledge/types.d.ts +16 -0
  292. package/dist/knowledge/types.d.ts.map +1 -1
  293. package/dist/monitoring/traces.d.ts +5 -3
  294. package/dist/monitoring/traces.d.ts.map +1 -1
  295. package/dist/monitoring/traces.js +19 -5
  296. package/dist/monitoring/traces.js.map +1 -1
  297. package/dist/test-setup/jsonl-fake-fs.d.ts +30 -0
  298. package/dist/test-setup/jsonl-fake-fs.d.ts.map +1 -0
  299. package/dist/test-setup/jsonl-fake-fs.js +49 -0
  300. package/dist/test-setup/jsonl-fake-fs.js.map +1 -0
  301. package/dist/tools/index.d.ts +4 -1
  302. package/dist/tools/index.d.ts.map +1 -1
  303. package/dist/tools/index.js +7 -15
  304. package/dist/tools/index.js.map +1 -1
  305. package/dist/types/checkpoint.d.ts +5 -0
  306. package/dist/types/checkpoint.d.ts.map +1 -1
  307. package/dist/types/passes-gate.d.ts +0 -13
  308. package/dist/types/passes-gate.d.ts.map +1 -1
  309. package/dist/types/project-config.d.ts +18 -0
  310. package/dist/types/project-config.d.ts.map +1 -1
  311. package/dist/types/trace.d.ts +13 -4
  312. package/dist/types/trace.d.ts.map +1 -1
  313. package/dist/types/trace.js +4 -3
  314. package/dist/types/trace.js.map +1 -1
  315. package/dist/utils/exec.d.ts +4 -27
  316. package/dist/utils/exec.d.ts.map +1 -1
  317. package/dist/utils/exec.js +4 -94
  318. package/dist/utils/exec.js.map +1 -1
  319. package/dist/utils/jsonl.d.ts +17 -7
  320. package/dist/utils/jsonl.d.ts.map +1 -1
  321. package/dist/utils/jsonl.js +144 -17
  322. package/dist/utils/jsonl.js.map +1 -1
  323. package/dist/utils/numeric-flag.d.ts +44 -0
  324. package/dist/utils/numeric-flag.d.ts.map +1 -0
  325. package/dist/utils/numeric-flag.js +62 -0
  326. package/dist/utils/numeric-flag.js.map +1 -0
  327. package/package.json +1 -1
  328. package/src/CONTEXT.md +5 -2
  329. package/src/__tests__/acceptance-gate.test.ts +7 -4
  330. package/src/__tests__/checker-extra.test.ts +3 -2
  331. package/src/__tests__/checker.test.ts +4 -3
  332. package/src/__tests__/checkpoint.test.ts +26 -9
  333. package/src/__tests__/context-files-resolution.test.ts +29 -15
  334. package/src/__tests__/contract-gate.test.ts +19 -40
  335. package/src/__tests__/error-classifier.test.ts +1 -1
  336. package/src/__tests__/exec.test.ts +45 -107
  337. package/src/__tests__/failure-recorder.test.ts +7 -5
  338. package/src/__tests__/hooks-pipeline.test.ts +34 -47
  339. package/src/__tests__/layering.test.ts +217 -25
  340. package/src/__tests__/passes-gate.test.ts +9 -4
  341. package/src/__tests__/performance-gate.test.ts +3 -15
  342. package/src/__tests__/project-config-loader-extra.test.ts +31 -57
  343. package/src/__tests__/project-config-loader.test.ts +6 -3
  344. package/src/__tests__/public-exports.test.ts +27 -6
  345. package/src/__tests__/public-type-surface.test.ts +360 -0
  346. package/src/__tests__/public-value-surface.test.ts +182 -0
  347. package/src/__tests__/review-gate.test.ts +4 -6
  348. package/src/__tests__/security-gate.test.ts +5 -20
  349. package/src/__tests__/skip-semantics.test.ts +5 -3
  350. package/src/__tests__/spec-validator.test.ts +3 -2
  351. package/src/__tests__/sub-barrels-explicit.test.ts +87 -0
  352. package/src/__tests__/test-fixture-hygiene.test.ts +53 -0
  353. package/src/__tests__/trace-analyzer-extra.test.ts +5 -3
  354. package/src/__tests__/trace-analyzer.test.ts +5 -3
  355. package/src/__tests__/trace-collector.test.ts +5 -3
  356. package/src/agents/index.ts +13 -2
  357. package/src/cli/__tests__/gate-command.test.ts +162 -0
  358. package/src/cli/commands/CONTEXT.md +29 -5
  359. package/src/cli/commands/__tests__/acceptance.test.ts +24 -25
  360. package/src/cli/commands/__tests__/bin-exit-mapping.test.ts +15 -0
  361. package/src/cli/commands/__tests__/check-drift.test.ts +42 -1
  362. package/src/cli/commands/__tests__/check-read-count.test.ts +167 -0
  363. package/src/cli/commands/__tests__/check-skip-output.test.ts +4 -1
  364. package/src/cli/commands/__tests__/check.test.ts +43 -36
  365. package/src/cli/commands/__tests__/command-gate-dead-options.test.ts +60 -0
  366. package/src/cli/commands/__tests__/command.test.ts +33 -17
  367. package/src/cli/commands/__tests__/constraints-retire.test.ts +52 -0
  368. package/src/cli/commands/__tests__/context-syncer.test.ts +141 -0
  369. package/src/cli/commands/__tests__/contract.test.ts +20 -20
  370. package/src/cli/commands/__tests__/failure.test.ts +5 -4
  371. package/src/cli/commands/__tests__/gate-decision.ts +30 -0
  372. package/src/cli/commands/__tests__/init-dead-options.test.ts +50 -0
  373. package/src/cli/commands/__tests__/init-governance-io.test.ts +139 -0
  374. package/src/cli/commands/__tests__/init-injection.test.ts +3 -3
  375. package/src/cli/commands/__tests__/init-ondisk.test.ts +867 -0
  376. package/src/cli/commands/__tests__/init.test.ts +82 -6
  377. package/src/cli/commands/__tests__/knowledge-audit-threshold.test.ts +146 -0
  378. package/src/cli/commands/__tests__/knowledge-flywheel-consistency.test.ts +1 -1
  379. package/src/cli/commands/__tests__/knowledge-tone-mapping.test.ts +244 -0
  380. package/src/cli/commands/__tests__/knowledge-view.test.ts +839 -0
  381. package/src/cli/commands/__tests__/knowledge.test.ts +33 -15
  382. package/src/cli/commands/__tests__/numeric-flag-assembly.test.ts +368 -0
  383. package/src/cli/commands/__tests__/passes-gate-dead-options.test.ts +89 -1
  384. package/src/cli/commands/__tests__/performance.test.ts +19 -21
  385. package/src/cli/commands/__tests__/posteval-plan.test.ts +5 -3
  386. package/src/cli/commands/__tests__/pre-push-hook.test.ts +181 -0
  387. package/src/cli/commands/__tests__/project-path-anchoring.test.ts +95 -2
  388. package/src/cli/commands/__tests__/project-path-convention.test.ts +103 -25
  389. package/src/cli/commands/__tests__/registry.test.ts +2 -0
  390. package/src/cli/commands/__tests__/report.test.ts +23 -1
  391. package/src/cli/commands/__tests__/review.test.ts +10 -17
  392. package/src/cli/commands/__tests__/scaffold.test.ts +505 -0
  393. package/src/cli/commands/__tests__/security-default-scan.test.ts +75 -0
  394. package/src/cli/commands/__tests__/security.test.ts +21 -24
  395. package/src/cli/commands/__tests__/spec-baseline-check.test.ts +3 -2
  396. package/src/cli/commands/__tests__/spec-baseline-index-cap.test.ts +131 -0
  397. package/src/cli/commands/__tests__/spec-baseline-read-count.test.ts +325 -0
  398. package/src/cli/commands/__tests__/sync-docs-agents.test.ts +19 -4
  399. package/src/cli/commands/__tests__/sync-docs-context-drift.test.ts +232 -0
  400. package/src/cli/commands/__tests__/sync-docs-module-order.test.ts +111 -0
  401. package/src/cli/commands/__tests__/sync-docs-read-count.test.ts +192 -0
  402. package/src/cli/commands/__tests__/sync-docs.test.ts +3 -2
  403. package/src/cli/commands/__tests__/validate.test.ts +1 -48
  404. package/src/cli/commands/acceptance.ts +24 -29
  405. package/src/cli/commands/check.ts +40 -17
  406. package/src/cli/commands/command.ts +9 -8
  407. package/src/cli/commands/constraints-retire.ts +57 -70
  408. package/src/cli/commands/contract.ts +44 -47
  409. package/src/cli/commands/definitions.ts +12 -6
  410. package/src/cli/commands/failure.ts +16 -3
  411. package/src/cli/commands/init.ts +242 -389
  412. package/src/cli/commands/knowledge-view.ts +224 -0
  413. package/src/cli/commands/knowledge.ts +643 -448
  414. package/src/cli/commands/passes-gate.ts +12 -3
  415. package/src/cli/commands/performance.ts +31 -38
  416. package/src/cli/commands/report.ts +3 -2
  417. package/src/cli/commands/review.ts +22 -28
  418. package/src/cli/commands/scaffold-templates.ts +406 -0
  419. package/src/cli/commands/scaffold.ts +302 -0
  420. package/src/cli/commands/security.ts +27 -23
  421. package/src/cli/commands/spec-baseline-check.ts +158 -33
  422. package/src/cli/commands/sync-docs/__tests__/context-export-surface.test.ts +102 -0
  423. package/src/cli/commands/sync-docs/__tests__/module-descriptions.test.ts +196 -0
  424. package/src/cli/commands/sync-docs/context-syncer.ts +137 -31
  425. package/src/cli/commands/sync-docs/index.ts +103 -28
  426. package/src/cli/commands/sync-docs/project-reader.ts +51 -7
  427. package/src/cli/commands/validate.ts +1 -104
  428. package/src/cli/gate-command.ts +87 -0
  429. package/src/completion-checkers/index.ts +10 -1
  430. package/src/context/CONTEXT.md +2 -1
  431. package/src/context/__tests__/knowledge-injector.test.ts +27 -0
  432. package/src/context/__tests__/session-manager.test.ts +19 -12
  433. package/src/context/knowledge-injector.ts +14 -7
  434. package/src/core/CONTEXT.md +10 -7
  435. package/src/core/__tests__/effective-set.test.ts +36 -60
  436. package/src/core/constraints/__tests__/context-reconcile.test.ts +246 -0
  437. package/src/core/constraints/__tests__/run-env.test.ts +377 -0
  438. package/src/core/constraints/__tests__/triggers.test.ts +70 -0
  439. package/src/core/constraints/agent-prompt-renderer.ts +1 -1
  440. package/src/core/constraints/capabilities-reconcile.ts +28 -4
  441. package/src/core/constraints/check-cache.ts +1 -1
  442. package/src/core/constraints/checker.ts +30 -14
  443. package/src/core/constraints/checkers/__tests__/context-doc-sync.test.ts +8 -3
  444. package/src/core/constraints/checkers/__tests__/governance-presence.test.ts +16 -7
  445. package/src/core/constraints/checkers/__tests__/no-hardcoded-credentials.test.ts +2 -1
  446. package/src/core/constraints/checkers/capability-sync.ts +27 -28
  447. package/src/core/constraints/checkers/context-doc-sync.ts +9 -7
  448. package/src/core/constraints/checkers/docs-freshness.ts +28 -33
  449. package/src/core/constraints/checkers/governance-presence.ts +10 -6
  450. package/src/core/constraints/checkers/types.ts +14 -8
  451. package/src/core/constraints/context-builder.ts +35 -26
  452. package/src/core/constraints/context-reconcile.ts +200 -0
  453. package/src/core/constraints/doc-freshness/__tests__/runner.test.ts +25 -0
  454. package/src/core/constraints/doc-freshness/runner.ts +18 -4
  455. package/src/core/constraints/git-evidence.ts +1 -1
  456. package/src/core/constraints/injection-drift.ts +19 -8
  457. package/src/core/constraints/run-env.ts +207 -0
  458. package/src/core/constraints/triggers.ts +33 -0
  459. package/src/core/effective-constraints.ts +17 -6
  460. package/src/core/effective-set.ts +8 -24
  461. package/src/core/index.ts +2 -1
  462. package/src/core/project-config-loader.ts +54 -102
  463. package/src/core/validators/__tests__/http-retry-sleep.test.ts +231 -0
  464. package/src/core/validators/check-handlers/http.ts +18 -7
  465. package/src/core/validators/index.ts +0 -1
  466. package/src/core/validators/passes-gate.ts +2 -3
  467. package/src/failure/CONTEXT.md +2 -1
  468. package/src/failure/classifier.ts +2 -2
  469. package/src/failure/index.ts +14 -2
  470. package/src/failure/recorder.ts +1 -1
  471. package/src/gates/CONTEXT.md +13 -7
  472. package/src/gates/__tests__/checker-gate.test.ts +1 -1
  473. package/src/gates/__tests__/command-single-predicate.test.ts +135 -0
  474. package/src/gates/__tests__/command.test.ts +8 -15
  475. package/src/gates/__tests__/contract.test.ts +5 -5
  476. package/src/gates/__tests__/gate-interface.test.ts +0 -17
  477. package/src/gates/__tests__/performance.test.ts +0 -13
  478. package/src/gates/__tests__/review.test.ts +0 -1
  479. package/src/gates/__tests__/runner.test.ts +1 -1
  480. package/src/gates/__tests__/security-default-scan.test.ts +97 -0
  481. package/src/gates/__tests__/security.test.ts +0 -13
  482. package/src/gates/checker-gate.ts +3 -2
  483. package/src/gates/command.ts +51 -74
  484. package/src/gates/contract.ts +0 -5
  485. package/src/gates/definitions.ts +6 -5
  486. package/src/gates/index.ts +0 -5
  487. package/src/gates/performance.ts +1 -6
  488. package/src/gates/runner.ts +1 -1
  489. package/src/gates/security.ts +9 -11
  490. package/src/gates/types.ts +20 -23
  491. package/src/hooks/CONTEXT.md +10 -9
  492. package/src/hooks/__tests__/bootstrap.test.ts +29 -6
  493. package/src/hooks/__tests__/pipeline.test.ts +28 -17
  494. package/src/hooks/__tests__/registry.test.ts +51 -3
  495. package/src/hooks/bootstrap.ts +35 -15
  496. package/src/hooks/config.ts +6 -2
  497. package/src/hooks/index.ts +10 -1
  498. package/src/hooks/pipeline.ts +4 -6
  499. package/src/hooks/registry.ts +31 -12
  500. package/src/hooks/types.ts +24 -7
  501. package/src/index.ts +1 -3
  502. package/src/knowledge/CONTEXT.md +14 -7
  503. package/src/knowledge/__tests__/audit-labels.test.ts +8 -5
  504. package/src/knowledge/__tests__/audit-scoring.test.ts +230 -0
  505. package/src/knowledge/__tests__/audit-write-count.test.ts +131 -0
  506. package/src/knowledge/__tests__/audit.test.ts +291 -208
  507. package/src/knowledge/__tests__/doctor.test.ts +3 -2
  508. package/src/knowledge/__tests__/ingest.test.ts +3 -2
  509. package/src/knowledge/__tests__/lifecycle.test.ts +57 -2
  510. package/src/knowledge/__tests__/migration.test.ts +35 -6
  511. package/src/knowledge/__tests__/query.test.ts +3 -2
  512. package/src/knowledge/__tests__/reference-tracker.test.ts +23 -2
  513. package/src/knowledge/__tests__/store.test.ts +149 -4
  514. package/src/knowledge/__tests__/tree-walker.test.ts +132 -0
  515. package/src/knowledge/audit-scoring.ts +589 -0
  516. package/src/knowledge/audit.ts +55 -599
  517. package/src/knowledge/import.ts +2 -0
  518. package/src/knowledge/index-generator.ts +4 -6
  519. package/src/knowledge/index.ts +27 -2
  520. package/src/knowledge/ingest.ts +1 -1
  521. package/src/knowledge/lifecycle.ts +5 -2
  522. package/src/knowledge/migration.ts +8 -2
  523. package/src/knowledge/query.ts +8 -1
  524. package/src/knowledge/reference-tracker.ts +5 -7
  525. package/src/knowledge/store.ts +75 -16
  526. package/src/knowledge/tree-walker.ts +29 -0
  527. package/src/knowledge/types.ts +19 -0
  528. package/src/monitoring/CONTEXT.md +5 -2
  529. package/src/monitoring/__tests__/context-tracker.test.ts +16 -8
  530. package/src/monitoring/__tests__/trace-file-anchoring.test.ts +80 -0
  531. package/src/monitoring/traces.ts +19 -5
  532. package/src/release/CONTEXT.md +1 -1
  533. package/src/release/__tests__/integrity.test.ts +21 -12
  534. package/src/test-setup/__tests__/jsonl-fake-fs.test.ts +98 -0
  535. package/src/test-setup/jsonl-fake-fs.ts +59 -0
  536. package/src/tools/index.ts +5 -1
  537. package/src/types/checkpoint.ts +6 -0
  538. package/src/types/passes-gate.ts +0 -17
  539. package/src/types/project-config.ts +21 -0
  540. package/src/types/trace.ts +14 -4
  541. package/src/utils/__tests__/file-walk.test.ts +3 -2
  542. package/src/utils/__tests__/jsonl-bounded-read.test.ts +106 -0
  543. package/src/utils/__tests__/jsonl-skip-disposition.test.ts +10 -6
  544. package/src/utils/__tests__/jsonl.test.ts +61 -14
  545. package/src/utils/__tests__/numeric-flag.test.ts +80 -0
  546. package/src/utils/__tests__/package-version.test.ts +2 -2
  547. package/src/utils/exec.ts +4 -64
  548. package/src/utils/jsonl.ts +159 -20
  549. package/src/utils/numeric-flag.ts +64 -0
  550. package/dist/failure/types.d.ts +0 -9
  551. package/dist/failure/types.d.ts.map +0 -1
  552. package/dist/failure/types.js +0 -25
  553. package/dist/failure/types.js.map +0 -1
  554. package/dist/gates/effective-gates.d.ts +0 -30
  555. package/dist/gates/effective-gates.d.ts.map +0 -1
  556. package/dist/gates/effective-gates.js +0 -81
  557. package/dist/gates/effective-gates.js.map +0 -1
  558. package/src/failure/types.ts +0 -9
  559. package/src/gates/__tests__/effective-gates.test.ts +0 -77
  560. package/src/gates/effective-gates.ts +0 -99
@@ -12,6 +12,7 @@ exports.formatEvidence = formatEvidence;
12
12
  exports.normalizeCheckOutcome = normalizeCheckOutcome;
13
13
  exports.contextFlag = contextFlag;
14
14
  exports.contextEvidenceFlag = contextEvidenceFlag;
15
+ const run_env_1 = require("../run-env");
15
16
  /**
16
17
  * 构造 CheckEnv:生产侧唯一构造点
17
18
  *
@@ -19,21 +20,24 @@ exports.contextEvidenceFlag = contextEvidenceFlag;
19
20
  * - 'none' = 显式不接证据:证据函数返回空;evidence flag 未接线的
20
21
  * checker 按契约返回 'skip'(见 contextEvidenceFlag),直接读空
21
22
  * 证据的 checker 在自然输入下判定
23
+ * - runEnv = 本 run 的运行级观察面(ADR-0023):传入即与 context-builder 及
24
+ * 其余 checker 共用同一份上行数据读取;不传则自造一枚,只服务本次调用
22
25
  *
23
26
  * studio 侧若需 git 证据(#129),传真实 providers 即可。
24
27
  */
25
- function buildCheckEnv(context, evidence) {
28
+ function buildCheckEnv(context, evidence, runEnv) {
26
29
  const projectPath = context.projectPath || process.cwd();
30
+ const run = runEnv ?? (0, run_env_1.createRunEnv)(projectPath);
27
31
  if (evidence === 'none') {
28
32
  return {
33
+ ...run,
29
34
  context,
30
- projectPath,
31
35
  stagedDiff: async () => '',
32
36
  stagedDiffNames: async () => '',
33
37
  srcScan: () => [],
34
38
  };
35
39
  }
36
- return { context, projectPath, ...evidence };
40
+ return { ...run, context, ...evidence };
37
41
  }
38
42
  /** 证据条数上限:trace 是 JSONL,缺口上百项时不能整仓落盘 */
39
43
  exports.MAX_EVIDENCE_ITEMS = 10;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAgDH,sCAeC;AA6CD,wCAIC;AAOD,sDAQC;AAeD,kCAKC;AASD,kDAYC;AAlID;;;;;;;;;GASG;AACH,SAAgB,aAAa,CAC3B,OAA0B,EAC1B,QAAoC;IAEpC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO;YACL,OAAO;YACP,WAAW;YACX,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;YAC1B,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;YAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;SAClB,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;AAC/C,CAAC;AAmCD,wCAAwC;AAC3B,QAAA,kBAAkB,GAAG,EAAE,CAAC;AAErC;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,OAAe,EAAE,KAAe;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,0BAAkB,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,OAAqB;IACzD,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAChF,IAAI,OAAO,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC9F,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,IAAI;QACvB,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;KACjC,CAAC;AACJ,CAAC;AAYD;;GAEG;AACH,SAAgB,WAAW,CACzB,EAAU,EACV,SAAkD;IAElD,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,mBAAmB,CACjC,EAAU,EACV,IAAyD;IAEzD,OAAO;QACL,EAAE;QACF,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,MAAM,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAoDH,sCAiBC;AA6CD,wCAIC;AAOD,sDAQC;AAeD,kCAKC;AASD,kDAYC;AA3KD,wCAAuD;AAqCvD;;;;;;;;;;;GAWG;AACH,SAAgB,aAAa,CAC3B,OAA0B,EAC1B,QAAoC,EACpC,MAAe;IAEf,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzD,MAAM,GAAG,GAAG,MAAM,IAAI,IAAA,sBAAY,EAAC,WAAW,CAAC,CAAC;IAChD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO;YACL,GAAG,GAAG;YACN,OAAO;YACP,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;YAC1B,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;YAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;SAClB,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;AAC1C,CAAC;AAmCD,wCAAwC;AAC3B,QAAA,kBAAkB,GAAG,EAAE,CAAC;AAErC;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,OAAe,EAAE,KAAe;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,0BAAkB,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,OAAqB;IACzD,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAChF,IAAI,OAAO,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC9F,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,IAAI;QACvB,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;KACjC,CAAC;AACJ,CAAC;AAYD;;GAEG;AACH,SAAgB,WAAW,CACzB,EAAU,EACV,SAAkD;IAElD,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,mBAAmB,CACjC,EAAU,EACV,IAAyD;IAEzD,OAAO;QACL,EAAE;QACF,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,MAAM,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -8,7 +8,13 @@
8
8
  * 架构评审 #87:本模块只做装配不做取证——git 证据一律经 git-evidence
9
9
  * adapter 取(缺省真 git adapter,调用方可注入与 checker 层同源的那一份),
10
10
  * 因此此处不再有 child_process / raw execSync。
11
+ *
12
+ * ADR-0023:同理,trace 记录与源码根探测改经运行级观察面 `RunEnv` 取——
13
+ * 此前本模块的两个证据探测各自整读一次 traces.log、detectTrigger 与 checker 层
14
+ * 各探一次源码根,同一次运行内重复读同一批文件。缺省自造一份 env,调用方(CLI check)
15
+ * 注入即全 run 共用。
11
16
  */
17
+ import { type RunEnv } from './run-env';
12
18
  import type { ConstraintContext, ConstraintTrigger } from '../../types/constraint';
13
19
  import { type GitEvidence } from './git-evidence';
14
20
  /**
@@ -30,22 +36,14 @@ export declare function detectTrigger(changedFiles: string[], options: {
30
36
  trigger?: ConstraintTrigger;
31
37
  projectPath?: string;
32
38
  evidence?: GitEvidence;
39
+ /** 运行级观察面(ADR-0023):注入即与其余消费方共用同一份源根探测 */
40
+ runEnv?: RunEnv;
33
41
  }): ConstraintTrigger | ConstraintTrigger[];
34
- /**
35
- * 检测是否有失败的测试记录
36
- * 扫描 trace 文件(DEFAULT_TRACE_FILE)中最近的记录
37
- */
38
- export declare function detectFailingTest(projectPath: string): Promise<boolean>;
39
42
  /**
40
43
  * 检测是否有根因分析文档
41
44
  * 检查 ROOT_CAUSE.md、.harness/diagnoses/、或 git commit 消息
42
45
  */
43
46
  export declare function detectRootCauseInvestigation(projectPath: string): boolean;
44
- /**
45
- * 检测是否有验证证据
46
- * 检查 trace 文件(DEFAULT_TRACE_FILE)中最近的成功验证记录
47
- */
48
- export declare function detectVerificationEvidence(projectPath: string): Promise<boolean>;
49
47
  /**
50
48
  * 检测是否有需求来源
51
49
  * 检查 CLAUDE.md、README.md、specs/、docs/specs/ 等
@@ -61,11 +59,14 @@ export declare function detectReuseCheck(projectPath: string): boolean;
61
59
  *
62
60
  * options.evidence(#87):git 证据适配器。调用方(CLI check)注入同一实例给
63
61
  * checkConstraints,即可让 context-builder 与 checker 层共用同一证据来源。
62
+ * options.runEnv(ADR-0023):运行级观察面。注入即本函数内的源根探测与两处 trace
63
+ * 证据探测与其余消费方共用同一份读取,缺省自造一份(只服务本次调用)。
64
64
  */
65
65
  export declare function buildConstraintContext(options: {
66
66
  projectPath?: string;
67
67
  staged: boolean;
68
68
  trigger?: ConstraintTrigger;
69
69
  evidence?: GitEvidence;
70
+ runEnv?: RunEnv;
70
71
  }): Promise<ConstraintContext>;
71
72
  //# sourceMappingURL=context-builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../../src/core/constraints/context-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAqC,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAErF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGtF;AASD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE;IACP,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB,GACA,iBAAiB,GAAG,iBAAiB,EAAE,CA8BzC;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAW7E;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAgBzE;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYtF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAqB9D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAY7D;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmB7B"}
1
+ {"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../../src/core/constraints/context-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAmC,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAqC,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAErF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGtF;AASD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE;IACP,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,iBAAiB,GAAG,iBAAiB,EAAE,CA8BzC;AAgBD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAgBzE;AAmBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAqB9D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAY7D;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAyB7B"}
@@ -9,6 +9,11 @@
9
9
  * 架构评审 #87:本模块只做装配不做取证——git 证据一律经 git-evidence
10
10
  * adapter 取(缺省真 git adapter,调用方可注入与 checker 层同源的那一份),
11
11
  * 因此此处不再有 child_process / raw execSync。
12
+ *
13
+ * ADR-0023:同理,trace 记录与源码根探测改经运行级观察面 `RunEnv` 取——
14
+ * 此前本模块的两个证据探测各自整读一次 traces.log、detectTrigger 与 checker 层
15
+ * 各探一次源码根,同一次运行内重复读同一批文件。缺省自造一份 env,调用方(CLI check)
16
+ * 注入即全 run 共用。
12
17
  */
13
18
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
19
  if (k2 === undefined) k2 = k;
@@ -46,17 +51,13 @@ var __importStar = (this && this.__importStar) || (function () {
46
51
  Object.defineProperty(exports, "__esModule", { value: true });
47
52
  exports.isNewDirectory = isNewDirectory;
48
53
  exports.detectTrigger = detectTrigger;
49
- exports.detectFailingTest = detectFailingTest;
50
54
  exports.detectRootCauseInvestigation = detectRootCauseInvestigation;
51
- exports.detectVerificationEvidence = detectVerificationEvidence;
52
55
  exports.detectRequirement = detectRequirement;
53
56
  exports.detectReuseCheck = detectReuseCheck;
54
57
  exports.buildConstraintContext = buildConstraintContext;
55
58
  const fs = __importStar(require("fs"));
56
59
  const path = __importStar(require("path"));
57
- const detect_source_roots_1 = require("../../utils/detect-source-roots");
58
- const jsonl_1 = require("../../utils/jsonl");
59
- const trace_1 = require("../../types/trace");
60
+ const run_env_1 = require("./run-env");
60
61
  const git_evidence_1 = require("./git-evidence");
61
62
  /**
62
63
  * 检查文件所在目录是否在 git HEAD 中不存在(即新目录)
@@ -91,7 +92,7 @@ function detectTrigger(changedFiles, options) {
91
92
  // pre-commit 场景下变更含代码文件 → 附加 code_implementation 推断
92
93
  const hasCodeChange = changedFiles.some(f => CODE_FILE_REGEX.test(f));
93
94
  const projectPath = options.projectPath || process.cwd();
94
- const sourceRoots = (0, detect_source_roots_1.detectSourceRoots)(projectPath);
95
+ const sourceRoots = (options.runEnv ?? (0, run_env_1.createRunEnv)(projectPath)).sourceRoots();
95
96
  const hasModuleChange = changedFiles.some(f => sourceRoots.some(root => f.startsWith(root + '/') || f.startsWith(root + '\\')) && !f.includes('__tests__'));
96
97
  // 工单 18 的批量语义保留在 adapter 层:一次 ls-tree,且仅在有模块变更时才取证
97
98
  const headDirs = hasModuleChange
@@ -111,17 +112,14 @@ function detectTrigger(changedFiles, options) {
111
112
  return hasCodeChange ? [primary, 'code_implementation'] : primary;
112
113
  }
113
114
  /**
114
- * 检测是否有失败的测试记录
115
- * 扫描 trace 文件(DEFAULT_TRACE_FILE)中最近的记录
115
+ * 检测是否有失败的测试记录(取运行级观察面的最近 20 条)
116
116
  */
117
- async function detectFailingTest(projectPath) {
117
+ async function detectFailingTest(env) {
118
118
  try {
119
- const traceFile = path.join(projectPath, trace_1.DEFAULT_TRACE_FILE);
120
- // 坏行策略:skip(原逐行 catch→false 语义不变);只 parse 最近 20 行
121
- // 计数去向:豁免(harness#100)——布尔证据探测,坏行只会让证据变少(判定方向保守),
122
- // 消费面是 check pass/fail 判定,没有可挂计数的输出位
123
- const { records } = (0, jsonl_1.readJsonl)(traceFile, 'skip', { tail: 20 });
124
- return records.some(trace => trace.result === 'fail');
119
+ // 坏行策略与计数去向见 run-env 的读点(ADR-0023 合并两处独立 tail 读为一份窗口)
120
+ return env
121
+ .traceTail(run_env_1.TRACE_TAIL_WINDOW)
122
+ .records.some(trace => trace.result === 'fail');
125
123
  }
126
124
  catch {
127
125
  return false;
@@ -149,19 +147,17 @@ function detectRootCauseInvestigation(projectPath) {
149
147
  }
150
148
  return false;
151
149
  }
150
+ /** 验证证据的尾部窗口(工单 23 原口径:只看最近 10 条) */
151
+ const VERIFICATION_EVIDENCE_TAIL = 10;
152
152
  /**
153
- * 检测是否有验证证据
154
- * 检查 trace 文件(DEFAULT_TRACE_FILE)中最近的成功验证记录
153
+ * 检测是否有验证证据(取运行级观察面的最近 10 条)
155
154
  */
156
- async function detectVerificationEvidence(projectPath) {
155
+ async function detectVerificationEvidence(env) {
157
156
  try {
158
- const traceFile = path.join(projectPath, trace_1.DEFAULT_TRACE_FILE);
159
- // 坏行策略:skip(原逐行 catch→false 语义不变);只 parse 最近 10 行
160
157
  // tail 在 parse 之前截断 → 坏行会占用尾部槽位(#82 裁决范围外的既有口径,本票不改)
161
- // 计数去向:豁免(harness#100)——同 detectFailingTest:布尔证据探测无计数输出位,
162
- // 坏行只会让证据变少
163
- const { records } = (0, jsonl_1.readJsonl)(traceFile, 'skip', { tail: 10 });
164
- return records.some(trace => trace.result === 'pass');
158
+ return env
159
+ .traceTail(VERIFICATION_EVIDENCE_TAIL)
160
+ .records.some(trace => trace.result === 'pass');
165
161
  }
166
162
  catch {
167
163
  return false;
@@ -216,12 +212,20 @@ function detectReuseCheck(projectPath) {
216
212
  *
217
213
  * options.evidence(#87):git 证据适配器。调用方(CLI check)注入同一实例给
218
214
  * checkConstraints,即可让 context-builder 与 checker 层共用同一证据来源。
215
+ * options.runEnv(ADR-0023):运行级观察面。注入即本函数内的源根探测与两处 trace
216
+ * 证据探测与其余消费方共用同一份读取,缺省自造一份(只服务本次调用)。
219
217
  */
220
218
  async function buildConstraintContext(options) {
221
219
  const projectPath = options.projectPath || process.cwd();
220
+ const runEnv = options.runEnv ?? (0, run_env_1.createRunEnv)(projectPath);
222
221
  const evidence = options.evidence ?? (0, git_evidence_1.createGitEvidence)(projectPath);
223
222
  const changedFiles = (0, git_evidence_1.splitFileNames)(evidence.changedFileNames(options.staged));
224
- const inferred = detectTrigger(changedFiles, { trigger: options.trigger, projectPath, evidence });
223
+ const inferred = detectTrigger(changedFiles, {
224
+ trigger: options.trigger,
225
+ projectPath,
226
+ evidence,
227
+ runEnv,
228
+ });
225
229
  const triggers = Array.isArray(inferred) ? inferred : [inferred];
226
230
  return {
227
231
  operation: triggers[0],
@@ -229,9 +233,9 @@ async function buildConstraintContext(options) {
229
233
  projectPath,
230
234
  changedFiles,
231
235
  hasTest: changedFiles.some(f => f.includes('.test.') || f.includes('.spec.')),
232
- hasFailingTest: await detectFailingTest(projectPath),
236
+ hasFailingTest: await detectFailingTest(runEnv),
233
237
  hasRootCauseInvestigation: detectRootCauseInvestigation(projectPath),
234
- hasVerificationEvidence: await detectVerificationEvidence(projectPath),
238
+ hasVerificationEvidence: await detectVerificationEvidence(runEnv),
235
239
  hasReuseCheck: detectReuseCheck(projectPath),
236
240
  hasRequirement: detectRequirement(projectPath),
237
241
  };
@@ -1 +1 @@
1
- {"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../../../src/core/constraints/context-builder.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBH,wCAGC;AAkBD,sCAqCC;AAMD,8CAWC;AAMD,oEAgBC;AAMD,gEAYC;AAMD,8CAqBC;AAMD,4CAYC;AAQD,wDAwBC;AA9MD,uCAAyB;AACzB,2CAA6B;AAC7B,yEAAoE;AACpE,6CAA8C;AAC9C,6CAAuD;AAGvD,iDAAqF;AAErF;;;;GAIG;AACH,SAAgB,cAAc,CAAC,QAA4B,EAAE,QAAgB;IAC3E,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,CAAC,cAAc;IAClD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,MAAM,eAAe,GAAG,gFAAgF,CAAC;AAEzG;;;;;;;;GAQG;AACH,SAAgB,aAAa,CAC3B,YAAsB,EACtB,OAIC;IAED,IAAI,OAAO,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC;IAE5C,eAAe;IACf,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC1C,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CACxE,CAAC;IACF,oDAAoD;IACpD,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzD,MAAM,WAAW,GAAG,IAAA,uCAAiB,EAAC,WAAW,CAAC,CAAC;IACnD,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC5C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5G,CAAC;IACF,mDAAmD;IACnD,MAAM,QAAQ,GAAG,eAAe;QAC9B,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAA,gCAAiB,EAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE;QACjE,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,iBAAiB,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC9C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QAC/E,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,CAC5B,CAAC;IAEF,IAAI,OAA0B,CAAC;IAC/B,IAAI,aAAa,IAAI,CAAC,eAAe;QAAE,OAAO,GAAG,eAAe,CAAC;SAC5D,IAAI,iBAAiB;QAAE,OAAO,GAAG,iBAAiB,CAAC;SACnD,IAAI,eAAe;QAAE,OAAO,GAAG,qBAAqB,CAAC;;QACrD,OAAO,GAAG,mBAAmB,CAAC;IAEnC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACpE,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IACzD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,0BAAkB,CAAC,CAAC;QAC7D,kDAAkD;QAClD,kDAAkD;QAClD,uCAAuC;QACvC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,iBAAS,EAAiB,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/E,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,4BAA4B,CAAC,WAAmB;IAC9D,mBAAmB;IACnB,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAExE,4BAA4B;IAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IACrE,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YAC3C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,0BAA0B,CAAC,WAAmB;IAClE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,0BAAkB,CAAC,CAAC;QAC7D,kDAAkD;QAClD,qDAAqD;QACrD,0DAA0D;QAC1D,YAAY;QACZ,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,iBAAS,EAAiB,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/E,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,WAAmB;IACnD,uDAAuD;IACvD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACzD,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;gBAC5C,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG;QACjB,WAAW;QACX,OAAO;QACP,YAAY;QACZ,QAAQ;KACT,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,WAAmB;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,sBAAsB,CAAC,OAK5C;IACC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAA,gCAAiB,EAAC,WAAW,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,IAAA,6BAAc,EAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/E,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClG,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAEjE,OAAO;QACL,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QACtB,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAChC,WAAW;QACX,YAAY;QACZ,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC7E,cAAc,EAAE,MAAM,iBAAiB,CAAC,WAAW,CAAC;QACpD,yBAAyB,EAAE,4BAA4B,CAAC,WAAW,CAAC;QACpE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC,WAAW,CAAC;QACtE,aAAa,EAAE,gBAAgB,CAAC,WAAW,CAAC;QAC5C,cAAc,EAAE,iBAAiB,CAAC,WAAW,CAAC;KAC/C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../../../src/core/constraints/context-builder.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaH,wCAGC;AAkBD,sCAuCC;AAoBD,oEAgBC;AAuBD,8CAqBC;AAMD,4CAYC;AAUD,wDA+BC;AAlND,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyE;AAEzE,iDAAqF;AAErF;;;;GAIG;AACH,SAAgB,cAAc,CAAC,QAA4B,EAAE,QAAgB;IAC3E,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,CAAC,cAAc;IAClD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,MAAM,eAAe,GAAG,gFAAgF,CAAC;AAEzG;;;;;;;;GAQG;AACH,SAAgB,aAAa,CAC3B,YAAsB,EACtB,OAMC;IAED,IAAI,OAAO,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC;IAE5C,eAAe;IACf,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC1C,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CACxE,CAAC;IACF,oDAAoD;IACpD,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzD,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,IAAA,sBAAY,EAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAChF,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC5C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5G,CAAC;IACF,mDAAmD;IACnD,MAAM,QAAQ,GAAG,eAAe;QAC9B,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAA,gCAAiB,EAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE;QACjE,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,iBAAiB,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC9C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QAC/E,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,CAC5B,CAAC;IAEF,IAAI,OAA0B,CAAC;IAC/B,IAAI,aAAa,IAAI,CAAC,eAAe;QAAE,OAAO,GAAG,eAAe,CAAC;SAC5D,IAAI,iBAAiB;QAAE,OAAO,GAAG,iBAAiB,CAAC;SACnD,IAAI,eAAe;QAAE,OAAO,GAAG,qBAAqB,CAAC;;QACrD,OAAO,GAAG,mBAAmB,CAAC;IAEnC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,sDAAsD;QACtD,OAAO,GAAG;aACP,SAAS,CAAC,2BAAiB,CAAC;aAC5B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,4BAA4B,CAAC,WAAmB;IAC9D,mBAAmB;IACnB,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAExE,4BAA4B;IAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IACrE,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YAC3C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,qCAAqC;AACrC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAEtC;;GAEG;AACH,KAAK,UAAU,0BAA0B,CAAC,GAAW;IACnD,IAAI,CAAC;QACH,qDAAqD;QACrD,OAAO,GAAG;aACP,SAAS,CAAC,0BAA0B,CAAC;aACrC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,WAAmB;IACnD,uDAAuD;IACvD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACzD,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;gBAC5C,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG;QACjB,WAAW;QACX,OAAO;QACP,YAAY;QACZ,QAAQ;KACT,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,WAAmB;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,sBAAsB,CAAC,OAM5C;IACC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAA,sBAAY,EAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAA,gCAAiB,EAAC,WAAW,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,IAAA,6BAAc,EAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/E,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,EAAE;QAC3C,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW;QACX,QAAQ;QACR,MAAM;KACP,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAEjE,OAAO;QACL,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QACtB,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAChC,WAAW;QACX,YAAY;QACZ,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC7E,cAAc,EAAE,MAAM,iBAAiB,CAAC,MAAM,CAAC;QAC/C,yBAAyB,EAAE,4BAA4B,CAAC,WAAW,CAAC;QACpE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC,MAAM,CAAC;QACjE,aAAa,EAAE,gBAAgB,CAAC,WAAW,CAAC;QAC5C,cAAc,EAAE,iBAAiB,CAAC,WAAW,CAAC;KAC/C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * CONTEXT.md「核心导出」节与目录导出面的对照判定(harness#142 / ADR-0025)
3
+ *
4
+ * 纯判定 module:吃「CONTEXT.md 正文 + 目录导出面清单(+ barrel 值符号清单)」,
5
+ * 一次产出双向判定;不做任何 fs IO——文件遍历、正文读取、`export *` 目标解析
6
+ * 全在调用方(cli 侧),与 ADR-0009 的 capabilities-reconcile 同一套组装形状。
7
+ *
8
+ * 方向(语义与 capabilities-reconcile 对齐:幽灵 = 文档说谎,未登记 = 代码有而文档漏):
9
+ * 文档→代码 ghosts(「核心导出」节声明的符号在目录导出面里不存在)
10
+ * 代码→文档 unlistedBarrelExports(index.ts 再导出的值符号未出现在该节)
11
+ *
12
+ * 口径(ADR-0025,两条都是「可操作」而非「越严越好」的取舍):
13
+ * - 声明只取 bullet **行首**的反引号标识符(`/` 连接的多符号逐个取,形参列表与
14
+ * `(type)`注解剥掉)。行首不是标识符的 bullet 是模块/目录条目
15
+ * (`types.ts`、`audit-scoring`、`constraints/`),不属符号声明面,整条跳过。
16
+ * - 覆盖方向只管 barrel 的**值**符号:类型面(interface/type)不要求逐个登记
17
+ * ——否则每次加一个公开类型都要回灌文档,正是本闸要避免的「连注释都要改」。
18
+ * 类型-only 的剔除在采集侧(读得懂 `export type { }` 与声明关键字的那一层)。
19
+ * - 「出现在该节」按标识符边界匹配(inline 提及即算登记),bullet 行首之外的正文同样参与,
20
+ * 但**其它 `## ` 节**的正文不参与——绕过闸需要把符号塞进「核心导出」节,而不是塞满全文件。
21
+ */
22
+ export interface ExportedSymbol {
23
+ /** 导出名(`a as b` 取 b) */
24
+ name: string;
25
+ /** 来源侧的本名(`a as b` 取 a;自身声明与无别名再导出时等于 name)——调用方按它核对正本是否真有此物 */
26
+ localName: string;
27
+ /** 类型-only(interface/type 声明、`export type { }` 块、逐项 `type` 标记) */
28
+ typeOnly: boolean;
29
+ /** 再导出的来源 spec(`from './x'`),模块自身声明为 undefined */
30
+ from?: string;
31
+ }
32
+ export interface ExportStatementParse {
33
+ symbols: ExportedSymbol[];
34
+ /** 待调用方解析的 `export *` 目标 spec(fs 侧才知道文件在不在) */
35
+ starFrom: string[];
36
+ }
37
+ export interface ContextReconcileInput {
38
+ /** CONTEXT.md 全文 */
39
+ contextMdContent: string;
40
+ /** 目录导出面全集:目录内所有 .ts 导出的符号名(值 + 类型,含 barrel 与内部 seam) */
41
+ exportSurface: string[];
42
+ /** index.ts barrel 再导出的**值**符号清单;无 index.ts 的目录不传(跳过覆盖方向) */
43
+ barrelExports?: string[];
44
+ }
45
+ export interface ContextVerdict {
46
+ /** 文档是否含「## 核心导出」节;无节 = 两方向都不参与判定 */
47
+ hasCoreExportsSection: boolean;
48
+ /** 该节解析出的符号声明(去重、按出现序) */
49
+ declaredSymbols: string[];
50
+ /** 幽灵:声明了但目录导出面没有 */
51
+ ghosts: string[];
52
+ /** 未登记:barrel 值符号未出现在该节 */
53
+ unlistedBarrelExports: string[];
54
+ }
55
+ /**
56
+ * 取「## 核心导出」节正文(不含标题行),到下一个二级标题为止。
57
+ * 无该节 → null。
58
+ */
59
+ export declare function parseCoreExportsSection(content: string): string | null;
60
+ /**
61
+ * 解析「## 核心导出」节的符号声明:只认 bullet 行首的反引号标识符
62
+ * (`/` 连接视为多个声明,其后的散文与 inline 提及不参与幽灵判定)。
63
+ */
64
+ export declare function parseDeclaredExportSymbols(content: string): string[];
65
+ /**
66
+ * 解析单个源文件的导出面(口径正本,采集侧与测试共用):
67
+ * 声明形、`export { }` 列表形(含别名与逐项 `type`)、`export default`、`export *`。
68
+ * 只做正则解析,不解析 spec 指向谁——那是调用方的 fs 活。
69
+ */
70
+ export declare function parseExportStatements(source: string): ExportStatementParse;
71
+ /**
72
+ * CONTEXT.md 与目录导出面的双向判定(唯一真相源,sync-docs 与任何后续消费方共用)。
73
+ */
74
+ export declare function reconcileContext(input: ContextReconcileInput): ContextVerdict;
75
+ //# sourceMappingURL=context-reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-reconcile.d.ts","sourceRoot":"","sources":["../../../src/core/constraints/context-reconcile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAuBH,MAAM,WAAW,cAAc;IAC7B,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,QAAQ,EAAE,OAAO,CAAC;IAClB,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,oBAAoB;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,0BAA0B;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,qBAAqB;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,2BAA2B;IAC3B,qBAAqB,EAAE,MAAM,EAAE,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWtE;AASD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BpE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAkC1E;AAQD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,cAAc,CAa7E"}
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ /**
3
+ * CONTEXT.md「核心导出」节与目录导出面的对照判定(harness#142 / ADR-0025)
4
+ *
5
+ * 纯判定 module:吃「CONTEXT.md 正文 + 目录导出面清单(+ barrel 值符号清单)」,
6
+ * 一次产出双向判定;不做任何 fs IO——文件遍历、正文读取、`export *` 目标解析
7
+ * 全在调用方(cli 侧),与 ADR-0009 的 capabilities-reconcile 同一套组装形状。
8
+ *
9
+ * 方向(语义与 capabilities-reconcile 对齐:幽灵 = 文档说谎,未登记 = 代码有而文档漏):
10
+ * 文档→代码 ghosts(「核心导出」节声明的符号在目录导出面里不存在)
11
+ * 代码→文档 unlistedBarrelExports(index.ts 再导出的值符号未出现在该节)
12
+ *
13
+ * 口径(ADR-0025,两条都是「可操作」而非「越严越好」的取舍):
14
+ * - 声明只取 bullet **行首**的反引号标识符(`/` 连接的多符号逐个取,形参列表与
15
+ * `(type)`注解剥掉)。行首不是标识符的 bullet 是模块/目录条目
16
+ * (`types.ts`、`audit-scoring`、`constraints/`),不属符号声明面,整条跳过。
17
+ * - 覆盖方向只管 barrel 的**值**符号:类型面(interface/type)不要求逐个登记
18
+ * ——否则每次加一个公开类型都要回灌文档,正是本闸要避免的「连注释都要改」。
19
+ * 类型-only 的剔除在采集侧(读得懂 `export type { }` 与声明关键字的那一层)。
20
+ * - 「出现在该节」按标识符边界匹配(inline 提及即算登记),bullet 行首之外的正文同样参与,
21
+ * 但**其它 `## ` 节**的正文不参与——绕过闸需要把符号塞进「核心导出」节,而不是塞满全文件。
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.parseCoreExportsSection = parseCoreExportsSection;
25
+ exports.parseDeclaredExportSymbols = parseDeclaredExportSymbols;
26
+ exports.parseExportStatements = parseExportStatements;
27
+ exports.reconcileContext = reconcileContext;
28
+ /** markdown「## 核心导出」节标题(其后括注允许,如 `## 核心导出 (dist/)`) */
29
+ const SECTION_HEADING_REGEX = /^##\s*核心导出/;
30
+ /** 任意二级标题:节的终点(三级标题属节内子结构,不终止) */
31
+ const H2_HEADING_REGEX = /^##\s/;
32
+ /** bullet 行 */
33
+ const BULLET_REGEX = /^\s*[-*]\s*(.*)$/;
34
+ /** bullet 行首(及 `/` 连接的后续)反引号片段 */
35
+ const LEADING_BACKTICK_REGEX = /^`([^`]+)`/;
36
+ /** token 间的 `/` 分隔(可含空白)+ 下一个反引号起点 */
37
+ const NEXT_TOKEN_REGEX = /^(?:\s*\/\s*)?\s*`/;
38
+ /** 合法导出标识符 */
39
+ const IDENTIFIER_REGEX = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
40
+ /** 源码导出声明:`export [默认] [形式] 名字` 与 `export { … } [from '…']` */
41
+ const DECLARATION_REGEX = /^export\s+(?:declare\s+)?(?:abstract\s+)?(?:async\s+)?(function|const|let|var|class|interface|type|enum)\s+([A-Za-z_$][\w$]*)/gm;
42
+ /** `export { … }` / `export type { … }`(可带 from) */
43
+ const EXPORT_LIST_REGEX = /^export\s+(type\s+)?\{([^}]*)\}(?:\s*from\s*['"]([^'"]+)['"])?/gm;
44
+ /** `export * from '…'` / `export * as ns from '…'` */
45
+ const STAR_EXPORT_REGEX = /^export\s+\*\s*(?:as\s+[A-Za-z_$][\w$]*\s*)?from\s*['"]([^'"]+)['"]/gm;
46
+ /**
47
+ * 取「## 核心导出」节正文(不含标题行),到下一个二级标题为止。
48
+ * 无该节 → null。
49
+ */
50
+ function parseCoreExportsSection(content) {
51
+ const lines = content.split(/\r?\n/);
52
+ const start = lines.findIndex((line) => SECTION_HEADING_REGEX.test(line));
53
+ if (start === -1)
54
+ return null;
55
+ const body = [];
56
+ for (let i = start + 1; i < lines.length; i++) {
57
+ if (H2_HEADING_REGEX.test(lines[i]))
58
+ break;
59
+ body.push(lines[i]);
60
+ }
61
+ return body.join('\n');
62
+ }
63
+ /** 反引号片段 → 导出符号名;剥形参列表与 `type` 关键字前缀,非标识符返回 null */
64
+ function toSymbolName(token) {
65
+ const bare = token.replace(/[((].*$/, '').trim();
66
+ const withoutKeyword = /^type\s+/.test(bare) ? bare.replace(/^type\s+/, '').trim() : bare;
67
+ return IDENTIFIER_REGEX.test(withoutKeyword) ? withoutKeyword : null;
68
+ }
69
+ /**
70
+ * 解析「## 核心导出」节的符号声明:只认 bullet 行首的反引号标识符
71
+ * (`/` 连接视为多个声明,其后的散文与 inline 提及不参与幽灵判定)。
72
+ */
73
+ function parseDeclaredExportSymbols(content) {
74
+ const section = parseCoreExportsSection(content);
75
+ if (section === null)
76
+ return [];
77
+ const out = [];
78
+ const seen = new Set();
79
+ for (const line of section.split(/\r?\n/)) {
80
+ const bullet = BULLET_REGEX.exec(line);
81
+ if (!bullet)
82
+ continue;
83
+ let rest = bullet[1];
84
+ for (;;) {
85
+ const token = LEADING_BACKTICK_REGEX.exec(rest);
86
+ if (!token)
87
+ break;
88
+ const name = toSymbolName(token[1]);
89
+ if (name && !seen.has(name)) {
90
+ seen.add(name);
91
+ out.push(name);
92
+ }
93
+ rest = rest.slice(token[0].length);
94
+ const separator = NEXT_TOKEN_REGEX.exec(rest);
95
+ if (!separator)
96
+ break;
97
+ rest = rest.slice(separator[0].length - 1);
98
+ }
99
+ }
100
+ return out;
101
+ }
102
+ /**
103
+ * 解析单个源文件的导出面(口径正本,采集侧与测试共用):
104
+ * 声明形、`export { }` 列表形(含别名与逐项 `type`)、`export default`、`export *`。
105
+ * 只做正则解析,不解析 spec 指向谁——那是调用方的 fs 活。
106
+ */
107
+ function parseExportStatements(source) {
108
+ const symbols = [];
109
+ for (const match of source.matchAll(DECLARATION_REGEX)) {
110
+ symbols.push({
111
+ name: match[2],
112
+ localName: match[2],
113
+ typeOnly: match[1] === 'interface' || match[1] === 'type',
114
+ });
115
+ }
116
+ for (const match of source.matchAll(EXPORT_LIST_REGEX)) {
117
+ const blockIsType = Boolean(match[1]);
118
+ const from = match[3];
119
+ for (const part of match[2].split(',')) {
120
+ const specifier = part.trim();
121
+ if (!specifier || specifier === 'default')
122
+ continue;
123
+ const typeOnly = blockIsType || /^type\s+/.test(specifier);
124
+ const cleaned = specifier.replace(/^type\s+/, '').trim();
125
+ const aliased = /^([A-Za-z_$][\w$]*)\s+as\s+([A-Za-z_$][\w$]*)$/.exec(cleaned);
126
+ const single = /^([A-Za-z_$][\w$]*)$/.exec(cleaned);
127
+ if (aliased)
128
+ symbols.push({ name: aliased[2], localName: aliased[1], typeOnly, ...(from ? { from } : {}) });
129
+ else if (single)
130
+ symbols.push({ name: single[1], localName: single[1], typeOnly, ...(from ? { from } : {}) });
131
+ }
132
+ }
133
+ if (/^export\s+default\b/m.test(source)) {
134
+ symbols.push({ name: 'default', localName: 'default', typeOnly: false });
135
+ }
136
+ return {
137
+ symbols,
138
+ starFrom: [...source.matchAll(STAR_EXPORT_REGEX)].map((m) => m[1]),
139
+ };
140
+ }
141
+ /** 符号是否在该节正文中出现(标识符边界匹配) */
142
+ function mentionedInSection(section, symbol) {
143
+ const escaped = symbol.replace(/[$]/g, '\\$');
144
+ return new RegExp(`(?<![\\w$])${escaped}(?![\\w$])`).test(section);
145
+ }
146
+ /**
147
+ * CONTEXT.md 与目录导出面的双向判定(唯一真相源,sync-docs 与任何后续消费方共用)。
148
+ */
149
+ function reconcileContext(input) {
150
+ const section = parseCoreExportsSection(input.contextMdContent);
151
+ const hasCoreExportsSection = section !== null && section.trim() !== '';
152
+ const declaredSymbols = parseDeclaredExportSymbols(input.contextMdContent);
153
+ const surface = new Set(input.exportSurface);
154
+ const ghosts = declaredSymbols.filter((symbol) => !surface.has(symbol));
155
+ const barrelExports = [...new Set(input.barrelExports ?? [])];
156
+ const unlistedBarrelExports = hasCoreExportsSection
157
+ ? barrelExports.filter((symbol) => !mentionedInSection(section, symbol))
158
+ : [];
159
+ return { hasCoreExportsSection, declaredSymbols, ghosts, unlistedBarrelExports };
160
+ }
161
+ //# sourceMappingURL=context-reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-reconcile.js","sourceRoot":"","sources":["../../../src/core/constraints/context-reconcile.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,12 @@ interface RunContext {
27
27
  projectPath: string;
28
28
  /** 外部提供的 required_dirs(来自 governance.context_files,用于 context_docs 检查的默认 dirs) */
29
29
  requiredDirs?: string[];
30
+ /**
31
+ * 源码根的**懒取**提供者(ADR-0023 决策 4):只在 doc_dir_check 从文档目录
32
+ * 推断不出根时用到。调用方传 `() => env.sourceRoots()` 即与本 run 其余消费方
33
+ * 共用一次探测;不传(sync-docs 等一次性调用方)则本模块自探一次。
34
+ */
35
+ sourceRoots?: () => string[];
30
36
  /** 外部提供的约束计数(用于内置 harner harness 的 doc_regex_count) */
31
37
  constraintCounts?: {
32
38
  ironLaws?: number;
@@ -42,6 +48,7 @@ export declare class FreshnessRunner {
42
48
  */
43
49
  runAll(config: DocFreshnessConfig, projectPath: string, ctx?: {
44
50
  requiredDirs?: string[];
51
+ sourceRoots?: () => string[];
45
52
  constraintCounts?: {
46
53
  ironLaws?: number;
47
54
  guidelines?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/core/constraints/doc-freshness/runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAKnB,MAAM,+BAA+B,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,IAAI,EAAE,OAAO,CAAC;IACd,aAAa;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,uDAAuD;IACvD,gBAAgB,CAAC,EAAE;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B;;OAEG;IACH,MAAM,CACJ,MAAM,EAAE,kBAAkB,EAC1B,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,gBAAgB,CAAC,EAAE;YAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GAC/F,oBAAoB,EAAE;IAazB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,GAAG,oBAAoB;IAsB9E,OAAO,CAAC,qBAAqB;IA0C7B,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,WAAW;IAiHnB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAiCrB,OAAO,CAAC,kBAAkB;IA0E1B;;OAEG;IACH,YAAY,CACV,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,WAAW,EAAE,MAAM,GAClB,MAAM;IA6BT;;OAEG;IACH,aAAa,CACX,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,MAAM;IAyCT,OAAO,CAAC,YAAY;CAGrB"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/core/constraints/doc-freshness/runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAKnB,MAAM,+BAA+B,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,IAAI,EAAE,OAAO,CAAC;IACd,aAAa;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;IAC7B,uDAAuD;IACvD,gBAAgB,CAAC,EAAE;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B;;OAEG;IACH,MAAM,CACJ,MAAM,EAAE,kBAAkB,EAC1B,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE;QACJ,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;QAC7B,gBAAgB,CAAC,EAAE;YAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC/D,GACA,oBAAoB,EAAE;IAczB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,GAAG,oBAAoB;IAsB9E,OAAO,CAAC,qBAAqB;IA0C7B,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,WAAW;IAiHnB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAoCrB,OAAO,CAAC,kBAAkB;IA0E1B;;OAEG;IACH,YAAY,CACV,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,WAAW,EAAE,MAAM,GAClB,MAAM;IA6BT;;OAEG;IACH,aAAa,CACX,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,MAAM;IAyCT,OAAO,CAAC,YAAY;CAGrB"}
@@ -26,6 +26,7 @@ class FreshnessRunner {
26
26
  const context = {
27
27
  projectPath,
28
28
  requiredDirs: ctx?.requiredDirs,
29
+ sourceRoots: ctx?.sourceRoots,
29
30
  constraintCounts: ctx?.constraintCounts,
30
31
  };
31
32
  return config.checks.map(check => this.runSingle(check, context));
@@ -163,7 +164,7 @@ class FreshnessRunner {
163
164
  // 2. fs → doc: 每个实际目录必须在文档中被覆盖
164
165
  if (!check.skip_reverse_check) {
165
166
  // 从文档目录中推断要扫描的根目录集
166
- const rootDirs = this.inferRootDirs(docDirs, ctx.projectPath);
167
+ const rootDirs = this.inferRootDirs(docDirs, ctx);
167
168
  const excludeSet = new Set(check.exclude || file_walk_1.DEFAULT_SKIP_DIRS);
168
169
  for (const rootDir of rootDirs) {
169
170
  const absRoot = (0, path_1.join)(ctx.projectPath, rootDir);
@@ -214,7 +215,7 @@ class FreshnessRunner {
214
215
  * 从文档目录集合推断要扫描的根目录
215
216
  * 例如 ["src/core", "src/cli/commands"] → ["src"]
216
217
  */
217
- inferRootDirs(docDirs, projectPath) {
218
+ inferRootDirs(docDirs, ctx) {
218
219
  const roots = new Set();
219
220
  for (const dir of docDirs) {
220
221
  // 取第一个路径段之前的公共部分
@@ -239,7 +240,11 @@ class FreshnessRunner {
239
240
  merged.add(root);
240
241
  }
241
242
  }
242
- return merged.size > 0 ? [...merged] : (0, detect_source_roots_1.detectSourceRoots)(projectPath);
243
+ if (merged.size > 0)
244
+ return [...merged];
245
+ // 兜底 = 文档一个目录条目都没登记:按项目实际源码根全量比对(删掉它等于静默放行空文档)。
246
+ // 取根优先用调用方注入的懒取 provider(与本 run 其余消费方共用一次探测,ADR-0023 决策 4)
247
+ return ctx.sourceRoots ? ctx.sourceRoots() : (0, detect_source_roots_1.detectSourceRoots)(ctx.projectPath);
243
248
  }
244
249
  // ── doc_regex_count ──────────────────────────────────────────────
245
250
  checkDocRegexCount(check, ctx) {