@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
package/CHANGELOG.md CHANGED
@@ -6,6 +6,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.4.0] - 2026-09-08
10
+
11
+ ### Changes
12
+ - fix(core,gates)!: 两个测试门禁判「过没过」的依据统一为**退出码为主 + 文本交叉否决**(ADR-0014,harness#93)——判定收在 `core/validators/test-output.ts` 新增的 `judgeTestRun({exitCode, output, allowPartialPass})` 一处,两门禁的结论一律从它取:passes-gate 成功分支不再硬编码 `passed = true`(exit 0 而输出含 `✕` 用例 / `FAIL <path>` 套件行 / `N failed` 汇总行 → 判负),acceptance 弃用裸 `includes('PASS') && !includes('FAIL')` 兜底(通过的用例名里带大写 `FAIL`、路径含 `FAIL/` 目录名不再反转结论;jest 零失败汇总行无 "passed" 字样也不再误伤),文本再也救不回非零退出。`allowPartialPass`(CLI `--allow-partial`)的落点从「赦免非零退出」移到「关闭文本否决」这一维。exit 0 的空输出/零测试不再判负(零测试识别另票)。按 minor 发布:`PassesGate.check()` 的 `allowed` 得出条件属行为变更,studio 消费的 `{allowed, violations}` 形状不变
13
+ - refactor(core)!: **harness 核心判定不取数、不执法覆盖率**(裁决 B 删薄,ADR-0015,harness#94)——删 `core/validators/test-output.ts` 的 `extractCoverage`(stdout 文本正则路:jest `All files |`、istanbul `Statements :`、pytest-cov `TOTAL`)与公开类型 `TaskTestResult.coverage`(含 `types/session.ts` 模块内镜像类型的同名字段):该正则的唯一用途是填这个全仓零读取的展示字段,`PassesGate.check()` 只读 `passed`/`evidence`。保留并逐字不变的两处真执法:CLI `harness passes-gate --coverage`(`coverageCheck`,读 json-summary、阈值默认 80、未达标不改退出码)与 `performance` 门禁的 `collectCoverage`;`check()` 入参类型 `TestResult.coverage` 亦保留(调用方自备数据,只原样回显)。职责边界定名:要「覆盖率不达阈值就拦」用 performance 门禁或 CI,不用 passes-gate。按 minor 发布:`TaskTestResult` / `ExtensionTestResult` 是包根公开类型的字段收缩,唯一外部消费方 studio 对该字段零引用(ADR-0012 核实),不留兼容 shim
14
+ - fix(core,gates)!: 两个门禁的 `-p/--project-path` 不再半失效(harness#95)——立约定「projectPath 只在 CLI 入口兜底一次,之后传到每个 IO/执行点」并据此修两处:`PassesGate.runTests()` 内部的 `const workDir = process.cwd()` 改为**必传形参** `runTests(workDir)`(此前 `-p` 只喂命令探测,执行与证据落盘仍在 cwd → 拿 A 工程的命令、在 B 目录跑、证据写进 B),`SpecAcceptanceGate` 删掉构造器默认值 `tasksPath: './tasks.yml'`、check() 取径统一 `path.resolve(context.projectPath, …)`(相对值不再按调用方 cwd 解析;acceptance 的「无 tasks.yml 即跳过」本身是 passed:true,读错位置即假绿)。约定正本 `src/cli/commands/CONTEXT.md`;机器可检两道闸:`src/cli/commands/__tests__/project-path-convention.test.ts`(CLI 层 cwd 只能是兜底形状 + 下游 cwd 站点与 `xxxPath: 相对值` 默认值冻结豁免表,逐条带理由、站点消失不删条目也失败)与 `project-path-anchoring.test.ts`(前提统一 cwd ≠ projectPath、不 mock 任何 IO 的行为回归)。同型扫荡三处豁免留痕:`release` 的 pkgPath(定义表本无 `-p`,根已逐个传给每条 `run(cmd, pkgPath)`)、`constraints` 的版本读取(报 harness 自身包版本,主锚 `__dirname`、cwd 仅兜底)、`core/spec/validator.ts` 的 `schemaPath: './specs/schemas'`(**确是同型病灶**:找 spec 文件用 projectPath、找 schema 用 cwd;`validateFile`/`loadSchema` 签名无根,属 spec 域收口,另票)。按 minor 发布:`PassesGate.runTests()` 是包根公开类的方法签名变更(调用方必须传执行根),无 config 构造的 `SpecAcceptanceGate` 其 tasks.yml 落点从 `<cwd>/tasks.yml` 变为 `<projectPath>/tasks.yml`
15
+ - feat(monitoring,core,cli): 坏行计数从 module 层贯通到消费面——立契约「**凡以 `skip` 策略读 JSONL,坏行计数必须到达该消费面的用户可见输出,或在调用点显式记名豁免并写明理由**」(#82 范围外项,harness#100)——#82 只做到「不抛 + 返回部分结果」,同一份损坏在四条路里两条静默吞、一条把损坏算成正常、一条报错,studio 端点连原来的 `logger.error` 都没了。承载纯增量、不动任何既有签名:`TraceCollector.readReport(filter?)` 与 `TraceAnalyzer.analyzeRecentReport(hours)` 是新增报告入口(就地返回形状 `{traces|summaries, skippedLines}`,`JsonlReadResult`/`JsonlBadLinePolicy` 不进包根,ADR-0003 类型面零扩张),`read()/readRecent()/readByConstraint()/getStats()/analyzeRecent()/analyzeConstraint()` 退化为丢掉计数的薄包装(#82 裁决 4 的兼容约束继续成立,`skipped-lines-report.test.ts` 用类型断言 + `@ts-expect-error` 在编译期钉住),计数是**文件级口径**(坏行没有 timestamp/constraintId 可归窗,故消费方无法用「原始行数 − 统计条数」反推——这条写死,挡实现捷径)。四处消费点逐一收口:`constraints report` 的坏行数挂 `ConstraintsUsageReport.traceFileExists` 同一降级维度(新增 `readProjectTracesReport()`,文本降级行 / `--json` 字段 / `--export` 摘要行三处呈现,只报条数不报路径与坏行内容)、`harness status` 的 `记录数` 保持原始行数口径**逐字节不变**(坏行另起一行 stderr,改口径属行为变更本票不做)、`constraints retire` 两条路径(交互与 `--yes` 直达)落盘前告知、`failure list` 的 #96 定稿文案与退出码逐字未动。其余 skip 读点逐个记名豁免(transcript / session-manager×2 / context-builder×2 / context-tracker / reference-tracker / recorder),豁免注释如实写明影响方向与不透传的代价;机器可检面新增 `src/utils/__tests__/jsonl-skip-disposition.test.ts` 三道闸(每个 `readJsonl` 调用点必须判得出策略、skip 读点集合冻结 12 处、每个读点上方 6 行内声明 `计数去向:` 且邻居声明不顶替)。studio 半边(端点响应体加 `skippedLines`)在 **dommaker/studio#451**,前置是本票随 `harness-ship release` 发版
16
+
9
17
  ## [1.3.0] - 2026-09-01
10
18
 
11
19
  ### Changes
package/README.md CHANGED
@@ -36,7 +36,6 @@ await checkBeforeExecution({
36
36
  operation: 'code_implementation',
37
37
  taskDescription: '重构用户认证模块',
38
38
  projectPath: '/path/to/project',
39
- hasWorktree: true,
40
39
  });
41
40
 
42
41
  // 获取约束元数据
@@ -111,7 +110,6 @@ harness update-user-model # 增量更新用户思维模型
111
110
 
112
111
  # 文档与 Spec
113
112
  harness sync-docs # 同步 CAPABILITIES.md + CONTEXT.md + AGENTS.md
114
- harness doc-freshness-check # 文档声明新鲜度检查
115
113
  harness spec # Spec 验证
116
114
  harness spec-baseline-check # Spec 前置条件验证
117
115
  harness sdd # SDD 索引管理
package/bin/harness.js CHANGED
@@ -11,18 +11,43 @@
11
11
  * COMMAND_DEFINITIONS(非门禁命令)与 GATE_DEFINITIONS.cli(6 门禁命令,
12
12
  * 形状同为 CommandDefinition,ADR-0007),不含任何单命令知识;
13
13
  * 新增命令 = 命令文件 + 定义表一条 + 测试,不再改本文件。
14
+ *
15
+ * 架构评审候选7:本文件是**全仓唯一的退出码出口**。命令实现返回 CommandResult
16
+ * ({ kind, reason? }),此处按 kind 做唯一映射(ok/skip → 0,fail/usage-error → 1);
17
+ * 命令实现与定义表内不得出现 process.exit / process.exitCode。
14
18
  */
15
19
 
16
20
  const { Command } = require('commander');
17
21
  const { version } = require('../package.json');
18
22
 
19
23
  /**
20
- * 命令定义表(纯数据模块,无实现 import),--help/--version 懒加载不受影响;
21
- * 门禁注册表双向闭环校验在实现加载期执行(src/gates/registry.ts),
22
- * 命令实现引用可解析性断言在测试期执行(src/cli/commands/__tests__/registry.test.ts)。
24
+ * kind 对外退出码(历史面只有 0/1;语义进类型,码值映射只在这一处)。
25
+ * 未知/缺失 kind = 命令契约违规 → fail-closed。
26
+ */
27
+ function exitCodeFor(result) {
28
+ switch (result && result.kind) {
29
+ case 'ok':
30
+ case 'skip':
31
+ return 0;
32
+ case 'fail':
33
+ case 'usage-error':
34
+ return 1;
35
+ default:
36
+ console.error(`[harness] 命令返回了未知判定结果(期望 kind ok/skip/fail/usage-error): ${JSON.stringify(result)}`);
37
+ return 1;
38
+ }
39
+ }
40
+
41
+ /**
42
+ * 把命令判定映射到进程退出码。
43
+ * 0 不退出(沿用进程自然退出,保持 stdout 冲刷行为不变);非 0 立即退出
44
+ * (与历史各命令自身的 process.exit 行为一致:首败即停)。
23
45
  */
24
- const { COMMAND_DEFINITIONS } = require('../dist/cli/commands/definitions');
25
- const { GATE_DEFINITIONS } = require('../dist/gates/definitions');
46
+ function applyResult(result) {
47
+ const code = exitCodeFor(result);
48
+ if (code !== 0) process.exit(code);
49
+ return code;
50
+ }
26
51
 
27
52
  /**
28
53
  * per-command 懒加载(O2):按定义表中的 module+export 引用,只在 action
@@ -81,19 +106,31 @@ function buildCommand(parent, def) {
81
106
  }
82
107
  }
83
108
 
109
+ /**
110
+ * 子命令解析:主名直查,别名表遍历匹配(候选7:别名是数据,不再复印条目)
111
+ */
112
+ function resolveSubcommand(subcommands, name) {
113
+ if (subcommands[name]) return subcommands[name];
114
+ for (const entry of Object.values(subcommands)) {
115
+ if (entry.aliases && entry.aliases.includes(name)) return entry;
116
+ }
117
+ return null;
118
+ }
119
+
84
120
  /**
85
121
  * 执行一条命令定义:
86
122
  * 1. optionRoutes(选项条件路由,全部匹配项按序执行,替代默认 action)
87
- * 2. subcommands(位置参数首值路由;strict 下未知值报错退出)
123
+ * 2. subcommands(位置参数首值路由,含别名;strict 下未知值报错退出)
88
124
  * 3. 默认 action
89
- * afterRun 统一接收返回值(如 sync-docs --check 失败 exit(1))
125
+ * 每条路由/子命令/action 的返回值都经 applyResult 映射退出码(首败即停,
126
+ * 与历史命令自身 process.exit 的截断行为一致)。
90
127
  */
91
128
  async function runDefinition(command, def, positionals, options) {
92
129
  if (def.optionRoutes) {
93
130
  const matched = def.optionRoutes.filter(r => options[r.flag] === r.when);
94
131
  if (matched.length > 0) {
95
132
  for (const route of matched) {
96
- await callImpl(route.impl, route.args ? route.args(positionals, options) : [options]);
133
+ applyResult(await callImpl(route.impl, [options]));
97
134
  }
98
135
  return;
99
136
  }
@@ -102,15 +139,18 @@ async function runDefinition(command, def, positionals, options) {
102
139
  if (def.subcommands) {
103
140
  const sub = positionals[0];
104
141
  if (sub != null) {
105
- const entry = def.subcommands[sub];
142
+ const entry = resolveSubcommand(def.subcommands, sub);
106
143
  if (entry) {
107
- const result = await callImpl(entry.impl, entry.args ? entry.args(positionals.slice(1), options) : [options]);
108
- if (def.afterRun) def.afterRun(result, options);
144
+ const callArgs = entry.withPositionals
145
+ ? [positionals.slice(1), options]
146
+ : [options];
147
+ applyResult(await callImpl(entry.impl, callArgs));
109
148
  return;
110
149
  }
111
150
  if (def.subcommandStrict !== false) {
112
151
  console.error(`未知子命令: ${sub}`);
113
- process.exit(1);
152
+ applyResult({ kind: 'usage-error', reason: `未知子命令: ${sub}` });
153
+ return;
114
154
  }
115
155
  // 非 strict(如 spec / 门禁命令):未知位置参数落回默认 action
116
156
  } else if (!def.bareRunsAction) {
@@ -124,27 +164,41 @@ async function runDefinition(command, def, positionals, options) {
124
164
  command.help();
125
165
  return;
126
166
  }
127
- const result = await callImpl(def.action, def.mapActionArgs ? def.mapActionArgs(positionals, options) : [options]);
128
- if (def.afterRun) def.afterRun(result, options);
167
+ applyResult(await callImpl(def.action, def.mapActionArgs ? def.mapActionArgs(positionals, options) : [options]));
168
+ }
169
+
170
+ /**
171
+ * 构建命令树并解析。定义表在此处才 require(纯数据模块,保持 --help/--version
172
+ * 零命令实现加载);被 require 时(bin 侧退出码映射测试)不触发解析。
173
+ */
174
+ function main() {
175
+ const { COMMAND_DEFINITIONS } = require('../dist/cli/commands/definitions');
176
+ const { GATE_DEFINITIONS } = require('../dist/gates/definitions');
177
+
178
+ const program = new Command();
179
+
180
+ program
181
+ .name('harness')
182
+ .description('通用工程约束框架 - 铁律系统、检查点验证、测试门控、执行追踪')
183
+ .version(version);
184
+
185
+ // ========================================
186
+ // 全部命令:注册表驱动生成(非门禁 COMMAND_DEFINITIONS + 门禁 GATE_DEFINITIONS.cli,
187
+ // 形状同为 CommandDefinition,ADR-0007)
188
+ // ========================================
189
+ for (const def of [
190
+ ...COMMAND_DEFINITIONS,
191
+ ...GATE_DEFINITIONS.filter(g => g.cli).map(g => g.cli),
192
+ ]) {
193
+ buildCommand(program, def);
194
+ }
195
+
196
+ // 解析命令行参数
197
+ program.parse();
129
198
  }
130
199
 
131
- const program = new Command();
132
-
133
- program
134
- .name('harness')
135
- .description('通用工程约束框架 - 铁律系统、检查点验证、测试门控、执行追踪')
136
- .version(version);
137
-
138
- // ========================================
139
- // 全部命令:注册表驱动生成(非门禁 COMMAND_DEFINITIONS + 门禁 GATE_DEFINITIONS.cli,
140
- // 形状同为 CommandDefinition,ADR-0007)
141
- // ========================================
142
- for (const def of [
143
- ...COMMAND_DEFINITIONS,
144
- ...GATE_DEFINITIONS.filter(g => g.cli).map(g => g.cli),
145
- ]) {
146
- buildCommand(program, def);
200
+ if (require.main === module) {
201
+ main();
147
202
  }
148
203
 
149
- // 解析命令行参数
150
- program.parse();
204
+ module.exports = { exitCodeFor, applyResult };
@@ -0,0 +1,83 @@
1
+ /**
2
+ * CLI 命令契约(架构评审候选7)
3
+ *
4
+ * 命令实现的 interface 由两部分组成,都在本模块定义:
5
+ * - **返回值 `CommandResult`**:判定结果(哪个 kind、为什么)。退出码不再由命令
6
+ * 自己 `process.exit`,而是由 bin 依 kind 唯一映射(`process.exit` 因此只出现在
7
+ * bin/harness.js 一处)。
8
+ * - **写入面 `CommandIO`**:流式输出去向。命令一律经注入的 io 打印,缺省 process
9
+ * 标准流——长命令(如 release)边跑边输出,不憋到结束由 bin 统一打印。
10
+ *
11
+ * 对外行为护栏:`processIO` 下 log/logError 的输出字节与 console.log/console.error
12
+ * 逐字一致(见 __tests__/command-contract.test.ts),CLI 语法与文案冻结。
13
+ */
14
+ /**
15
+ * 命令判定类别。
16
+ * 对外退出码只有 0/1(历史面),语义放进 kind,码值映射收敛在 bin。
17
+ */
18
+ export type CommandKind = 'ok' | 'skip' | 'fail' | 'usage-error';
19
+ /**
20
+ * 命令实现返回值(判别联合)。
21
+ * `fail` / `usage-error` 必附 `reason`,且 reason 要能唯一定位失败点
22
+ * (多闸门命令须含闸门标识);`skip` 可选附原因。
23
+ */
24
+ export type CommandResult = {
25
+ kind: 'ok';
26
+ } | {
27
+ kind: 'skip';
28
+ reason?: string;
29
+ } | {
30
+ kind: 'fail';
31
+ reason: string;
32
+ } | {
33
+ kind: 'usage-error';
34
+ reason: string;
35
+ };
36
+ /**
37
+ * 命令输出流注入面(最小可写接口,`process.stdout` / `process.stderr` 结构化满足)
38
+ */
39
+ export interface CommandIO {
40
+ stdout: {
41
+ write(chunk: string): boolean;
42
+ };
43
+ stderr: {
44
+ write(chunk: string): boolean;
45
+ };
46
+ }
47
+ /** 缺省 io:process 标准流(bin 不注入时的现状行为) */
48
+ export declare const processIO: CommandIO;
49
+ /**
50
+ * 与 console.log 同语义(util.format + 换行)写入 io.stdout
51
+ */
52
+ export declare function log(io: CommandIO, ...args: unknown[]): void;
53
+ /**
54
+ * 与 console.error 同语义(util.format + 换行)写入 io.stderr
55
+ */
56
+ export declare function logError(io: CommandIO, ...args: unknown[]): void;
57
+ /**
58
+ * 捕获型 io:测试注入面,替代 `spyOn(process, 'exit')` 时代的彩色字符串断言。
59
+ */
60
+ export interface CapturingIO extends CommandIO {
61
+ /** 已写入 stdout 的全部文本 */
62
+ outText(): string;
63
+ /** 已写入 stderr 的全部文本 */
64
+ errText(): string;
65
+ /** stdout 按行切分(末尾换行不产生空尾行) */
66
+ outLines(): string[];
67
+ /** stderr 按行切分(末尾换行不产生空尾行) */
68
+ errLines(): string[];
69
+ /** stdout 每次写入的原始文本(一次 log 调用 = 一条记录,等价旧的 console.log 调用参数视图) */
70
+ outRecords(): string[];
71
+ /** stderr 每次写入的原始文本 */
72
+ errRecords(): string[];
73
+ }
74
+ export declare function captureIO(): CapturingIO;
75
+ /**
76
+ * 解析 --json 命令的捕获输出(测试断言面,harness#108)
77
+ *
78
+ * 与 captureIO 同住一处:它是 captureIO 的消费端正本,此前散在各命令测试里
79
+ * 逐字复制(JSON.parse(outText()))。缺省返回 Record 形状;消费方已知字段
80
+ * 形状时传泛型(如 lastJsonOutput<any>(io) 做任意字段穿透)。
81
+ */
82
+ export declare function lastJsonOutput<T = Record<string, unknown>>(capture: CapturingIO): T;
83
+ //# sourceMappingURL=command-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-contract.d.ts","sourceRoot":"","sources":["../../src/cli/command-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;AAEjE;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GACd;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC1C,MAAM,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CAC3C;AAED,uCAAuC;AACvC,eAAO,MAAM,SAAS,EAAE,SAGvB,CAAC;AAEF;;GAEG;AACH,wBAAgB,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAE3D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAEhE;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,uBAAuB;IACvB,OAAO,IAAI,MAAM,CAAC;IAClB,uBAAuB;IACvB,OAAO,IAAI,MAAM,CAAC;IAClB,8BAA8B;IAC9B,QAAQ,IAAI,MAAM,EAAE,CAAC;IACrB,8BAA8B;IAC9B,QAAQ,IAAI,MAAM,EAAE,CAAC;IACrB,iEAAiE;IACjE,UAAU,IAAI,MAAM,EAAE,CAAC;IACvB,uBAAuB;IACvB,UAAU,IAAI,MAAM,EAAE,CAAC;CACxB;AAED,wBAAgB,SAAS,IAAI,WAAW,CAiBvC;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,CAAC,CAEnF"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /**
3
+ * CLI 命令契约(架构评审候选7)
4
+ *
5
+ * 命令实现的 interface 由两部分组成,都在本模块定义:
6
+ * - **返回值 `CommandResult`**:判定结果(哪个 kind、为什么)。退出码不再由命令
7
+ * 自己 `process.exit`,而是由 bin 依 kind 唯一映射(`process.exit` 因此只出现在
8
+ * bin/harness.js 一处)。
9
+ * - **写入面 `CommandIO`**:流式输出去向。命令一律经注入的 io 打印,缺省 process
10
+ * 标准流——长命令(如 release)边跑边输出,不憋到结束由 bin 统一打印。
11
+ *
12
+ * 对外行为护栏:`processIO` 下 log/logError 的输出字节与 console.log/console.error
13
+ * 逐字一致(见 __tests__/command-contract.test.ts),CLI 语法与文案冻结。
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.processIO = void 0;
17
+ exports.log = log;
18
+ exports.logError = logError;
19
+ exports.captureIO = captureIO;
20
+ exports.lastJsonOutput = lastJsonOutput;
21
+ const util_1 = require("util");
22
+ /** 缺省 io:process 标准流(bin 不注入时的现状行为) */
23
+ exports.processIO = {
24
+ stdout: process.stdout,
25
+ stderr: process.stderr,
26
+ };
27
+ /**
28
+ * 与 console.log 同语义(util.format + 换行)写入 io.stdout
29
+ */
30
+ function log(io, ...args) {
31
+ io.stdout.write((0, util_1.format)(...args) + '\n');
32
+ }
33
+ /**
34
+ * 与 console.error 同语义(util.format + 换行)写入 io.stderr
35
+ */
36
+ function logError(io, ...args) {
37
+ io.stderr.write((0, util_1.format)(...args) + '\n');
38
+ }
39
+ function captureIO() {
40
+ let out = '';
41
+ let err = '';
42
+ const outChunks = [];
43
+ const errChunks = [];
44
+ const split = (text) => text.endsWith('\n') ? text.slice(0, -1).split('\n') : (text === '' ? [] : text.split('\n'));
45
+ return {
46
+ stdout: { write: (chunk) => { out += chunk; outChunks.push(chunk); return true; } },
47
+ stderr: { write: (chunk) => { err += chunk; errChunks.push(chunk); return true; } },
48
+ outText: () => out,
49
+ errText: () => err,
50
+ outLines: () => split(out),
51
+ errLines: () => split(err),
52
+ outRecords: () => [...outChunks],
53
+ errRecords: () => [...errChunks],
54
+ };
55
+ }
56
+ /**
57
+ * 解析 --json 命令的捕获输出(测试断言面,harness#108)
58
+ *
59
+ * 与 captureIO 同住一处:它是 captureIO 的消费端正本,此前散在各命令测试里
60
+ * 逐字复制(JSON.parse(outText()))。缺省返回 Record 形状;消费方已知字段
61
+ * 形状时传泛型(如 lastJsonOutput<any>(io) 做任意字段穿透)。
62
+ */
63
+ function lastJsonOutput(capture) {
64
+ return JSON.parse(capture.outText());
65
+ }
66
+ //# sourceMappingURL=command-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-contract.js","sourceRoot":"","sources":["../../src/cli/command-contract.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAsCH,kBAEC;AAKD,4BAEC;AAoBD,8BAiBC;AASD,wCAEC;AA7FD,+BAA8B;AA2B9B,uCAAuC;AAC1B,QAAA,SAAS,GAAc;IAClC,MAAM,EAAE,OAAO,CAAC,MAAM;IACtB,MAAM,EAAE,OAAO,CAAC,MAAM;CACvB,CAAC;AAEF;;GAEG;AACH,SAAgB,GAAG,CAAC,EAAa,EAAE,GAAG,IAAe;IACnD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,aAAM,EAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,SAAgB,QAAQ,CAAC,EAAa,EAAE,GAAG,IAAe;IACxD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,aAAM,EAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC1C,CAAC;AAoBD,SAAgB,SAAS;IACvB,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,IAAY,EAAY,EAAE,CACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9F,OAAO;QACL,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE;QAC3F,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE;QAC3F,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG;QAClB,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG;QAClB,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;QAC1B,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;QAC1B,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;QAChC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;KACjC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,cAAc,CAA8B,OAAoB;IAC9E,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;AACvC,CAAC"}
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * 验收标准门控,检查任务是否满足验收标准
5
5
  */
6
+ import { type CommandIO, type CommandResult } from '../command-contract';
6
7
  export interface AcceptanceOptions {
7
8
  /** 任务 ID */
8
9
  taskId?: string;
@@ -18,9 +19,9 @@ export interface AcceptanceOptions {
18
19
  /**
19
20
  * 执行验收门控
20
21
  */
21
- export declare function acceptance(options: AcceptanceOptions): Promise<void>;
22
+ export declare function acceptance(options: AcceptanceOptions, io?: CommandIO): Promise<CommandResult>;
22
23
  /**
23
24
  * 列出所有任务及其验收标准
24
25
  */
25
- export declare function listAcceptanceCriteria(options: AcceptanceOptions): Promise<void>;
26
+ export declare function listAcceptanceCriteria(options: AcceptanceOptions, io?: CommandIO): Promise<CommandResult>;
26
27
  //# sourceMappingURL=acceptance.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"acceptance.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/acceptance.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,iBAAiB;IAChC,YAAY;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kBAAkB;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C1E;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCtF"}
1
+ {"version":3,"file":"acceptance.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/acceptance.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAkB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzF,MAAM,WAAW,iBAAiB;IAChC,YAAY;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kBAAkB;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,iBAAiB,EAC1B,EAAE,GAAE,SAAqB,GACxB,OAAO,CAAC,aAAa,CAAC,CA8CxB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,iBAAiB,EAC1B,EAAE,GAAE,SAAqB,GACxB,OAAO,CAAC,aAAa,CAAC,CAmCxB"}
@@ -47,11 +47,12 @@ const chalk_1 = __importDefault(require("chalk"));
47
47
  const fs = __importStar(require("fs/promises"));
48
48
  const path = __importStar(require("path"));
49
49
  const acceptance_1 = require("../../gates/acceptance");
50
+ const command_contract_1 = require("../command-contract");
50
51
  /**
51
52
  * 执行验收门控
52
53
  */
53
- async function acceptance(options) {
54
- console.log(chalk_1.default.blue('📋 验收标准门控检查...'));
54
+ async function acceptance(options, io = command_contract_1.processIO) {
55
+ (0, command_contract_1.log)(io, chalk_1.default.blue('📋 验收标准门控检查...'));
55
56
  const projectPath = options.projectPath || process.cwd();
56
57
  // 创建验收门控实例
57
58
  const gate = new acceptance_1.SpecAcceptanceGate({
@@ -67,37 +68,38 @@ async function acceptance(options) {
67
68
  };
68
69
  const result = await gate.check(context);
69
70
  if (result.passed) {
70
- console.log();
71
- console.log(chalk_1.default.green('✅ 验收标准检查通过'));
71
+ (0, command_contract_1.log)(io);
72
+ (0, command_contract_1.log)(io, chalk_1.default.green('✅ 验收标准检查通过'));
72
73
  if (result.details) {
73
- console.log(chalk_1.default.gray(` 通过项: ${result.details.checkedCriteria ?? 0}`));
74
- console.log(chalk_1.default.gray(` 总项数: ${result.details.totalCriteria ?? 0}`));
74
+ (0, command_contract_1.log)(io, chalk_1.default.gray(` 通过项: ${result.details.checkedCriteria ?? 0}`));
75
+ (0, command_contract_1.log)(io, chalk_1.default.gray(` 总项数: ${result.details.totalCriteria ?? 0}`));
75
76
  }
76
77
  }
77
78
  else {
78
- console.log();
79
- console.log(chalk_1.default.red('❌ 验收标准检查失败'));
80
- console.log(chalk_1.default.red(` ${result.message}`));
79
+ (0, command_contract_1.log)(io);
80
+ (0, command_contract_1.log)(io, chalk_1.default.red('❌ 验收标准检查失败'));
81
+ (0, command_contract_1.log)(io, chalk_1.default.red(` ${result.message}`));
81
82
  if (result.details?.uncheckedCriteria) {
82
83
  result.details.uncheckedCriteria.forEach((criteria) => {
83
- console.log(chalk_1.default.red(` - ${criteria}`));
84
+ (0, command_contract_1.log)(io, chalk_1.default.red(` - ${criteria}`));
84
85
  });
85
86
  }
86
- process.exit(1);
87
+ return { kind: 'fail', reason: `acceptance gate denied: ${result.message}` };
87
88
  }
89
+ return { kind: 'ok' };
88
90
  }
89
91
  catch (error) {
90
- console.log();
91
- console.log(chalk_1.default.red('❌ 验收标准检查出错'));
92
- console.log(chalk_1.default.red(` ${error.message}`));
93
- process.exit(1);
92
+ (0, command_contract_1.log)(io);
93
+ (0, command_contract_1.log)(io, chalk_1.default.red('❌ 验收标准检查出错'));
94
+ (0, command_contract_1.log)(io, chalk_1.default.red(` ${error.message}`));
95
+ return { kind: 'fail', reason: `acceptance gate error: ${error.message}` };
94
96
  }
95
97
  }
96
98
  /**
97
99
  * 列出所有任务及其验收标准
98
100
  */
99
- async function listAcceptanceCriteria(options) {
100
- console.log(chalk_1.default.blue('📋 任务验收标准列表...\n'));
101
+ async function listAcceptanceCriteria(options, io = command_contract_1.processIO) {
102
+ (0, command_contract_1.log)(io, chalk_1.default.blue('📋 任务验收标准列表...\n'));
101
103
  const projectPath = options.projectPath || process.cwd();
102
104
  const tasksPath = options.tasksPath || path.join(projectPath, 'tasks.yml');
103
105
  try {
@@ -105,27 +107,29 @@ async function listAcceptanceCriteria(options) {
105
107
  const yaml = await Promise.resolve().then(() => __importStar(require('js-yaml')));
106
108
  const tasks = yaml.load(content);
107
109
  if (!tasks || typeof tasks !== 'object') {
108
- console.log(chalk_1.default.yellow('⚠️ 未找到任务定义'));
109
- return;
110
+ (0, command_contract_1.log)(io, chalk_1.default.yellow('⚠️ 未找到任务定义'));
111
+ return { kind: 'skip', reason: `未找到任务定义: ${tasksPath}` };
110
112
  }
111
113
  for (const [taskId, task] of Object.entries(tasks)) {
112
114
  if (typeof task === 'object' && task !== null) {
113
- console.log(chalk_1.default.cyan(`${taskId}:`));
115
+ (0, command_contract_1.log)(io, chalk_1.default.cyan(`${taskId}:`));
114
116
  const taskObj = task;
115
117
  if (taskObj.acceptanceCriteria) {
116
118
  taskObj.acceptanceCriteria.forEach((criteria, i) => {
117
- console.log(chalk_1.default.gray(` ${i + 1}. ${criteria}`));
119
+ (0, command_contract_1.log)(io, chalk_1.default.gray(` ${i + 1}. ${criteria}`));
118
120
  });
119
121
  }
120
122
  else {
121
- console.log(chalk_1.default.gray(' (无验收标准)'));
123
+ (0, command_contract_1.log)(io, chalk_1.default.gray(' (无验收标准)'));
122
124
  }
123
- console.log();
125
+ (0, command_contract_1.log)(io);
124
126
  }
125
127
  }
128
+ return { kind: 'ok' };
126
129
  }
127
130
  catch (error) {
128
- console.log(chalk_1.default.red(`❌ 读取 tasks.yml 失败: ${error.message}`));
131
+ (0, command_contract_1.log)(io, chalk_1.default.red(`❌ 读取 tasks.yml 失败: ${error.message}`));
132
+ return { kind: 'skip', reason: `读取 tasks.yml 失败: ${error.message}` };
129
133
  }
130
134
  }
131
135
  //# sourceMappingURL=acceptance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"acceptance.js","sourceRoot":"","sources":["../../../src/cli/commands/acceptance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acceptance.js","sourceRoot":"","sources":["../../../src/cli/commands/acceptance.ts"],"names":[],"mappings":"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"}
@@ -10,10 +10,11 @@
10
10
  *
11
11
  * 工单 19-C:transcript 解析/纠正模式/分词相似度收敛至 cli/session-mining/。
12
12
  */
13
+ import { type CommandIO, type CommandResult } from '../command-contract';
13
14
  export interface AnalyzeSessionsOptions {
14
15
  days?: number;
15
16
  projectPath?: string;
16
17
  json?: boolean;
17
18
  }
18
- export declare function analyzeSessions(options: AnalyzeSessionsOptions): Promise<void>;
19
+ export declare function analyzeSessions(options: AnalyzeSessionsOptions, io?: CommandIO): Promise<CommandResult>;
19
20
  //# sourceMappingURL=analyze-sessions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-sessions.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/analyze-sessions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAoBH,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAmBD,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CpF"}
1
+ {"version":3,"file":"analyze-sessions.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/analyze-sessions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAmBH,OAAO,EAAkB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzF,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAmBD,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,EAAE,EAAE,GAAE,SAAqB,GAAG,OAAO,CAAC,aAAa,CAAC,CA0CxH"}