@dommaker/harness 1.7.0 → 1.8.1

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 (563) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/bin/harness.js +17 -1
  3. package/dist/agents/index.d.ts +6 -2
  4. package/dist/agents/index.d.ts.map +1 -1
  5. package/dist/agents/index.js +6 -16
  6. package/dist/agents/index.js.map +1 -1
  7. package/dist/cli/commands/__tests__/gate-decision.d.ts +18 -0
  8. package/dist/cli/commands/__tests__/gate-decision.d.ts.map +1 -0
  9. package/dist/cli/commands/__tests__/gate-decision.js +26 -0
  10. package/dist/cli/commands/__tests__/gate-decision.js.map +1 -0
  11. package/dist/cli/commands/acceptance.d.ts.map +1 -1
  12. package/dist/cli/commands/acceptance.js +17 -28
  13. package/dist/cli/commands/acceptance.js.map +1 -1
  14. package/dist/cli/commands/check.d.ts +19 -3
  15. package/dist/cli/commands/check.d.ts.map +1 -1
  16. package/dist/cli/commands/check.js +36 -22
  17. package/dist/cli/commands/check.js.map +1 -1
  18. package/dist/cli/commands/command.d.ts +0 -1
  19. package/dist/cli/commands/command.d.ts.map +1 -1
  20. package/dist/cli/commands/command.js +8 -6
  21. package/dist/cli/commands/command.js.map +1 -1
  22. package/dist/cli/commands/constraints-retire.d.ts.map +1 -1
  23. package/dist/cli/commands/constraints-retire.js +36 -57
  24. package/dist/cli/commands/constraints-retire.js.map +1 -1
  25. package/dist/cli/commands/contract.d.ts.map +1 -1
  26. package/dist/cli/commands/contract.js +36 -42
  27. package/dist/cli/commands/contract.js.map +1 -1
  28. package/dist/cli/commands/definitions.d.ts +2 -0
  29. package/dist/cli/commands/definitions.d.ts.map +1 -1
  30. package/dist/cli/commands/definitions.js +11 -6
  31. package/dist/cli/commands/definitions.js.map +1 -1
  32. package/dist/cli/commands/failure.d.ts.map +1 -1
  33. package/dist/cli/commands/failure.js +16 -2
  34. package/dist/cli/commands/failure.js.map +1 -1
  35. package/dist/cli/commands/init.d.ts +14 -8
  36. package/dist/cli/commands/init.d.ts.map +1 -1
  37. package/dist/cli/commands/init.js +172 -364
  38. package/dist/cli/commands/init.js.map +1 -1
  39. package/dist/cli/commands/knowledge-view.d.ts +90 -0
  40. package/dist/cli/commands/knowledge-view.d.ts.map +1 -0
  41. package/dist/cli/commands/knowledge-view.js +198 -0
  42. package/dist/cli/commands/knowledge-view.js.map +1 -0
  43. package/dist/cli/commands/knowledge.d.ts +137 -52
  44. package/dist/cli/commands/knowledge.d.ts.map +1 -1
  45. package/dist/cli/commands/knowledge.js +534 -400
  46. package/dist/cli/commands/knowledge.js.map +1 -1
  47. package/dist/cli/commands/passes-gate.d.ts +4 -1
  48. package/dist/cli/commands/passes-gate.d.ts.map +1 -1
  49. package/dist/cli/commands/passes-gate.js +11 -2
  50. package/dist/cli/commands/passes-gate.js.map +1 -1
  51. package/dist/cli/commands/performance.d.ts.map +1 -1
  52. package/dist/cli/commands/performance.js +19 -31
  53. package/dist/cli/commands/performance.js.map +1 -1
  54. package/dist/cli/commands/report.d.ts.map +1 -1
  55. package/dist/cli/commands/report.js +2 -1
  56. package/dist/cli/commands/report.js.map +1 -1
  57. package/dist/cli/commands/review.d.ts.map +1 -1
  58. package/dist/cli/commands/review.js +13 -25
  59. package/dist/cli/commands/review.js.map +1 -1
  60. package/dist/cli/commands/scaffold-templates.d.ts +73 -0
  61. package/dist/cli/commands/scaffold-templates.d.ts.map +1 -0
  62. package/dist/cli/commands/scaffold-templates.js +424 -0
  63. package/dist/cli/commands/scaffold-templates.js.map +1 -0
  64. package/dist/cli/commands/scaffold.d.ts +105 -0
  65. package/dist/cli/commands/scaffold.d.ts.map +1 -0
  66. package/dist/cli/commands/scaffold.js +263 -0
  67. package/dist/cli/commands/scaffold.js.map +1 -0
  68. package/dist/cli/commands/security.d.ts.map +1 -1
  69. package/dist/cli/commands/security.js +22 -24
  70. package/dist/cli/commands/security.js.map +1 -1
  71. package/dist/cli/commands/spec-baseline-check.d.ts +43 -0
  72. package/dist/cli/commands/spec-baseline-check.d.ts.map +1 -1
  73. package/dist/cli/commands/spec-baseline-check.js +109 -34
  74. package/dist/cli/commands/spec-baseline-check.js.map +1 -1
  75. package/dist/cli/commands/status.d.ts +8 -0
  76. package/dist/cli/commands/status.d.ts.map +1 -1
  77. package/dist/cli/commands/status.js +5 -7
  78. package/dist/cli/commands/status.js.map +1 -1
  79. package/dist/cli/commands/sync-docs/context-syncer.d.ts +21 -2
  80. package/dist/cli/commands/sync-docs/context-syncer.d.ts.map +1 -1
  81. package/dist/cli/commands/sync-docs/context-syncer.js +112 -28
  82. package/dist/cli/commands/sync-docs/context-syncer.js.map +1 -1
  83. package/dist/cli/commands/sync-docs/index.d.ts +1 -1
  84. package/dist/cli/commands/sync-docs/index.d.ts.map +1 -1
  85. package/dist/cli/commands/sync-docs/index.js +86 -27
  86. package/dist/cli/commands/sync-docs/index.js.map +1 -1
  87. package/dist/cli/commands/sync-docs/project-reader.d.ts +24 -1
  88. package/dist/cli/commands/sync-docs/project-reader.d.ts.map +1 -1
  89. package/dist/cli/commands/sync-docs/project-reader.js +33 -7
  90. package/dist/cli/commands/sync-docs/project-reader.js.map +1 -1
  91. package/dist/cli/commands/validate.d.ts +0 -16
  92. package/dist/cli/commands/validate.d.ts.map +1 -1
  93. package/dist/cli/commands/validate.js +2 -97
  94. package/dist/cli/commands/validate.js.map +1 -1
  95. package/dist/cli/gate-command.d.ts +37 -0
  96. package/dist/cli/gate-command.d.ts.map +1 -0
  97. package/dist/cli/gate-command.js +64 -0
  98. package/dist/cli/gate-command.js.map +1 -0
  99. package/dist/cli/state-io.d.ts +34 -0
  100. package/dist/cli/state-io.d.ts.map +1 -0
  101. package/dist/cli/state-io.js +71 -0
  102. package/dist/cli/state-io.js.map +1 -0
  103. package/dist/completion-checkers/index.d.ts +1 -1
  104. package/dist/completion-checkers/index.d.ts.map +1 -1
  105. package/dist/completion-checkers/index.js +0 -15
  106. package/dist/completion-checkers/index.js.map +1 -1
  107. package/dist/context/knowledge-injector.d.ts +4 -2
  108. package/dist/context/knowledge-injector.d.ts.map +1 -1
  109. package/dist/context/knowledge-injector.js +13 -6
  110. package/dist/context/knowledge-injector.js.map +1 -1
  111. package/dist/core/constraints/agent-prompt-renderer.js +2 -2
  112. package/dist/core/constraints/agent-prompt-renderer.js.map +1 -1
  113. package/dist/core/constraints/capabilities-reconcile.d.ts +20 -0
  114. package/dist/core/constraints/capabilities-reconcile.d.ts.map +1 -1
  115. package/dist/core/constraints/capabilities-reconcile.js +26 -4
  116. package/dist/core/constraints/capabilities-reconcile.js.map +1 -1
  117. package/dist/core/constraints/check-cache.d.ts +1 -1
  118. package/dist/core/constraints/check-cache.js +1 -1
  119. package/dist/core/constraints/checker.d.ts +8 -3
  120. package/dist/core/constraints/checker.d.ts.map +1 -1
  121. package/dist/core/constraints/checker.js +30 -19
  122. package/dist/core/constraints/checker.js.map +1 -1
  123. package/dist/core/constraints/checkers/capability-sync.d.ts +3 -1
  124. package/dist/core/constraints/checkers/capability-sync.d.ts.map +1 -1
  125. package/dist/core/constraints/checkers/capability-sync.js +17 -24
  126. package/dist/core/constraints/checkers/capability-sync.js.map +1 -1
  127. package/dist/core/constraints/checkers/context-doc-sync.d.ts +1 -1
  128. package/dist/core/constraints/checkers/context-doc-sync.d.ts.map +1 -1
  129. package/dist/core/constraints/checkers/context-doc-sync.js +9 -6
  130. package/dist/core/constraints/checkers/context-doc-sync.js.map +1 -1
  131. package/dist/core/constraints/checkers/docs-freshness.d.ts.map +1 -1
  132. package/dist/core/constraints/checkers/docs-freshness.js +24 -30
  133. package/dist/core/constraints/checkers/docs-freshness.js.map +1 -1
  134. package/dist/core/constraints/checkers/governance-presence.d.ts.map +1 -1
  135. package/dist/core/constraints/checkers/governance-presence.js +10 -4
  136. package/dist/core/constraints/checkers/governance-presence.js.map +1 -1
  137. package/dist/core/constraints/checkers/types.d.ts +10 -6
  138. package/dist/core/constraints/checkers/types.d.ts.map +1 -1
  139. package/dist/core/constraints/checkers/types.js +7 -3
  140. package/dist/core/constraints/checkers/types.js.map +1 -1
  141. package/dist/core/constraints/context-builder.d.ts +11 -10
  142. package/dist/core/constraints/context-builder.d.ts.map +1 -1
  143. package/dist/core/constraints/context-builder.js +31 -27
  144. package/dist/core/constraints/context-builder.js.map +1 -1
  145. package/dist/core/constraints/context-reconcile.d.ts +75 -0
  146. package/dist/core/constraints/context-reconcile.d.ts.map +1 -0
  147. package/dist/core/constraints/context-reconcile.js +161 -0
  148. package/dist/core/constraints/context-reconcile.js.map +1 -0
  149. package/dist/core/constraints/doc-freshness/runner.d.ts +7 -0
  150. package/dist/core/constraints/doc-freshness/runner.d.ts.map +1 -1
  151. package/dist/core/constraints/doc-freshness/runner.js +8 -3
  152. package/dist/core/constraints/doc-freshness/runner.js.map +1 -1
  153. package/dist/core/constraints/git-evidence.js +1 -1
  154. package/dist/core/constraints/git-evidence.js.map +1 -1
  155. package/dist/core/constraints/injection-drift.d.ts +7 -2
  156. package/dist/core/constraints/injection-drift.d.ts.map +1 -1
  157. package/dist/core/constraints/injection-drift.js +13 -7
  158. package/dist/core/constraints/injection-drift.js.map +1 -1
  159. package/dist/core/constraints/run-env.d.ts +92 -0
  160. package/dist/core/constraints/run-env.d.ts.map +1 -0
  161. package/dist/core/constraints/run-env.js +175 -0
  162. package/dist/core/constraints/run-env.js.map +1 -0
  163. package/dist/core/constraints/triggers.d.ts +22 -0
  164. package/dist/core/constraints/triggers.d.ts.map +1 -0
  165. package/dist/core/constraints/triggers.js +31 -0
  166. package/dist/core/constraints/triggers.js.map +1 -0
  167. package/dist/core/effective-constraints.d.ts +13 -4
  168. package/dist/core/effective-constraints.d.ts.map +1 -1
  169. package/dist/core/effective-constraints.js +16 -6
  170. package/dist/core/effective-constraints.js.map +1 -1
  171. package/dist/core/effective-set.d.ts +8 -15
  172. package/dist/core/effective-set.d.ts.map +1 -1
  173. package/dist/core/effective-set.js +7 -12
  174. package/dist/core/effective-set.js.map +1 -1
  175. package/dist/core/index.d.ts +1 -0
  176. package/dist/core/index.d.ts.map +1 -1
  177. package/dist/core/index.js.map +1 -1
  178. package/dist/core/project-config-loader.d.ts +39 -17
  179. package/dist/core/project-config-loader.d.ts.map +1 -1
  180. package/dist/core/project-config-loader.js +51 -122
  181. package/dist/core/project-config-loader.js.map +1 -1
  182. package/dist/core/validators/check-handlers/http.d.ts +2 -2
  183. package/dist/core/validators/check-handlers/http.d.ts.map +1 -1
  184. package/dist/core/validators/check-handlers/http.js +12 -7
  185. package/dist/core/validators/check-handlers/http.js.map +1 -1
  186. package/dist/failure/classifier.d.ts +1 -1
  187. package/dist/failure/classifier.d.ts.map +1 -1
  188. package/dist/failure/classifier.js +8 -8
  189. package/dist/failure/classifier.js.map +1 -1
  190. package/dist/failure/index.d.ts +2 -1
  191. package/dist/failure/index.d.ts.map +1 -1
  192. package/dist/failure/index.js +9 -17
  193. package/dist/failure/index.js.map +1 -1
  194. package/dist/failure/recorder.d.ts +1 -1
  195. package/dist/failure/recorder.d.ts.map +1 -1
  196. package/dist/gates/checker-gate.d.ts +2 -1
  197. package/dist/gates/checker-gate.d.ts.map +1 -1
  198. package/dist/gates/checker-gate.js +3 -2
  199. package/dist/gates/checker-gate.js.map +1 -1
  200. package/dist/gates/command.d.ts +10 -4
  201. package/dist/gates/command.d.ts.map +1 -1
  202. package/dist/gates/command.js +36 -62
  203. package/dist/gates/command.js.map +1 -1
  204. package/dist/gates/contract.d.ts.map +1 -1
  205. package/dist/gates/contract.js +0 -4
  206. package/dist/gates/contract.js.map +1 -1
  207. package/dist/gates/definitions.d.ts +2 -1
  208. package/dist/gates/definitions.d.ts.map +1 -1
  209. package/dist/gates/definitions.js +6 -5
  210. package/dist/gates/definitions.js.map +1 -1
  211. package/dist/gates/index.d.ts +0 -4
  212. package/dist/gates/index.d.ts.map +1 -1
  213. package/dist/gates/index.js +1 -6
  214. package/dist/gates/index.js.map +1 -1
  215. package/dist/gates/performance.d.ts.map +1 -1
  216. package/dist/gates/performance.js +0 -4
  217. package/dist/gates/performance.js.map +1 -1
  218. package/dist/gates/runner.d.ts +1 -1
  219. package/dist/gates/runner.js +1 -1
  220. package/dist/gates/security.d.ts +1 -1
  221. package/dist/gates/security.d.ts.map +1 -1
  222. package/dist/gates/security.js +5 -6
  223. package/dist/gates/security.js.map +1 -1
  224. package/dist/gates/types.d.ts +14 -17
  225. package/dist/gates/types.d.ts.map +1 -1
  226. package/dist/gates/types.js.map +1 -1
  227. package/dist/hooks/bootstrap.d.ts +6 -4
  228. package/dist/hooks/bootstrap.d.ts.map +1 -1
  229. package/dist/hooks/bootstrap.js +25 -13
  230. package/dist/hooks/bootstrap.js.map +1 -1
  231. package/dist/hooks/config.d.ts +6 -2
  232. package/dist/hooks/config.d.ts.map +1 -1
  233. package/dist/hooks/config.js +5 -1
  234. package/dist/hooks/config.js.map +1 -1
  235. package/dist/hooks/index.d.ts +1 -1
  236. package/dist/hooks/index.d.ts.map +1 -1
  237. package/dist/hooks/index.js +0 -15
  238. package/dist/hooks/index.js.map +1 -1
  239. package/dist/hooks/pipeline.d.ts +19 -1
  240. package/dist/hooks/pipeline.d.ts.map +1 -1
  241. package/dist/hooks/pipeline.js +42 -4
  242. package/dist/hooks/pipeline.js.map +1 -1
  243. package/dist/hooks/registry.d.ts +11 -8
  244. package/dist/hooks/registry.d.ts.map +1 -1
  245. package/dist/hooks/registry.js +22 -7
  246. package/dist/hooks/registry.js.map +1 -1
  247. package/dist/hooks/types.d.ts +25 -7
  248. package/dist/hooks/types.d.ts.map +1 -1
  249. package/dist/index.d.ts +3 -3
  250. package/dist/index.d.ts.map +1 -1
  251. package/dist/index.js +3 -4
  252. package/dist/index.js.map +1 -1
  253. package/dist/knowledge/audit-scoring.d.ts +87 -0
  254. package/dist/knowledge/audit-scoring.d.ts.map +1 -0
  255. package/dist/knowledge/audit-scoring.js +470 -0
  256. package/dist/knowledge/audit-scoring.js.map +1 -0
  257. package/dist/knowledge/audit.d.ts +11 -59
  258. package/dist/knowledge/audit.d.ts.map +1 -1
  259. package/dist/knowledge/audit.js +47 -522
  260. package/dist/knowledge/audit.js.map +1 -1
  261. package/dist/knowledge/import.d.ts.map +1 -1
  262. package/dist/knowledge/import.js +2 -0
  263. package/dist/knowledge/import.js.map +1 -1
  264. package/dist/knowledge/index-generator.d.ts.map +1 -1
  265. package/dist/knowledge/index-generator.js +4 -5
  266. package/dist/knowledge/index-generator.js.map +1 -1
  267. package/dist/knowledge/index.d.ts +3 -2
  268. package/dist/knowledge/index.d.ts.map +1 -1
  269. package/dist/knowledge/index.js +3 -16
  270. package/dist/knowledge/index.js.map +1 -1
  271. package/dist/knowledge/ingest.js +1 -1
  272. package/dist/knowledge/ingest.js.map +1 -1
  273. package/dist/knowledge/lifecycle.d.ts.map +1 -1
  274. package/dist/knowledge/lifecycle.js +4 -2
  275. package/dist/knowledge/lifecycle.js.map +1 -1
  276. package/dist/knowledge/migration.d.ts +3 -0
  277. package/dist/knowledge/migration.d.ts.map +1 -1
  278. package/dist/knowledge/migration.js +8 -2
  279. package/dist/knowledge/migration.js.map +1 -1
  280. package/dist/knowledge/query.d.ts +6 -0
  281. package/dist/knowledge/query.d.ts.map +1 -1
  282. package/dist/knowledge/query.js +8 -2
  283. package/dist/knowledge/query.js.map +1 -1
  284. package/dist/knowledge/reference-tracker.d.ts.map +1 -1
  285. package/dist/knowledge/reference-tracker.js +4 -6
  286. package/dist/knowledge/reference-tracker.js.map +1 -1
  287. package/dist/knowledge/store.d.ts +22 -16
  288. package/dist/knowledge/store.d.ts.map +1 -1
  289. package/dist/knowledge/store.js +53 -12
  290. package/dist/knowledge/store.js.map +1 -1
  291. package/dist/knowledge/tree-walker.d.ts +19 -0
  292. package/dist/knowledge/tree-walker.d.ts.map +1 -0
  293. package/dist/knowledge/tree-walker.js +30 -0
  294. package/dist/knowledge/tree-walker.js.map +1 -0
  295. package/dist/knowledge/types.d.ts +16 -0
  296. package/dist/knowledge/types.d.ts.map +1 -1
  297. package/dist/monitoring/traces.d.ts +5 -3
  298. package/dist/monitoring/traces.d.ts.map +1 -1
  299. package/dist/monitoring/traces.js +19 -5
  300. package/dist/monitoring/traces.js.map +1 -1
  301. package/dist/test-setup/jsonl-fake-fs.d.ts +30 -0
  302. package/dist/test-setup/jsonl-fake-fs.d.ts.map +1 -0
  303. package/dist/test-setup/jsonl-fake-fs.js +49 -0
  304. package/dist/test-setup/jsonl-fake-fs.js.map +1 -0
  305. package/dist/tools/index.d.ts +4 -1
  306. package/dist/tools/index.d.ts.map +1 -1
  307. package/dist/tools/index.js +7 -15
  308. package/dist/tools/index.js.map +1 -1
  309. package/dist/types/checkpoint.d.ts +5 -0
  310. package/dist/types/checkpoint.d.ts.map +1 -1
  311. package/dist/types/project-config.d.ts +18 -0
  312. package/dist/types/project-config.d.ts.map +1 -1
  313. package/dist/types/trace.d.ts +13 -4
  314. package/dist/types/trace.d.ts.map +1 -1
  315. package/dist/types/trace.js +4 -3
  316. package/dist/types/trace.js.map +1 -1
  317. package/dist/utils/exec.d.ts +4 -27
  318. package/dist/utils/exec.d.ts.map +1 -1
  319. package/dist/utils/exec.js +4 -94
  320. package/dist/utils/exec.js.map +1 -1
  321. package/dist/utils/jsonl.d.ts +17 -7
  322. package/dist/utils/jsonl.d.ts.map +1 -1
  323. package/dist/utils/jsonl.js +144 -17
  324. package/dist/utils/jsonl.js.map +1 -1
  325. package/dist/utils/numeric-flag.d.ts +44 -0
  326. package/dist/utils/numeric-flag.d.ts.map +1 -0
  327. package/dist/utils/numeric-flag.js +62 -0
  328. package/dist/utils/numeric-flag.js.map +1 -0
  329. package/package.json +1 -1
  330. package/src/CONTEXT.md +5 -2
  331. package/src/__tests__/acceptance-gate.test.ts +7 -4
  332. package/src/__tests__/checker-extra.test.ts +3 -2
  333. package/src/__tests__/checker.test.ts +4 -3
  334. package/src/__tests__/checkpoint.test.ts +26 -9
  335. package/src/__tests__/context-files-resolution.test.ts +29 -15
  336. package/src/__tests__/contract-gate.test.ts +19 -40
  337. package/src/__tests__/error-classifier.test.ts +1 -1
  338. package/src/__tests__/exec.test.ts +45 -107
  339. package/src/__tests__/failure-recorder.test.ts +7 -5
  340. package/src/__tests__/hooks-pipeline.test.ts +34 -47
  341. package/src/__tests__/layering.test.ts +217 -25
  342. package/src/__tests__/passes-gate.test.ts +9 -4
  343. package/src/__tests__/performance-gate.test.ts +3 -15
  344. package/src/__tests__/project-config-loader-extra.test.ts +31 -57
  345. package/src/__tests__/project-config-loader.test.ts +6 -3
  346. package/src/__tests__/public-exports.test.ts +0 -1
  347. package/src/__tests__/public-type-surface.test.ts +5 -4
  348. package/src/__tests__/public-value-surface.test.ts +182 -0
  349. package/src/__tests__/review-gate.test.ts +4 -6
  350. package/src/__tests__/security-gate.test.ts +5 -20
  351. package/src/__tests__/skip-semantics.test.ts +5 -3
  352. package/src/__tests__/spec-validator.test.ts +3 -2
  353. package/src/__tests__/sub-barrels-explicit.test.ts +87 -0
  354. package/src/__tests__/test-fixture-hygiene.test.ts +53 -0
  355. package/src/__tests__/trace-analyzer-extra.test.ts +5 -3
  356. package/src/__tests__/trace-analyzer.test.ts +5 -3
  357. package/src/__tests__/trace-collector.test.ts +5 -3
  358. package/src/agents/index.ts +13 -2
  359. package/src/cli/__tests__/gate-command.test.ts +162 -0
  360. package/src/cli/__tests__/state-io.test.ts +50 -0
  361. package/src/cli/commands/CONTEXT.md +30 -5
  362. package/src/cli/commands/__tests__/acceptance.test.ts +24 -25
  363. package/src/cli/commands/__tests__/bin-exit-mapping.test.ts +15 -0
  364. package/src/cli/commands/__tests__/check-drift.test.ts +42 -1
  365. package/src/cli/commands/__tests__/check-read-count.test.ts +170 -0
  366. package/src/cli/commands/__tests__/check-skip-output.test.ts +4 -1
  367. package/src/cli/commands/__tests__/check.test.ts +63 -44
  368. package/src/cli/commands/__tests__/command-gate-dead-options.test.ts +60 -0
  369. package/src/cli/commands/__tests__/command.test.ts +33 -17
  370. package/src/cli/commands/__tests__/constraints-retire.test.ts +52 -0
  371. package/src/cli/commands/__tests__/context-syncer.test.ts +141 -0
  372. package/src/cli/commands/__tests__/contract.test.ts +20 -20
  373. package/src/cli/commands/__tests__/failure.test.ts +5 -4
  374. package/src/cli/commands/__tests__/gate-decision.ts +30 -0
  375. package/src/cli/commands/__tests__/init-dead-options.test.ts +50 -0
  376. package/src/cli/commands/__tests__/init-governance-io.test.ts +139 -0
  377. package/src/cli/commands/__tests__/init-injection.test.ts +3 -3
  378. package/src/cli/commands/__tests__/init-ondisk.test.ts +867 -0
  379. package/src/cli/commands/__tests__/init.test.ts +82 -6
  380. package/src/cli/commands/__tests__/knowledge-audit-threshold.test.ts +146 -0
  381. package/src/cli/commands/__tests__/knowledge-flywheel-consistency.test.ts +1 -1
  382. package/src/cli/commands/__tests__/knowledge-tone-mapping.test.ts +244 -0
  383. package/src/cli/commands/__tests__/knowledge-view.test.ts +839 -0
  384. package/src/cli/commands/__tests__/knowledge.test.ts +33 -15
  385. package/src/cli/commands/__tests__/numeric-flag-assembly.test.ts +368 -0
  386. package/src/cli/commands/__tests__/performance.test.ts +19 -21
  387. package/src/cli/commands/__tests__/posteval-plan.test.ts +5 -3
  388. package/src/cli/commands/__tests__/pre-push-hook.test.ts +181 -0
  389. package/src/cli/commands/__tests__/project-path-anchoring.test.ts +95 -2
  390. package/src/cli/commands/__tests__/project-path-convention.test.ts +103 -25
  391. package/src/cli/commands/__tests__/registry.test.ts +2 -0
  392. package/src/cli/commands/__tests__/report.test.ts +23 -1
  393. package/src/cli/commands/__tests__/review.test.ts +10 -17
  394. package/src/cli/commands/__tests__/scaffold.test.ts +505 -0
  395. package/src/cli/commands/__tests__/security-default-scan.test.ts +75 -0
  396. package/src/cli/commands/__tests__/security.test.ts +21 -24
  397. package/src/cli/commands/__tests__/spec-baseline-check.test.ts +3 -2
  398. package/src/cli/commands/__tests__/spec-baseline-index-cap.test.ts +131 -0
  399. package/src/cli/commands/__tests__/spec-baseline-read-count.test.ts +325 -0
  400. package/src/cli/commands/__tests__/status-extra.test.ts +25 -8
  401. package/src/cli/commands/__tests__/status.test.ts +46 -18
  402. package/src/cli/commands/__tests__/sync-docs-agents.test.ts +19 -4
  403. package/src/cli/commands/__tests__/sync-docs-context-drift.test.ts +232 -0
  404. package/src/cli/commands/__tests__/sync-docs-module-order.test.ts +111 -0
  405. package/src/cli/commands/__tests__/sync-docs-read-count.test.ts +192 -0
  406. package/src/cli/commands/__tests__/sync-docs.test.ts +3 -2
  407. package/src/cli/commands/__tests__/validate.test.ts +1 -48
  408. package/src/cli/commands/acceptance.ts +24 -29
  409. package/src/cli/commands/check.ts +60 -35
  410. package/src/cli/commands/command.ts +9 -8
  411. package/src/cli/commands/constraints-retire.ts +57 -70
  412. package/src/cli/commands/contract.ts +44 -47
  413. package/src/cli/commands/definitions.ts +12 -6
  414. package/src/cli/commands/failure.ts +16 -3
  415. package/src/cli/commands/init.ts +242 -389
  416. package/src/cli/commands/knowledge-view.ts +224 -0
  417. package/src/cli/commands/knowledge.ts +643 -448
  418. package/src/cli/commands/passes-gate.ts +12 -3
  419. package/src/cli/commands/performance.ts +31 -38
  420. package/src/cli/commands/report.ts +3 -2
  421. package/src/cli/commands/review.ts +22 -28
  422. package/src/cli/commands/scaffold-templates.ts +406 -0
  423. package/src/cli/commands/scaffold.ts +302 -0
  424. package/src/cli/commands/security.ts +27 -23
  425. package/src/cli/commands/spec-baseline-check.ts +158 -33
  426. package/src/cli/commands/status.ts +12 -7
  427. package/src/cli/commands/sync-docs/__tests__/context-export-surface.test.ts +102 -0
  428. package/src/cli/commands/sync-docs/__tests__/module-descriptions.test.ts +196 -0
  429. package/src/cli/commands/sync-docs/context-syncer.ts +137 -31
  430. package/src/cli/commands/sync-docs/index.ts +103 -28
  431. package/src/cli/commands/sync-docs/project-reader.ts +51 -7
  432. package/src/cli/commands/validate.ts +1 -104
  433. package/src/cli/gate-command.ts +87 -0
  434. package/src/cli/state-io.ts +53 -0
  435. package/src/completion-checkers/index.ts +10 -1
  436. package/src/context/CONTEXT.md +2 -1
  437. package/src/context/__tests__/knowledge-injector.test.ts +27 -0
  438. package/src/context/__tests__/session-manager.test.ts +19 -12
  439. package/src/context/knowledge-injector.ts +14 -7
  440. package/src/core/CONTEXT.md +10 -7
  441. package/src/core/__tests__/effective-set.test.ts +36 -60
  442. package/src/core/constraints/__tests__/context-reconcile.test.ts +246 -0
  443. package/src/core/constraints/__tests__/run-env.test.ts +377 -0
  444. package/src/core/constraints/__tests__/triggers.test.ts +70 -0
  445. package/src/core/constraints/agent-prompt-renderer.ts +1 -1
  446. package/src/core/constraints/capabilities-reconcile.ts +28 -4
  447. package/src/core/constraints/check-cache.ts +1 -1
  448. package/src/core/constraints/checker.ts +30 -14
  449. package/src/core/constraints/checkers/__tests__/context-doc-sync.test.ts +8 -3
  450. package/src/core/constraints/checkers/__tests__/governance-presence.test.ts +16 -7
  451. package/src/core/constraints/checkers/__tests__/no-hardcoded-credentials.test.ts +2 -1
  452. package/src/core/constraints/checkers/capability-sync.ts +27 -28
  453. package/src/core/constraints/checkers/context-doc-sync.ts +9 -7
  454. package/src/core/constraints/checkers/docs-freshness.ts +28 -33
  455. package/src/core/constraints/checkers/governance-presence.ts +10 -6
  456. package/src/core/constraints/checkers/types.ts +14 -8
  457. package/src/core/constraints/context-builder.ts +35 -26
  458. package/src/core/constraints/context-reconcile.ts +200 -0
  459. package/src/core/constraints/doc-freshness/__tests__/runner.test.ts +25 -0
  460. package/src/core/constraints/doc-freshness/runner.ts +18 -4
  461. package/src/core/constraints/git-evidence.ts +1 -1
  462. package/src/core/constraints/injection-drift.ts +19 -8
  463. package/src/core/constraints/run-env.ts +207 -0
  464. package/src/core/constraints/triggers.ts +33 -0
  465. package/src/core/effective-constraints.ts +17 -6
  466. package/src/core/effective-set.ts +8 -24
  467. package/src/core/index.ts +2 -0
  468. package/src/core/project-config-loader.ts +54 -102
  469. package/src/core/validators/__tests__/http-retry-sleep.test.ts +231 -0
  470. package/src/core/validators/check-handlers/http.ts +18 -7
  471. package/src/failure/CONTEXT.md +2 -1
  472. package/src/failure/classifier.ts +2 -2
  473. package/src/failure/index.ts +14 -2
  474. package/src/failure/recorder.ts +1 -1
  475. package/src/gates/CONTEXT.md +13 -7
  476. package/src/gates/__tests__/checker-gate.test.ts +1 -1
  477. package/src/gates/__tests__/command-single-predicate.test.ts +135 -0
  478. package/src/gates/__tests__/command.test.ts +8 -15
  479. package/src/gates/__tests__/contract.test.ts +5 -5
  480. package/src/gates/__tests__/gate-interface.test.ts +0 -17
  481. package/src/gates/__tests__/performance.test.ts +0 -13
  482. package/src/gates/__tests__/review.test.ts +0 -1
  483. package/src/gates/__tests__/runner.test.ts +1 -1
  484. package/src/gates/__tests__/security-default-scan.test.ts +97 -0
  485. package/src/gates/__tests__/security.test.ts +0 -13
  486. package/src/gates/checker-gate.ts +3 -2
  487. package/src/gates/command.ts +51 -74
  488. package/src/gates/contract.ts +0 -5
  489. package/src/gates/definitions.ts +6 -5
  490. package/src/gates/index.ts +0 -5
  491. package/src/gates/performance.ts +1 -6
  492. package/src/gates/runner.ts +1 -1
  493. package/src/gates/security.ts +9 -11
  494. package/src/gates/types.ts +20 -23
  495. package/src/hooks/CONTEXT.md +10 -9
  496. package/src/hooks/__tests__/bootstrap.test.ts +29 -6
  497. package/src/hooks/__tests__/pipeline.test.ts +133 -17
  498. package/src/hooks/__tests__/registry.test.ts +51 -3
  499. package/src/hooks/bootstrap.ts +35 -15
  500. package/src/hooks/config.ts +6 -2
  501. package/src/hooks/index.ts +10 -1
  502. package/src/hooks/pipeline.ts +51 -6
  503. package/src/hooks/registry.ts +31 -12
  504. package/src/hooks/types.ts +26 -7
  505. package/src/index.ts +1 -2
  506. package/src/knowledge/CONTEXT.md +14 -7
  507. package/src/knowledge/__tests__/audit-labels.test.ts +8 -5
  508. package/src/knowledge/__tests__/audit-scoring.test.ts +230 -0
  509. package/src/knowledge/__tests__/audit-write-count.test.ts +131 -0
  510. package/src/knowledge/__tests__/audit.test.ts +291 -208
  511. package/src/knowledge/__tests__/doctor.test.ts +3 -2
  512. package/src/knowledge/__tests__/ingest.test.ts +3 -2
  513. package/src/knowledge/__tests__/lifecycle.test.ts +57 -2
  514. package/src/knowledge/__tests__/migration.test.ts +35 -6
  515. package/src/knowledge/__tests__/query.test.ts +3 -2
  516. package/src/knowledge/__tests__/reference-tracker.test.ts +23 -2
  517. package/src/knowledge/__tests__/store.test.ts +149 -4
  518. package/src/knowledge/__tests__/tree-walker.test.ts +132 -0
  519. package/src/knowledge/audit-scoring.ts +589 -0
  520. package/src/knowledge/audit.ts +55 -599
  521. package/src/knowledge/import.ts +2 -0
  522. package/src/knowledge/index-generator.ts +4 -6
  523. package/src/knowledge/index.ts +27 -2
  524. package/src/knowledge/ingest.ts +1 -1
  525. package/src/knowledge/lifecycle.ts +5 -2
  526. package/src/knowledge/migration.ts +8 -2
  527. package/src/knowledge/query.ts +8 -1
  528. package/src/knowledge/reference-tracker.ts +5 -7
  529. package/src/knowledge/store.ts +75 -16
  530. package/src/knowledge/tree-walker.ts +29 -0
  531. package/src/knowledge/types.ts +19 -0
  532. package/src/monitoring/CONTEXT.md +5 -2
  533. package/src/monitoring/__tests__/context-tracker.test.ts +16 -8
  534. package/src/monitoring/__tests__/trace-file-anchoring.test.ts +80 -0
  535. package/src/monitoring/traces.ts +19 -5
  536. package/src/release/CONTEXT.md +1 -1
  537. package/src/release/__tests__/integrity.test.ts +21 -12
  538. package/src/test-setup/__tests__/jsonl-fake-fs.test.ts +98 -0
  539. package/src/test-setup/jsonl-fake-fs.ts +59 -0
  540. package/src/tools/index.ts +5 -1
  541. package/src/types/checkpoint.ts +6 -0
  542. package/src/types/project-config.ts +21 -0
  543. package/src/types/trace.ts +14 -4
  544. package/src/utils/__tests__/file-walk.test.ts +3 -2
  545. package/src/utils/__tests__/jsonl-bounded-read.test.ts +106 -0
  546. package/src/utils/__tests__/jsonl-skip-disposition.test.ts +10 -6
  547. package/src/utils/__tests__/jsonl.test.ts +61 -14
  548. package/src/utils/__tests__/numeric-flag.test.ts +80 -0
  549. package/src/utils/__tests__/package-version.test.ts +2 -2
  550. package/src/utils/exec.ts +4 -64
  551. package/src/utils/jsonl.ts +159 -20
  552. package/src/utils/numeric-flag.ts +64 -0
  553. package/dist/failure/types.d.ts +0 -9
  554. package/dist/failure/types.d.ts.map +0 -1
  555. package/dist/failure/types.js +0 -25
  556. package/dist/failure/types.js.map +0 -1
  557. package/dist/gates/effective-gates.d.ts +0 -30
  558. package/dist/gates/effective-gates.d.ts.map +0 -1
  559. package/dist/gates/effective-gates.js +0 -81
  560. package/dist/gates/effective-gates.js.map +0 -1
  561. package/src/failure/types.ts +0 -9
  562. package/src/gates/__tests__/effective-gates.test.ts +0 -77
  563. package/src/gates/effective-gates.ts +0 -99
@@ -0,0 +1,80 @@
1
+ /**
2
+ * 数值旗帜装配解析器测试(harness#154)
3
+ *
4
+ * 口径正本:src/cli/commands/CONTEXT.md「数值旗帜装配口径(harness#152)」条目——
5
+ * commander 给到命令侧恒是字符串、数值只在装配点转一次、转不出来 fail-loud。
6
+ * 本模块是全部数值旗帜的唯一解析器:定义表 mapActionArgs 走 requireNumericFlag(抛
7
+ * NumericFlagError,bin 映射 usage-error),命令模块入口走 parseNumericFlag(返回值
8
+ * 判别,就地 logError + usage-error)。
9
+ */
10
+
11
+ import {
12
+ NumericFlagError,
13
+ numericFlagMessage,
14
+ parseNumericFlag,
15
+ requireNumericFlag,
16
+ } from '../numeric-flag';
17
+
18
+ describe('parseNumericFlag:int 形', () => {
19
+ it('合法:十进制整数字符串 → 数值;undefined → 未传(落下游缺省)', () => {
20
+ expect(parseNumericFlag('20', 'int')).toEqual({ ok: true, value: 20 });
21
+ expect(parseNumericFlag(' 7 ', 'int')).toEqual({ ok: true, value: 7 });
22
+ expect(parseNumericFlag(undefined, 'int')).toEqual({ ok: true });
23
+ });
24
+
25
+ it('显式 "0" 是合法零值,不当「未传」兜掉', () => {
26
+ expect(parseNumericFlag('0', 'int')).toEqual({ ok: true, value: 0 });
27
+ });
28
+
29
+ it.each(['abc', '30abc', '1e2', '0.7', '-5', '', ' ', 'NaN', 'Infinity', '0x10'])(
30
+ '脏输入 %o → ok:false(parseInt 会静默误读的形一并拒)',
31
+ (raw) => {
32
+ expect(parseNumericFlag(raw, 'int')).toEqual({ ok: false, raw });
33
+ },
34
+ );
35
+
36
+ it('数值溢出(位数字符串超 double 上限)→ ok:false,不放 Infinity 进判定槽', () => {
37
+ const raw = '9'.repeat(400);
38
+ expect(parseNumericFlag(raw, 'int')).toEqual({ ok: false, raw });
39
+ });
40
+ });
41
+
42
+ describe('parseNumericFlag:float 形', () => {
43
+ it('合法:整数与小数字符串 → 数值', () => {
44
+ expect(parseNumericFlag('0.8', 'float')).toEqual({ ok: true, value: 0.8 });
45
+ expect(parseNumericFlag('1', 'float')).toEqual({ ok: true, value: 1 });
46
+ expect(parseNumericFlag('0', 'float')).toEqual({ ok: true, value: 0 });
47
+ });
48
+
49
+ it.each(['abc', '0.8.1', '1.', '.5', '1e-3', '-0.5', '', 'NaN', 'Infinity'])(
50
+ '脏输入 %o → ok:false',
51
+ (raw) => {
52
+ expect(parseNumericFlag(raw, 'float')).toEqual({ ok: false, raw });
53
+ },
54
+ );
55
+ });
56
+
57
+ describe('numericFlagMessage / requireNumericFlag', () => {
58
+ it('报错文案点名旗帜与原值(可定位)', () => {
59
+ expect(numericFlagMessage('--limit', 'abc', 'int')).toBe('错误:--limit 需要非负整数,收到 "abc"');
60
+ expect(numericFlagMessage('--noise-fail-rate', 'x', 'float')).toBe('错误:--noise-fail-rate 需要非负数值,收到 "x"');
61
+ });
62
+
63
+ it('合法值原样返回;未传 → undefined', () => {
64
+ expect(requireNumericFlag('--limit', '20', 'int')).toBe(20);
65
+ expect(requireNumericFlag('--limit', '0', 'int')).toBe(0);
66
+ expect(requireNumericFlag('--limit', undefined, 'int')).toBeUndefined();
67
+ });
68
+
69
+ it('脏输入抛 NumericFlagError(bin 据 name/instanceof 映射 usage-error)', () => {
70
+ let caught: unknown;
71
+ try {
72
+ requireNumericFlag('--zero-intercept-min', 'abc', 'int');
73
+ } catch (err) {
74
+ caught = err;
75
+ }
76
+ expect(caught).toBeInstanceOf(NumericFlagError);
77
+ expect((caught as Error).name).toBe('NumericFlagError');
78
+ expect((caught as Error).message).toBe('错误:--zero-intercept-min 需要非负整数,收到 "abc"');
79
+ });
80
+ });
@@ -9,6 +9,7 @@
9
9
 
10
10
  import * as fs from 'fs';
11
11
  import * as path from 'path';
12
+ import * as os from 'os';
12
13
  import { getHarnessPackageVersion } from '../package-version';
13
14
 
14
15
  const REAL_VERSION = JSON.parse(
@@ -21,8 +22,7 @@ describe('getHarnessPackageVersion', () => {
21
22
  });
22
23
 
23
24
  it('cwd 是消费者项目时仍读 harness 版本,不误读消费者 package.json', () => {
24
- const consumerDir = path.join(process.cwd(), 'temp-test-pkg-version-consumer');
25
- fs.mkdirSync(consumerDir, { recursive: true });
25
+ const consumerDir = fs.mkdtempSync(path.join(os.tmpdir(), 'temp-test-pkg-version-consumer-'));
26
26
  fs.writeFileSync(
27
27
  path.join(consumerDir, 'package.json'),
28
28
  JSON.stringify({ name: 'consumer-app', version: '9.9.9' })
package/src/utils/exec.ts CHANGED
@@ -1,7 +1,10 @@
1
1
  /**
2
2
  * 通用工具模块
3
3
  *
4
- * 提供命令执行、数组规范化、延迟等公共函数,减少各子系统重复代码。
4
+ * 提供命令执行的公共函数,减少各子系统重复代码。
5
+ * 约束域谓词不在本模块(harness#137:`normalizeTriggers`/`matchesTrigger` 已迁
6
+ * `core/constraints/triggers.ts`;`isCommandAvailable`/`delay` 双仓零生产消费者,已删;
7
+ * `runCommand` 零生产调用点且不在包公共面,按 ADR-0022 同判据随 harness#162 删除)。
5
8
  */
6
9
 
7
10
  import { exec } from 'child_process';
@@ -11,66 +14,3 @@ import { promisify } from 'util';
11
14
  * Promisified exec
12
15
  */
13
16
  export const execAsync = promisify(exec);
14
-
15
- /**
16
- * 执行命令并返回 stdout(忽略 stderr)
17
- */
18
- export async function runCommand(command: string, cwd?: string): Promise<string> {
19
- try {
20
- const { stdout } = await execAsync(command, {
21
- cwd,
22
- maxBuffer: 1024 * 1024, // 1MB buffer
23
- });
24
- return stdout.trim();
25
- } catch {
26
- return '';
27
- }
28
- }
29
-
30
- /**
31
- * 检查命令是否可用
32
- */
33
- export async function isCommandAvailable(command: string): Promise<boolean> {
34
- try {
35
- // 使用 execFile 避免命令注入(不通过 shell 解析)
36
- const { execFile: execFileCb } = await import('child_process');
37
- const execFileAsync = promisify(execFileCb);
38
- await execFileAsync('which', [command]);
39
- return true;
40
- } catch {
41
- return false;
42
- }
43
- }
44
-
45
- /**
46
- * 将单值或数组统一为数组(用于 trigger 等字段)
47
- */
48
- export function normalizeTriggers<T>(
49
- value: T | T[] | undefined,
50
- fallback: T[] = []
51
- ): T[] {
52
- if (value === undefined || value === null) return fallback;
53
- return Array.isArray(value) ? value : [value];
54
- }
55
-
56
- /**
57
- * 判断约束是否匹配当前操作集合(#105:trigger 匹配语义单一来源)
58
- *
59
- * 语义 = normalizeTriggers(undefined → [] 不匹配任何操作)+ 交集判定,
60
- * 任一 operation 命中任一 trigger 即匹配。checker 与 prompt 渲染共用本函数,
61
- * 禁止就地重写。
62
- */
63
- export function matchesTrigger<T>(
64
- constraint: { trigger: T | T[] | undefined },
65
- operations: T[]
66
- ): boolean {
67
- const triggers = normalizeTriggers(constraint.trigger);
68
- return operations.some(op => triggers.includes(op));
69
- }
70
-
71
- /**
72
- * 异步延迟
73
- */
74
- export function delay(ms: number): Promise<void> {
75
- return new Promise((resolve) => setTimeout(resolve, ms));
76
- }
@@ -11,9 +11,12 @@
11
11
  * 也不反转既有容错调用点的语义。坏行指非空但 JSON.parse 失败的行
12
12
  * (半写入截断、手工编辑、磁盘满等)。
13
13
  *
14
- * tail / head:只解析尾部 / 头部 N 个非空行(文件仍全量读取,parse 才是大头),
15
- * 供「只看最近 K 条」的调用点避免全量 parse(check 等热路径)。
16
- * countJsonlLines 供纯计数消费方(完全不 parse)。
14
+ * tail:从文件末尾倒着分块 seek,只把够数的尾部行读进内存。2026-09-14 量数据推翻本文件
15
+ * 早先「文件仍全量读取,parse 才是大头」的断言:6.7MB / 32723 行的 traces.log 上,
16
+ * 完全不 parse 的整读单次仍 16.6–21.1ms——成本在 split('\n') 与空白行过滤。
17
+ * head:从文件头正向分块读,够数即停——供「有没有至少 N 条」这类阈值消费方,不再为
18
+ * 一个比较符把全文捞进内存。
19
+ * 两者同给或都不给时才整读后截断(head→tail 顺序即既有语义)。
17
20
  *
18
21
  * 计数去向(harness#100):本模块是坏行计数的唯一正本,但正本≠终点——凡以 'skip'
19
22
  * 策略读,调用点必须把 skippedLines 带到该消费面的用户可见输出(CLI 走 stderr,
@@ -69,24 +72,106 @@ function readNonEmptyLines(filePath: string): string[] {
69
72
  .filter(line => line.trim().length > 0);
70
73
  }
71
74
 
75
+ /** tail 倒读的分块大小:trace 行约 200B,一块即够几十行 */
76
+ const TAIL_CHUNK_BYTES = 64 * 1024;
77
+
78
+ /** head 正读的分块大小 */
79
+ const HEAD_CHUNK_BYTES = 64 * 1024;
80
+
72
81
  /**
73
- * 读取 JSONL 文件:exists → read → split → parse → filter(正本读链)
82
+ * 从文件头正向分块读,只返回前 want 个非空行(够数即停,不整读)
74
83
  *
75
- * policy 必填无缺省(裁决 1);缺文件返回空结果,不抛。
84
+ * 与「整读后 slice(0, want)」逐字同语义:行以 `\n` 界定,末块无尾换行时整段收尾算一行,
85
+ * 纯空白行不计数。块边界切在多字节字符中间时,残段按字节留在缓冲里等下一块拼齐再解码。
86
+ * 供「有没有至少 N 条记录」这类阈值消费方——它要的是够不够,不是总数。
76
87
  */
77
- export function readJsonl<T>(
78
- filePath: string,
79
- policy: JsonlBadLinePolicy,
80
- options?: JsonlReadOptions
81
- ): JsonlReadResult<T> {
82
- let lines = readNonEmptyLines(filePath);
83
- if (options?.head !== undefined) {
84
- lines = options.head > 0 ? lines.slice(0, options.head) : [];
88
+ function readHeadNonEmptyLines(filePath: string, want: number): string[] {
89
+ if (want <= 0) return [];
90
+ if (!fs.existsSync(filePath)) return [];
91
+
92
+ const fd = fs.openSync(filePath, 'r');
93
+ try {
94
+ const size = fs.fstatSync(fd).size;
95
+ const kept: string[] = [];
96
+ let acc = Buffer.alloc(0);
97
+ let pos = 0;
98
+ while (kept.length < want) {
99
+ const end = Math.min(size, pos + HEAD_CHUNK_BYTES);
100
+ if (end > pos) {
101
+ const chunk = Buffer.alloc(end - pos);
102
+ fs.readSync(fd, chunk, 0, end - pos, pos);
103
+ acc = Buffer.concat([acc, chunk]);
104
+ }
105
+ let cursor = 0;
106
+ for (let i = 0; i < acc.length && kept.length < want; i++) {
107
+ if (acc[i] !== 0x0a) continue;
108
+ const line = acc.subarray(cursor, i).toString('utf-8');
109
+ if (line.trim().length > 0) kept.push(line);
110
+ cursor = i + 1;
111
+ }
112
+ if (end >= size) {
113
+ // 读到文件末尾:最后一段没有换行收尾,但它就是一行
114
+ if (kept.length < want && cursor < acc.length) {
115
+ const last = acc.subarray(cursor).toString('utf-8');
116
+ if (last.trim().length > 0) kept.push(last);
117
+ }
118
+ break;
119
+ }
120
+ pos = end;
121
+ acc = acc.subarray(cursor);
122
+ }
123
+ return kept;
124
+ } finally {
125
+ fs.closeSync(fd);
85
126
  }
86
- if (options?.tail !== undefined) {
87
- lines = options.tail > 0 ? lines.slice(-options.tail) : [];
127
+ }
128
+
129
+ /**
130
+ * 从文件末尾倒着分块读,只返回末尾 want 个非空行(文件顺序)
131
+ *
132
+ * 与「整读后 slice(-want)」逐字同语义:行以 `\n` 界定,末行允许无换行,`\r` 随行进文本,
133
+ * 纯空白行不计数。左侧残段(块边界切在多字节字符中间)不解码,按字节留到下一轮——
134
+ * UTF-8 的多字节序列不含 0x0a,故按 `\n` 切字节再解码不会破坏字符。
135
+ */
136
+ function readTailNonEmptyLines(filePath: string, want: number): string[] {
137
+ if (want <= 0) return [];
138
+ if (!fs.existsSync(filePath)) return [];
139
+
140
+ const fd = fs.openSync(filePath, 'r');
141
+ try {
142
+ let pos = fs.fstatSync(fd).size;
143
+ let acc = Buffer.alloc(0);
144
+ for (;;) {
145
+ const start = Math.max(0, pos - TAIL_CHUNK_BYTES);
146
+ if (pos > start) {
147
+ const chunk = Buffer.alloc(pos - start);
148
+ fs.readSync(fd, chunk, 0, pos - start, start);
149
+ acc = Buffer.concat([chunk, acc]);
150
+ }
151
+ pos = start;
152
+
153
+ const lines: string[] = [];
154
+ let cursor = pos === 0 ? 0 : -1;
155
+ for (let i = 0; i < acc.length; i++) {
156
+ if (acc[i] !== 0x0a) continue;
157
+ if (cursor >= 0) lines.push(acc.subarray(cursor, i).toString('utf-8'));
158
+ cursor = i + 1;
159
+ }
160
+ if (cursor >= 0 && cursor < acc.length) lines.push(acc.subarray(cursor).toString('utf-8'));
161
+
162
+ const kept = lines
163
+ .filter(line => line.trim().length > 0)
164
+ .slice(-want);
165
+ // 已到文件头 → 全部行都在手里;否则末尾 want 个非空行已凑齐,左侧只可能是更早的行
166
+ if (pos === 0 || kept.length >= want) return kept;
167
+ }
168
+ } finally {
169
+ fs.closeSync(fd);
88
170
  }
171
+ }
89
172
 
173
+ /** parse 非空行文本(读链的末段;坏行策略同 readJsonl) */
174
+ function parseJsonlLines<T>(lines: string[], policy: JsonlBadLinePolicy): JsonlReadResult<T> {
90
175
  const records: T[] = [];
91
176
  let skippedLines = 0;
92
177
  for (const line of lines) {
@@ -101,13 +186,67 @@ export function readJsonl<T>(
101
186
  }
102
187
 
103
188
  /**
104
- * 统计非空行数(含坏行,完全不 parse
189
+ * 读取 JSONL 文件:exists → read → split → parse → filter(正本读链)
190
+ *
191
+ * policy 必填无缺省(裁决 1);缺文件返回空结果,不抛。
192
+ * 只给 head 走有界正读、只给 tail 走倒读 seek;两者同给或都不给走整读后截断
193
+ * (head→tail 的截断顺序即既有语义)。
194
+ */
195
+ export function readJsonl<T>(
196
+ filePath: string,
197
+ policy: JsonlBadLinePolicy,
198
+ options?: JsonlReadOptions
199
+ ): JsonlReadResult<T> {
200
+ let lines: string[];
201
+ if (options?.head !== undefined && options.tail === undefined) {
202
+ lines = readHeadNonEmptyLines(filePath, options.head);
203
+ } else if (options?.tail !== undefined && options.head === undefined) {
204
+ lines = readTailNonEmptyLines(filePath, options.tail);
205
+ } else {
206
+ lines = applyHeadTail(readNonEmptyLines(filePath), options);
207
+ }
208
+ return parseJsonlLines<T>(lines, policy);
209
+ }
210
+
211
+ /**
212
+ * 尾部窗口:一次分块读行文本,之后按不同 tail 口径反复取用
105
213
  *
106
- * 供只关心记录条数的调用点(如 check 智能提示)避免全量 parse;
107
- * 缺文件返回 0。
214
+ * 供「同一次运行里有多个消费方、各看不同长度的尾部」的场景(ADR-0023 run 内共享),
215
+ * 取一份行文本而不是各捞一遍。`take(limit)` 与 `readJsonl(..., { tail: limit })` 逐字
216
+ * 同口径:**先按行文本截窗再 parse**——坏行占尾部槽位不占 records 名额,若改拿大窗口的
217
+ * records 再切,窗口内有坏行时小窗口会多收更老的有效记录,判定就变了。
108
218
  */
109
- export function countJsonlLines(filePath: string): number {
110
- return readNonEmptyLines(filePath).length;
219
+ export interface JsonlWindow<T> {
220
+ take(limit: number): JsonlReadResult<T>;
221
+ }
222
+
223
+ export function readJsonlWindow<T>(
224
+ filePath: string,
225
+ policy: JsonlBadLinePolicy,
226
+ maxLines: number
227
+ ): JsonlWindow<T> {
228
+ const lines = readTailNonEmptyLines(filePath, maxLines);
229
+ return {
230
+ take: (limit: number) => {
231
+ if (limit > maxLines) {
232
+ throw new Error(
233
+ `尾部窗口上限 ${maxLines} 行,无法取 ${limit} 行——建窗口时按最大消费方取值,或改上限(不静默少给)`
234
+ );
235
+ }
236
+ return parseJsonlLines<T>(limit > 0 ? lines.slice(-limit) : [], policy);
237
+ },
238
+ };
239
+ }
240
+
241
+ /** 整读路径上的 head → tail 截断(顺序即既有语义:先截头再截尾) */
242
+ function applyHeadTail(lines: string[], options?: JsonlReadOptions): string[] {
243
+ if (options?.head !== undefined) {
244
+ lines = options.head > 0 ? lines.slice(0, options.head) : [];
245
+ }
246
+ if (options?.tail !== undefined) {
247
+ lines = options.tail > 0 ? lines.slice(-options.tail) : [];
248
+ }
249
+ return lines;
111
250
  }
112
251
 
113
252
  export interface JsonlEndsResult<T> {
@@ -0,0 +1,64 @@
1
+ /**
2
+ * 数值旗帜装配解析器(harness#154;口径正本 = src/cli/commands/CONTEXT.md
3
+ * 「数值旗帜装配口径(harness#152)」条目,本模块是该条目指名的唯一解析器)
4
+ *
5
+ * 背景:commander 给到命令侧的数值旗帜恒是字符串(`defaultValue: '50'` 也是),
6
+ * 数值只在装配点转一次,转不出来必须 fail-loud——下游兜底多是 `??`/`||`,
7
+ * NaN 穿透后比较恒 false,一道质量判定被静默关掉而退出码仍是 0(#152 病灶)。
8
+ * `parseInt`/`parseFloat` 不可用:它们前缀截断('30abc'→30、'1e2'→1)同属静默误读。
9
+ *
10
+ * 两个消费形(同一条判定规则,不建第二套解析器):
11
+ * - `requireNumericFlag`:定义表 `mapActionArgs` 装配点用,脏值抛 `NumericFlagError`,
12
+ * bin/harness.js 捕获后映射 usage-error(非零退出);
13
+ * - `parseNumericFlag`:命令模块入口装配点用(knowledge/failure/passes-gate),
14
+ * 返回值判别,就地 `logError` + `usage-error`。
15
+ */
16
+
17
+ /** 数值形:int = 非负整数;float = 非负十进制(不收指数/符号/前后缀) */
18
+ export type NumericFlagKind = 'int' | 'float';
19
+
20
+ /** 装配结果:`ok: false` = 脏输入,由装配点 fail-loud(不得往判定槽塞 NaN) */
21
+ export type NumericFlagAssembly = { ok: true; value?: number } | { ok: false; raw: string };
22
+
23
+ /**
24
+ * 装配窄化:`undefined` = 未传(落下游缺省);`'0'` 是显式零值,不当「未传」兜掉。
25
+ * 规则与 #152 `assembleShortContentThreshold` 同源:trim 后全数字(float 允许一段小数),
26
+ * 溢出 double 上限(→ Infinity)同脏值处理。
27
+ */
28
+ export function parseNumericFlag(raw: string | undefined, kind: NumericFlagKind): NumericFlagAssembly {
29
+ if (raw === undefined) return { ok: true };
30
+ const text = raw.trim();
31
+ const pattern = kind === 'int' ? /^\d+$/ : /^\d+(\.\d+)?$/;
32
+ if (!pattern.test(text)) return { ok: false, raw };
33
+ const value = Number(text);
34
+ if (!Number.isFinite(value)) return { ok: false, raw };
35
+ return { ok: true, value };
36
+ }
37
+
38
+ /** 报错文案模板:点名旗帜与原值(可定位),int/float 措辞一致收敛 */
39
+ export function numericFlagMessage(flag: string, raw: string, kind: NumericFlagKind): string {
40
+ return `错误:${flag} 需要非负${kind === 'int' ? '整数' : '数值'},收到 "${raw}"`;
41
+ }
42
+
43
+ /** 定义表装配失败的专用错误:bin/harness.js 凭它映射 usage-error(非零退出) */
44
+ export class NumericFlagError extends Error {
45
+ constructor(message: string) {
46
+ super(message);
47
+ this.name = 'NumericFlagError';
48
+ }
49
+ }
50
+
51
+ /**
52
+ * 定义表 `mapActionArgs` 装配点用:脏值抛 `NumericFlagError`。
53
+ * 定义表是纯数据模块,返回不了 CommandResult;退出码映射唯一出口在 bin,
54
+ * 故以抛出表达失败、bin 就地捕获映射,不新增第二条失败通道。
55
+ */
56
+ export function requireNumericFlag(
57
+ flag: string,
58
+ raw: string | undefined,
59
+ kind: NumericFlagKind,
60
+ ): number | undefined {
61
+ const result = parseNumericFlag(raw, kind);
62
+ if (!result.ok) throw new NumericFlagError(numericFlagMessage(flag, result.raw, kind));
63
+ return result.value;
64
+ }
@@ -1,9 +0,0 @@
1
- /**
2
- * 失败处理类型定义(兼容再导出)
3
- *
4
- * 工单 14:类型定义本体已归位 types 层(src/types/failure.ts),
5
- * 以消除 types/index.ts 对 ../failure 的反向 import。
6
- * 此文件保留原模块路径,供既有引用方(classifier/recorder/index 与外部消费者)继续工作。
7
- */
8
- export * from '../types/failure';
9
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/failure/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,kBAAkB,CAAC"}
@@ -1,25 +0,0 @@
1
- "use strict";
2
- /**
3
- * 失败处理类型定义(兼容再导出)
4
- *
5
- * 工单 14:类型定义本体已归位 types 层(src/types/failure.ts),
6
- * 以消除 types/index.ts 对 ../failure 的反向 import。
7
- * 此文件保留原模块路径,供既有引用方(classifier/recorder/index 与外部消费者)继续工作。
8
- */
9
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- var desc = Object.getOwnPropertyDescriptor(m, k);
12
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
- desc = { enumerable: true, get: function() { return m[k]; } };
14
- }
15
- Object.defineProperty(o, k2, desc);
16
- }) : (function(o, m, k, k2) {
17
- if (k2 === undefined) k2 = k;
18
- o[k2] = m[k];
19
- }));
20
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
21
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
22
- };
23
- Object.defineProperty(exports, "__esModule", { value: true });
24
- __exportStar(require("../types/failure"), exports);
25
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/failure/types.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;AAEH,mDAAiC"}
@@ -1,30 +0,0 @@
1
- /**
2
- * 生效门禁集(G1):对齐 getEffectiveConstraints 的 config 裁剪模式
3
- *
4
- * 单一来源:注册表(默认 order)→ config.yml `gates.order` 声明式重排 →
5
- * `gates.<id>.enabled:false` 裁剪移除。
6
- *
7
- * 闭环:config.yml gates 配置引用了未注册的门禁 id → 抛错
8
- * (与注册表「引用未注册」同款闭环;gates 配置段为新增面,
9
- * 不存在历史残留配置,故不需静默忽略)。
10
- */
11
- import type { Gate } from './types';
12
- /**
13
- * config.yml `gates` 段
14
- */
15
- export interface GatesConfig {
16
- /** 声明式顺序(门禁 id 列表);未列出的按默认顺序排后 */
17
- order?: string[];
18
- /** 每个门禁的启用开关(gates.<id>.enabled: false = 裁剪) */
19
- [gateId: string]: {
20
- enabled?: boolean;
21
- } | string[] | undefined;
22
- }
23
- /**
24
- * 获取项目当前生效的门禁集(按 order 升序)
25
- *
26
- * @param projectRoot 项目根路径(缺省 process.cwd())
27
- * @throws config.yml gates 段引用未注册门禁 id 时抛错
28
- */
29
- export declare function getEffectiveGates(projectRoot?: string): Gate[];
30
- //# sourceMappingURL=effective-gates.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"effective-gates.d.ts","sourceRoot":"","sources":["../../src/gates/effective-gates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAKpC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,gDAAgD;IAChD,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CAChE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,GAAE,MAAsB,GAAG,IAAI,EAAE,CA8D7E"}
@@ -1,81 +0,0 @@
1
- "use strict";
2
- /**
3
- * 生效门禁集(G1):对齐 getEffectiveConstraints 的 config 裁剪模式
4
- *
5
- * 单一来源:注册表(默认 order)→ config.yml `gates.order` 声明式重排 →
6
- * `gates.<id>.enabled:false` 裁剪移除。
7
- *
8
- * 闭环:config.yml gates 配置引用了未注册的门禁 id → 抛错
9
- * (与注册表「引用未注册」同款闭环;gates 配置段为新增面,
10
- * 不存在历史残留配置,故不需静默忽略)。
11
- */
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.getEffectiveGates = getEffectiveGates;
14
- const registry_1 = require("./registry");
15
- const project_config_loader_1 = require("../core/project-config-loader");
16
- const effective_set_1 = require("../core/effective-set");
17
- /**
18
- * 获取项目当前生效的门禁集(按 order 升序)
19
- *
20
- * @param projectRoot 项目根路径(缺省 process.cwd())
21
- * @throws config.yml gates 段引用未注册门禁 id 时抛错
22
- */
23
- function getEffectiveGates(projectRoot = process.cwd()) {
24
- const raw = (0, project_config_loader_1.loadRawProjectConfig)(projectRoot);
25
- const config = raw?.gates;
26
- const gates = (0, registry_1.listRegisteredGates)();
27
- const known = new Set(gates.map(g => g.id));
28
- if (!config) {
29
- return sortByOrder(gates);
30
- }
31
- // ========================================
32
- // 闭环校验(order 重排与重复 id 检测留门禁侧;
33
- // enabled 段的未注册校验走共享筛选器 throw 模式)
34
- // ========================================
35
- const orderIds = Array.isArray(config.order) ? config.order : undefined;
36
- if (orderIds) {
37
- const seen = new Set();
38
- for (const id of orderIds) {
39
- if (!known.has(id)) {
40
- throw new Error(`[harness] config.yml gates.order 引用了未注册的门禁 "${id}"。` +
41
- `可用门禁: ${[...known].join(', ')}。`);
42
- }
43
- if (seen.has(id)) {
44
- throw new Error(`[harness] config.yml gates.order 中门禁 "${id}" 重复。`);
45
- }
46
- seen.add(id);
47
- }
48
- }
49
- // ========================================
50
- // enabled 裁剪(与 getEffectiveConstraints 的 enabled:false 删除同效)
51
- // ========================================
52
- const enabledEntries = {};
53
- for (const [key, value] of Object.entries(config)) {
54
- if (key === 'order')
55
- continue;
56
- enabledEntries[key] = value;
57
- }
58
- const { disabledIds } = (0, effective_set_1.filterEnabledEntries)(known, enabledEntries, {
59
- onUnknownId: 'throw',
60
- unknownIdError: id => `[harness] config.yml gates.${id} 引用了未注册的门禁。` +
61
- `可用门禁: ${[...known].join(', ')}。`,
62
- });
63
- const disabled = new Set(disabledIds);
64
- const effective = gates.filter(g => !disabled.has(g.id));
65
- // ========================================
66
- // order 重排:列出的按列表顺序,未列出的按默认顺序排后
67
- // ========================================
68
- if (orderIds) {
69
- const position = new Map(orderIds.map((id, i) => [id, i]));
70
- return effective.sort((a, b) => {
71
- const pa = position.has(a.id) ? position.get(a.id) : orderIds.length + a.order;
72
- const pb = position.has(b.id) ? position.get(b.id) : orderIds.length + b.order;
73
- return pa - pb;
74
- });
75
- }
76
- return sortByOrder(effective);
77
- }
78
- function sortByOrder(gates) {
79
- return gates.sort((a, b) => a.order - b.order);
80
- }
81
- //# sourceMappingURL=effective-gates.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"effective-gates.js","sourceRoot":"","sources":["../../src/gates/effective-gates.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- /**
2
- * 失败处理类型定义(兼容再导出)
3
- *
4
- * 工单 14:类型定义本体已归位 types 层(src/types/failure.ts),
5
- * 以消除 types/index.ts 对 ../failure 的反向 import。
6
- * 此文件保留原模块路径,供既有引用方(classifier/recorder/index 与外部消费者)继续工作。
7
- */
8
-
9
- export * from '../types/failure';