@dommaker/harness 0.19.0 → 1.1.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 (398) hide show
  1. package/CHANGELOG.md +22 -9
  2. package/bin/harness.js +136 -557
  3. package/dist/cli/commands/check.d.ts.map +1 -1
  4. package/dist/cli/commands/check.js +2 -13
  5. package/dist/cli/commands/check.js.map +1 -1
  6. package/dist/cli/commands/definitions.d.ts +90 -0
  7. package/dist/cli/commands/definitions.d.ts.map +1 -0
  8. package/dist/cli/commands/definitions.js +519 -0
  9. package/dist/cli/commands/definitions.js.map +1 -0
  10. package/dist/cli/commands/knowledge.js.map +1 -1
  11. package/dist/cli/commands/sync-docs/agents-syncer.d.ts.map +1 -1
  12. package/dist/cli/commands/sync-docs/agents-syncer.js +25 -4
  13. package/dist/cli/commands/sync-docs/agents-syncer.js.map +1 -1
  14. package/dist/cli/commands/sync-docs/capabilities-syncer.d.ts +3 -25
  15. package/dist/cli/commands/sync-docs/capabilities-syncer.d.ts.map +1 -1
  16. package/dist/cli/commands/sync-docs/capabilities-syncer.js +3 -93
  17. package/dist/cli/commands/sync-docs/capabilities-syncer.js.map +1 -1
  18. package/dist/cli/commands/sync-docs/index.d.ts +1 -1
  19. package/dist/cli/commands/sync-docs/index.d.ts.map +1 -1
  20. package/dist/cli/commands/sync-docs/index.js +4 -4
  21. package/dist/cli/commands/sync-docs/index.js.map +1 -1
  22. package/dist/completion-checkers/classify.d.ts +23 -0
  23. package/dist/completion-checkers/classify.d.ts.map +1 -0
  24. package/dist/completion-checkers/classify.js +37 -0
  25. package/dist/completion-checkers/classify.js.map +1 -0
  26. package/dist/completion-checkers/contract-presence.d.ts +12 -0
  27. package/dist/completion-checkers/contract-presence.d.ts.map +1 -0
  28. package/dist/completion-checkers/contract-presence.js +36 -0
  29. package/dist/completion-checkers/contract-presence.js.map +1 -0
  30. package/dist/completion-checkers/glob-match.d.ts +13 -0
  31. package/dist/completion-checkers/glob-match.d.ts.map +1 -0
  32. package/dist/completion-checkers/glob-match.js +58 -0
  33. package/dist/completion-checkers/glob-match.js.map +1 -0
  34. package/dist/completion-checkers/index.d.ts +19 -0
  35. package/dist/completion-checkers/index.d.ts.map +1 -0
  36. package/dist/completion-checkers/index.js +47 -0
  37. package/dist/completion-checkers/index.js.map +1 -0
  38. package/dist/completion-checkers/phase-format.d.ts +15 -0
  39. package/dist/completion-checkers/phase-format.d.ts.map +1 -0
  40. package/dist/completion-checkers/phase-format.js +42 -0
  41. package/dist/completion-checkers/phase-format.js.map +1 -0
  42. package/dist/completion-checkers/tdd-chain.d.ts +16 -0
  43. package/dist/completion-checkers/tdd-chain.d.ts.map +1 -0
  44. package/dist/completion-checkers/tdd-chain.js +57 -0
  45. package/dist/completion-checkers/tdd-chain.js.map +1 -0
  46. package/dist/completion-checkers/types.d.ts +77 -0
  47. package/dist/completion-checkers/types.d.ts.map +1 -0
  48. package/dist/completion-checkers/types.js +10 -0
  49. package/dist/completion-checkers/types.js.map +1 -0
  50. package/dist/context/index.d.ts +1 -5
  51. package/dist/context/index.d.ts.map +1 -1
  52. package/dist/context/index.js +1 -5
  53. package/dist/context/index.js.map +1 -1
  54. package/dist/context/knowledge-injector.d.ts +3 -3
  55. package/dist/context/knowledge-injector.d.ts.map +1 -1
  56. package/dist/context/knowledge-injector.js +1 -1
  57. package/dist/context/session-manager.d.ts +1 -12
  58. package/dist/context/session-manager.d.ts.map +1 -1
  59. package/dist/context/session-manager.js +0 -63
  60. package/dist/context/session-manager.js.map +1 -1
  61. package/dist/context/types.d.ts +1 -39
  62. package/dist/context/types.d.ts.map +1 -1
  63. package/dist/context/types.js +2 -15
  64. package/dist/context/types.js.map +1 -1
  65. package/dist/core/constraints/agent-prompt-renderer.d.ts +1 -1
  66. package/dist/core/constraints/agent-prompt-renderer.js +1 -1
  67. package/dist/core/constraints/capabilities-parser.d.ts +17 -2
  68. package/dist/core/constraints/capabilities-parser.d.ts.map +1 -1
  69. package/dist/core/constraints/capabilities-parser.js +84 -2
  70. package/dist/core/constraints/capabilities-parser.js.map +1 -1
  71. package/dist/core/constraints/checker.d.ts +3 -17
  72. package/dist/core/constraints/checker.d.ts.map +1 -1
  73. package/dist/core/constraints/checker.js +7 -47
  74. package/dist/core/constraints/checker.js.map +1 -1
  75. package/dist/core/constraints/definitions.d.ts +0 -7
  76. package/dist/core/constraints/definitions.d.ts.map +1 -1
  77. package/dist/core/constraints/definitions.js +1 -8
  78. package/dist/core/constraints/definitions.js.map +1 -1
  79. package/dist/core/constraints/doc-freshness/runner.d.ts +0 -2
  80. package/dist/core/constraints/doc-freshness/runner.d.ts.map +1 -1
  81. package/dist/core/constraints/doc-freshness/runner.js.map +1 -1
  82. package/dist/core/constraints/index.d.ts +1 -1
  83. package/dist/core/constraints/index.d.ts.map +1 -1
  84. package/dist/core/constraints/index.js +2 -3
  85. package/dist/core/constraints/index.js.map +1 -1
  86. package/dist/core/constraints/interceptor.d.ts.map +1 -1
  87. package/dist/core/constraints/interceptor.js +1 -5
  88. package/dist/core/constraints/interceptor.js.map +1 -1
  89. package/dist/core/effective-constraints.d.ts.map +1 -1
  90. package/dist/core/effective-constraints.js +0 -1
  91. package/dist/core/effective-constraints.js.map +1 -1
  92. package/dist/core/project-config-loader.d.ts.map +1 -1
  93. package/dist/core/project-config-loader.js +1 -8
  94. package/dist/core/project-config-loader.js.map +1 -1
  95. package/dist/dashboard/stats.d.ts.map +1 -1
  96. package/dist/dashboard/stats.js.map +1 -1
  97. package/dist/dashboard/types.d.ts +2 -2
  98. package/dist/dashboard/types.d.ts.map +1 -1
  99. package/dist/failure/constraint-handler.d.ts.map +1 -1
  100. package/dist/failure/constraint-handler.js +0 -2
  101. package/dist/failure/constraint-handler.js.map +1 -1
  102. package/dist/gates/acceptance.d.ts +9 -1
  103. package/dist/gates/acceptance.d.ts.map +1 -1
  104. package/dist/gates/acceptance.js +21 -0
  105. package/dist/gates/acceptance.js.map +1 -1
  106. package/dist/gates/checker-gate.d.ts +23 -0
  107. package/dist/gates/checker-gate.d.ts.map +1 -0
  108. package/dist/gates/checker-gate.js +53 -0
  109. package/dist/gates/checker-gate.js.map +1 -0
  110. package/dist/gates/command.d.ts +9 -2
  111. package/dist/gates/command.d.ts.map +1 -1
  112. package/dist/gates/command.js +10 -0
  113. package/dist/gates/command.js.map +1 -1
  114. package/dist/gates/contract.d.ts +8 -2
  115. package/dist/gates/contract.d.ts.map +1 -1
  116. package/dist/gates/contract.js +9 -0
  117. package/dist/gates/contract.js.map +1 -1
  118. package/dist/gates/decision.d.ts +17 -0
  119. package/dist/gates/decision.d.ts.map +1 -0
  120. package/dist/gates/decision.js +25 -0
  121. package/dist/gates/decision.js.map +1 -0
  122. package/dist/gates/definitions.d.ts +63 -0
  123. package/dist/gates/definitions.d.ts.map +1 -0
  124. package/dist/gates/definitions.js +160 -0
  125. package/dist/gates/definitions.js.map +1 -0
  126. package/dist/gates/effective-gates.d.ts +30 -0
  127. package/dist/gates/effective-gates.d.ts.map +1 -0
  128. package/dist/gates/effective-gates.js +85 -0
  129. package/dist/gates/effective-gates.js.map +1 -0
  130. package/dist/gates/index.d.ts +25 -1
  131. package/dist/gates/index.d.ts.map +1 -1
  132. package/dist/gates/index.js +37 -1
  133. package/dist/gates/index.js.map +1 -1
  134. package/dist/gates/performance.d.ts +8 -2
  135. package/dist/gates/performance.d.ts.map +1 -1
  136. package/dist/gates/performance.js +9 -0
  137. package/dist/gates/performance.js.map +1 -1
  138. package/dist/gates/registry.d.ts +32 -0
  139. package/dist/gates/registry.d.ts.map +1 -0
  140. package/dist/gates/registry.js +90 -0
  141. package/dist/gates/registry.js.map +1 -0
  142. package/dist/gates/review.d.ts +8 -2
  143. package/dist/gates/review.d.ts.map +1 -1
  144. package/dist/gates/review.js +9 -0
  145. package/dist/gates/review.js.map +1 -1
  146. package/dist/gates/runner.d.ts +30 -0
  147. package/dist/gates/runner.d.ts.map +1 -0
  148. package/dist/gates/runner.js +38 -0
  149. package/dist/gates/runner.js.map +1 -0
  150. package/dist/gates/security.d.ts +8 -2
  151. package/dist/gates/security.d.ts.map +1 -1
  152. package/dist/gates/security.js +9 -0
  153. package/dist/gates/security.js.map +1 -1
  154. package/dist/gates/types.d.ts +41 -1
  155. package/dist/gates/types.d.ts.map +1 -1
  156. package/dist/hooks/bootstrap.d.ts.map +1 -1
  157. package/dist/hooks/bootstrap.js +0 -2
  158. package/dist/hooks/bootstrap.js.map +1 -1
  159. package/dist/hooks/config.d.ts +26 -0
  160. package/dist/hooks/config.d.ts.map +1 -0
  161. package/dist/hooks/config.js +30 -0
  162. package/dist/hooks/config.js.map +1 -0
  163. package/dist/hooks/index.d.ts +2 -1
  164. package/dist/hooks/index.d.ts.map +1 -1
  165. package/dist/hooks/index.js +4 -1
  166. package/dist/hooks/index.js.map +1 -1
  167. package/dist/hooks/registry.d.ts +18 -1
  168. package/dist/hooks/registry.d.ts.map +1 -1
  169. package/dist/hooks/registry.js +45 -0
  170. package/dist/hooks/registry.js.map +1 -1
  171. package/dist/hooks/types.d.ts +20 -0
  172. package/dist/hooks/types.d.ts.map +1 -1
  173. package/dist/index.d.ts +5 -8
  174. package/dist/index.d.ts.map +1 -1
  175. package/dist/index.js +11 -20
  176. package/dist/index.js.map +1 -1
  177. package/dist/knowledge/import.d.ts +2 -2
  178. package/dist/knowledge/import.d.ts.map +1 -1
  179. package/dist/knowledge/ingest.js.map +1 -1
  180. package/dist/knowledge/lifecycle-hooks.d.ts +2 -2
  181. package/dist/knowledge/lifecycle-hooks.d.ts.map +1 -1
  182. package/dist/knowledge/types.d.ts +5 -7
  183. package/dist/knowledge/types.d.ts.map +1 -1
  184. package/dist/knowledge/types.js +1 -1
  185. package/dist/knowledge/types.js.map +1 -1
  186. package/dist/monitoring/constraint-doctor.d.ts +4 -22
  187. package/dist/monitoring/constraint-doctor.d.ts.map +1 -1
  188. package/dist/monitoring/constraint-doctor.js +7 -94
  189. package/dist/monitoring/constraint-doctor.js.map +1 -1
  190. package/dist/presets/standard.d.ts +1 -1
  191. package/dist/presets/standard.d.ts.map +1 -1
  192. package/dist/presets/standard.js +1 -2
  193. package/dist/presets/standard.js.map +1 -1
  194. package/dist/pretool-use-hook.d.ts +16 -0
  195. package/dist/pretool-use-hook.d.ts.map +1 -0
  196. package/dist/pretool-use-hook.js +68 -0
  197. package/dist/pretool-use-hook.js.map +1 -0
  198. package/dist/spec/annotation-checker.d.ts.map +1 -1
  199. package/dist/spec/annotation-checker.js +6 -26
  200. package/dist/spec/annotation-checker.js.map +1 -1
  201. package/dist/tools/index.d.ts +0 -4
  202. package/dist/tools/index.d.ts.map +1 -1
  203. package/dist/tools/index.js +0 -4
  204. package/dist/tools/index.js.map +1 -1
  205. package/dist/types/constraint.d.ts +1 -12
  206. package/dist/types/constraint.d.ts.map +1 -1
  207. package/dist/types/constraint.js +0 -3
  208. package/dist/types/constraint.js.map +1 -1
  209. package/dist/types/project-config.d.ts +0 -2
  210. package/dist/types/project-config.d.ts.map +1 -1
  211. package/dist/utils/file-walk.d.ts +2 -2
  212. package/dist/utils/file-walk.js +2 -2
  213. package/package.json +6 -1
  214. package/src/CONTEXT.md +15 -0
  215. package/src/__tests__/checker-extra.test.ts +2 -59
  216. package/src/__tests__/constraint-doctor.test.ts +1 -140
  217. package/src/__tests__/constraint-handler.test.ts +0 -4
  218. package/src/__tests__/pretool-use-hook.test.ts +82 -0
  219. package/src/__tests__/project-config-loader-extra.test.ts +0 -20
  220. package/src/__tests__/project-config-loader.test.ts +0 -1
  221. package/src/cli/commands/CONTEXT.md +15 -7
  222. package/src/cli/commands/__tests__/check-drift.test.ts +0 -3
  223. package/src/cli/commands/__tests__/check-skip-output.test.ts +0 -5
  224. package/src/cli/commands/__tests__/check.test.ts +7 -75
  225. package/src/cli/commands/__tests__/registry.test.ts +201 -0
  226. package/src/cli/commands/__tests__/sync-docs-agents.test.ts +55 -0
  227. package/src/cli/commands/check.ts +2 -14
  228. package/src/cli/commands/definitions.ts +593 -0
  229. package/src/cli/commands/knowledge.ts +3 -3
  230. package/src/cli/commands/sync-docs/agents-syncer.ts +26 -6
  231. package/src/cli/commands/sync-docs/capabilities-syncer.ts +4 -110
  232. package/src/cli/commands/sync-docs/index.ts +8 -5
  233. package/src/completion-checkers/CONTEXT.md +25 -0
  234. package/src/completion-checkers/__tests__/contract-presence.test.ts +44 -0
  235. package/src/completion-checkers/__tests__/phase-format.test.ts +60 -0
  236. package/src/completion-checkers/__tests__/tdd-chain.test.ts +99 -0
  237. package/src/completion-checkers/classify.ts +47 -0
  238. package/src/completion-checkers/contract-presence.ts +40 -0
  239. package/src/completion-checkers/glob-match.ts +54 -0
  240. package/src/completion-checkers/index.ts +19 -0
  241. package/src/completion-checkers/phase-format.ts +48 -0
  242. package/src/completion-checkers/tdd-chain.ts +63 -0
  243. package/src/completion-checkers/types.ts +84 -0
  244. package/src/context/CONTEXT.md +2 -7
  245. package/src/context/__tests__/session-manager.test.ts +0 -91
  246. package/src/context/index.ts +1 -5
  247. package/src/context/knowledge-injector.ts +3 -3
  248. package/src/context/session-manager.ts +0 -74
  249. package/src/context/types.ts +2 -63
  250. package/src/core/constraints/__tests__/interceptor.test.ts +0 -2
  251. package/src/core/constraints/agent-prompt-renderer.ts +1 -1
  252. package/src/core/constraints/capabilities-parser.ts +95 -2
  253. package/src/core/constraints/checker.ts +8 -53
  254. package/src/core/constraints/definitions.ts +0 -8
  255. package/src/core/constraints/doc-freshness/runner.ts +1 -2
  256. package/src/core/constraints/index.ts +1 -2
  257. package/src/core/constraints/interceptor.ts +1 -6
  258. package/src/core/effective-constraints.ts +0 -1
  259. package/src/core/project-config-loader.ts +1 -7
  260. package/src/dashboard/stats.ts +2 -2
  261. package/src/dashboard/types.ts +2 -2
  262. package/src/failure/constraint-handler.ts +0 -2
  263. package/src/gates/CONTEXT.md +16 -13
  264. package/src/gates/__tests__/checker-gate.test.ts +45 -0
  265. package/src/gates/__tests__/contract.test.ts +73 -0
  266. package/src/gates/__tests__/effective-gates.test.ts +82 -0
  267. package/src/gates/__tests__/gate-interface.test.ts +202 -0
  268. package/src/gates/__tests__/registry.test.ts +87 -0
  269. package/src/gates/__tests__/runner.test.ts +81 -0
  270. package/src/gates/acceptance.ts +24 -1
  271. package/src/gates/checker-gate.ts +54 -0
  272. package/src/gates/command.ts +13 -2
  273. package/src/gates/contract.ts +12 -2
  274. package/src/gates/decision.ts +27 -0
  275. package/src/gates/definitions.ts +207 -0
  276. package/src/gates/effective-gates.ts +106 -0
  277. package/src/gates/index.ts +38 -0
  278. package/src/gates/performance.ts +12 -2
  279. package/src/gates/registry.ts +107 -0
  280. package/src/gates/review.ts +12 -2
  281. package/src/gates/runner.ts +57 -0
  282. package/src/gates/security.ts +12 -2
  283. package/src/gates/types.ts +48 -1
  284. package/src/hooks/CONTEXT.md +12 -2
  285. package/src/hooks/__tests__/bootstrap.test.ts +0 -1
  286. package/src/hooks/__tests__/config.test.ts +19 -0
  287. package/src/hooks/__tests__/pipeline.test.ts +79 -0
  288. package/src/hooks/__tests__/registry.test.ts +67 -0
  289. package/src/hooks/bootstrap.ts +0 -2
  290. package/src/hooks/config.ts +29 -0
  291. package/src/hooks/index.ts +2 -1
  292. package/src/hooks/registry.ts +60 -1
  293. package/src/hooks/types.ts +21 -0
  294. package/src/index.ts +11 -21
  295. package/src/knowledge/import.ts +3 -3
  296. package/src/knowledge/ingest.ts +4 -4
  297. package/src/knowledge/lifecycle-hooks.ts +3 -3
  298. package/src/knowledge/types.ts +5 -8
  299. package/src/monitoring/constraint-doctor.ts +7 -106
  300. package/src/presets/__tests__/standard.test.ts +0 -2
  301. package/src/presets/standard.ts +1 -2
  302. package/src/pretool-use-hook.ts +68 -0
  303. package/src/spec/__tests__/annotation-checker.test.ts +9 -3
  304. package/src/spec/annotation-checker.ts +7 -29
  305. package/src/tools/CONTEXT.md +7 -14
  306. package/src/tools/index.ts +0 -4
  307. package/src/types/constraint.ts +1 -14
  308. package/src/types/project-config.ts +0 -3
  309. package/src/utils/file-walk.ts +2 -2
  310. package/dist/architecture/constraint-engine.d.ts +0 -67
  311. package/dist/architecture/constraint-engine.d.ts.map +0 -1
  312. package/dist/architecture/constraint-engine.js +0 -295
  313. package/dist/architecture/constraint-engine.js.map +0 -1
  314. package/dist/architecture/cross-project-checker.d.ts +0 -54
  315. package/dist/architecture/cross-project-checker.d.ts.map +0 -1
  316. package/dist/architecture/cross-project-checker.js +0 -467
  317. package/dist/architecture/cross-project-checker.js.map +0 -1
  318. package/dist/cli/commands/index.d.ts +0 -30
  319. package/dist/cli/commands/index.d.ts.map +0 -1
  320. package/dist/cli/commands/index.js +0 -91
  321. package/dist/cli/commands/index.js.map +0 -1
  322. package/dist/context/file-budget.d.ts +0 -40
  323. package/dist/context/file-budget.d.ts.map +0 -1
  324. package/dist/context/file-budget.js +0 -147
  325. package/dist/context/file-budget.js.map +0 -1
  326. package/dist/context/progressive-loader.d.ts +0 -109
  327. package/dist/context/progressive-loader.d.ts.map +0 -1
  328. package/dist/context/progressive-loader.js +0 -166
  329. package/dist/context/progressive-loader.js.map +0 -1
  330. package/dist/context/token-pipeline.d.ts +0 -55
  331. package/dist/context/token-pipeline.d.ts.map +0 -1
  332. package/dist/context/token-pipeline.js +0 -220
  333. package/dist/context/token-pipeline.js.map +0 -1
  334. package/dist/context/tool-output-budget.d.ts +0 -59
  335. package/dist/context/tool-output-budget.d.ts.map +0 -1
  336. package/dist/context/tool-output-budget.js +0 -177
  337. package/dist/context/tool-output-budget.js.map +0 -1
  338. package/dist/core/constraints/default-executors.d.ts +0 -10
  339. package/dist/core/constraints/default-executors.d.ts.map +0 -1
  340. package/dist/core/constraints/default-executors.js +0 -120
  341. package/dist/core/constraints/default-executors.js.map +0 -1
  342. package/dist/llm/adapter.d.ts +0 -36
  343. package/dist/llm/adapter.d.ts.map +0 -1
  344. package/dist/llm/adapter.js +0 -118
  345. package/dist/llm/adapter.js.map +0 -1
  346. package/dist/llm/index.d.ts +0 -3
  347. package/dist/llm/index.d.ts.map +0 -1
  348. package/dist/llm/index.js +0 -19
  349. package/dist/llm/index.js.map +0 -1
  350. package/dist/llm/types.d.ts +0 -62
  351. package/dist/llm/types.d.ts.map +0 -1
  352. package/dist/llm/types.js +0 -8
  353. package/dist/llm/types.js.map +0 -1
  354. package/dist/tools/core/index.d.ts +0 -13
  355. package/dist/tools/core/index.d.ts.map +0 -1
  356. package/dist/tools/core/index.js +0 -198
  357. package/dist/tools/core/index.js.map +0 -1
  358. package/dist/tools/loader.d.ts +0 -21
  359. package/dist/tools/loader.d.ts.map +0 -1
  360. package/dist/tools/loader.js +0 -199
  361. package/dist/tools/loader.js.map +0 -1
  362. package/dist/tools/registry.d.ts +0 -59
  363. package/dist/tools/registry.d.ts.map +0 -1
  364. package/dist/tools/registry.js +0 -115
  365. package/dist/tools/registry.js.map +0 -1
  366. package/dist/tools/types.d.ts +0 -38
  367. package/dist/tools/types.d.ts.map +0 -1
  368. package/dist/tools/types.js +0 -6
  369. package/dist/tools/types.js.map +0 -1
  370. package/src/__tests__/architecture-engine.test.ts +0 -619
  371. package/src/__tests__/context/progressive-loader.test.ts +0 -131
  372. package/src/__tests__/cross-project-checker.test.ts +0 -318
  373. package/src/architecture/CONTEXT.md +0 -22
  374. package/src/architecture/constraint-engine.ts +0 -351
  375. package/src/architecture/cross-project-checker.ts +0 -545
  376. package/src/cli/commands/index.ts +0 -30
  377. package/src/context/__tests__/file-budget.test.ts +0 -142
  378. package/src/context/__tests__/progressive-loader.test.ts +0 -264
  379. package/src/context/__tests__/token-pipeline.test.ts +0 -178
  380. package/src/context/__tests__/tool-output-budget.test.ts +0 -95
  381. package/src/context/file-budget.ts +0 -142
  382. package/src/context/progressive-loader.ts +0 -260
  383. package/src/context/token-pipeline.ts +0 -265
  384. package/src/context/tool-output-budget.ts +0 -178
  385. package/src/core/constraints/__tests__/default-executors.test.ts +0 -57
  386. package/src/core/constraints/default-executors.ts +0 -92
  387. package/src/llm/CONTEXT.md +0 -21
  388. package/src/llm/__tests__/adapter.test.ts +0 -172
  389. package/src/llm/adapter.ts +0 -149
  390. package/src/llm/index.ts +0 -2
  391. package/src/llm/types.ts +0 -81
  392. package/src/tools/__tests__/loader.test.ts +0 -252
  393. package/src/tools/__tests__/registry.test.ts +0 -157
  394. package/src/tools/core/__tests__/core.test.ts +0 -122
  395. package/src/tools/core/index.ts +0 -201
  396. package/src/tools/loader.ts +0 -216
  397. package/src/tools/registry.ts +0 -128
  398. package/src/tools/types.ts +0 -46
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Completion Checkers 类型定义(T7-E1,studio#160)
3
+ *
4
+ * 三个纯判定函数共享的输入/输出/配置类型。
5
+ * 与 ConstraintCheck 闭环注册表无关:直接 export,不注册、不碰 checkers/index.ts。
6
+ * 函数不碰文件系统与 git,commits 由调用方(studio 侧 git log)供给。
7
+ */
8
+
9
+ /** WU 提交输入(有序,base..HEAD 升序) */
10
+ export interface CommitInput {
11
+ /** 完整 sha */
12
+ sha: string;
13
+ /** commit subject(第一行) */
14
+ subject: string;
15
+ /** commit body(trailer 所在) */
16
+ body: string;
17
+ /** 本 commit 触碰的文件清单(相对路径) */
18
+ files: string[];
19
+ /**
20
+ * 是否 merge commit。调用方有 git 数据时应显式供给(如 %P 父数 > 1);
21
+ * 缺省时按 subject 启发式判定(`/^Merge\s/`)。
22
+ */
23
+ isMerge?: boolean;
24
+ }
25
+
26
+ /** 判定结论:pass / violation / waiver(豁免放行,记台账)/ skip(不适用,不记台账) */
27
+ export type CheckerVerdict = 'pass' | 'violation' | 'waiver' | 'skip';
28
+
29
+ /** 单 commit 判定明细 */
30
+ export interface CommitVerdict {
31
+ sha: string;
32
+ verdict: CheckerVerdict;
33
+ reason?: string;
34
+ }
35
+
36
+ /** verifyTddChain 结果。整体 verdict 只取 pass/violation/skip;waiver 是 commit 级结论 */
37
+ export interface TddChainResult {
38
+ checker: 'tdd-chain';
39
+ verdict: 'pass' | 'violation' | 'skip';
40
+ commits: CommitVerdict[];
41
+ }
42
+
43
+ /** verifyPhaseFormat 结果 */
44
+ export interface PhaseFormatResult {
45
+ checker: 'phase-format';
46
+ verdict: 'pass' | 'violation' | 'skip';
47
+ commits: CommitVerdict[];
48
+ }
49
+
50
+ /** verifyContractPresence 上下文(类型→字段的判定方法映射是代码不是配置) */
51
+ export interface ContractPresenceContext {
52
+ /** review 类型契约:studio agent-loop 已解析的 metadata.reviewReport */
53
+ reviewReport?: unknown;
54
+ [key: string]: unknown;
55
+ }
56
+
57
+ /** verifyContractPresence 结果 */
58
+ export interface ContractPresenceResult {
59
+ checker: 'contract-presence';
60
+ verdict: 'pass' | 'violation' | 'skip';
61
+ detail?: string;
62
+ }
63
+
64
+ /**
65
+ * completion_checkers 配置(对应 yml 顶层键 `completion_checkers:`,studio 侧自解)。
66
+ * 只配开关/glob/契约类型清单;协议格式(Tested-By、Tests: none、phase 结构)写死为机制本体。
67
+ * 缺省 = 全开 + 默认 glob。
68
+ */
69
+ export interface CompletionCheckersConfig {
70
+ /** 总开关,缺省 true */
71
+ enabled?: boolean;
72
+ /** 各 checker 开关,缺省全开 */
73
+ checkers?: {
74
+ tddChain?: boolean;
75
+ phaseFormat?: boolean;
76
+ contractPresence?: boolean;
77
+ };
78
+ /** 测试文件 glob,缺省 DEFAULT_TEST_GLOBS */
79
+ testGlobs?: string[];
80
+ /** 非代码文件 glob,缺省 DEFAULT_NONCODE_GLOBS */
81
+ noncodeGlobs?: string[];
82
+ /** 契约类型清单:类型在清单内才判定,无表项 = skip */
83
+ contracts?: string[];
84
+ }
@@ -1,15 +1,11 @@
1
1
  # context/
2
2
 
3
3
  ## 职责
4
- 上下文管理:Token 预算(多级分配)、渐进式加载(worker pool 并发)、文件/工具输出预算、会话压缩、Token 流水线、知识注入。
4
+ 上下文管理:Token 预算(多级分配)、会话压缩、会话管理、知识注入。
5
5
 
6
6
  ## 核心导出
7
7
  - `TokenBudget` — 多级 token 预算(system/user/tool/reserve)
8
- - `ProgressiveLoader` — 渐进式加载 + worker pool 并发
9
- - `FileBudget` — 文件级 token 预算
10
- - `ToolOutputBudget` — 工具输出 token 预算
11
8
  - `Compaction` — 会话压缩(摘要/截断/滑动窗口)
12
- - `TokenPipeline` — Token 流水线
13
9
  - `SessionManager` — 会话管理
14
10
  - `KnowledgeInjector` — 知识注入引擎
15
11
 
@@ -20,9 +16,8 @@
20
16
 
21
17
  ## 约定
22
18
  - Token 预算策略由配置文件控制
23
- - 渐进式加载保证输入顺序(worker pool 模式)
24
19
  - 会话压缩策略可组合
25
20
 
26
21
  ## 注意事项
27
- - Phase 2 实现的 Token 流水线 + 预算 + 压缩
28
22
  - 零 Token 成本:纯计算,不调用 LLM
23
+ - Phase 2 前瞻的渐进式加载/Token 流水线/文件与工具输出预算已随 H1(#40)删除
@@ -81,50 +81,6 @@ describe('SessionManager', () => {
81
81
  });
82
82
  });
83
83
 
84
- describe('getWindowView', () => {
85
- it('应该生成窗口视图', () => {
86
- manager.createSession('session-1');
87
- manager.appendToSession('session-1', {
88
- type: 'system',
89
- id: 'sys-1',
90
- content: 'You are helpful.',
91
- timestamp: 't1',
92
- });
93
- manager.appendToSession('session-1', {
94
- type: 'user_message',
95
- id: 'msg-1',
96
- content: 'Hello',
97
- timestamp: 't2',
98
- });
99
-
100
- const output = manager.getWindowView('session-1', {
101
- total: 8000,
102
- systemPrompt: 1000,
103
- toolDefinitions: 500,
104
- knowledge: 600,
105
- notes: 300,
106
- history: 5600,
107
- });
108
-
109
- expect(output.prompt).toContain('You are helpful.');
110
- expect(output.prompt).toContain('Hello');
111
- expect(output.snapshot).toBeDefined();
112
- });
113
-
114
- it('应该抛出当会话不存在', () => {
115
- expect(() => {
116
- manager.getWindowView('nonexistent', {
117
- total: 8000,
118
- systemPrompt: 1000,
119
- toolDefinitions: 500,
120
- knowledge: 600,
121
- notes: 300,
122
- history: 5600,
123
- });
124
- }).toThrow('不存在');
125
- });
126
- });
127
-
128
84
  describe('checkpointSession', () => {
129
85
  it('应该生成 checkpoint', () => {
130
86
  manager.createSession('session-1');
@@ -250,51 +206,4 @@ describe('SessionManager', () => {
250
206
  });
251
207
  });
252
208
 
253
- describe('getWindowView with all event types', () => {
254
- it('handles all event types through eventsToSources', () => {
255
- manager.createSession('session-event-types');
256
- manager.appendToSession('session-event-types', {
257
- type: 'system',
258
- id: 'sys-1',
259
- content: 'System prompt',
260
- timestamp: 't1',
261
- });
262
- manager.appendToSession('session-event-types', {
263
- type: 'assistant_message',
264
- id: 'asst-1',
265
- content: 'I will help',
266
- timestamp: 't2',
267
- });
268
- manager.appendToSession('session-event-types', {
269
- type: 'tool_call',
270
- id: 'tool-1',
271
- content: 'run test',
272
- timestamp: 't3',
273
- });
274
- manager.appendToSession('session-event-types', {
275
- type: 'tool_result',
276
- id: 'tool-2',
277
- content: 'test output',
278
- timestamp: 't4',
279
- });
280
- manager.appendToSession('session-event-types', {
281
- type: 'checkpoint',
282
- id: 'cp-1',
283
- content: 'session summary',
284
- timestamp: 't5',
285
- });
286
-
287
- const output = manager.getWindowView('session-event-types', {
288
- total: 8000,
289
- systemPrompt: 1000,
290
- toolDefinitions: 500,
291
- knowledge: 600,
292
- notes: 300,
293
- history: 5600,
294
- });
295
-
296
- expect(output).toBeDefined();
297
- expect(output.prompt).toBeDefined();
298
- });
299
- });
300
209
  });
@@ -1,15 +1,11 @@
1
1
  /**
2
2
  * 上下文管理模块
3
3
  *
4
- * Phase 2: Token 流水线 + 预算 + 压缩
4
+ * Token 预算 + 会话压缩 + 知识注入
5
5
  */
6
6
 
7
7
  export * from './types';
8
8
  export * from './token-budget';
9
- export * from './progressive-loader';
10
- export * from './file-budget';
11
- export * from './tool-output-budget';
12
9
  export * from './compaction';
13
- export * from './token-pipeline';
14
10
  export * from './session-manager';
15
11
  export * from './knowledge-injector';
@@ -1,20 +1,20 @@
1
1
  /**
2
2
  * 知识注入器
3
3
  *
4
- * 将知识条目转换为 ContextSource,注入到 TokenPipeline 的 P3 位置
4
+ * 将知识条目转换为 ContextSource,供上层上下文组装消费
5
5
  * 支持按阶段预算、类型过滤、去重
6
6
  */
7
7
 
8
8
  import { KnowledgeQuery } from '../knowledge/query';
9
9
  import { TokenEstimator } from './token-budget';
10
- import type { KnowledgeEntry, KnowledgeType } from '../knowledge/types';
10
+ import type { KnowledgeEntry, KnowledgeSubsystem } from '../knowledge/types';
11
11
  import type { ContextSource } from './types';
12
12
 
13
13
  export interface InjectionConfig {
14
14
  /** Token 预算(默认 800) */
15
15
  budget: number;
16
16
  /** 关注的知识类型 */
17
- focusTypes?: KnowledgeType[];
17
+ focusTypes?: KnowledgeSubsystem[];
18
18
  /** 当前阶段 */
19
19
  phase?: string;
20
20
  /** 已注入的条目 ID(去重) */
@@ -8,26 +8,20 @@
8
8
 
9
9
  import * as fs from 'fs';
10
10
  import * as path from 'path';
11
- import { TokenPipeline } from './token-pipeline';
12
11
  import { ContextTracker } from '../monitoring/context-tracker';
13
12
  import type {
14
13
  SessionEvent,
15
14
  SessionHandle,
16
15
  SessionCheckpoint,
17
- TokenBudgetAllocation,
18
- PipelineOutput,
19
- ContextSource,
20
16
  } from './types';
21
17
 
22
18
  export class SessionManager {
23
19
  private basePath: string;
24
20
  private sessions: Map<string, SessionHandle> = new Map();
25
- private pipeline: TokenPipeline;
26
21
  private tracker: ContextTracker;
27
22
 
28
23
  constructor(basePath?: string) {
29
24
  this.basePath = basePath || process.cwd();
30
- this.pipeline = new TokenPipeline();
31
25
  this.tracker = new ContextTracker(this.basePath);
32
26
  }
33
27
 
@@ -139,29 +133,6 @@ export class SessionManager {
139
133
  this.appendEvent(id, event);
140
134
  }
141
135
 
142
- /**
143
- * 获取当前轮窗口视图(自动从磁盘加载,S2)
144
- *
145
- * 将 session 事件转换为 ContextSource,通过 TokenPipeline 生成 prompt
146
- */
147
- getWindowView(id: string, budget: TokenBudgetAllocation): PipelineOutput {
148
- const handle = this.getSession(id);
149
- if (!handle) {
150
- throw new Error(`会话 ${id} 不存在`);
151
- }
152
-
153
- // 将事件转换为 ContextSource
154
- const sources = this.eventsToSources(handle.events);
155
-
156
- // 通过 pipeline 生成窗口视图
157
- const output = this.pipeline.run({ sources, budget });
158
-
159
- // 记录快照
160
- this.tracker.record(output.snapshot);
161
-
162
- return output;
163
- }
164
-
165
136
  /**
166
137
  * 生成 checkpoint(自动从磁盘加载,S2)
167
138
  */
@@ -242,51 +213,6 @@ export class SessionManager {
242
213
  return this.tracker;
243
214
  }
244
215
 
245
- /**
246
- * 将事件转换为 ContextSource
247
- */
248
- private eventsToSources(events: SessionEvent[]): ContextSource[] {
249
- return events.map(event => {
250
- let priority: number;
251
- let type: ContextSource['type'];
252
-
253
- switch (event.type) {
254
- case 'system':
255
- priority = 1;
256
- type = 'system_prompt';
257
- break;
258
- case 'user_message':
259
- priority = 6;
260
- type = 'user_message';
261
- break;
262
- case 'assistant_message':
263
- priority = 5;
264
- type = 'session_event';
265
- break;
266
- case 'tool_call':
267
- case 'tool_result':
268
- priority = 5;
269
- type = 'tool_output';
270
- break;
271
- case 'checkpoint':
272
- priority = 4;
273
- type = 'session_event';
274
- break;
275
- default:
276
- priority = 5;
277
- type = 'session_event';
278
- }
279
-
280
- return {
281
- type,
282
- id: event.id,
283
- content: event.content,
284
- priority,
285
- metadata: event.metadata,
286
- };
287
- });
288
- }
289
-
290
216
  /**
291
217
  * 生成 checkpoint 摘要
292
218
  */
@@ -1,49 +1,9 @@
1
1
  /**
2
2
  * 上下文管理类型定义
3
3
  *
4
- * Phase 2: Token 流水线 + 预算 + 压缩
4
+ * Token 预算 + 会话压缩 + 会话管理 + 知识注入
5
5
  */
6
6
 
7
- import type { QueryResult } from '../knowledge/types';
8
-
9
- // ========================================
10
- // 文件读取预算
11
- // ========================================
12
-
13
- export interface FileBudgetConfig {
14
- maxLines: number; // 默认 2000
15
- maxBytes: number; // 默认 50KB (51200)
16
- maxTokenEstimate: number; // 默认 8000
17
- continuationHint: boolean; // 默认 true
18
- }
19
-
20
- export const DEFAULT_FILE_BUDGET: FileBudgetConfig = {
21
- maxLines: 2000,
22
- maxBytes: 51200,
23
- maxTokenEstimate: 8000,
24
- continuationHint: true,
25
- };
26
-
27
- // ========================================
28
- // 工具输出预算
29
- // ========================================
30
-
31
- export interface ToolOutputBudgetConfig {
32
- maxChars: number; // 默认 16000
33
- maxTokenRatio: number; // 默认 0.3 (占总预算 30%)
34
- previewLines: number; // 默认 50
35
- overflowToDisk: boolean; // 默认 false
36
- dedup: boolean; // 默认 true
37
- }
38
-
39
- export const DEFAULT_TOOL_OUTPUT_BUDGET: ToolOutputBudgetConfig = {
40
- maxChars: 16000,
41
- maxTokenRatio: 0.3,
42
- previewLines: 50,
43
- overflowToDisk: false,
44
- dedup: true,
45
- };
46
-
47
7
  // ========================================
48
8
  // 会话压缩
49
9
  // ========================================
@@ -76,7 +36,7 @@ export interface SessionMessage {
76
36
  }
77
37
 
78
38
  // ========================================
79
- // Token Pipeline
39
+ // 上下文来源
80
40
  // ========================================
81
41
 
82
42
  export type ContextSourceType = 'session_event' | 'tool_output' | 'knowledge' | 'user_message' | 'system_prompt' | 'tool_definition';
@@ -89,27 +49,6 @@ export interface ContextSource {
89
49
  metadata?: Record<string, any>;
90
50
  }
91
51
 
92
- export interface TokenBudgetAllocation {
93
- total: number;
94
- systemPrompt: number; // 固定,不压缩
95
- toolDefinitions: number; // 按需懒加载
96
- knowledge: number; // 500-800
97
- notes: number; // 200-500
98
- history: number; // 剩余预算
99
- }
100
-
101
- export interface PipelineInput {
102
- sources: ContextSource[];
103
- budget: TokenBudgetAllocation;
104
- knowledge?: QueryResult;
105
- }
106
-
107
- export interface PipelineOutput {
108
- prompt: string;
109
- snapshot: ContextUsageSnapshot;
110
- dropped: Array<{ type: string; id: string; reason: string }>;
111
- }
112
-
113
52
  // ========================================
114
53
  // 上下文使用快照
115
54
  // ========================================
@@ -64,7 +64,6 @@ describe('ConstraintInterceptor', () => {
64
64
  mockChecker.getConstraints.mockReturnValue({
65
65
  ironLaws: { test_iron_law: mockIronLaw },
66
66
  guidelines: { test_guideline: mockGuideline },
67
- tips: {},
68
67
  prompts: {},
69
68
  });
70
69
  });
@@ -202,7 +201,6 @@ describe('ConstraintInterceptor', () => {
202
201
  mockChecker.getConstraints.mockReturnValue({
203
202
  ironLaws: {},
204
203
  guidelines: {},
205
- tips: {},
206
204
  prompts: {},
207
205
  });
208
206
 
@@ -8,7 +8,7 @@
8
8
  * custom 追加 → scenes 过滤),与 init 注入、harness check 同一来源。
9
9
  *
10
10
  * 输出按层级分组:铁律 → 指导原则 → 行为提示;无 promptInjection 的约束
11
- * (如 docs_freshness)不渲染。tip 层级已随 TIPS 退役,不参与分组。
11
+ * (如 docs_freshness)不渲染。
12
12
  */
13
13
 
14
14
  import type { Constraint, ConstraintLevel, ConstraintTrigger } from '../../types/constraint';
@@ -1,11 +1,16 @@
1
1
  /**
2
- * CAPABILITIES.md 表格解析(工单 19-B)
2
+ * CAPABILITIES.md 解析与能力清单计数(工单 19-B / H2 O10-R3
3
3
  *
4
4
  * 此前 checker.parseCapabilitiesFiles 与 sync-docs.parseCapabilitiesFiles
5
- * 各持一份正则,收敛到此处。
5
+ * 各持一份正则,收敛到此处。H2 起能力清单计数(checkCapabilityCounts /
6
+ * updateCapabilityCounts)也从 sync-docs/capabilities-syncer 收敛到此,
7
+ * 使本模块成为 CAPABILITIES.md 解析 + 计数唯一入口。
6
8
  */
7
9
 
8
10
  import * as fs from 'fs';
11
+ import { IRON_LAWS, GUIDELINES } from './definitions';
12
+ import { FreshnessRunner } from './doc-freshness/runner';
13
+ import type { DocFreshnessCheck } from '../../types/project-config';
9
14
 
10
15
  /** 匹配表格单元格中的源码文件条目(如 `src/foo.ts`、`foo.tsx`) */
11
16
  const FILE_CELL_REGEX = /\|\s*([^|]+?\.(?:ts|tsx|js|jsx))\s*\|/g;
@@ -96,3 +101,91 @@ export function aggregateToSourceSubdir(root: string, file: string): string {
96
101
  if (idx === -1) return prefix;
97
102
  return prefix + rest.slice(0, idx) + '/';
98
103
  }
104
+
105
+ // ── 能力清单计数 ────────────────────────────────────────────
106
+
107
+ /**
108
+ * 构建 CAPABILITIES.md 能力清单格式的检查配置
109
+ */
110
+ function buildCapabilityChecks(): DocFreshnessCheck[] {
111
+ return [
112
+ {
113
+ type: 'doc_regex_count',
114
+ doc: 'CAPABILITIES.md',
115
+ label: 'CLI Commands',
116
+ pattern: 'CLI Commands\\s*\\((\\d+)\\)',
117
+ // index.ts(已删 barrel)与 definitions.ts(命令注册表纯数据)不是命令实现,不计入
118
+ actual: { kind: 'dir_count', path: 'src/cli/commands', extension: '.ts', exclude: ['index.ts', 'definitions.ts'] },
119
+ },
120
+ {
121
+ type: 'doc_regex_count',
122
+ doc: 'CAPABILITIES.md',
123
+ label: 'Quality Gates',
124
+ pattern: 'Quality Gates?\\s*\\((\\d+)\\)',
125
+ actual: { kind: 'dir_count', path: 'src/gates', extension: '.ts', exclude: ['index.ts', 'types.ts'] },
126
+ },
127
+ {
128
+ type: 'doc_regex_count',
129
+ doc: 'CAPABILITIES.md',
130
+ label: 'Iron Laws',
131
+ pattern: 'Iron Laws?\\s*\\((\\d+)\\)',
132
+ actual: { kind: 'const_count', value: Object.keys(IRON_LAWS).length },
133
+ },
134
+ {
135
+ type: 'doc_regex_count',
136
+ doc: 'CAPABILITIES.md',
137
+ label: 'Guidelines',
138
+ pattern: 'Guidelines?\\s*\\((\\d+)\\)',
139
+ actual: { kind: 'const_count', value: Object.keys(GUIDELINES).length },
140
+ },
141
+ ];
142
+ }
143
+
144
+ /**
145
+ * 使用 FreshnessRunner 检查能力清单计数是否与代码一致(--check 模式)
146
+ */
147
+ export function checkCapabilityCounts(
148
+ projectPath: string
149
+ ): { match: boolean; mismatches: string[] } {
150
+ const runner = new FreshnessRunner();
151
+ const checks = buildCapabilityChecks();
152
+ const results = runner.runAll({ checks }, projectPath);
153
+
154
+ const mismatches: string[] = [];
155
+ for (const r of results) {
156
+ if (!r.pass && r.message) {
157
+ mismatches.push(r.message);
158
+ }
159
+ }
160
+
161
+ return { match: mismatches.length === 0, mismatches };
162
+ }
163
+
164
+ /**
165
+ * 更新 CAPABILITIES.md 中的能力清单计数(write 模式)
166
+ *
167
+ * 使用 FreshnessRunner 获取实际计数,然后 regex 替换文档计数行。
168
+ */
169
+ export function updateCapabilityCounts(content: string, projectPath: string): string {
170
+ const runner = new FreshnessRunner();
171
+
172
+ const cliCount = runner.countFromDir('src/cli/commands', '.ts', ['index.ts', 'definitions.ts'], projectPath);
173
+ const gateCount = runner.countFromDir('src/gates', '.ts', ['index.ts', 'types.ts'], projectPath);
174
+ const ironCount = Object.keys(IRON_LAWS).length;
175
+ const guideCount = Object.keys(GUIDELINES).length;
176
+
177
+ const replacements: [RegExp, string][] = [
178
+ [/CLI Commands\s*\(\d+\)/, `CLI Commands (${cliCount})`],
179
+ [/Quality Gates?\s*\(\d+\)/, `Quality Gates (${gateCount})`],
180
+ [/Iron Laws?\s*\(\d+\)/, `Iron Laws (${ironCount})`],
181
+ [/Guidelines?\s*\(\d+\)/, `Guidelines (${guideCount})`],
182
+ ];
183
+
184
+ for (const [regex, replacement] of replacements) {
185
+ if (regex.test(content)) {
186
+ content = content.replace(regex, replacement);
187
+ }
188
+ }
189
+
190
+ return content;
191
+ }