@dommaker/harness 1.3.0 → 1.4.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 (517) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +0 -2
  3. package/bin/harness.js +86 -32
  4. package/dist/cli/command-contract.d.ts +83 -0
  5. package/dist/cli/command-contract.d.ts.map +1 -0
  6. package/dist/cli/command-contract.js +66 -0
  7. package/dist/cli/command-contract.js.map +1 -0
  8. package/dist/cli/commands/acceptance.d.ts +3 -2
  9. package/dist/cli/commands/acceptance.d.ts.map +1 -1
  10. package/dist/cli/commands/acceptance.js +28 -24
  11. package/dist/cli/commands/acceptance.js.map +1 -1
  12. package/dist/cli/commands/analyze-sessions.d.ts +2 -1
  13. package/dist/cli/commands/analyze-sessions.d.ts.map +1 -1
  14. package/dist/cli/commands/analyze-sessions.js +25 -24
  15. package/dist/cli/commands/analyze-sessions.js.map +1 -1
  16. package/dist/cli/commands/check.d.ts +14 -2
  17. package/dist/cli/commands/check.d.ts.map +1 -1
  18. package/dist/cli/commands/check.js +76 -61
  19. package/dist/cli/commands/check.js.map +1 -1
  20. package/dist/cli/commands/command.d.ts +5 -1
  21. package/dist/cli/commands/command.d.ts.map +1 -1
  22. package/dist/cli/commands/command.js +26 -17
  23. package/dist/cli/commands/command.js.map +1 -1
  24. package/dist/cli/commands/constraints-report.d.ts +2 -1
  25. package/dist/cli/commands/constraints-report.d.ts.map +1 -1
  26. package/dist/cli/commands/constraints-report.js +37 -33
  27. package/dist/cli/commands/constraints-report.js.map +1 -1
  28. package/dist/cli/commands/constraints-retire.d.ts +6 -5
  29. package/dist/cli/commands/constraints-retire.d.ts.map +1 -1
  30. package/dist/cli/commands/constraints-retire.js +50 -52
  31. package/dist/cli/commands/constraints-retire.js.map +1 -1
  32. package/dist/cli/commands/constraints.d.ts +2 -1
  33. package/dist/cli/commands/constraints.d.ts.map +1 -1
  34. package/dist/cli/commands/constraints.js +10 -27
  35. package/dist/cli/commands/constraints.js.map +1 -1
  36. package/dist/cli/commands/contract.d.ts +3 -2
  37. package/dist/cli/commands/contract.d.ts.map +1 -1
  38. package/dist/cli/commands/contract.js +45 -42
  39. package/dist/cli/commands/contract.js.map +1 -1
  40. package/dist/cli/commands/definitions.d.ts +11 -11
  41. package/dist/cli/commands/definitions.d.ts.map +1 -1
  42. package/dist/cli/commands/definitions.js +29 -214
  43. package/dist/cli/commands/definitions.js.map +1 -1
  44. package/dist/cli/commands/failure.d.ts +5 -4
  45. package/dist/cli/commands/failure.d.ts.map +1 -1
  46. package/dist/cli/commands/failure.js +31 -25
  47. package/dist/cli/commands/failure.js.map +1 -1
  48. package/dist/cli/commands/init.d.ts +7 -5
  49. package/dist/cli/commands/init.d.ts.map +1 -1
  50. package/dist/cli/commands/init.js +147 -211
  51. package/dist/cli/commands/init.js.map +1 -1
  52. package/dist/cli/commands/knowledge.d.ts +21 -15
  53. package/dist/cli/commands/knowledge.d.ts.map +1 -1
  54. package/dist/cli/commands/knowledge.js +214 -199
  55. package/dist/cli/commands/knowledge.js.map +1 -1
  56. package/dist/cli/commands/passes-gate.d.ts +8 -2
  57. package/dist/cli/commands/passes-gate.d.ts.map +1 -1
  58. package/dist/cli/commands/passes-gate.js +44 -66
  59. package/dist/cli/commands/passes-gate.js.map +1 -1
  60. package/dist/cli/commands/performance.d.ts +2 -1
  61. package/dist/cli/commands/performance.d.ts.map +1 -1
  62. package/dist/cli/commands/performance.js +20 -18
  63. package/dist/cli/commands/performance.js.map +1 -1
  64. package/dist/cli/commands/posteval-plan.d.ts +5 -1
  65. package/dist/cli/commands/posteval-plan.d.ts.map +1 -1
  66. package/dist/cli/commands/posteval-plan.js +26 -15
  67. package/dist/cli/commands/posteval-plan.js.map +1 -1
  68. package/dist/cli/commands/release.d.ts +6 -1
  69. package/dist/cli/commands/release.d.ts.map +1 -1
  70. package/dist/cli/commands/release.js +69 -59
  71. package/dist/cli/commands/release.js.map +1 -1
  72. package/dist/cli/commands/report.d.ts +2 -1
  73. package/dist/cli/commands/report.d.ts.map +1 -1
  74. package/dist/cli/commands/report.js +9 -5
  75. package/dist/cli/commands/report.js.map +1 -1
  76. package/dist/cli/commands/review.d.ts +3 -2
  77. package/dist/cli/commands/review.d.ts.map +1 -1
  78. package/dist/cli/commands/review.js +33 -29
  79. package/dist/cli/commands/review.js.map +1 -1
  80. package/dist/cli/commands/sdd.d.ts +2 -1
  81. package/dist/cli/commands/sdd.d.ts.map +1 -1
  82. package/dist/cli/commands/sdd.js +7 -5
  83. package/dist/cli/commands/sdd.js.map +1 -1
  84. package/dist/cli/commands/security.d.ts +3 -2
  85. package/dist/cli/commands/security.d.ts.map +1 -1
  86. package/dist/cli/commands/security.js +29 -26
  87. package/dist/cli/commands/security.js.map +1 -1
  88. package/dist/cli/commands/spec-baseline-check.d.ts +2 -1
  89. package/dist/cli/commands/spec-baseline-check.d.ts.map +1 -1
  90. package/dist/cli/commands/spec-baseline-check.js +15 -11
  91. package/dist/cli/commands/spec-baseline-check.js.map +1 -1
  92. package/dist/cli/commands/spec.d.ts +7 -2
  93. package/dist/cli/commands/spec.d.ts.map +1 -1
  94. package/dist/cli/commands/spec.js +61 -51
  95. package/dist/cli/commands/spec.js.map +1 -1
  96. package/dist/cli/commands/status.d.ts +2 -1
  97. package/dist/cli/commands/status.d.ts.map +1 -1
  98. package/dist/cli/commands/status.js +57 -53
  99. package/dist/cli/commands/status.js.map +1 -1
  100. package/dist/cli/commands/sync-docs/agents-syncer.d.ts.map +1 -1
  101. package/dist/cli/commands/sync-docs/agents-syncer.js +5 -2
  102. package/dist/cli/commands/sync-docs/agents-syncer.js.map +1 -1
  103. package/dist/cli/commands/sync-docs/context-syncer.d.ts.map +1 -1
  104. package/dist/cli/commands/sync-docs/context-syncer.js +3 -2
  105. package/dist/cli/commands/sync-docs/context-syncer.js.map +1 -1
  106. package/dist/cli/commands/sync-docs/index.d.ts +2 -1
  107. package/dist/cli/commands/sync-docs/index.d.ts.map +1 -1
  108. package/dist/cli/commands/sync-docs/index.js +68 -88
  109. package/dist/cli/commands/sync-docs/index.js.map +1 -1
  110. package/dist/cli/commands/sync-docs/project-reader.d.ts +6 -1
  111. package/dist/cli/commands/sync-docs/project-reader.d.ts.map +1 -1
  112. package/dist/cli/commands/sync-docs/project-reader.js +14 -16
  113. package/dist/cli/commands/sync-docs/project-reader.js.map +1 -1
  114. package/dist/cli/commands/update-user-model.d.ts +2 -1
  115. package/dist/cli/commands/update-user-model.d.ts.map +1 -1
  116. package/dist/cli/commands/update-user-model.js +31 -45
  117. package/dist/cli/commands/update-user-model.js.map +1 -1
  118. package/dist/cli/commands/validate.d.ts +4 -3
  119. package/dist/cli/commands/validate.d.ts.map +1 -1
  120. package/dist/cli/commands/validate.js +28 -26
  121. package/dist/cli/commands/validate.js.map +1 -1
  122. package/dist/cli/session-mining/transcript.d.ts +7 -1
  123. package/dist/cli/session-mining/transcript.d.ts.map +1 -1
  124. package/dist/cli/session-mining/transcript.js +21 -14
  125. package/dist/cli/session-mining/transcript.js.map +1 -1
  126. package/dist/context/session-manager.d.ts.map +1 -1
  127. package/dist/context/session-manager.js +19 -32
  128. package/dist/context/session-manager.js.map +1 -1
  129. package/dist/core/constraints/agent-prompt-renderer.d.ts.map +1 -1
  130. package/dist/core/constraints/agent-prompt-renderer.js +1 -4
  131. package/dist/core/constraints/agent-prompt-renderer.js.map +1 -1
  132. package/dist/core/constraints/capabilities-parser.d.ts +24 -7
  133. package/dist/core/constraints/capabilities-parser.d.ts.map +1 -1
  134. package/dist/core/constraints/capabilities-parser.js +32 -28
  135. package/dist/core/constraints/capabilities-parser.js.map +1 -1
  136. package/dist/core/constraints/capabilities-reconcile.d.ts +67 -0
  137. package/dist/core/constraints/capabilities-reconcile.d.ts.map +1 -0
  138. package/dist/core/constraints/capabilities-reconcile.js +105 -0
  139. package/dist/core/constraints/capabilities-reconcile.js.map +1 -0
  140. package/dist/core/constraints/checker.d.ts +21 -43
  141. package/dist/core/constraints/checker.d.ts.map +1 -1
  142. package/dist/core/constraints/checker.js +64 -115
  143. package/dist/core/constraints/checker.js.map +1 -1
  144. package/dist/core/constraints/checkers/capability-sync.d.ts +4 -3
  145. package/dist/core/constraints/checkers/capability-sync.d.ts.map +1 -1
  146. package/dist/core/constraints/checkers/capability-sync.js +29 -69
  147. package/dist/core/constraints/checkers/capability-sync.js.map +1 -1
  148. package/dist/core/constraints/checkers/context-doc-sync.d.ts +4 -2
  149. package/dist/core/constraints/checkers/context-doc-sync.d.ts.map +1 -1
  150. package/dist/core/constraints/checkers/context-doc-sync.js +13 -22
  151. package/dist/core/constraints/checkers/context-doc-sync.js.map +1 -1
  152. package/dist/core/constraints/checkers/docs-freshness.d.ts.map +1 -1
  153. package/dist/core/constraints/checkers/docs-freshness.js +37 -63
  154. package/dist/core/constraints/checkers/docs-freshness.js.map +1 -1
  155. package/dist/core/constraints/checkers/governance-presence.d.ts +2 -2
  156. package/dist/core/constraints/checkers/governance-presence.d.ts.map +1 -1
  157. package/dist/core/constraints/checkers/governance-presence.js +7 -28
  158. package/dist/core/constraints/checkers/governance-presence.js.map +1 -1
  159. package/dist/core/constraints/checkers/no-test-simplification.d.ts.map +1 -1
  160. package/dist/core/constraints/checkers/no-test-simplification.js +4 -3
  161. package/dist/core/constraints/checkers/no-test-simplification.js.map +1 -1
  162. package/dist/core/constraints/checkers/types.d.ts +2 -2
  163. package/dist/core/constraints/context-builder.d.ts +15 -14
  164. package/dist/core/constraints/context-builder.d.ts.map +1 -1
  165. package/dist/core/constraints/context-builder.js +32 -96
  166. package/dist/core/constraints/context-builder.js.map +1 -1
  167. package/dist/core/constraints/doc-freshness/runner.d.ts.map +1 -1
  168. package/dist/core/constraints/doc-freshness/runner.js +2 -1
  169. package/dist/core/constraints/doc-freshness/runner.js.map +1 -1
  170. package/dist/core/constraints/git-evidence.d.ts +60 -0
  171. package/dist/core/constraints/git-evidence.d.ts.map +1 -0
  172. package/dist/core/constraints/git-evidence.js +88 -0
  173. package/dist/core/constraints/git-evidence.js.map +1 -0
  174. package/dist/core/constraints/injection-drift.d.ts +3 -20
  175. package/dist/core/constraints/injection-drift.d.ts.map +1 -1
  176. package/dist/core/constraints/injection-drift.js +10 -57
  177. package/dist/core/constraints/injection-drift.js.map +1 -1
  178. package/dist/core/constraints/injection-writer.d.ts +113 -0
  179. package/dist/core/constraints/injection-writer.d.ts.map +1 -0
  180. package/dist/core/constraints/injection-writer.js +228 -0
  181. package/dist/core/constraints/injection-writer.js.map +1 -0
  182. package/dist/core/constraints/usage-report.d.ts +22 -1
  183. package/dist/core/constraints/usage-report.d.ts.map +1 -1
  184. package/dist/core/constraints/usage-report.js +27 -20
  185. package/dist/core/constraints/usage-report.js.map +1 -1
  186. package/dist/core/index.d.ts +2 -2
  187. package/dist/core/index.d.ts.map +1 -1
  188. package/dist/core/index.js +4 -2
  189. package/dist/core/index.js.map +1 -1
  190. package/dist/core/project-config-loader.d.ts +32 -1
  191. package/dist/core/project-config-loader.d.ts.map +1 -1
  192. package/dist/core/project-config-loader.js +39 -9
  193. package/dist/core/project-config-loader.js.map +1 -1
  194. package/dist/core/validators/passes-gate.d.ts +15 -64
  195. package/dist/core/validators/passes-gate.d.ts.map +1 -1
  196. package/dist/core/validators/passes-gate.js +84 -222
  197. package/dist/core/validators/passes-gate.js.map +1 -1
  198. package/dist/core/validators/test-output.d.ts +58 -0
  199. package/dist/core/validators/test-output.d.ts.map +1 -0
  200. package/dist/core/validators/test-output.js +109 -0
  201. package/dist/core/validators/test-output.js.map +1 -0
  202. package/dist/failure/recorder.d.ts +6 -0
  203. package/dist/failure/recorder.d.ts.map +1 -1
  204. package/dist/failure/recorder.js +12 -8
  205. package/dist/failure/recorder.js.map +1 -1
  206. package/dist/gates/acceptance.d.ts +1 -48
  207. package/dist/gates/acceptance.d.ts.map +1 -1
  208. package/dist/gates/acceptance.js +6 -38
  209. package/dist/gates/acceptance.js.map +1 -1
  210. package/dist/gates/checker-gate.d.ts.map +1 -1
  211. package/dist/gates/checker-gate.js +6 -11
  212. package/dist/gates/checker-gate.js.map +1 -1
  213. package/dist/gates/command.d.ts.map +1 -1
  214. package/dist/gates/command.js +10 -22
  215. package/dist/gates/command.js.map +1 -1
  216. package/dist/gates/contract.d.ts.map +1 -1
  217. package/dist/gates/contract.js +22 -61
  218. package/dist/gates/contract.js.map +1 -1
  219. package/dist/gates/performance.d.ts.map +1 -1
  220. package/dist/gates/performance.js +13 -31
  221. package/dist/gates/performance.js.map +1 -1
  222. package/dist/gates/review.d.ts.map +1 -1
  223. package/dist/gates/review.js +21 -53
  224. package/dist/gates/review.js.map +1 -1
  225. package/dist/gates/security.d.ts.map +1 -1
  226. package/dist/gates/security.js +14 -32
  227. package/dist/gates/security.js.map +1 -1
  228. package/dist/gates/types.d.ts +28 -5
  229. package/dist/gates/types.d.ts.map +1 -1
  230. package/dist/gates/types.js +38 -1
  231. package/dist/gates/types.js.map +1 -1
  232. package/dist/hooks/bootstrap.d.ts +2 -0
  233. package/dist/hooks/bootstrap.d.ts.map +1 -1
  234. package/dist/hooks/bootstrap.js +5 -2
  235. package/dist/hooks/bootstrap.js.map +1 -1
  236. package/dist/index.d.ts +1 -2
  237. package/dist/index.d.ts.map +1 -1
  238. package/dist/index.js.map +1 -1
  239. package/dist/knowledge/audit.d.ts +7 -2
  240. package/dist/knowledge/audit.d.ts.map +1 -1
  241. package/dist/knowledge/audit.js +59 -79
  242. package/dist/knowledge/audit.js.map +1 -1
  243. package/dist/knowledge/flywheel-metrics.d.ts +39 -0
  244. package/dist/knowledge/flywheel-metrics.d.ts.map +1 -0
  245. package/dist/knowledge/flywheel-metrics.js +47 -0
  246. package/dist/knowledge/flywheel-metrics.js.map +1 -0
  247. package/dist/knowledge/import.d.ts.map +1 -1
  248. package/dist/knowledge/import.js +4 -14
  249. package/dist/knowledge/import.js.map +1 -1
  250. package/dist/knowledge/index-generator.d.ts.map +1 -1
  251. package/dist/knowledge/index-generator.js +17 -14
  252. package/dist/knowledge/index-generator.js.map +1 -1
  253. package/dist/knowledge/ingest.d.ts.map +1 -1
  254. package/dist/knowledge/ingest.js +9 -4
  255. package/dist/knowledge/ingest.js.map +1 -1
  256. package/dist/knowledge/migration.d.ts.map +1 -1
  257. package/dist/knowledge/migration.js +11 -8
  258. package/dist/knowledge/migration.js.map +1 -1
  259. package/dist/knowledge/reference-tracker.d.ts.map +1 -1
  260. package/dist/knowledge/reference-tracker.js +12 -9
  261. package/dist/knowledge/reference-tracker.js.map +1 -1
  262. package/dist/knowledge/store.d.ts +15 -0
  263. package/dist/knowledge/store.d.ts.map +1 -1
  264. package/dist/knowledge/store.js +59 -10
  265. package/dist/knowledge/store.js.map +1 -1
  266. package/dist/monitoring/context-tracker.d.ts.map +1 -1
  267. package/dist/monitoring/context-tracker.js +11 -20
  268. package/dist/monitoring/context-tracker.js.map +1 -1
  269. package/dist/monitoring/index.d.ts +1 -1
  270. package/dist/monitoring/index.d.ts.map +1 -1
  271. package/dist/monitoring/index.js +1 -2
  272. package/dist/monitoring/index.js.map +1 -1
  273. package/dist/monitoring/trace-analyzer.d.ts +15 -0
  274. package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
  275. package/dist/monitoring/trace-analyzer.js +19 -2
  276. package/dist/monitoring/trace-analyzer.js.map +1 -1
  277. package/dist/monitoring/traces.d.ts +21 -2
  278. package/dist/monitoring/traces.d.ts.map +1 -1
  279. package/dist/monitoring/traces.js +38 -29
  280. package/dist/monitoring/traces.js.map +1 -1
  281. package/dist/release/index.d.ts +2 -2
  282. package/dist/release/index.d.ts.map +1 -1
  283. package/dist/release/index.js +1 -5
  284. package/dist/release/index.js.map +1 -1
  285. package/dist/sdd/index-generator.js +10 -11
  286. package/dist/sdd/index-generator.js.map +1 -1
  287. package/dist/test-setup/project-fixture.d.ts +48 -0
  288. package/dist/test-setup/project-fixture.d.ts.map +1 -0
  289. package/dist/test-setup/project-fixture.js +106 -0
  290. package/dist/test-setup/project-fixture.js.map +1 -0
  291. package/dist/types/constraint.d.ts +0 -18
  292. package/dist/types/constraint.d.ts.map +1 -1
  293. package/dist/types/constraint.js.map +1 -1
  294. package/dist/types/passes-gate.d.ts +10 -25
  295. package/dist/types/passes-gate.d.ts.map +1 -1
  296. package/dist/types/project-config.d.ts +1 -1
  297. package/dist/types/session.d.ts +6 -5
  298. package/dist/types/session.d.ts.map +1 -1
  299. package/dist/utils/exec.d.ts +10 -0
  300. package/dist/utils/exec.d.ts.map +1 -1
  301. package/dist/utils/exec.js +12 -0
  302. package/dist/utils/exec.js.map +1 -1
  303. package/dist/utils/file-walk.d.ts +9 -1
  304. package/dist/utils/file-walk.d.ts.map +1 -1
  305. package/dist/utils/file-walk.js +10 -1
  306. package/dist/utils/file-walk.js.map +1 -1
  307. package/dist/utils/frontmatter.d.ts +73 -0
  308. package/dist/utils/frontmatter.d.ts.map +1 -0
  309. package/dist/utils/frontmatter.js +141 -0
  310. package/dist/utils/frontmatter.js.map +1 -0
  311. package/dist/utils/jsonl.d.ts +92 -0
  312. package/dist/utils/jsonl.d.ts.map +1 -0
  313. package/dist/utils/jsonl.js +166 -0
  314. package/dist/utils/jsonl.js.map +1 -0
  315. package/dist/utils/package-version.d.ts +16 -0
  316. package/dist/utils/package-version.d.ts.map +1 -0
  317. package/dist/utils/package-version.js +63 -0
  318. package/dist/utils/package-version.js.map +1 -0
  319. package/package.json +1 -1
  320. package/src/CONTEXT.md +7 -2
  321. package/src/__tests__/acceptance-gate.test.ts +3 -1
  322. package/src/__tests__/checker-extra.test.ts +7 -1218
  323. package/src/__tests__/context-files-resolution.test.ts +116 -0
  324. package/src/__tests__/effective-constraints.test.ts +10 -13
  325. package/src/__tests__/exec.test.ts +35 -1
  326. package/src/__tests__/layering.test.ts +152 -0
  327. package/src/__tests__/passes-gate-extra.test.ts +0 -145
  328. package/src/__tests__/passes-gate.test.ts +142 -106
  329. package/src/__tests__/skip-semantics.test.ts +5 -9
  330. package/src/cli/__tests__/command-contract.test.ts +170 -0
  331. package/src/cli/command-contract.ts +108 -0
  332. package/src/cli/commands/CONTEXT.md +22 -7
  333. package/src/cli/commands/__tests__/acceptance.test.ts +40 -33
  334. package/src/cli/commands/__tests__/analyze-sessions.test.ts +35 -29
  335. package/src/cli/commands/__tests__/bin-exit-mapping.test.ts +101 -0
  336. package/src/cli/commands/__tests__/check-drift.test.ts +27 -34
  337. package/src/cli/commands/__tests__/check-skip-output.test.ts +21 -24
  338. package/src/cli/commands/__tests__/check.test.ts +378 -382
  339. package/src/cli/commands/__tests__/command.test.ts +85 -70
  340. package/src/cli/commands/__tests__/constraints-report.test.ts +100 -71
  341. package/src/cli/commands/__tests__/constraints-retire.test.ts +152 -95
  342. package/src/cli/commands/__tests__/contract.test.ts +27 -34
  343. package/src/cli/commands/__tests__/failure.test.ts +31 -34
  344. package/src/cli/commands/__tests__/init-injection.test.ts +58 -28
  345. package/src/cli/commands/__tests__/init.test.ts +77 -48
  346. package/src/cli/commands/__tests__/knowledge-flywheel-consistency.test.ts +108 -0
  347. package/src/cli/commands/__tests__/knowledge.test.ts +69 -43
  348. package/src/cli/commands/__tests__/passes-gate.test.ts +43 -45
  349. package/src/cli/commands/__tests__/performance.test.ts +22 -23
  350. package/src/cli/commands/__tests__/posteval-plan.test.ts +39 -38
  351. package/src/cli/commands/__tests__/project-path-anchoring.test.ts +157 -0
  352. package/src/cli/commands/__tests__/project-path-convention.test.ts +169 -0
  353. package/src/cli/commands/__tests__/registry.test.ts +69 -35
  354. package/src/cli/commands/__tests__/release.test.ts +209 -80
  355. package/src/cli/commands/__tests__/report-extra.test.ts +16 -16
  356. package/src/cli/commands/__tests__/report.test.ts +25 -25
  357. package/src/cli/commands/__tests__/review.test.ts +33 -31
  358. package/src/cli/commands/__tests__/security.test.ts +23 -27
  359. package/src/cli/commands/__tests__/spec-baseline-check.test.ts +20 -20
  360. package/src/cli/commands/__tests__/spec.test.ts +41 -29
  361. package/src/cli/commands/__tests__/status-extra.test.ts +18 -18
  362. package/src/cli/commands/__tests__/status-skipped-lines.test.ts +72 -0
  363. package/src/cli/commands/__tests__/status.test.ts +34 -34
  364. package/src/cli/commands/__tests__/sync-docs-agents.test.ts +77 -78
  365. package/src/cli/commands/__tests__/sync-docs.test.ts +72 -74
  366. package/src/cli/commands/__tests__/update-user-model.test.ts +62 -33
  367. package/src/cli/commands/__tests__/validate.test.ts +27 -29
  368. package/src/cli/commands/acceptance.ts +35 -24
  369. package/src/cli/commands/analyze-sessions.ts +25 -24
  370. package/src/cli/commands/check.ts +88 -65
  371. package/src/cli/commands/command.ts +30 -17
  372. package/src/cli/commands/constraints-report.ts +37 -34
  373. package/src/cli/commands/constraints-retire.ts +58 -55
  374. package/src/cli/commands/constraints.ts +10 -27
  375. package/src/cli/commands/contract.ts +51 -42
  376. package/src/cli/commands/definitions.ts +36 -222
  377. package/src/cli/commands/failure.ts +33 -26
  378. package/src/cli/commands/init.ts +166 -220
  379. package/src/cli/commands/knowledge.ts +225 -203
  380. package/src/cli/commands/passes-gate.ts +58 -68
  381. package/src/cli/commands/performance.ts +23 -18
  382. package/src/cli/commands/posteval-plan.ts +29 -15
  383. package/src/cli/commands/release.ts +70 -59
  384. package/src/cli/commands/report.ts +9 -5
  385. package/src/cli/commands/review.ts +39 -29
  386. package/src/cli/commands/sdd.ts +7 -5
  387. package/src/cli/commands/security.ts +35 -26
  388. package/src/cli/commands/spec-baseline-check.ts +16 -11
  389. package/src/cli/commands/spec.ts +66 -53
  390. package/src/cli/commands/status.ts +59 -53
  391. package/src/cli/commands/sync-docs/agents-syncer.ts +5 -2
  392. package/src/cli/commands/sync-docs/context-syncer.ts +3 -2
  393. package/src/cli/commands/sync-docs/index.ts +73 -100
  394. package/src/cli/commands/sync-docs/project-reader.ts +17 -18
  395. package/src/cli/commands/update-user-model.ts +33 -45
  396. package/src/cli/commands/validate.ts +31 -25
  397. package/src/cli/session-mining/__tests__/transcript.test.ts +118 -0
  398. package/src/cli/session-mining/transcript.ts +26 -8
  399. package/src/context/session-manager.ts +19 -33
  400. package/src/core/CONTEXT.md +9 -6
  401. package/src/core/constraints/__tests__/capabilities-reconcile.test.ts +200 -0
  402. package/src/core/constraints/__tests__/capability-counts.test.ts +94 -0
  403. package/src/core/constraints/__tests__/git-evidence.test.ts +208 -0
  404. package/src/core/constraints/__tests__/injection-drift.test.ts +3 -10
  405. package/src/core/constraints/__tests__/injection-writer.test.ts +231 -0
  406. package/src/core/constraints/__tests__/trace-injection.test.ts +71 -0
  407. package/src/core/constraints/__tests__/usage-report.test.ts +112 -0
  408. package/src/core/constraints/agent-prompt-renderer.ts +2 -6
  409. package/src/core/constraints/capabilities-parser.ts +53 -35
  410. package/src/core/constraints/capabilities-reconcile.ts +166 -0
  411. package/src/core/constraints/checker.ts +75 -130
  412. package/src/core/constraints/checkers/__tests__/capability-sync.test.ts +214 -0
  413. package/src/core/constraints/checkers/__tests__/context-doc-sync.test.ts +77 -0
  414. package/src/core/constraints/checkers/__tests__/docs-freshness.test.ts +117 -0
  415. package/src/{__tests__ → core/constraints/checkers/__tests__}/governance-presence.test.ts +83 -9
  416. package/src/core/constraints/checkers/__tests__/iron-flags.test.ts +50 -0
  417. package/src/core/constraints/checkers/__tests__/no-bypass-checkpoint.test.ts +76 -0
  418. package/src/{__tests__ → core/constraints/checkers/__tests__}/no-hardcoded-credentials.test.ts +4 -3
  419. package/src/core/constraints/checkers/__tests__/no-test-simplification.test.ts +58 -0
  420. package/src/core/constraints/checkers/__tests__/three-state-consistency.test.ts +145 -0
  421. package/src/core/constraints/checkers/capability-sync.ts +29 -88
  422. package/src/core/constraints/checkers/context-doc-sync.ts +15 -25
  423. package/src/core/constraints/checkers/docs-freshness.ts +40 -69
  424. package/src/core/constraints/checkers/governance-presence.ts +7 -25
  425. package/src/core/constraints/checkers/no-test-simplification.ts +4 -3
  426. package/src/core/constraints/checkers/types.ts +2 -2
  427. package/src/core/constraints/context-builder.ts +39 -91
  428. package/src/core/constraints/doc-freshness/runner.ts +2 -1
  429. package/src/core/constraints/git-evidence.ts +120 -0
  430. package/src/core/constraints/injection-drift.ts +13 -60
  431. package/src/core/constraints/injection-writer.ts +212 -0
  432. package/src/core/constraints/usage-report.ts +36 -17
  433. package/src/core/index.ts +4 -2
  434. package/src/core/project-config-loader.ts +49 -9
  435. package/src/core/validators/__tests__/passes-gate.test.ts +2 -56
  436. package/src/core/validators/__tests__/test-output.test.ts +372 -0
  437. package/src/core/validators/passes-gate.ts +86 -248
  438. package/src/core/validators/test-output.ts +128 -0
  439. package/src/failure/__tests__/recorder.test.ts +168 -0
  440. package/src/failure/recorder.ts +12 -10
  441. package/src/gates/CONTEXT.md +6 -3
  442. package/src/gates/__tests__/acceptance-types-single-source.test.ts +68 -0
  443. package/src/gates/__tests__/acceptance.test.ts +4 -86
  444. package/src/gates/__tests__/effective-gates.test.ts +3 -8
  445. package/src/gates/__tests__/test-verdict-consistency.test.ts +140 -0
  446. package/src/gates/acceptance.ts +19 -84
  447. package/src/gates/checker-gate.ts +8 -7
  448. package/src/gates/command.ts +10 -16
  449. package/src/gates/contract.ts +22 -61
  450. package/src/gates/performance.ts +10 -22
  451. package/src/gates/review.ts +21 -41
  452. package/src/gates/security.ts +10 -22
  453. package/src/gates/types.ts +70 -5
  454. package/src/hooks/CONTEXT.md +1 -1
  455. package/src/hooks/bootstrap.ts +5 -2
  456. package/src/index.ts +0 -4
  457. package/src/knowledge/CONTEXT.md +8 -3
  458. package/src/knowledge/__tests__/audit-labels.test.ts +44 -0
  459. package/src/knowledge/__tests__/flywheel-metrics.test.ts +135 -0
  460. package/src/knowledge/__tests__/import.test.ts +44 -0
  461. package/src/knowledge/__tests__/index-generator.test.ts +53 -0
  462. package/src/knowledge/__tests__/ingest.test.ts +85 -0
  463. package/src/knowledge/__tests__/migration.test.ts +47 -0
  464. package/src/knowledge/__tests__/reference-tracker.test.ts +16 -0
  465. package/src/knowledge/__tests__/store.test.ts +194 -0
  466. package/src/knowledge/audit.ts +67 -71
  467. package/src/knowledge/flywheel-metrics.ts +71 -0
  468. package/src/knowledge/import.ts +4 -18
  469. package/src/knowledge/index-generator.ts +19 -14
  470. package/src/knowledge/ingest.ts +9 -4
  471. package/src/knowledge/migration.ts +11 -8
  472. package/src/knowledge/reference-tracker.ts +12 -8
  473. package/src/knowledge/store.ts +64 -11
  474. package/src/monitoring/CONTEXT.md +8 -3
  475. package/src/monitoring/__tests__/skipped-lines-report.test.ts +178 -0
  476. package/src/monitoring/__tests__/traces.test.ts +57 -0
  477. package/src/monitoring/context-tracker.ts +11 -23
  478. package/src/monitoring/index.ts +1 -1
  479. package/src/monitoring/trace-analyzer.ts +21 -2
  480. package/src/monitoring/traces.ts +39 -36
  481. package/src/release/CONTEXT.md +1 -0
  482. package/src/release/__tests__/barrel.test.ts +60 -0
  483. package/src/release/index.ts +2 -13
  484. package/src/sdd/__tests__/index-generator.test.ts +71 -0
  485. package/src/sdd/index-generator.ts +9 -9
  486. package/src/test-setup/__tests__/project-fixture.test.ts +178 -0
  487. package/src/test-setup/project-fixture.ts +87 -0
  488. package/src/tools/CONTEXT.md +6 -0
  489. package/src/tools/__tests__/registry.test.ts +221 -0
  490. package/src/types/__tests__/types.test.ts +4 -5
  491. package/src/types/constraint.ts +0 -25
  492. package/src/types/passes-gate.ts +10 -30
  493. package/src/types/project-config.ts +1 -1
  494. package/src/types/session.ts +5 -5
  495. package/src/utils/__tests__/frontmatter.test.ts +206 -0
  496. package/src/utils/__tests__/jsonl-skip-disposition.test.ts +175 -0
  497. package/src/utils/__tests__/jsonl.test.ts +187 -0
  498. package/src/utils/__tests__/package-version.test.ts +97 -0
  499. package/src/utils/exec.ts +15 -0
  500. package/src/utils/file-walk.ts +11 -2
  501. package/src/utils/frontmatter.ts +121 -0
  502. package/src/utils/jsonl.ts +167 -0
  503. package/src/utils/package-version.ts +27 -0
  504. package/dist/cli/commands/doc-freshness-check.d.ts +0 -53
  505. package/dist/cli/commands/doc-freshness-check.d.ts.map +0 -1
  506. package/dist/cli/commands/doc-freshness-check.js +0 -352
  507. package/dist/cli/commands/doc-freshness-check.js.map +0 -1
  508. package/dist/types/index.d.ts +0 -14
  509. package/dist/types/index.d.ts.map +0 -1
  510. package/dist/types/index.js +0 -39
  511. package/dist/types/index.js.map +0 -1
  512. package/src/__tests__/long-running.test.ts +0 -17
  513. package/src/__tests__/passes-gate-extension.test.ts +0 -151
  514. package/src/cli/commands/__tests__/doc-freshness-check.test.ts +0 -168
  515. package/src/cli/commands/doc-freshness-check.ts +0 -386
  516. package/src/spec/CONTEXT.md +0 -11
  517. package/src/types/index.ts +0 -47
@@ -0,0 +1,228 @@
1
+ "use strict";
2
+ /**
3
+ * 治理注入段落点写入器(架构评审候选1,ADR-0011)
4
+ *
5
+ * 「按渲染 body 替换标记区间 + 尾换行规一」的切片数学此前手抄 4 份
6
+ * (init.ts 三个 writer / constraints-retire 一份),落点路由读写两侧各抄一份。
7
+ * 本模块是唯一 writer:init/retire 退化为「渲染 body + 调 writer」。
8
+ *
9
+ * 形状两种(排版约定不同,非"算哪些"的差异,故合法分叉):
10
+ * - replaceStandaloneRange:区间独立成节,END 标记后折叠为恰好一个空行
11
+ * (CLAUDE.md 约束段 / Output Style 段 / retire 注入段同步)
12
+ * - replaceEnclosedRange:区间后紧跟外层收口标记(AGENTS.md PRESERVE 段内
13
+ * 的 HARNESS_CONSTRAINTS 区间)——恰好剥一个换行,手写余文原样落回
14
+ *
15
+ * 半标记守护:单边缺失或顺序颠倒 → 'half',拒写(旧实现此时或追加出双份
16
+ * 正本或产生乱序切片,属二次损坏路径,收紧为告警交人工,见 ADR-0011)。
17
+ *
18
+ * 落点路由同规则一份:
19
+ * - resolveInjectionTarget:读侧(漂移检测/retire 同步)——CLAUDE.md 有完整
20
+ * 标记段优先(旧模型仓豁免),否则 AGENTS.md(新模型仓住 PRESERVE 段内)
21
+ * - resolveGovernanceLanding:写侧(init 落点选择)——额外承认 CLAUDE.md
22
+ * 无标记的 `## Governance Rules` 旧块(续写不制造双份正本)
23
+ *
24
+ * 探测/判定同住本模块(#83,ADR-0011 补注:收口范围含探测器,不只写器)——
25
+ * 「这份文档里有没有治理契约 / 有几个正本标题」此前手抄 4 份且正则已漂移,
26
+ * 见文末 GOVERNANCE_HEADING / hasGovernanceContract / countGovernanceHeadings /
27
+ * hasPreserveBlock。
28
+ */
29
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
30
+ if (k2 === undefined) k2 = k;
31
+ var desc = Object.getOwnPropertyDescriptor(m, k);
32
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
33
+ desc = { enumerable: true, get: function() { return m[k]; } };
34
+ }
35
+ Object.defineProperty(o, k2, desc);
36
+ }) : (function(o, m, k, k2) {
37
+ if (k2 === undefined) k2 = k;
38
+ o[k2] = m[k];
39
+ }));
40
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
41
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
42
+ }) : function(o, v) {
43
+ o["default"] = v;
44
+ });
45
+ var __importStar = (this && this.__importStar) || (function () {
46
+ var ownKeys = function(o) {
47
+ ownKeys = Object.getOwnPropertyNames || function (o) {
48
+ var ar = [];
49
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
50
+ return ar;
51
+ };
52
+ return ownKeys(o);
53
+ };
54
+ return function (mod) {
55
+ if (mod && mod.__esModule) return mod;
56
+ var result = {};
57
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
58
+ __setModuleDefault(result, mod);
59
+ return result;
60
+ };
61
+ })();
62
+ Object.defineProperty(exports, "__esModule", { value: true });
63
+ exports.GOVERNANCE_HEADING = exports.INJECTION_FILES = void 0;
64
+ exports.readIfExists = readIfExists;
65
+ exports.cutMarkerBlock = cutMarkerBlock;
66
+ exports.replaceStandaloneRange = replaceStandaloneRange;
67
+ exports.replaceEnclosedRange = replaceEnclosedRange;
68
+ exports.resolveInjectionTarget = resolveInjectionTarget;
69
+ exports.resolveGovernanceLanding = resolveGovernanceLanding;
70
+ exports.hasGovernanceContract = hasGovernanceContract;
71
+ exports.countGovernanceHeadings = countGovernanceHeadings;
72
+ exports.hasPreserveBlock = hasPreserveBlock;
73
+ const fs = __importStar(require("fs"));
74
+ const path = __importStar(require("path"));
75
+ const injection_renderer_1 = require("./injection-renderer");
76
+ /** 注入段落点文件名(检测顺序即路由优先级:旧模型仓 CLAUDE.md 优先) */
77
+ exports.INJECTION_FILES = ['CLAUDE.md', 'AGENTS.md'];
78
+ function readIfExists(filePath) {
79
+ try {
80
+ const content = fs.readFileSync(filePath, 'utf-8');
81
+ return typeof content === 'string' ? content : null;
82
+ }
83
+ catch {
84
+ return null;
85
+ }
86
+ }
87
+ /** 定位完整标记对:两标记俱在且顺序正确 */
88
+ function findPair(content, begin, end) {
89
+ const startIdx = content.indexOf(begin);
90
+ const endIdx = content.indexOf(end);
91
+ if (startIdx === -1 && endIdx === -1)
92
+ return 'absent';
93
+ if (startIdx === -1 || endIdx === -1 || endIdx < startIdx)
94
+ return 'half';
95
+ return { startIdx, endIdx };
96
+ }
97
+ /**
98
+ * 切出完整标记块(before + begin + inner + end + after)。
99
+ * 'absent' = 两俱无;'half' = 残缺/乱序,拒切。
100
+ */
101
+ function cutMarkerBlock(content, begin, end) {
102
+ const pair = findPair(content, begin, end);
103
+ if (pair === 'absent' || pair === 'half')
104
+ return pair;
105
+ return {
106
+ before: content.slice(0, pair.startIdx),
107
+ inner: content.slice(pair.startIdx + begin.length, pair.endIdx),
108
+ after: content.slice(pair.endIdx + end.length),
109
+ };
110
+ }
111
+ /**
112
+ * 替换独立成节的标记区间:body 为含首尾标记的完整替换文本(以换行结尾),
113
+ * 区间后文剥除全部前导换行、以恰好一个空行相接(幂等:重复替换结果稳定)。
114
+ */
115
+ function replaceStandaloneRange(content, begin, end, body) {
116
+ const pair = findPair(content, begin, end);
117
+ if (pair === 'absent' || pair === 'half')
118
+ return { kind: pair };
119
+ const after = content.slice(pair.endIdx + end.length).replace(/^\n+/, '');
120
+ return {
121
+ kind: 'updated',
122
+ content: content.slice(0, pair.startIdx) + body + (after ? '\n' + after : ''),
123
+ };
124
+ }
125
+ /**
126
+ * 替换后跟外层收口标记的区间:body 含首尾标记且以换行结尾(收口标记落自己行),
127
+ * 区间后文恰好剥一个换行(外层标记拼接位),其余手写余文原样保留。
128
+ */
129
+ function replaceEnclosedRange(content, begin, end, body) {
130
+ const pair = findPair(content, begin, end);
131
+ if (pair === 'absent' || pair === 'half')
132
+ return { kind: pair };
133
+ const tail = content.slice(pair.endIdx + end.length).replace(/^\n/, '');
134
+ return {
135
+ kind: 'updated',
136
+ content: content.slice(0, pair.startIdx) + body + tail,
137
+ };
138
+ }
139
+ /**
140
+ * 读侧路由:定位含完整 HARNESS_CONSTRAINTS 标记段的文件(studio #307)。
141
+ * detectInjectionDrift 与 retire 注入段同步共用。
142
+ */
143
+ function resolveInjectionTarget(projectRoot) {
144
+ for (const file of exports.INJECTION_FILES) {
145
+ const content = readIfExists(path.join(projectRoot, file));
146
+ if (content === null)
147
+ continue;
148
+ const startIdx = content.indexOf(injection_renderer_1.CONSTRAINTS_START_MARKER);
149
+ const endIdx = content.indexOf(injection_renderer_1.CONSTRAINTS_END_MARKER);
150
+ if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
151
+ return { file, content, startIdx, endIdx };
152
+ }
153
+ }
154
+ return null;
155
+ }
156
+ /**
157
+ * 写侧路由(init 落点选择,原 setupGovernanceConstraints 内联判定收于此):
158
+ * CLAUDE.md 有约束标记段或有旧版 `## Governance Rules` 块 → 续写 CLAUDE.md
159
+ * (旧模型仓豁免,不制造双份正本);否则 AGENTS.md PRESERVE:governance。
160
+ */
161
+ function resolveGovernanceLanding(projectRoot) {
162
+ const claudeContent = readIfExists(path.join(projectRoot, 'CLAUDE.md'));
163
+ if (claudeContent !== null && hasGovernanceContract(claudeContent)) {
164
+ return { target: 'claude-md', claudeContent };
165
+ }
166
+ return { target: 'agents-md', claudeContent };
167
+ }
168
+ /**
169
+ * 治理正本标题字面量(单一来源,#83):init 的标题写点与下列两个判定谓词
170
+ * 都由它派生,仓内不再本地拼写。字面量无正则元字符,可直接拼入 RegExp。
171
+ *
172
+ * 两谓词回答两个问题,**共享字面量而非共享正则**(triage 裁决 2026-09-02):
173
+ * 强行合一要么在场守护 fail-open 失效(取严格),要么重复计数引入无行尾
174
+ * 锚定的误报(取宽松)。
175
+ */
176
+ exports.GOVERNANCE_HEADING = '## Governance Rules';
177
+ /** 标题文本(去 `## ` 前缀),宽松谓词按 `##` + 任意空白 + 此文本匹配 */
178
+ const GOVERNANCE_HEADING_TEXT = exports.GOVERNANCE_HEADING.replace(/^##\s+/, '');
179
+ /** 宽松标题正则:容忍 `## Governance Rules` 双空格等排版漂移 */
180
+ const GOVERNANCE_HEADING_LOOSE_RE = new RegExp(`^##\\s+${GOVERNANCE_HEADING_TEXT}`, 'm');
181
+ /** 严格标题正则:精确拼写 + 行尾锚定(行尾仅容忍空白) */
182
+ const GOVERNANCE_HEADING_STRICT_RE = new RegExp(`^${exports.GOVERNANCE_HEADING}[ \\t]*$`, 'gm');
183
+ /** 约束标记裸文本(去注释壳),宽松谓词按「标记文本在场」判定,容忍壳残缺 */
184
+ const CONSTRAINTS_START_TEXT = injection_renderer_1.CONSTRAINTS_START_MARKER.replace(/^<!--\s*|\s*-->$/g, '');
185
+ /**
186
+ * 宽松谓词:内容里是否有治理契约在场——标题宽松匹配或 HARNESS 约束标记
187
+ * 文本在场即算。fail-open 偏向:排版漂移宁可信其有,漏报「约束正本静默
188
+ * 丢失」的代价高于误报。消费方:governance_presence / sync-docs 治理计数 /
189
+ * init 落点路由(#83)。
190
+ */
191
+ function hasGovernanceContract(content) {
192
+ return GOVERNANCE_HEADING_LOOSE_RE.test(content) || content.includes(CONSTRAINTS_START_TEXT);
193
+ }
194
+ /**
195
+ * 严格计数:全文统计治理标题数(精确拼写 + 行尾锚定),drift 重复章节
196
+ * 检测专用。宽松变体(如双空格)不计入——在场判定与正本计数是两个问题,
197
+ * 见 GOVERNANCE_HEADING。
198
+ */
199
+ function countGovernanceHeadings(content) {
200
+ return (content.match(GOVERNANCE_HEADING_STRICT_RE) ?? []).length;
201
+ }
202
+ /**
203
+ * PRESERVE 标记块存在性判定:块存在且块体非空(governance_presence 在场
204
+ * 守护消费,#83 收编其手写切片)。标记契约与 sync-docs/preserve-block 一致:
205
+ * 首尾标记均须独占一行——开始标记行首锚定(行尾仅空白),结束标记行 trim
206
+ * 后等于标记文本。结束标记嵌在行中 / 缺失 / 乱序均为畸形块 → false,在场
207
+ * 守护按契约丢失报警(原 presence「行中结束标记也算在场」显式收紧,#83)。
208
+ * name 仅允许字母/数字/下划线/连字符(PRESERVE 命名约定,调用方传常量段名)。
209
+ */
210
+ function hasPreserveBlock(content, name) {
211
+ const beginMarker = `<!-- PRESERVE:${name} -->`;
212
+ const endMarker = `<!-- /PRESERVE:${name} -->`;
213
+ const lines = content.split('\n');
214
+ const begin = lines.findIndex(line => line.trimEnd() === beginMarker);
215
+ if (begin === -1)
216
+ return false;
217
+ let end = -1;
218
+ for (let j = begin + 1; j < lines.length; j++) {
219
+ if (lines[j].trim() === endMarker) {
220
+ end = j;
221
+ break;
222
+ }
223
+ }
224
+ if (end === -1)
225
+ return false;
226
+ return lines.slice(begin + 1, end).join('\n').trim().length > 0;
227
+ }
228
+ //# sourceMappingURL=injection-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injection-writer.js","sourceRoot":"","sources":["../../../src/core/constraints/injection-writer.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,8 @@ export interface RetireCandidate {
45
45
  /** 人类可读的诊断说明(带证据数字) */
46
46
  reason: string;
47
47
  }
48
+ /** 候选种类的呈现名(constraints report / retire 共用) */
49
+ export declare const CANDIDATE_KIND_LABEL: Record<RetireCandidateKind, string>;
48
50
  /**
49
51
  * 候选诊断阈值(CLI 可覆盖)
50
52
  */
@@ -71,9 +73,28 @@ export interface ConstraintsUsageReport {
71
73
  lint: EffectiveConfigLint;
72
74
  /** trace 文件是否存在 */
73
75
  traceFileExists: boolean;
76
+ /**
77
+ * trace 文件被跳过的坏行数(harness#100,与 `traceFileExists` 同一降级维度)
78
+ *
79
+ * 恒有值,0 = 无损坏。文件级口径:坏行没有 timestamp,归不进任何统计窗口。
80
+ */
81
+ skippedLines: number;
74
82
  }
75
83
  /**
76
- * 读取项目 traces.log(只读,容错:坏行跳过)
84
+ * 读取项目 traces.log 并带出坏行计数(只读,harness#100 报告入口)
85
+ *
86
+ * 坏行策略:skip(原语义不变——report 只读,不因单行损坏失败);
87
+ * 计数去向:透传——`skippedLines` 随本方法返回,进 `ConstraintsUsageReport.skippedLines`,
88
+ * 消费面为 `constraints report` 的文本行 / `--json` 字段 / `--export` 摘要。
89
+ */
90
+ export declare function readProjectTracesReport(projectRoot: string): {
91
+ traces: ExecutionTrace[];
92
+ skippedLines: number;
93
+ };
94
+ /**
95
+ * 读取项目 traces.log(只读)
96
+ *
97
+ * 兼容签名:只返回记录数组、丢坏行计数,需要计数的消费方走 `readProjectTracesReport()`。
77
98
  */
78
99
  export declare function readProjectTraces(projectRoot: string): ExecutionTrace[];
79
100
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"usage-report.d.ts","sourceRoot":"","sources":["../../../src/core/constraints/usage-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE;;;GAGG;AACH,eAAO,MAAM,4BAA4B,EAAE,WAAW,CAAC,MAAM,CAI3D,CAAC;AAEH;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAE3B,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IAEb,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAElB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IAEjB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAC3B,cAAc,GACd,aAAa,GACb,YAAY,GACZ,gBAAgB,CAAC;AAErB,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,oBAAoB,CAAC;IAC5B,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,0BAA0B;IAC1B,yBAAyB,EAAE,MAAM,CAAC;IAClC,kCAAkC;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,eAAO,MAAM,2BAA2B,EAAE,kBAIzC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,gDAAgD;IAChD,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,4EAA4E;IAC5E,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,+BAA+B;IAC/B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,2BAA2B;IAC3B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,mBAAmB;IACnB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CAgBvE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,cAAc,EAAE,GACvB,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC,CAAC,CAgBpF;AAmBD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,oBAAoB,EAAE,EAC7B,UAAU,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAC3C,eAAe,EAAE,CAiDnB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,GAAE,MAAsB,EACnC,UAAU,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAC3C,sBAAsB,CAoBxB"}
1
+ {"version":3,"file":"usage-report.d.ts","sourceRoot":"","sources":["../../../src/core/constraints/usage-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE;;;GAGG;AACH,eAAO,MAAM,4BAA4B,EAAE,WAAW,CAAC,MAAM,CAI3D,CAAC;AAEH;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAE3B,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IAEb,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAElB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IAEjB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAC3B,cAAc,GACd,aAAa,GACb,YAAY,GACZ,gBAAgB,CAAC;AAErB,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,oBAAoB,CAAC;IAC5B,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,+CAA+C;AAC/C,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAKpE,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,0BAA0B;IAC1B,yBAAyB,EAAE,MAAM,CAAC;IAClC,kCAAkC;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,eAAO,MAAM,2BAA2B,EAAE,kBAIzC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,gDAAgD;IAChD,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,4EAA4E;IAC5E,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,+BAA+B;IAC/B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,2BAA2B;IAC3B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,mBAAmB;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAM/G;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CAEvE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,cAAc,EAAE,GACvB,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC,CAAC,CAgBpF;AAmBD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,oBAAoB,EAAE,EAC7B,UAAU,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAC3C,eAAe,EAAE,CAiDnB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,GAAE,MAAsB,EACnC,UAAU,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAC3C,sBAAsB,CAqBxB"}
@@ -42,7 +42,8 @@ var __importStar = (this && this.__importStar) || (function () {
42
42
  };
43
43
  })();
44
44
  Object.defineProperty(exports, "__esModule", { value: true });
45
- exports.DEFAULT_DIAGNOSE_THRESHOLDS = exports.FLAG_EVIDENCE_CONSTRAINT_IDS = void 0;
45
+ exports.DEFAULT_DIAGNOSE_THRESHOLDS = exports.CANDIDATE_KIND_LABEL = exports.FLAG_EVIDENCE_CONSTRAINT_IDS = void 0;
46
+ exports.readProjectTracesReport = readProjectTracesReport;
46
47
  exports.readProjectTraces = readProjectTraces;
47
48
  exports.collectUsageByConstraint = collectUsageByConstraint;
48
49
  exports.diagnoseRetireCandidates = diagnoseRetireCandidates;
@@ -50,6 +51,7 @@ exports.buildConstraintsUsageReport = buildConstraintsUsageReport;
50
51
  const fs = __importStar(require("fs"));
51
52
  const path = __importStar(require("path"));
52
53
  const trace_1 = require("../../types/trace");
54
+ const jsonl_1 = require("../../utils/jsonl");
53
55
  const effective_constraints_1 = require("../effective-constraints");
54
56
  /**
55
57
  * flag 型 check 约束(证据来自 ConstraintContext flag,见 checkers/iron-flags.ts)。
@@ -60,32 +62,36 @@ exports.FLAG_EVIDENCE_CONSTRAINT_IDS = new Set([
60
62
  'incremental_progress',
61
63
  'no_implementation_without_requirement',
62
64
  ]);
65
+ /** 候选种类的呈现名(constraints report / retire 共用) */
66
+ exports.CANDIDATE_KIND_LABEL = {
67
+ zero_trigger: '零触发',
68
+ unevaluable: '不可评估',
69
+ high_noise: '高噪',
70
+ zero_intercept: '零拦截',
71
+ };
63
72
  exports.DEFAULT_DIAGNOSE_THRESHOLDS = {
64
73
  zeroInterceptMinEvaluated: 50,
65
74
  highNoiseFailRate: 0.8,
66
75
  highNoiseMinEvaluated: 20,
67
76
  };
68
77
  /**
69
- * 读取项目 traces.log(只读,容错:坏行跳过)
78
+ * 读取项目 traces.log 并带出坏行计数(只读,harness#100 报告入口)
79
+ *
80
+ * 坏行策略:skip(原语义不变——report 只读,不因单行损坏失败);
81
+ * 计数去向:透传——`skippedLines` 随本方法返回,进 `ConstraintsUsageReport.skippedLines`,
82
+ * 消费面为 `constraints report` 的文本行 / `--json` 字段 / `--export` 摘要。
83
+ */
84
+ function readProjectTracesReport(projectRoot) {
85
+ const { records, skippedLines } = (0, jsonl_1.readJsonl)(path.join(projectRoot, trace_1.DEFAULT_TRACE_FILE), 'skip');
86
+ return { traces: records, skippedLines };
87
+ }
88
+ /**
89
+ * 读取项目 traces.log(只读)
90
+ *
91
+ * 兼容签名:只返回记录数组、丢坏行计数,需要计数的消费方走 `readProjectTracesReport()`。
70
92
  */
71
93
  function readProjectTraces(projectRoot) {
72
- const tracePath = path.join(projectRoot, trace_1.DEFAULT_TRACE_FILE);
73
- if (!fs.existsSync(tracePath))
74
- return [];
75
- const content = fs.readFileSync(tracePath, 'utf-8');
76
- const traces = [];
77
- for (const line of content.split('\n')) {
78
- const trimmed = line.trim();
79
- if (!trimmed)
80
- continue;
81
- try {
82
- traces.push(JSON.parse(trimmed));
83
- }
84
- catch {
85
- // 坏行跳过(report 只读,不因单行损坏失败)
86
- }
87
- }
88
- return traces;
94
+ return readProjectTracesReport(projectRoot).traces;
89
95
  }
90
96
  /**
91
97
  * 按约束聚合 trace 统计(Map: constraintId → 计数)
@@ -187,7 +193,7 @@ function buildConstraintsUsageReport(projectRoot = process.cwd(), thresholds = {
187
193
  const checkConstraints = effective.filter(c => c.kind === 'check');
188
194
  const activePromptIds = effective.filter(c => c.kind === 'prompt').map(c => c.id);
189
195
  const tracePath = path.join(projectRoot, trace_1.DEFAULT_TRACE_FILE);
190
- const traces = readProjectTraces(projectRoot);
196
+ const { traces, skippedLines } = readProjectTracesReport(projectRoot);
191
197
  const usage = collectUsageByConstraint(traces);
192
198
  const stats = checkConstraints.map(c => toStats(c.id, c.level, usage.get(c.id)));
193
199
  const candidates = diagnoseRetireCandidates(stats, thresholds);
@@ -198,6 +204,7 @@ function buildConstraintsUsageReport(projectRoot = process.cwd(), thresholds = {
198
204
  activePromptIds,
199
205
  lint,
200
206
  traceFileExists: fs.existsSync(tracePath),
207
+ skippedLines,
201
208
  };
202
209
  }
203
210
  //# sourceMappingURL=usage-report.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usage-report.js","sourceRoot":"","sources":["../../../src/core/constraints/usage-report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usage-report.js","sourceRoot":"","sources":["../../../src/core/constraints/usage-report.ts"],"names":[],"mappings":"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"}
@@ -11,8 +11,8 @@ export type { CSOValidationResult, CSOIssue, Checkpoint, CheckpointCheck, Checkp
11
11
  export { SessionStartup, createSessionStartup, DEFAULT_CODE_CHECKPOINTS, MINIMAL_CHECKPOINTS, CleanStateManager, createCleanStateManager, } from './session';
12
12
  export { SpecValidator } from './spec/validator';
13
13
  export type { SpecValidatorConfig, SpecValidationResult, BatchSpecValidationResult, SpecSchemaDefinition, SpecType, } from '../types/spec';
14
- export { ProjectConfigLoader, loadRawProjectConfig, getCapabilitiesMode, } from './project-config-loader';
15
- export type { CapabilitiesMode } from './project-config-loader';
14
+ export { ProjectConfigLoader, loadRawProjectConfig, getGovernanceConfig, resolveContextFiles, getCapabilitiesMode, } from './project-config-loader';
15
+ export type { CapabilitiesMode, ContextFilesResolution } from './project-config-loader';
16
16
  export { getEffectiveConstraints, lintEffectiveConfig, } from './effective-constraints';
17
17
  export type { EffectiveConfigLint } from './effective-constraints';
18
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,SAAS,EACT,UAAU,EACV,OAAO,EACP,iBAAiB,EACjB,wBAAwB,EACxB,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,UAAU,EACV,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,uBAAuB,EACvB,gBAAgB,EAChB,mBAAmB,EACnB,iCAAiC,EACjC,YAAY,EACZ,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,GACf,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,gBAAgB,EAChB,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,mBAAmB,EACnB,QAAQ,EACR,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,WAAW,GACZ,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,QAAQ,GACT,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,OAAO,EACL,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,SAAS,EACT,UAAU,EACV,OAAO,EACP,iBAAiB,EACjB,wBAAwB,EACxB,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,UAAU,EACV,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,uBAAuB,EACvB,gBAAgB,EAChB,mBAAmB,EACnB,iCAAiC,EACjC,YAAY,EACZ,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,GACf,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,gBAAgB,EAChB,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,mBAAmB,EACnB,QAAQ,EACR,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,WAAW,GACZ,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,QAAQ,GACT,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAGxF,OAAO,EACL,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -6,7 +6,7 @@
6
6
  * 不再暴露位置参数版。
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.lintEffectiveConfig = exports.getEffectiveConstraints = exports.getCapabilitiesMode = exports.loadRawProjectConfig = exports.ProjectConfigLoader = exports.SpecValidator = exports.createCleanStateManager = exports.CleanStateManager = exports.MINIMAL_CHECKPOINTS = exports.DEFAULT_CODE_CHECKPOINTS = exports.createSessionStartup = exports.SessionStartup = exports.CSOValidator = exports.createPassesGate = exports.PassesGate = exports.CheckpointValidator = exports.ConstraintViolationError = exports.renderConstraintsByTrigger = exports.CheckCache = exports.renderConstraintsSection = exports.CONSTRAINTS_END_MARKER = exports.CONSTRAINTS_START_MARKER = exports.constraintChecker = exports.checkBeforeExecution = exports.checkConstraints = exports.checkConstraint = exports.ConstraintChecker = exports.getConstraint = exports.findConstraintsByTrigger = exports.getAllConstraints = exports.PROMPTS = exports.GUIDELINES = exports.IRON_LAWS = void 0;
9
+ exports.lintEffectiveConfig = exports.getEffectiveConstraints = exports.getCapabilitiesMode = exports.resolveContextFiles = exports.getGovernanceConfig = exports.loadRawProjectConfig = exports.ProjectConfigLoader = exports.SpecValidator = exports.createCleanStateManager = exports.CleanStateManager = exports.MINIMAL_CHECKPOINTS = exports.DEFAULT_CODE_CHECKPOINTS = exports.createSessionStartup = exports.SessionStartup = exports.CSOValidator = exports.createPassesGate = exports.PassesGate = exports.CheckpointValidator = exports.ConstraintViolationError = exports.renderConstraintsByTrigger = exports.CheckCache = exports.renderConstraintsSection = exports.CONSTRAINTS_END_MARKER = exports.CONSTRAINTS_START_MARKER = exports.constraintChecker = exports.checkBeforeExecution = exports.checkConstraints = exports.checkConstraint = exports.ConstraintChecker = exports.getConstraint = exports.findConstraintsByTrigger = exports.getAllConstraints = exports.PROMPTS = exports.GUIDELINES = exports.IRON_LAWS = void 0;
10
10
  // 约束系统(三层:Iron Laws / Guidelines / Tips)
11
11
  var constraints_1 = require("./constraints");
12
12
  Object.defineProperty(exports, "IRON_LAWS", { enumerable: true, get: function () { return constraints_1.IRON_LAWS; } });
@@ -43,10 +43,12 @@ Object.defineProperty(exports, "createCleanStateManager", { enumerable: true, ge
43
43
  // Spec 验证器
44
44
  var validator_1 = require("./spec/validator");
45
45
  Object.defineProperty(exports, "SpecValidator", { enumerable: true, get: function () { return validator_1.SpecValidator; } });
46
- // 项目配置加载器
46
+ // 项目配置加载器(governance 段读取一律经访问器,禁止消费方手写钻取)
47
47
  var project_config_loader_1 = require("./project-config-loader");
48
48
  Object.defineProperty(exports, "ProjectConfigLoader", { enumerable: true, get: function () { return project_config_loader_1.ProjectConfigLoader; } });
49
49
  Object.defineProperty(exports, "loadRawProjectConfig", { enumerable: true, get: function () { return project_config_loader_1.loadRawProjectConfig; } });
50
+ Object.defineProperty(exports, "getGovernanceConfig", { enumerable: true, get: function () { return project_config_loader_1.getGovernanceConfig; } });
51
+ Object.defineProperty(exports, "resolveContextFiles", { enumerable: true, get: function () { return project_config_loader_1.resolveContextFiles; } });
50
52
  Object.defineProperty(exports, "getCapabilitiesMode", { enumerable: true, get: function () { return project_config_loader_1.getCapabilitiesMode; } });
51
53
  // 生效约束集(ADR-0001:唯一生效集来源)
52
54
  var effective_constraints_1 = require("./effective-constraints");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,yCAAyC;AACzC,6CAkBuB;AAjBrB,wGAAA,SAAS,OAAA;AACT,yGAAA,UAAU,OAAA;AACV,sGAAA,OAAO,OAAA;AACP,gHAAA,iBAAiB,OAAA;AACjB,uHAAA,wBAAwB,OAAA;AACxB,4GAAA,aAAa,OAAA;AACb,gHAAA,iBAAiB,OAAA;AACjB,8GAAA,eAAe,OAAA;AACf,+GAAA,gBAAgB,OAAA;AAChB,mHAAA,oBAAoB,OAAA;AACpB,gHAAA,iBAAiB,OAAA;AACjB,uHAAA,wBAAwB,OAAA;AACxB,qHAAA,sBAAsB,OAAA;AACtB,uHAAA,wBAAwB,OAAA;AACxB,yGAAA,UAAU,OAAA;AACV,yHAAA,0BAA0B,OAAA;AAC1B,uHAAA,wBAAwB,OAAA;AAkB1B,8BAA8B;AAC9B,2CAKsB;AAJpB,iHAAA,mBAAmB,OAAA;AACnB,wGAAA,UAAU,OAAA;AACV,8GAAA,gBAAgB,OAAA;AAChB,0GAAA,YAAY,OAAA;AAkBd,cAAc;AACd,qCAOmB;AANjB,yGAAA,cAAc,OAAA;AACd,+GAAA,oBAAoB,OAAA;AACpB,mHAAA,wBAAwB,OAAA;AACxB,8GAAA,mBAAmB,OAAA;AACnB,4GAAA,iBAAiB,OAAA;AACjB,kHAAA,uBAAuB,OAAA;AAGzB,WAAW;AACX,8CAAiD;AAAxC,0GAAA,aAAa,OAAA;AAStB,UAAU;AACV,iEAIiC;AAH/B,4HAAA,mBAAmB,OAAA;AACnB,6HAAA,oBAAoB,OAAA;AACpB,4HAAA,mBAAmB,OAAA;AAIrB,0BAA0B;AAC1B,iEAGiC;AAF/B,gIAAA,uBAAuB,OAAA;AACvB,4HAAA,mBAAmB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,yCAAyC;AACzC,6CAkBuB;AAjBrB,wGAAA,SAAS,OAAA;AACT,yGAAA,UAAU,OAAA;AACV,sGAAA,OAAO,OAAA;AACP,gHAAA,iBAAiB,OAAA;AACjB,uHAAA,wBAAwB,OAAA;AACxB,4GAAA,aAAa,OAAA;AACb,gHAAA,iBAAiB,OAAA;AACjB,8GAAA,eAAe,OAAA;AACf,+GAAA,gBAAgB,OAAA;AAChB,mHAAA,oBAAoB,OAAA;AACpB,gHAAA,iBAAiB,OAAA;AACjB,uHAAA,wBAAwB,OAAA;AACxB,qHAAA,sBAAsB,OAAA;AACtB,uHAAA,wBAAwB,OAAA;AACxB,yGAAA,UAAU,OAAA;AACV,yHAAA,0BAA0B,OAAA;AAC1B,uHAAA,wBAAwB,OAAA;AAkB1B,8BAA8B;AAC9B,2CAKsB;AAJpB,iHAAA,mBAAmB,OAAA;AACnB,wGAAA,UAAU,OAAA;AACV,8GAAA,gBAAgB,OAAA;AAChB,0GAAA,YAAY,OAAA;AAkBd,cAAc;AACd,qCAOmB;AANjB,yGAAA,cAAc,OAAA;AACd,+GAAA,oBAAoB,OAAA;AACpB,mHAAA,wBAAwB,OAAA;AACxB,8GAAA,mBAAmB,OAAA;AACnB,4GAAA,iBAAiB,OAAA;AACjB,kHAAA,uBAAuB,OAAA;AAGzB,WAAW;AACX,8CAAiD;AAAxC,0GAAA,aAAa,OAAA;AAStB,0CAA0C;AAC1C,iEAMiC;AAL/B,4HAAA,mBAAmB,OAAA;AACnB,6HAAA,oBAAoB,OAAA;AACpB,4HAAA,mBAAmB,OAAA;AACnB,4HAAA,mBAAmB,OAAA;AACnB,4HAAA,mBAAmB,OAAA;AAIrB,0BAA0B;AAC1B,iEAGiC;AAF/B,gIAAA,uBAAuB,OAAA;AACvB,4HAAA,mBAAmB,OAAA"}
@@ -4,7 +4,7 @@
4
4
  * 加载 .harness/config.yml 和 .harness/custom-constraints.yml
5
5
  * 合并内置约束和项目自定义约束
6
6
  */
7
- import type { ProjectConfig, CustomConstraintDefinition, MergedConstraintsConfig, CapabilitiesConfig } from '../types/project-config';
7
+ import type { ProjectConfig, CustomConstraintDefinition, MergedConstraintsConfig, CapabilitiesConfig, GovernanceConfig } from '../types/project-config';
8
8
  /**
9
9
  * 读取并解析 .harness/config.yml(进程级 memoize)
10
10
  *
@@ -15,6 +15,37 @@ export declare function loadRawProjectConfig(projectPath: string): Record<string
15
15
  * CAPABILITIES.md 登记模式(governance.capabilities.mode)
16
16
  */
17
17
  export type CapabilitiesMode = NonNullable<CapabilitiesConfig['mode']>;
18
+ /**
19
+ * 读取 governance 段(全仓唯一手写钻取点,工单 84)
20
+ *
21
+ * 基于 loadRawProjectConfig 的进程级 memoize,不引入第二次 yaml 解析。
22
+ * 配置缺失 / 解析失败 / 形状不符时返回 undefined,由调用方按未配置处理。
23
+ */
24
+ export declare function getGovernanceConfig(projectPath: string): GovernanceConfig | undefined;
25
+ /**
26
+ * governance.context_files 三态分辨率(工单 84 triage 裁决口径)
27
+ *
28
+ * - unconfigured:段缺失 / enabled 为假 / 解析失败——约定未采用
29
+ * - enabled-empty:enabled 但 required_dirs 缺失、非数组、含非字符串项或空——
30
+ * 约定已立但无可用目标
31
+ * - enabled:enabled 且 required_dirs 为非空字符串数组——约定有效
32
+ */
33
+ export type ContextFilesResolution = {
34
+ state: 'unconfigured';
35
+ } | {
36
+ state: 'enabled-empty';
37
+ } | {
38
+ state: 'enabled';
39
+ dirs: string[];
40
+ };
41
+ /**
42
+ * 分辨 governance.context_files 三态(语义见 ContextFilesResolution)
43
+ *
44
+ * 消费方约定:约束 checker 对前两态一律 skip(与 ADR-0001 存在性探测同构);
45
+ * init / 扫描类工具流的自动探测回落保留在调用方,不进本访问器。
46
+ * 元素类型在此收口:脏配置(如 required_dirs: [1])不得流入调用方 path.join。
47
+ */
48
+ export declare function resolveContextFiles(projectPath: string): ContextFilesResolution;
18
49
  /**
19
50
  * 读取 governance.capabilities.mode(缺省 'file',向后兼容)
20
51
  *
@@ -1 +1 @@
1
- {"version":3,"file":"project-config-loader.d.ts","sourceRoot":"","sources":["../../src/core/project-config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,aAAa,EACb,0BAA0B,EAC1B,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAqBjC;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CA8B7F;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;AAEvE;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAWzE;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,iBAAiB,CAA6C;gBAE1D,WAAW,CAAC,EAAE,MAAM;IAMhC;;OAEG;IACH,IAAI,IAAI,aAAa;IAarB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B;;;;;;;;;;;;;OAaG;IACH,gBAAgB,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,uBAAuB;IAqGxE;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAgBpB;;OAEG;IACH,SAAS,IAAI,aAAa;IAI1B;;OAEG;IACH,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC;IAIlE;;OAEG;IACH,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAclD;;OAEG;IACH,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU;IAU7E;;OAEG;IACH,eAAe,IAAI,OAAO;CAM3B"}
1
+ {"version":3,"file":"project-config-loader.d.ts","sourceRoot":"","sources":["../../src/core/project-config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,aAAa,EACb,0BAA0B,EAC1B,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,yBAAyB,CAAC;AAqBjC;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CA8B7F;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;AAEvE;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CASrF;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,sBAAsB,GAC9B;IAAE,KAAK,EAAE,cAAc,CAAA;CAAE,GACzB;IAAE,KAAK,EAAE,eAAe,CAAA;CAAE,GAC1B;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEzC;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,sBAAsB,CAO/E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAIzE;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,iBAAiB,CAA6C;gBAE1D,WAAW,CAAC,EAAE,MAAM;IAMhC;;OAEG;IACH,IAAI,IAAI,aAAa;IAarB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B;;;;;;;;;;;;;OAaG;IACH,gBAAgB,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,uBAAuB;IAqGxE;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAgBpB;;OAEG;IACH,SAAS,IAAI,aAAa;IAI1B;;OAEG;IACH,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC;IAIlE;;OAEG;IACH,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAclD;;OAEG;IACH,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU;IAU7E;;OAEG;IACH,eAAe,IAAI,OAAO;CAM3B"}
@@ -41,6 +41,8 @@ var __importStar = (this && this.__importStar) || (function () {
41
41
  Object.defineProperty(exports, "__esModule", { value: true });
42
42
  exports.ProjectConfigLoader = void 0;
43
43
  exports.loadRawProjectConfig = loadRawProjectConfig;
44
+ exports.getGovernanceConfig = getGovernanceConfig;
45
+ exports.resolveContextFiles = resolveContextFiles;
44
46
  exports.getCapabilitiesMode = getCapabilitiesMode;
45
47
  const fs = __importStar(require("fs"));
46
48
  const path = __importStar(require("path"));
@@ -97,22 +99,50 @@ function loadRawProjectConfig(projectPath) {
97
99
  return raw;
98
100
  }
99
101
  /**
100
- * 读取 governance.capabilities.mode(缺省 'file',向后兼容)
102
+ * 读取 governance 段(全仓唯一手写钻取点,工单 84)
101
103
  *
102
- * 配置缺失/解析失败/取值非法时一律回落 'file'。
104
+ * 基于 loadRawProjectConfig 的进程级 memoize,不引入第二次 yaml 解析。
105
+ * 配置缺失 / 解析失败 / 形状不符时返回 undefined,由调用方按未配置处理。
103
106
  */
104
- function getCapabilitiesMode(projectPath) {
107
+ function getGovernanceConfig(projectPath) {
105
108
  try {
106
109
  const raw = loadRawProjectConfig(projectPath);
107
110
  const governance = raw?.governance;
108
- const capabilities = governance?.capabilities;
109
- const mode = capabilities?.mode;
110
- if (mode === 'file' || mode === 'module' || mode === 'listing')
111
- return mode;
111
+ if (governance === null || typeof governance !== 'object')
112
+ return undefined;
113
+ return governance;
112
114
  }
113
115
  catch {
114
- // 配置缺失或解析失败,按默认 file 处理
116
+ return undefined;
115
117
  }
118
+ }
119
+ /**
120
+ * 分辨 governance.context_files 三态(语义见 ContextFilesResolution)
121
+ *
122
+ * 消费方约定:约束 checker 对前两态一律 skip(与 ADR-0001 存在性探测同构);
123
+ * init / 扫描类工具流的自动探测回落保留在调用方,不进本访问器。
124
+ * 元素类型在此收口:脏配置(如 required_dirs: [1])不得流入调用方 path.join。
125
+ */
126
+ function resolveContextFiles(projectPath) {
127
+ const contextFiles = getGovernanceConfig(projectPath)?.context_files;
128
+ if (!contextFiles?.enabled)
129
+ return { state: 'unconfigured' };
130
+ const dirs = contextFiles.required_dirs;
131
+ if (!Array.isArray(dirs) || dirs.length === 0)
132
+ return { state: 'enabled-empty' };
133
+ if (!dirs.every(dir => typeof dir === 'string'))
134
+ return { state: 'enabled-empty' };
135
+ return { state: 'enabled', dirs };
136
+ }
137
+ /**
138
+ * 读取 governance.capabilities.mode(缺省 'file',向后兼容)
139
+ *
140
+ * 配置缺失/解析失败/取值非法时一律回落 'file'。
141
+ */
142
+ function getCapabilitiesMode(projectPath) {
143
+ const mode = getGovernanceConfig(projectPath)?.capabilities?.mode;
144
+ if (mode === 'file' || mode === 'module' || mode === 'listing')
145
+ return mode;
116
146
  return 'file';
117
147
  }
118
148
  /**
@@ -228,7 +258,7 @@ class ProjectConfigLoader {
228
258
  }
229
259
  // 2. 添加自定义约束(config.yml 禁用的 id 不追加:step 1 已将其
230
260
  // 收集进 disabled,custom 在 step 1 时尚未入桶,须在此兜底跳过;
231
- // 条目带 retired 元数据的同样不追加——#82 D6 退役落点在条目自身)
261
+ // 条目带 retired 元数据的同样不追加——studio#82 D6 退役落点在条目自身)
232
262
  for (const [id, customDef] of Object.entries(this.customConstraints)) {
233
263
  if (result.disabled.includes(id) || customDef.retired) {
234
264
  continue;