@dommaker/harness 1.3.0 → 1.5.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 (532) hide show
  1. package/CHANGELOG.md +20 -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 +104 -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 +27 -219
  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 +17 -30
  53. package/dist/cli/commands/knowledge.d.ts.map +1 -1
  54. package/dist/cli/commands/knowledge.js +183 -273
  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 +9 -3
  115. package/dist/cli/commands/update-user-model.d.ts.map +1 -1
  116. package/dist/cli/commands/update-user-model.js +56 -61
  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 +68 -117
  143. package/dist/core/constraints/checker.js.map +1 -1
  144. package/dist/core/constraints/checkers/capability-sync.d.ts +20 -8
  145. package/dist/core/constraints/checkers/capability-sync.d.ts.map +1 -1
  146. package/dist/core/constraints/checkers/capability-sync.js +66 -77
  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 +49 -66
  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/index.d.ts +2 -2
  160. package/dist/core/constraints/checkers/index.d.ts.map +1 -1
  161. package/dist/core/constraints/checkers/index.js +2 -1
  162. package/dist/core/constraints/checkers/index.js.map +1 -1
  163. package/dist/core/constraints/checkers/no-test-simplification.d.ts.map +1 -1
  164. package/dist/core/constraints/checkers/no-test-simplification.js +4 -3
  165. package/dist/core/constraints/checkers/no-test-simplification.js.map +1 -1
  166. package/dist/core/constraints/checkers/types.d.ts +43 -4
  167. package/dist/core/constraints/checkers/types.d.ts.map +1 -1
  168. package/dist/core/constraints/checkers/types.js +33 -0
  169. package/dist/core/constraints/checkers/types.js.map +1 -1
  170. package/dist/core/constraints/context-builder.d.ts +15 -14
  171. package/dist/core/constraints/context-builder.d.ts.map +1 -1
  172. package/dist/core/constraints/context-builder.js +32 -96
  173. package/dist/core/constraints/context-builder.js.map +1 -1
  174. package/dist/core/constraints/doc-freshness/runner.d.ts.map +1 -1
  175. package/dist/core/constraints/doc-freshness/runner.js +2 -1
  176. package/dist/core/constraints/doc-freshness/runner.js.map +1 -1
  177. package/dist/core/constraints/git-evidence.d.ts +60 -0
  178. package/dist/core/constraints/git-evidence.d.ts.map +1 -0
  179. package/dist/core/constraints/git-evidence.js +88 -0
  180. package/dist/core/constraints/git-evidence.js.map +1 -0
  181. package/dist/core/constraints/injection-drift.d.ts +3 -20
  182. package/dist/core/constraints/injection-drift.d.ts.map +1 -1
  183. package/dist/core/constraints/injection-drift.js +10 -57
  184. package/dist/core/constraints/injection-drift.js.map +1 -1
  185. package/dist/core/constraints/injection-writer.d.ts +113 -0
  186. package/dist/core/constraints/injection-writer.d.ts.map +1 -0
  187. package/dist/core/constraints/injection-writer.js +228 -0
  188. package/dist/core/constraints/injection-writer.js.map +1 -0
  189. package/dist/core/constraints/usage-report.d.ts +22 -1
  190. package/dist/core/constraints/usage-report.d.ts.map +1 -1
  191. package/dist/core/constraints/usage-report.js +27 -20
  192. package/dist/core/constraints/usage-report.js.map +1 -1
  193. package/dist/core/index.d.ts +2 -2
  194. package/dist/core/index.d.ts.map +1 -1
  195. package/dist/core/index.js +4 -2
  196. package/dist/core/index.js.map +1 -1
  197. package/dist/core/project-config-loader.d.ts +32 -1
  198. package/dist/core/project-config-loader.d.ts.map +1 -1
  199. package/dist/core/project-config-loader.js +39 -9
  200. package/dist/core/project-config-loader.js.map +1 -1
  201. package/dist/core/validators/passes-gate.d.ts +15 -64
  202. package/dist/core/validators/passes-gate.d.ts.map +1 -1
  203. package/dist/core/validators/passes-gate.js +84 -222
  204. package/dist/core/validators/passes-gate.js.map +1 -1
  205. package/dist/core/validators/test-output.d.ts +58 -0
  206. package/dist/core/validators/test-output.d.ts.map +1 -0
  207. package/dist/core/validators/test-output.js +109 -0
  208. package/dist/core/validators/test-output.js.map +1 -0
  209. package/dist/failure/recorder.d.ts +6 -0
  210. package/dist/failure/recorder.d.ts.map +1 -1
  211. package/dist/failure/recorder.js +12 -8
  212. package/dist/failure/recorder.js.map +1 -1
  213. package/dist/gates/acceptance.d.ts +1 -48
  214. package/dist/gates/acceptance.d.ts.map +1 -1
  215. package/dist/gates/acceptance.js +6 -38
  216. package/dist/gates/acceptance.js.map +1 -1
  217. package/dist/gates/checker-gate.d.ts +2 -1
  218. package/dist/gates/checker-gate.d.ts.map +1 -1
  219. package/dist/gates/checker-gate.js +11 -13
  220. package/dist/gates/checker-gate.js.map +1 -1
  221. package/dist/gates/command.d.ts.map +1 -1
  222. package/dist/gates/command.js +10 -22
  223. package/dist/gates/command.js.map +1 -1
  224. package/dist/gates/contract.d.ts.map +1 -1
  225. package/dist/gates/contract.js +22 -61
  226. package/dist/gates/contract.js.map +1 -1
  227. package/dist/gates/performance.d.ts.map +1 -1
  228. package/dist/gates/performance.js +13 -31
  229. package/dist/gates/performance.js.map +1 -1
  230. package/dist/gates/review.d.ts.map +1 -1
  231. package/dist/gates/review.js +21 -53
  232. package/dist/gates/review.js.map +1 -1
  233. package/dist/gates/security.d.ts.map +1 -1
  234. package/dist/gates/security.js +14 -32
  235. package/dist/gates/security.js.map +1 -1
  236. package/dist/gates/types.d.ts +28 -5
  237. package/dist/gates/types.d.ts.map +1 -1
  238. package/dist/gates/types.js +38 -1
  239. package/dist/gates/types.js.map +1 -1
  240. package/dist/hooks/bootstrap.d.ts +2 -0
  241. package/dist/hooks/bootstrap.d.ts.map +1 -1
  242. package/dist/hooks/bootstrap.js +5 -2
  243. package/dist/hooks/bootstrap.js.map +1 -1
  244. package/dist/index.d.ts +1 -2
  245. package/dist/index.d.ts.map +1 -1
  246. package/dist/index.js.map +1 -1
  247. package/dist/knowledge/audit.d.ts +7 -2
  248. package/dist/knowledge/audit.d.ts.map +1 -1
  249. package/dist/knowledge/audit.js +59 -79
  250. package/dist/knowledge/audit.js.map +1 -1
  251. package/dist/knowledge/flywheel-metrics.d.ts +39 -0
  252. package/dist/knowledge/flywheel-metrics.d.ts.map +1 -0
  253. package/dist/knowledge/flywheel-metrics.js +47 -0
  254. package/dist/knowledge/flywheel-metrics.js.map +1 -0
  255. package/dist/knowledge/import.d.ts.map +1 -1
  256. package/dist/knowledge/import.js +4 -14
  257. package/dist/knowledge/import.js.map +1 -1
  258. package/dist/knowledge/index-generator.d.ts.map +1 -1
  259. package/dist/knowledge/index-generator.js +17 -14
  260. package/dist/knowledge/index-generator.js.map +1 -1
  261. package/dist/knowledge/ingest.d.ts.map +1 -1
  262. package/dist/knowledge/ingest.js +9 -4
  263. package/dist/knowledge/ingest.js.map +1 -1
  264. package/dist/knowledge/migration.d.ts.map +1 -1
  265. package/dist/knowledge/migration.js +11 -8
  266. package/dist/knowledge/migration.js.map +1 -1
  267. package/dist/knowledge/reference-tracker.d.ts.map +1 -1
  268. package/dist/knowledge/reference-tracker.js +12 -9
  269. package/dist/knowledge/reference-tracker.js.map +1 -1
  270. package/dist/knowledge/store.d.ts +15 -0
  271. package/dist/knowledge/store.d.ts.map +1 -1
  272. package/dist/knowledge/store.js +59 -10
  273. package/dist/knowledge/store.js.map +1 -1
  274. package/dist/monitoring/context-tracker.d.ts.map +1 -1
  275. package/dist/monitoring/context-tracker.js +11 -20
  276. package/dist/monitoring/context-tracker.js.map +1 -1
  277. package/dist/monitoring/index.d.ts +1 -1
  278. package/dist/monitoring/index.d.ts.map +1 -1
  279. package/dist/monitoring/index.js +1 -2
  280. package/dist/monitoring/index.js.map +1 -1
  281. package/dist/monitoring/trace-analyzer.d.ts +15 -0
  282. package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
  283. package/dist/monitoring/trace-analyzer.js +19 -2
  284. package/dist/monitoring/trace-analyzer.js.map +1 -1
  285. package/dist/monitoring/traces.d.ts +21 -2
  286. package/dist/monitoring/traces.d.ts.map +1 -1
  287. package/dist/monitoring/traces.js +38 -29
  288. package/dist/monitoring/traces.js.map +1 -1
  289. package/dist/release/index.d.ts +2 -2
  290. package/dist/release/index.d.ts.map +1 -1
  291. package/dist/release/index.js +1 -5
  292. package/dist/release/index.js.map +1 -1
  293. package/dist/sdd/index-generator.js +10 -11
  294. package/dist/sdd/index-generator.js.map +1 -1
  295. package/dist/test-setup/project-fixture.d.ts +48 -0
  296. package/dist/test-setup/project-fixture.d.ts.map +1 -0
  297. package/dist/test-setup/project-fixture.js +106 -0
  298. package/dist/test-setup/project-fixture.js.map +1 -0
  299. package/dist/types/constraint.d.ts +8 -18
  300. package/dist/types/constraint.d.ts.map +1 -1
  301. package/dist/types/constraint.js +6 -1
  302. package/dist/types/constraint.js.map +1 -1
  303. package/dist/types/passes-gate.d.ts +10 -25
  304. package/dist/types/passes-gate.d.ts.map +1 -1
  305. package/dist/types/project-config.d.ts +1 -1
  306. package/dist/types/session.d.ts +6 -5
  307. package/dist/types/session.d.ts.map +1 -1
  308. package/dist/types/trace.d.ts +9 -0
  309. package/dist/types/trace.d.ts.map +1 -1
  310. package/dist/utils/exec.d.ts +10 -0
  311. package/dist/utils/exec.d.ts.map +1 -1
  312. package/dist/utils/exec.js +12 -0
  313. package/dist/utils/exec.js.map +1 -1
  314. package/dist/utils/file-walk.d.ts +9 -1
  315. package/dist/utils/file-walk.d.ts.map +1 -1
  316. package/dist/utils/file-walk.js +10 -1
  317. package/dist/utils/file-walk.js.map +1 -1
  318. package/dist/utils/frontmatter.d.ts +73 -0
  319. package/dist/utils/frontmatter.d.ts.map +1 -0
  320. package/dist/utils/frontmatter.js +141 -0
  321. package/dist/utils/frontmatter.js.map +1 -0
  322. package/dist/utils/jsonl.d.ts +92 -0
  323. package/dist/utils/jsonl.d.ts.map +1 -0
  324. package/dist/utils/jsonl.js +166 -0
  325. package/dist/utils/jsonl.js.map +1 -0
  326. package/dist/utils/package-version.d.ts +16 -0
  327. package/dist/utils/package-version.d.ts.map +1 -0
  328. package/dist/utils/package-version.js +63 -0
  329. package/dist/utils/package-version.js.map +1 -0
  330. package/package.json +1 -1
  331. package/src/CONTEXT.md +8 -2
  332. package/src/__tests__/acceptance-gate.test.ts +3 -1
  333. package/src/__tests__/checker-extra.test.ts +7 -1218
  334. package/src/__tests__/context-files-resolution.test.ts +116 -0
  335. package/src/__tests__/effective-constraints.test.ts +10 -13
  336. package/src/__tests__/exec.test.ts +35 -1
  337. package/src/__tests__/layering.test.ts +152 -0
  338. package/src/__tests__/passes-gate-extra.test.ts +0 -145
  339. package/src/__tests__/passes-gate.test.ts +130 -101
  340. package/src/__tests__/skip-semantics.test.ts +5 -9
  341. package/src/cli/__tests__/command-contract.test.ts +170 -0
  342. package/src/cli/command-contract.ts +108 -0
  343. package/src/cli/commands/CONTEXT.md +23 -8
  344. package/src/cli/commands/__tests__/acceptance.test.ts +40 -33
  345. package/src/cli/commands/__tests__/analyze-sessions.test.ts +35 -29
  346. package/src/cli/commands/__tests__/bin-exit-mapping.test.ts +107 -0
  347. package/src/cli/commands/__tests__/check-drift.test.ts +27 -34
  348. package/src/cli/commands/__tests__/check-skip-output.test.ts +21 -24
  349. package/src/cli/commands/__tests__/check.test.ts +448 -378
  350. package/src/cli/commands/__tests__/command.test.ts +85 -70
  351. package/src/cli/commands/__tests__/constraints-report.test.ts +100 -71
  352. package/src/cli/commands/__tests__/constraints-retire.test.ts +152 -95
  353. package/src/cli/commands/__tests__/contract.test.ts +27 -34
  354. package/src/cli/commands/__tests__/failure.test.ts +31 -34
  355. package/src/cli/commands/__tests__/init-injection.test.ts +58 -28
  356. package/src/cli/commands/__tests__/init.test.ts +77 -48
  357. package/src/cli/commands/__tests__/knowledge-flywheel-consistency.test.ts +108 -0
  358. package/src/cli/commands/__tests__/knowledge.test.ts +69 -43
  359. package/src/cli/commands/__tests__/passes-gate.test.ts +43 -45
  360. package/src/cli/commands/__tests__/performance.test.ts +22 -23
  361. package/src/cli/commands/__tests__/posteval-plan.test.ts +39 -38
  362. package/src/cli/commands/__tests__/project-path-anchoring.test.ts +157 -0
  363. package/src/cli/commands/__tests__/project-path-convention.test.ts +231 -0
  364. package/src/cli/commands/__tests__/registry.test.ts +75 -35
  365. package/src/cli/commands/__tests__/release.test.ts +209 -80
  366. package/src/cli/commands/__tests__/report-extra.test.ts +16 -16
  367. package/src/cli/commands/__tests__/report.test.ts +25 -25
  368. package/src/cli/commands/__tests__/review.test.ts +33 -31
  369. package/src/cli/commands/__tests__/security.test.ts +23 -27
  370. package/src/cli/commands/__tests__/spec-baseline-check.test.ts +20 -20
  371. package/src/cli/commands/__tests__/spec.test.ts +41 -29
  372. package/src/cli/commands/__tests__/status-extra.test.ts +18 -18
  373. package/src/cli/commands/__tests__/status-skipped-lines.test.ts +72 -0
  374. package/src/cli/commands/__tests__/status.test.ts +34 -34
  375. package/src/cli/commands/__tests__/sync-docs-agents.test.ts +77 -78
  376. package/src/cli/commands/__tests__/sync-docs.test.ts +72 -74
  377. package/src/cli/commands/__tests__/update-user-model.test.ts +97 -34
  378. package/src/cli/commands/__tests__/validate.test.ts +27 -29
  379. package/src/cli/commands/acceptance.ts +35 -24
  380. package/src/cli/commands/analyze-sessions.ts +25 -24
  381. package/src/cli/commands/check.ts +127 -66
  382. package/src/cli/commands/command.ts +30 -17
  383. package/src/cli/commands/constraints-report.ts +37 -34
  384. package/src/cli/commands/constraints-retire.ts +58 -55
  385. package/src/cli/commands/constraints.ts +10 -27
  386. package/src/cli/commands/contract.ts +51 -42
  387. package/src/cli/commands/definitions.ts +34 -227
  388. package/src/cli/commands/failure.ts +33 -26
  389. package/src/cli/commands/init.ts +166 -220
  390. package/src/cli/commands/knowledge.ts +192 -289
  391. package/src/cli/commands/passes-gate.ts +58 -68
  392. package/src/cli/commands/performance.ts +23 -18
  393. package/src/cli/commands/posteval-plan.ts +29 -15
  394. package/src/cli/commands/release.ts +70 -59
  395. package/src/cli/commands/report.ts +9 -5
  396. package/src/cli/commands/review.ts +39 -29
  397. package/src/cli/commands/sdd.ts +7 -5
  398. package/src/cli/commands/security.ts +35 -26
  399. package/src/cli/commands/spec-baseline-check.ts +16 -11
  400. package/src/cli/commands/spec.ts +66 -53
  401. package/src/cli/commands/status.ts +59 -53
  402. package/src/cli/commands/sync-docs/agents-syncer.ts +5 -2
  403. package/src/cli/commands/sync-docs/context-syncer.ts +3 -2
  404. package/src/cli/commands/sync-docs/index.ts +73 -100
  405. package/src/cli/commands/sync-docs/project-reader.ts +17 -18
  406. package/src/cli/commands/update-user-model.ts +64 -61
  407. package/src/cli/commands/validate.ts +31 -25
  408. package/src/cli/session-mining/__tests__/transcript.test.ts +118 -0
  409. package/src/cli/session-mining/transcript.ts +26 -8
  410. package/src/context/session-manager.ts +19 -33
  411. package/src/core/CONTEXT.md +10 -6
  412. package/src/core/constraints/__tests__/capabilities-reconcile.test.ts +200 -0
  413. package/src/core/constraints/__tests__/capability-counts.test.ts +94 -0
  414. package/src/core/constraints/__tests__/git-evidence.test.ts +208 -0
  415. package/src/core/constraints/__tests__/injection-drift.test.ts +3 -10
  416. package/src/core/constraints/__tests__/injection-writer.test.ts +231 -0
  417. package/src/core/constraints/__tests__/trace-injection.test.ts +71 -0
  418. package/src/core/constraints/__tests__/usage-report.test.ts +112 -0
  419. package/src/core/constraints/agent-prompt-renderer.ts +2 -6
  420. package/src/core/constraints/capabilities-parser.ts +53 -35
  421. package/src/core/constraints/capabilities-reconcile.ts +166 -0
  422. package/src/core/constraints/checker.ts +82 -133
  423. package/src/core/constraints/checkers/__tests__/capability-sync.test.ts +273 -0
  424. package/src/core/constraints/checkers/__tests__/check-outcome.test.ts +176 -0
  425. package/src/core/constraints/checkers/__tests__/context-doc-sync.test.ts +77 -0
  426. package/src/core/constraints/checkers/__tests__/docs-freshness.test.ts +126 -0
  427. package/src/{__tests__ → core/constraints/checkers/__tests__}/governance-presence.test.ts +83 -9
  428. package/src/core/constraints/checkers/__tests__/iron-flags.test.ts +50 -0
  429. package/src/core/constraints/checkers/__tests__/no-bypass-checkpoint.test.ts +76 -0
  430. package/src/{__tests__ → core/constraints/checkers/__tests__}/no-hardcoded-credentials.test.ts +4 -3
  431. package/src/core/constraints/checkers/__tests__/no-test-simplification.test.ts +58 -0
  432. package/src/core/constraints/checkers/__tests__/three-state-consistency.test.ts +153 -0
  433. package/src/core/constraints/checkers/capability-sync.ts +75 -96
  434. package/src/core/constraints/checkers/context-doc-sync.ts +15 -25
  435. package/src/core/constraints/checkers/docs-freshness.ts +54 -70
  436. package/src/core/constraints/checkers/governance-presence.ts +7 -25
  437. package/src/core/constraints/checkers/index.ts +9 -2
  438. package/src/core/constraints/checkers/no-test-simplification.ts +4 -3
  439. package/src/core/constraints/checkers/types.ts +60 -4
  440. package/src/core/constraints/context-builder.ts +39 -91
  441. package/src/core/constraints/doc-freshness/runner.ts +2 -1
  442. package/src/core/constraints/git-evidence.ts +120 -0
  443. package/src/core/constraints/injection-drift.ts +13 -60
  444. package/src/core/constraints/injection-writer.ts +212 -0
  445. package/src/core/constraints/usage-report.ts +36 -17
  446. package/src/core/index.ts +4 -2
  447. package/src/core/project-config-loader.ts +49 -9
  448. package/src/core/validators/__tests__/passes-gate.test.ts +2 -56
  449. package/src/core/validators/__tests__/test-output.test.ts +372 -0
  450. package/src/core/validators/passes-gate.ts +86 -248
  451. package/src/core/validators/test-output.ts +128 -0
  452. package/src/failure/__tests__/recorder.test.ts +168 -0
  453. package/src/failure/recorder.ts +12 -10
  454. package/src/gates/CONTEXT.md +7 -4
  455. package/src/gates/__tests__/acceptance-types-single-source.test.ts +68 -0
  456. package/src/gates/__tests__/acceptance.test.ts +4 -86
  457. package/src/gates/__tests__/checker-gate.test.ts +24 -0
  458. package/src/gates/__tests__/effective-gates.test.ts +3 -8
  459. package/src/gates/__tests__/test-verdict-consistency.test.ts +140 -0
  460. package/src/gates/acceptance.ts +19 -84
  461. package/src/gates/checker-gate.ts +12 -15
  462. package/src/gates/command.ts +10 -16
  463. package/src/gates/contract.ts +22 -61
  464. package/src/gates/performance.ts +10 -22
  465. package/src/gates/review.ts +21 -41
  466. package/src/gates/security.ts +10 -22
  467. package/src/gates/types.ts +70 -5
  468. package/src/hooks/CONTEXT.md +1 -1
  469. package/src/hooks/bootstrap.ts +5 -2
  470. package/src/index.ts +0 -4
  471. package/src/knowledge/CONTEXT.md +8 -3
  472. package/src/knowledge/__tests__/audit-labels.test.ts +44 -0
  473. package/src/knowledge/__tests__/flywheel-metrics.test.ts +135 -0
  474. package/src/knowledge/__tests__/import.test.ts +44 -0
  475. package/src/knowledge/__tests__/index-generator.test.ts +53 -0
  476. package/src/knowledge/__tests__/ingest.test.ts +85 -0
  477. package/src/knowledge/__tests__/migration.test.ts +47 -0
  478. package/src/knowledge/__tests__/reference-tracker.test.ts +16 -0
  479. package/src/knowledge/__tests__/store.test.ts +194 -0
  480. package/src/knowledge/audit.ts +67 -71
  481. package/src/knowledge/flywheel-metrics.ts +71 -0
  482. package/src/knowledge/import.ts +4 -18
  483. package/src/knowledge/index-generator.ts +19 -14
  484. package/src/knowledge/ingest.ts +9 -4
  485. package/src/knowledge/migration.ts +11 -8
  486. package/src/knowledge/reference-tracker.ts +12 -8
  487. package/src/knowledge/store.ts +64 -11
  488. package/src/monitoring/CONTEXT.md +8 -3
  489. package/src/monitoring/__tests__/skipped-lines-report.test.ts +178 -0
  490. package/src/monitoring/__tests__/traces.test.ts +57 -0
  491. package/src/monitoring/context-tracker.ts +11 -23
  492. package/src/monitoring/index.ts +1 -1
  493. package/src/monitoring/trace-analyzer.ts +21 -2
  494. package/src/monitoring/traces.ts +39 -36
  495. package/src/release/CONTEXT.md +1 -0
  496. package/src/release/__tests__/barrel.test.ts +60 -0
  497. package/src/release/index.ts +2 -13
  498. package/src/sdd/__tests__/index-generator.test.ts +71 -0
  499. package/src/sdd/index-generator.ts +9 -9
  500. package/src/test-setup/__tests__/project-fixture.test.ts +178 -0
  501. package/src/test-setup/project-fixture.ts +87 -0
  502. package/src/tools/CONTEXT.md +6 -0
  503. package/src/tools/__tests__/registry.test.ts +221 -0
  504. package/src/types/__tests__/types.test.ts +4 -5
  505. package/src/types/constraint.ts +16 -27
  506. package/src/types/passes-gate.ts +10 -30
  507. package/src/types/project-config.ts +1 -1
  508. package/src/types/session.ts +5 -5
  509. package/src/types/trace.ts +10 -0
  510. package/src/utils/__tests__/frontmatter.test.ts +206 -0
  511. package/src/utils/__tests__/jsonl-skip-disposition.test.ts +175 -0
  512. package/src/utils/__tests__/jsonl.test.ts +187 -0
  513. package/src/utils/__tests__/package-version.test.ts +97 -0
  514. package/src/utils/exec.ts +15 -0
  515. package/src/utils/file-walk.ts +11 -2
  516. package/src/utils/frontmatter.ts +121 -0
  517. package/src/utils/jsonl.ts +167 -0
  518. package/src/utils/package-version.ts +27 -0
  519. package/dist/cli/commands/doc-freshness-check.d.ts +0 -53
  520. package/dist/cli/commands/doc-freshness-check.d.ts.map +0 -1
  521. package/dist/cli/commands/doc-freshness-check.js +0 -352
  522. package/dist/cli/commands/doc-freshness-check.js.map +0 -1
  523. package/dist/types/index.d.ts +0 -14
  524. package/dist/types/index.d.ts.map +0 -1
  525. package/dist/types/index.js +0 -39
  526. package/dist/types/index.js.map +0 -1
  527. package/src/__tests__/long-running.test.ts +0 -17
  528. package/src/__tests__/passes-gate-extension.test.ts +0 -151
  529. package/src/cli/commands/__tests__/doc-freshness-check.test.ts +0 -168
  530. package/src/cli/commands/doc-freshness-check.ts +0 -386
  531. package/src/spec/CONTEXT.md +0 -11
  532. package/src/types/index.ts +0 -47
@@ -5,6 +5,7 @@
5
5
  * 检查命令是否安全,防止执行危险操作
6
6
  */
7
7
 
8
+ import { pass, gateResult } from './types';
8
9
  import type { GateResult, CommandGateConfig, CommandBlacklistRule, Gate, GateContext, GateDecision } from './types';
9
10
  import { decisionFromResult } from './decision';
10
11
 
@@ -232,32 +233,25 @@ export class CommandGate implements Gate {
232
233
  const startTime = Date.now();
233
234
 
234
235
  if (!this.config.enabled) {
235
- return {
236
- gate: 'command',
237
- passed: true,
238
- message: '命令门禁已禁用',
239
- timestamp: new Date().toISOString(),
240
- duration: Date.now() - startTime,
241
- };
236
+ return pass('command', '命令门禁已禁用', startTime);
242
237
  }
243
238
 
244
239
  const result = this.checkBlacklist(command);
245
240
 
246
- return {
247
- gate: 'command',
248
- passed: result.allowed,
249
- message: result.allowed
241
+ return gateResult(
242
+ 'command',
243
+ result.allowed,
244
+ result.allowed
250
245
  ? this.formatSuccessMessage(result)
251
246
  : this.formatBlockMessage(result),
252
- details: {
247
+ startTime,
248
+ {
253
249
  blocked: result.blocked,
254
250
  warnings: result.warnings,
255
251
  audits: result.audits,
256
252
  command,
257
- },
258
- timestamp: new Date().toISOString(),
259
- duration: Date.now() - startTime,
260
- };
253
+ }
254
+ );
261
255
  }
262
256
 
263
257
  /**
@@ -9,6 +9,7 @@
9
9
 
10
10
  import * as fs from 'fs/promises';
11
11
  import * as path from 'path';
12
+ import { pass, fail, fromError } from './types';
12
13
  import type { GateResult, GateContext, ContractGateConfig, Gate, GateDecision } from './types';
13
14
  import { decisionFromResult } from './decision';
14
15
 
@@ -43,13 +44,7 @@ export class ContractGate implements Gate {
43
44
  const startTime = Date.now();
44
45
 
45
46
  if (!this.config.enabled) {
46
- return {
47
- gate: 'contract',
48
- passed: true,
49
- message: '契约门禁已禁用',
50
- timestamp: new Date().toISOString(),
51
- duration: Date.now() - startTime,
52
- };
47
+ return pass('contract', '契约门禁已禁用', startTime);
53
48
  }
54
49
 
55
50
  try {
@@ -60,34 +55,20 @@ export class ContractGate implements Gate {
60
55
  try {
61
56
  await fs.access(contractPath);
62
57
  } catch {
63
- return {
64
- gate: 'contract',
65
- passed: true,
66
- message: '未找到契约文件,跳过检查',
67
- details: {
68
- contractPath,
69
- suggestion: '创建 OpenAPI 规范文件',
70
- },
71
- timestamp: new Date().toISOString(),
72
- duration: Date.now() - startTime,
73
- };
58
+ return pass('contract', '未找到契约文件,跳过检查', startTime, {
59
+ contractPath,
60
+ suggestion: '创建 OpenAPI 规范文件',
61
+ });
74
62
  }
75
63
 
76
64
  // 验证契约格式
77
65
  const validation = await this.validateContract(contractPath);
78
66
 
79
67
  if (!validation.valid) {
80
- return {
81
- gate: 'contract',
82
- passed: false,
83
- message: `契约格式无效: ${validation.errors.join(', ')}`,
84
- details: {
85
- contractPath,
86
- errors: validation.errors,
87
- },
88
- timestamp: new Date().toISOString(),
89
- duration: Date.now() - startTime,
90
- };
68
+ return fail('contract', `契约格式无效: ${validation.errors.join(', ')}`, startTime, {
69
+ contractPath,
70
+ errors: validation.errors,
71
+ });
91
72
  }
92
73
 
93
74
  // 检查破坏性变更(如果提供了旧契约)
@@ -98,42 +79,22 @@ export class ContractGate implements Gate {
98
79
  );
99
80
 
100
81
  if (breakingChanges.length > 0 && !this.config.allowBreakingChanges) {
101
- return {
102
- gate: 'contract',
103
- passed: false,
104
- message: `发现破坏性变更: ${breakingChanges.length} 个`,
105
- details: {
106
- contractPath,
107
- oldContractPath: context.oldContractPath,
108
- breakingChanges,
109
- suggestion: '更新 API 版本或保持向后兼容',
110
- },
111
- timestamp: new Date().toISOString(),
112
- duration: Date.now() - startTime,
113
- };
82
+ return fail('contract', `发现破坏性变更: ${breakingChanges.length} 个`, startTime, {
83
+ contractPath,
84
+ oldContractPath: context.oldContractPath,
85
+ breakingChanges,
86
+ suggestion: '更新 API 版本或保持向后兼容',
87
+ });
114
88
  }
115
89
  }
116
90
 
117
- return {
118
- gate: 'contract',
119
- passed: true,
120
- message: '契约检查通过',
121
- details: {
122
- contractPath,
123
- endpoints: validation.endpoints,
124
- version: validation.version,
125
- },
126
- timestamp: new Date().toISOString(),
127
- duration: Date.now() - startTime,
128
- };
91
+ return pass('contract', '契约检查通过', startTime, {
92
+ contractPath,
93
+ endpoints: validation.endpoints,
94
+ version: validation.version,
95
+ });
129
96
  } catch (error: any) {
130
- return {
131
- gate: 'contract',
132
- passed: false,
133
- message: `契约检查失败: ${error.message}`,
134
- timestamp: new Date().toISOString(),
135
- duration: Date.now() - startTime,
136
- };
97
+ return fromError('contract', '契约检查失败', error, startTime);
137
98
  }
138
99
  }
139
100
 
@@ -16,6 +16,7 @@
16
16
  import { execAsync } from '../utils/exec';
17
17
  import * as fs from 'fs/promises';
18
18
  import * as path from 'path';
19
+ import { pass, gateResult, fromError } from './types';
19
20
  import type { GateResult, GateContext, PerformanceGateConfig, PerformanceThresholds, Gate, GateDecision } from './types';
20
21
  import { decisionFromResult } from './decision';
21
22
 
@@ -70,13 +71,7 @@ export class PerformanceGate implements Gate {
70
71
  const startTime = Date.now();
71
72
 
72
73
  if (!this.config.enabled) {
73
- return {
74
- gate: 'performance',
75
- passed: true,
76
- message: '性能门禁已禁用',
77
- timestamp: new Date().toISOString(),
78
- duration: Date.now() - startTime,
79
- };
74
+ return pass('performance', '性能门禁已禁用', startTime);
80
75
  }
81
76
 
82
77
  try {
@@ -122,11 +117,12 @@ export class PerformanceGate implements Gate {
122
117
  ? `性能检查通过: ${this.formatMetrics(metrics)}`
123
118
  : failures.join('; ');
124
119
 
125
- return {
126
- gate: 'performance',
120
+ return gateResult(
121
+ 'performance',
127
122
  passed,
128
- message: warnings.length > 0 ? `${message} (警告: ${warnings.join('; ')})` : message,
129
- details: {
123
+ warnings.length > 0 ? `${message} (警告: ${warnings.join('; ')})` : message,
124
+ startTime,
125
+ {
130
126
  metrics: {
131
127
  responseTime: metrics.responseTime,
132
128
  memoryUsage: metrics.memoryUsage,
@@ -136,18 +132,10 @@ export class PerformanceGate implements Gate {
136
132
  thresholds,
137
133
  failures,
138
134
  warnings,
139
- },
140
- timestamp: new Date().toISOString(),
141
- duration: Date.now() - startTime,
142
- };
135
+ }
136
+ );
143
137
  } catch (error: any) {
144
- return {
145
- gate: 'performance',
146
- passed: false,
147
- message: `性能检查失败: ${error.message}`,
148
- timestamp: new Date().toISOString(),
149
- duration: Date.now() - startTime,
150
- };
138
+ return fromError('performance', '性能检查失败', error, startTime);
151
139
  }
152
140
  }
153
141
 
@@ -8,6 +8,7 @@
8
8
  */
9
9
 
10
10
  import { execAsync } from '../utils/exec';
11
+ import { gateResult, fromError } from './types';
11
12
  import type { GateResult, GateContext, ReviewGateConfig, Gate, GateDecision } from './types';
12
13
  import { decisionFromResult } from './decision';
13
14
 
@@ -50,13 +51,7 @@ export class ReviewGate implements Gate {
50
51
  // 否则尝试从 git 获取
51
52
  return this.checkLocalGit(context);
52
53
  } catch (error: any) {
53
- return {
54
- gate: 'review',
55
- passed: false,
56
- message: `审查检查失败: ${error.message}`,
57
- timestamp: new Date().toISOString(),
58
- duration: Date.now() - startTime,
59
- };
54
+ return fromError('review', '审查检查失败', error, startTime);
60
55
  }
61
56
  }
62
57
 
@@ -86,33 +81,25 @@ export class ReviewGate implements Gate {
86
81
  approvals.length >= this.config.minReviewers &&
87
82
  (!this.config.blockOnChangesRequested || changesRequested.length === 0);
88
83
 
89
- return {
90
- gate: 'review',
84
+ return gateResult(
85
+ 'review',
91
86
  passed,
92
- message: passed
87
+ passed
93
88
  ? `审查通过: ${approvals.length} 个审批`
94
89
  : `审查未通过: ${approvals.length}/${this.config.minReviewers} 审批, ${changesRequested.length} 个变更请求`,
95
- details: {
90
+ startTime,
91
+ {
96
92
  approvals: approvals.length,
97
93
  changesRequested: changesRequested.length,
98
94
  pending: pending.length,
99
95
  minReviewers: this.config.minReviewers,
100
- },
101
- timestamp: new Date().toISOString(),
102
- duration: Date.now() - startTime,
103
- };
96
+ }
97
+ );
104
98
  } catch (error: any) {
105
99
  // gh CLI 不可用或 PR 不存在
106
- return {
107
- gate: 'review',
108
- passed: false,
109
- message: `无法获取 PR 状态: ${error.message}`,
110
- details: {
111
- suggestion: '确保已安装 gh CLI 并配置了 GitHub token',
112
- },
113
- timestamp: new Date().toISOString(),
114
- duration: Date.now() - startTime,
115
- };
100
+ return fromError('review', '无法获取 PR 状态', error, startTime, {
101
+ suggestion: '确保已安装 gh CLI 并配置了 GitHub token',
102
+ });
116
103
  }
117
104
  }
118
105
 
@@ -138,28 +125,21 @@ export class ReviewGate implements Gate {
138
125
  const hasUnpushed = unpushed.trim().length > 0;
139
126
 
140
127
  // 本地模式无法验证审查,返回警告
141
- return {
142
- gate: 'review',
143
- passed: !this.config.requireApproval,
144
- message: this.config.requireApproval
128
+ return gateResult(
129
+ 'review',
130
+ !this.config.requireApproval,
131
+ this.config.requireApproval
145
132
  ? '本地模式无法验证审查,请通过 PR 进行代码审查'
146
133
  : '审查要求未启用,跳过检查',
147
- details: {
134
+ startTime,
135
+ {
148
136
  lastCommit: logOutput,
149
137
  hasUnpushedCommits: hasUnpushed,
150
138
  requireApproval: this.config.requireApproval,
151
- },
152
- timestamp: new Date().toISOString(),
153
- duration: Date.now() - startTime,
154
- };
139
+ }
140
+ );
155
141
  } catch (error: any) {
156
- return {
157
- gate: 'review',
158
- passed: false,
159
- message: `Git 检查失败: ${error.message}`,
160
- timestamp: new Date().toISOString(),
161
- duration: Date.now() - startTime,
162
- };
142
+ return fromError('review', 'Git 检查失败', error, startTime);
163
143
  }
164
144
  }
165
145
 
@@ -8,6 +8,7 @@
8
8
  */
9
9
 
10
10
  import { execAsync } from '../utils/exec';
11
+ import { pass, gateResult, fromError } from './types';
11
12
  import type { GateResult, GateContext, SecurityGateConfig, Gate, GateDecision } from './types';
12
13
  import { decisionFromResult } from './decision';
13
14
 
@@ -43,13 +44,7 @@ export class SecurityGate implements Gate {
43
44
  const startTime = Date.now();
44
45
 
45
46
  if (!this.config.enabled) {
46
- return {
47
- gate: 'security',
48
- passed: true,
49
- message: '安全门禁已禁用',
50
- timestamp: new Date().toISOString(),
51
- duration: Date.now() - startTime,
52
- };
47
+ return pass('security', '安全门禁已禁用', startTime);
53
48
  }
54
49
 
55
50
  try {
@@ -65,13 +60,14 @@ export class SecurityGate implements Gate {
65
60
 
66
61
  const passed = this.isPassed(analysis);
67
62
 
68
- return {
69
- gate: 'security',
63
+ return gateResult(
64
+ 'security',
70
65
  passed,
71
- message: passed
66
+ passed
72
67
  ? '安全扫描通过'
73
68
  : `发现 ${analysis.critical} 个严重漏洞, ${analysis.high} 个高危漏洞`,
74
- details: {
69
+ startTime,
70
+ {
75
71
  critical: analysis.critical,
76
72
  high: analysis.high,
77
73
  moderate: analysis.moderate,
@@ -79,18 +75,10 @@ export class SecurityGate implements Gate {
79
75
  total: analysis.total,
80
76
  vulnerabilities: analysis.vulnerabilities.slice(0, 10), // 只返回前 10 个
81
77
  scanCommand,
82
- },
83
- timestamp: new Date().toISOString(),
84
- duration: Date.now() - startTime,
85
- };
78
+ }
79
+ );
86
80
  } catch (error: any) {
87
- return {
88
- gate: 'security',
89
- passed: false,
90
- message: `安全扫描失败: ${error.message}`,
91
- timestamp: new Date().toISOString(),
92
- duration: Date.now() - startTime,
93
- };
81
+ return fromError('security', '安全扫描失败', error, startTime);
94
82
  }
95
83
  }
96
84
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * 门禁类型定义
2
+ * 门禁类型定义 + GateResult 构造器
3
3
  */
4
4
 
5
5
  /**
@@ -17,6 +17,65 @@ export interface GateResult {
17
17
  duration?: number;
18
18
  }
19
19
 
20
+ /**
21
+ * GateResult 构造器:报告层的唯一落点
22
+ *
23
+ * gate/passed/message 逐次手写最容易漏的是 duration(无类型可救,字段是可选的);
24
+ * 时间戳与耗时口径也由此统一。无 details 时不出该键(与手写形状一致)。
25
+ */
26
+ export function gateResult(
27
+ gate: string,
28
+ passed: boolean,
29
+ message: string,
30
+ startedAt: number,
31
+ details?: Record<string, any>
32
+ ): GateResult {
33
+ return {
34
+ gate,
35
+ passed,
36
+ message,
37
+ ...(details ? { details } : {}),
38
+ timestamp: new Date().toISOString(),
39
+ duration: Date.now() - startedAt,
40
+ };
41
+ }
42
+
43
+ /** 通过报告 */
44
+ export function pass(
45
+ gate: string,
46
+ message: string,
47
+ startedAt: number,
48
+ details?: Record<string, any>
49
+ ): GateResult {
50
+ return gateResult(gate, true, message, startedAt, details);
51
+ }
52
+
53
+ /** 未通过报告 */
54
+ export function fail(
55
+ gate: string,
56
+ message: string,
57
+ startedAt: number,
58
+ details?: Record<string, any>
59
+ ): GateResult {
60
+ return gateResult(gate, false, message, startedAt, details);
61
+ }
62
+
63
+ /**
64
+ * 异常报告:message = `${label}: ${原因}`
65
+ *
66
+ * 非 Error 抛出物按 String() 取原因(原 `error.message` 会得到 undefined)。
67
+ */
68
+ export function fromError(
69
+ gate: string,
70
+ label: string,
71
+ error: unknown,
72
+ startedAt: number,
73
+ details?: Record<string, any>
74
+ ): GateResult {
75
+ const reason = error instanceof Error ? error.message : String(error);
76
+ return fail(gate, `${label}: ${reason}`, startedAt, details);
77
+ }
78
+
20
79
  /**
21
80
  * 门禁决策三态(守卫/门禁统一,G1)
22
81
  *
@@ -145,15 +204,21 @@ export interface ContractGateConfig {
145
204
  }
146
205
 
147
206
  /**
148
- * 验收标准门禁配置
207
+ * 验收标准门禁配置(单一正本,harness#101:并入原 acceptance.ts 宽版的 e2e 字段)
149
208
  */
150
209
  export interface SpecAcceptanceGateConfig {
151
- /** tasks.yml 路径 */
210
+ /** tasks.yml 路径;相对值按 check 上下文的 projectPath 解析,缺省 `<projectPath>/tasks.yml` */
152
211
  tasksPath?: string;
153
212
  /** 是否检查所有任务 */
154
213
  checkAllTasks?: boolean;
155
214
  /** 自定义验收条件 */
156
215
  customAcceptanceCriteria?: Record<string, (task: any) => Promise<boolean>>;
216
+ /** E2E 测试命令模板 */
217
+ e2eTestCommand?: string;
218
+ /** E2E 测试超时时间(毫秒) */
219
+ e2eTestTimeout?: number;
220
+ /** 项目路径 */
221
+ projectPath?: string;
157
222
  }
158
223
 
159
224
  /**
@@ -164,12 +229,12 @@ export interface AcceptanceGateContext {
164
229
  projectPath: string;
165
230
  /** 任务 ID */
166
231
  taskId?: string;
167
- /** tasks.yml 路径 */
232
+ /** tasks.yml 路径;相对值按 projectPath 解析 */
168
233
  tasksPath?: string;
169
234
  }
170
235
 
171
236
  /**
172
- * 验收标准
237
+ * 验收标准(旧格式,向后兼容)
173
238
  */
174
239
  export interface AcceptanceCriteria {
175
240
  id: string;
@@ -13,7 +13,7 @@ H5(#44)起增加两个机制(G2/G7):
13
13
  - `assertHookRegistryClosed` — 注册表闭环双向校验(构建/测试期)
14
14
  - `HookConfig`(type)— per-hook 配置声明(归一后形状)
15
15
  - `toErrorStrategy` — blocking → errorStrategy 无损映射(G7)
16
- - `bootstrapHarness` / `bootstrapHarnessSync` — Harness 启动引导
16
+ - `bootstrapHarness` / `bootstrapHarnessSync` — Harness 启动引导;也是 trace 记录器的组合根:`new ConstraintChecker(getTraceCollector())`(harness#88,core 不上行依赖 monitoring,故由本层接线)
17
17
 
18
18
  ## 依赖关系
19
19
  - 依赖 `src/types/` Hook 相关类型
@@ -10,11 +10,14 @@
10
10
  * const harness = await bootstrapHarness('/path/to/project');
11
11
  * // harness.checker, harness.config, harness.hooks, harness.sessions
12
12
  * ```
13
+ *
14
+ * checker 的 trace 记录器在此接线(harness#88:core 不上行依赖 monitoring)。
13
15
  */
14
16
 
15
17
  import { ConstraintChecker } from '../core/constraints/checker';
16
18
  import { SessionManager } from '../context/session-manager';
17
19
  import { ProjectConfigLoader } from '../core/project-config-loader';
20
+ import { getTraceCollector } from '../monitoring/traces';
18
21
  import { HookRegistry } from './registry';
19
22
  import { HookPipeline } from './pipeline';
20
23
  import type { MergedConstraintsConfig } from '../types/project-config';
@@ -72,7 +75,7 @@ export async function bootstrapHarness(
72
75
  const { mergedConstraints } = await loadConfigAsync(resolvedPath);
73
76
 
74
77
  // 2. 初始化核心组件
75
- const checker = ConstraintChecker.getInstance();
78
+ const checker = new ConstraintChecker(getTraceCollector());
76
79
 
77
80
  const sessions = new SessionManager(resolvedPath);
78
81
  const hooks = new HookRegistry();
@@ -108,7 +111,7 @@ export function bootstrapHarnessSync(
108
111
  loader.load();
109
112
  const mergedConstraints = loader.mergeConstraints();
110
113
 
111
- const checker = ConstraintChecker.getInstance();
114
+ const checker = new ConstraintChecker(getTraceCollector());
112
115
 
113
116
  const sessions = new SessionManager(resolvedPath);
114
117
  const hooks = new HookRegistry();
package/src/index.ts CHANGED
@@ -103,11 +103,9 @@ export type {
103
103
  PassesGateResult,
104
104
  PassesGateCheckResult,
105
105
  PassesGateViolation,
106
- PassesGateExtension,
107
106
  TestResult,
108
107
  DynamicTask,
109
108
  TaskTestResult,
110
- ExtensionTestResult,
111
109
  } from './types/passes-gate';
112
110
  export type {
113
111
  StepMeta,
@@ -137,8 +135,6 @@ export type {
137
135
  TaskStepStatus,
138
136
  SessionInfo,
139
137
  } from './types/session';
140
- // 与 passes-gate 同名类型的 session 版(沿用既有别名)
141
- export { DynamicTask as ExtendedDynamicTask, TaskTestResult as ExtendedTaskTestResult } from './types/session';
142
138
 
143
139
  // ========================================
144
140
  // Spec 验证(已接线的 spec 故事:validator + SpecAcceptanceGate)
@@ -17,13 +17,14 @@
17
17
  - 所有模式支持 `decayAt` 硬过期
18
18
 
19
19
  ## 核心导出
20
- - `KnowledgeStore` — 知识条目 CRUD + 结构化存储
20
+ - `KnowledgeStore` — 知识条目 CRUD + 结构化存储;`saveAll()` 批量写入(循环内只更新内存索引、结束一次 writeIndex,harness#107)
21
21
  - `KnowledgeQuery` — 语义搜索 + 类型/标签过滤 + `queryByMode()` + `consume(taskContext)`;`query()` 是 budget 截断管线(仅用于 prompt 注入),`search()` 是全语料文本搜索(先匹配→排序→limit,交互搜索专用,勿用 query() 代替)
22
22
  - `KnowledgeLifecycle` — per-mode 生命周期管理
23
23
  - `KnowledgeIngest` — 知识摄取引擎(含 ingest gate 质量门)+ `ingestExternal()` 外部内容摄入
24
24
  - `sanitizeExternalContent` — 外部内容安全清洗(过滤注入模式 + 长度限制)
25
25
  - `migrateKnowledgeEntries` — AS-021 迁移工具(为现有条目添加 consumptionMode/origin)
26
- - `KnowledgeAudit` — 6 维度质量审计引擎
26
+ - `KnowledgeAudit` — 7 维度质量审计引擎。per-entry 规则记录带 `scope: 'active' | 'all'`(active = 不判定 archived 条目);人口过滤由 `ruleDetail()` 统一执行,规则内禁止再写 `entry.maturity === 'archived'` 早返回。规则中文 label 正本在规则定义的 `label` 字段(harness#109,ADR-0002 定义即注册),`AUDIT_RULE_LABELS` 派生导出、与 `AuditRuleName` 编译期闭环,CLI 展示层直接消费、禁止另建 label 表
27
+ - `flywheel-metrics`(包内,不进导出面)— 知识飞轮指标唯一实现:`evaluateFlywheel(env)` 出 canonical 比例、`genuineRefs()` 出 synthetic 过滤口径,audit D6 / `knowledge stats` / `knowledge health` 三处共消费(ADR-0013)
27
28
  - `ReferenceTracker` — 知识引用关系图谱
28
29
  - `KnowledgeLinter` — 知识质量检查(完整性/一致性/时效性)
29
30
  - `ColdStartImporter` — 冷启动知识导入
@@ -32,20 +33,24 @@
32
33
 
33
34
  ## 依赖关系
34
35
  - 依赖 `src/types/` 知识相关类型
36
+ - 依赖 `src/utils/frontmatter` — markdown frontmatter 解析/序列化的唯一正本(harness#89:store、migration、index-generator、ingest 共用同一套语法判定,不再各写正则)
35
37
  - 依赖 `src/context/types`(ContextUsageSnapshot 等类型;不依赖 monitoring——知识健康评分由本目录 doctor.ts 的 KnowledgeHealthScorer 承载)
36
38
  - 被 `src/cli/commands/knowledge.ts` CLI 消费(含 `migrate` 子命令)
37
39
 
38
40
  ## 约定
41
+ - 知识条目文件的 frontmatter 语法只由 `src/utils/frontmatter` 定义(harness#89):缺头/空 meta = `absent`(合法输入,按非条目静默处理);未闭合/YAML 非法 = `malformed`(必须显式上报后按消费方语义恢复——migration 落 `errors`、store 与 index-generator 打一行 stderr 后跳过或走 best-effort),禁止静默丢条目;canonical 字段序是 `store.toFrontmatter` 的私有策略,`join` 只管包裹格式
39
42
  - 知识条目有明确的生命周期状态(按 consumptionMode 分化)
40
43
  - 约束退役(`harness constraints retire`,人确认)时写入 KnowledgeStore:规则原文 + 退役原因 + 历史统计
41
44
  - Linter 检查完整性/一致性/时效性三个维度
42
- - Audit 6 维度评分:D1结构 D2内容 D3去重 D4成熟度 D5新鲜度 D6飞轮
45
+ - Audit 7 维度评分:D1结构 D2内容 D3去重 D4成熟度 D5新鲜度 D6飞轮 D7增量存活
43
46
  - Ingest gate: ingestEntry() 先经 audit.validate() 检查,reject 不入库
44
47
  - 外部内容三层防御:ingest sanitization + retrieval marking + prompt constraint
45
48
  - 消费饱和度替代固定 TTL 用于 signal 过期判断
49
+ - **飞轮指标只有一个实现**(ADR-0013):`refCoverage` / `avgRefs` / `consumptionHitRate` 一律出自 `flywheel-metrics.evaluateFlywheel()`,canonical 分子 = `genuineRefs()` 过滤后的真实消费引用(`search|test-agent|prompt-inject|monitor|analyst|...:<date>` 自动化按天记账键不算消费,`unknown:` 注入键算消费)。audit D6 / `knowledge stats` / `knowledge health` 只在展示层做单位与字段名映射(百分比取整、一位小数、`avgRefs`→`avgRefCount`),人口筛选留在各调用方。新增消费方禁止自行数 `referencedBy.length`。
46
50
 
47
51
  ## 注意事项
48
52
  - Phase 1+4 实现的知识引擎核心
49
53
  - 约束"退役不删除"——retire 落盘 config.yml `enabled: false` + retired 元数据,保留规则原文 + 退役原因 + 历史统计(可回滚)
50
54
  - `MaturityLevel` 包含 6 个值: draft/verified/proven/archived/active/deprecated
51
55
  - `excludeArchived` 同时排除 archived 和 deprecated
56
+ - 仍有两处按**原始** `referencedBy.length` 判定,不属飞轮指标、ADR-0013 明确列为范围外:`lifecycle.ts` 的 signal 饱和 / reference 激活(退役阈值调整另票)、`knowledge health` 的 D1「verified 零引用」线索提示(逐条 issue 线索,非聚合分子)
@@ -0,0 +1,44 @@
1
+ /**
2
+ * 审计规则 label 闭环测试(架构评审 A6,#109)
3
+ *
4
+ * label 正本在 audit.ts 规则定义上(定义即注册),AUDIT_RULE_LABELS 派生自规则表。
5
+ * 新增规则无 label → 编译期/本测试期即失败,CLI 不再静默回落英文键名。
6
+ */
7
+
8
+ import * as fs from 'fs';
9
+ import * as os from 'os';
10
+ import * as path from 'path';
11
+ import { KnowledgeAudit, AUDIT_RULE_LABELS } from '../audit';
12
+ import type { AuditRuleName } from '../audit';
13
+
14
+ function makeTmpDir(): string {
15
+ return fs.mkdtempSync(path.join(os.tmpdir(), 'audit-labels-test-'));
16
+ }
17
+
18
+ describe('AUDIT_RULE_LABELS', () => {
19
+ let tmpDir: string;
20
+
21
+ beforeEach(() => {
22
+ tmpDir = makeTmpDir();
23
+ });
24
+
25
+ afterEach(() => {
26
+ fs.rmSync(tmpDir, { recursive: true, force: true });
27
+ });
28
+
29
+ it('应与运行期 summary 的规则键集完全一致(双向闭环)', () => {
30
+ const report = new KnowledgeAudit({ baseDir: tmpDir }).run();
31
+ const summaryKeys = Object.keys(report.summary).sort();
32
+ const labelKeys = (Object.keys(AUDIT_RULE_LABELS) as AuditRuleName[]).sort();
33
+ expect(labelKeys).toEqual(summaryKeys);
34
+ });
35
+
36
+ it('每条规则都有非空中文 label,event-noise / deprecated-domain 不再缺失', () => {
37
+ for (const [rule, label] of Object.entries(AUDIT_RULE_LABELS)) {
38
+ expect(label.trim().length).toBeGreaterThan(0);
39
+ expect(label).not.toBe(rule); // 不允许回落英文键名
40
+ }
41
+ expect(AUDIT_RULE_LABELS['event-noise']).toBe('运维事件噪音');
42
+ expect(AUDIT_RULE_LABELS['deprecated-domain']).toBe('废弃领域残留');
43
+ });
44
+ });