@dommaker/harness 1.1.1 → 1.2.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 (373) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +2 -4
  3. package/bin/harness.js +12 -37
  4. package/dist/cli/commands/check.d.ts +2 -2
  5. package/dist/cli/commands/check.d.ts.map +1 -1
  6. package/dist/cli/commands/check.js +8 -33
  7. package/dist/cli/commands/check.js.map +1 -1
  8. package/dist/cli/commands/constraints-report.js +1 -1
  9. package/dist/cli/commands/constraints-report.js.map +1 -1
  10. package/dist/cli/commands/constraints-retire.d.ts +6 -3
  11. package/dist/cli/commands/constraints-retire.d.ts.map +1 -1
  12. package/dist/cli/commands/constraints-retire.js +34 -25
  13. package/dist/cli/commands/constraints-retire.js.map +1 -1
  14. package/dist/cli/commands/definitions.d.ts +2 -0
  15. package/dist/cli/commands/definitions.d.ts.map +1 -1
  16. package/dist/cli/commands/definitions.js.map +1 -1
  17. package/dist/cli/commands/init.d.ts +21 -1
  18. package/dist/cli/commands/init.d.ts.map +1 -1
  19. package/dist/cli/commands/init.js +118 -40
  20. package/dist/cli/commands/init.js.map +1 -1
  21. package/dist/cli/commands/knowledge.d.ts.map +1 -1
  22. package/dist/cli/commands/knowledge.js +1 -12
  23. package/dist/cli/commands/knowledge.js.map +1 -1
  24. package/dist/cli/commands/report.d.ts.map +1 -1
  25. package/dist/cli/commands/report.js +0 -2
  26. package/dist/cli/commands/report.js.map +1 -1
  27. package/dist/cli/commands/status.js +2 -2
  28. package/dist/cli/commands/status.js.map +1 -1
  29. package/dist/context/index.d.ts +9 -6
  30. package/dist/context/index.d.ts.map +1 -1
  31. package/dist/context/index.js +18 -20
  32. package/dist/context/index.js.map +1 -1
  33. package/dist/core/constraints/capabilities-parser.d.ts +3 -2
  34. package/dist/core/constraints/capabilities-parser.d.ts.map +1 -1
  35. package/dist/core/constraints/capabilities-parser.js +25 -47
  36. package/dist/core/constraints/capabilities-parser.js.map +1 -1
  37. package/dist/core/constraints/checker.d.ts +29 -32
  38. package/dist/core/constraints/checker.d.ts.map +1 -1
  39. package/dist/core/constraints/checker.js +34 -126
  40. package/dist/core/constraints/checker.js.map +1 -1
  41. package/dist/core/constraints/checkers/governance-presence.d.ts +20 -0
  42. package/dist/core/constraints/checkers/governance-presence.d.ts.map +1 -0
  43. package/dist/core/constraints/checkers/governance-presence.js +76 -0
  44. package/dist/core/constraints/checkers/governance-presence.js.map +1 -0
  45. package/dist/core/constraints/checkers/index.d.ts +2 -1
  46. package/dist/core/constraints/checkers/index.d.ts.map +1 -1
  47. package/dist/core/constraints/checkers/index.js +5 -0
  48. package/dist/core/constraints/checkers/index.js.map +1 -1
  49. package/dist/core/constraints/checkers/types.d.ts +25 -0
  50. package/dist/core/constraints/checkers/types.d.ts.map +1 -1
  51. package/dist/core/constraints/checkers/types.js +24 -0
  52. package/dist/core/constraints/checkers/types.js.map +1 -1
  53. package/dist/core/constraints/definitions/guidelines.d.ts.map +1 -1
  54. package/dist/core/constraints/definitions/guidelines.js +21 -2
  55. package/dist/core/constraints/definitions/guidelines.js.map +1 -1
  56. package/dist/core/constraints/definitions/prompts.d.ts.map +1 -1
  57. package/dist/core/constraints/definitions/prompts.js +0 -5
  58. package/dist/core/constraints/definitions/prompts.js.map +1 -1
  59. package/dist/core/constraints/index.d.ts +1 -2
  60. package/dist/core/constraints/index.d.ts.map +1 -1
  61. package/dist/core/constraints/index.js +1 -7
  62. package/dist/core/constraints/index.js.map +1 -1
  63. package/dist/core/constraints/injection-drift.d.ts +29 -4
  64. package/dist/core/constraints/injection-drift.d.ts.map +1 -1
  65. package/dist/core/constraints/injection-drift.js +52 -20
  66. package/dist/core/constraints/injection-drift.js.map +1 -1
  67. package/dist/core/constraints/usage-report.d.ts +1 -2
  68. package/dist/core/constraints/usage-report.d.ts.map +1 -1
  69. package/dist/core/constraints/usage-report.js +2 -5
  70. package/dist/core/constraints/usage-report.js.map +1 -1
  71. package/dist/core/effective-constraints.d.ts +24 -4
  72. package/dist/core/effective-constraints.d.ts.map +1 -1
  73. package/dist/core/effective-constraints.js +28 -7
  74. package/dist/core/effective-constraints.js.map +1 -1
  75. package/dist/core/effective-set.d.ts +30 -0
  76. package/dist/core/effective-set.d.ts.map +1 -0
  77. package/dist/core/effective-set.js +35 -0
  78. package/dist/core/effective-set.js.map +1 -0
  79. package/dist/core/index.d.ts +13 -6
  80. package/dist/core/index.d.ts.map +1 -1
  81. package/dist/core/index.js +44 -21
  82. package/dist/core/index.js.map +1 -1
  83. package/dist/core/project-config-loader.d.ts +3 -6
  84. package/dist/core/project-config-loader.d.ts.map +1 -1
  85. package/dist/core/project-config-loader.js +47 -61
  86. package/dist/core/project-config-loader.js.map +1 -1
  87. package/dist/failure/constraint-handler.d.ts +1 -1
  88. package/dist/failure/constraint-handler.js +1 -1
  89. package/dist/gates/checker-gate.d.ts +1 -4
  90. package/dist/gates/checker-gate.d.ts.map +1 -1
  91. package/dist/gates/checker-gate.js +3 -11
  92. package/dist/gates/checker-gate.js.map +1 -1
  93. package/dist/gates/definitions.d.ts +9 -38
  94. package/dist/gates/definitions.d.ts.map +1 -1
  95. package/dist/gates/definitions.js +24 -13
  96. package/dist/gates/definitions.js.map +1 -1
  97. package/dist/gates/effective-gates.d.ts.map +1 -1
  98. package/dist/gates/effective-gates.js +14 -18
  99. package/dist/gates/effective-gates.js.map +1 -1
  100. package/dist/gates/index.d.ts +1 -1
  101. package/dist/gates/index.d.ts.map +1 -1
  102. package/dist/gates/index.js.map +1 -1
  103. package/dist/hooks/bootstrap.d.ts.map +1 -1
  104. package/dist/hooks/bootstrap.js +0 -3
  105. package/dist/hooks/bootstrap.js.map +1 -1
  106. package/dist/index.d.ts +43 -60
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +180 -143
  109. package/dist/index.js.map +1 -1
  110. package/dist/knowledge/query.d.ts +15 -0
  111. package/dist/knowledge/query.d.ts.map +1 -1
  112. package/dist/knowledge/query.js +23 -0
  113. package/dist/knowledge/query.js.map +1 -1
  114. package/dist/monitoring/analyzer-base.d.ts +0 -4
  115. package/dist/monitoring/analyzer-base.d.ts.map +1 -1
  116. package/dist/monitoring/analyzer-base.js +0 -21
  117. package/dist/monitoring/analyzer-base.js.map +1 -1
  118. package/dist/monitoring/index.d.ts +6 -12
  119. package/dist/monitoring/index.d.ts.map +1 -1
  120. package/dist/monitoring/index.js +13 -29
  121. package/dist/monitoring/index.js.map +1 -1
  122. package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
  123. package/dist/monitoring/trace-analyzer.js +2 -68
  124. package/dist/monitoring/trace-analyzer.js.map +1 -1
  125. package/dist/monitoring/traces.d.ts +0 -4
  126. package/dist/monitoring/traces.d.ts.map +1 -1
  127. package/dist/monitoring/traces.js +0 -14
  128. package/dist/monitoring/traces.js.map +1 -1
  129. package/dist/presets/index.d.ts +2 -2
  130. package/dist/presets/index.d.ts.map +1 -1
  131. package/dist/presets/index.js +3 -4
  132. package/dist/presets/index.js.map +1 -1
  133. package/dist/presets/standard.d.ts +10 -22
  134. package/dist/presets/standard.d.ts.map +1 -1
  135. package/dist/presets/standard.js +15 -75
  136. package/dist/presets/standard.js.map +1 -1
  137. package/dist/types/constraint.d.ts +1 -29
  138. package/dist/types/constraint.d.ts.map +1 -1
  139. package/dist/types/constraint.js +1 -1
  140. package/dist/types/constraint.js.map +1 -1
  141. package/dist/types/index.d.ts +0 -3
  142. package/dist/types/index.d.ts.map +1 -1
  143. package/dist/types/index.js +0 -4
  144. package/dist/types/index.js.map +1 -1
  145. package/dist/types/project-config.d.ts +4 -8
  146. package/dist/types/project-config.d.ts.map +1 -1
  147. package/dist/types/trace.d.ts +5 -18
  148. package/dist/types/trace.d.ts.map +1 -1
  149. package/package.json +2 -2
  150. package/src/CONTEXT.md +4 -5
  151. package/src/__tests__/checker-extra.test.ts +33 -139
  152. package/src/__tests__/checker.test.ts +0 -376
  153. package/src/__tests__/governance-presence.test.ts +129 -0
  154. package/src/__tests__/iron-laws.test.ts +7 -7
  155. package/src/__tests__/project-config-loader-extra.test.ts +42 -29
  156. package/src/__tests__/public-exports.test.ts +138 -0
  157. package/src/__tests__/trace-analyzer-extra.test.ts +6 -86
  158. package/src/__tests__/trace-analyzer.test.ts +4 -5
  159. package/src/__tests__/trace-collector.test.ts +0 -11
  160. package/src/__tests__/traces.test.ts +3 -22
  161. package/src/cli/commands/CONTEXT.md +6 -3
  162. package/src/cli/commands/__tests__/check-skip-output.test.ts +10 -7
  163. package/src/cli/commands/__tests__/check.test.ts +29 -69
  164. package/src/cli/commands/__tests__/constraints-report.test.ts +3 -3
  165. package/src/cli/commands/__tests__/constraints-retire.test.ts +45 -4
  166. package/src/cli/commands/__tests__/init-injection.test.ts +202 -0
  167. package/src/cli/commands/__tests__/knowledge.test.ts +90 -1
  168. package/src/cli/commands/__tests__/registry.test.ts +8 -6
  169. package/src/cli/commands/__tests__/status-extra.test.ts +6 -6
  170. package/src/cli/commands/__tests__/status.test.ts +6 -6
  171. package/src/cli/commands/__tests__/sync-docs-agents.test.ts +28 -0
  172. package/src/cli/commands/check.ts +9 -35
  173. package/src/cli/commands/constraints-report.ts +1 -1
  174. package/src/cli/commands/constraints-retire.ts +38 -27
  175. package/src/cli/commands/definitions.ts +2 -0
  176. package/src/cli/commands/init.ts +129 -40
  177. package/src/cli/commands/knowledge.ts +1 -16
  178. package/src/cli/commands/report.ts +0 -2
  179. package/src/cli/commands/status.ts +2 -2
  180. package/src/context/index.ts +29 -6
  181. package/src/core/CONTEXT.md +4 -3
  182. package/src/core/__tests__/effective-set.test.ts +80 -0
  183. package/src/core/constraints/__tests__/injection-drift.test.ts +90 -0
  184. package/src/core/constraints/capabilities-parser.ts +43 -49
  185. package/src/core/constraints/checker.ts +51 -145
  186. package/src/core/constraints/checkers/governance-presence.ts +74 -0
  187. package/src/core/constraints/checkers/index.ts +4 -1
  188. package/src/core/constraints/checkers/types.ts +42 -0
  189. package/src/core/constraints/definitions/guidelines.ts +22 -2
  190. package/src/core/constraints/definitions/prompts.ts +0 -5
  191. package/src/core/constraints/index.ts +2 -17
  192. package/src/core/constraints/injection-drift.ts +60 -21
  193. package/src/core/constraints/usage-report.ts +5 -8
  194. package/src/core/effective-constraints.ts +35 -7
  195. package/src/core/effective-set.ts +56 -0
  196. package/src/core/index.ts +80 -6
  197. package/src/core/project-config-loader.ts +53 -68
  198. package/src/failure/CONTEXT.md +1 -1
  199. package/src/failure/constraint-handler.ts +1 -1
  200. package/src/gates/CONTEXT.md +3 -3
  201. package/src/gates/checker-gate.ts +4 -12
  202. package/src/gates/definitions.ts +27 -50
  203. package/src/gates/effective-gates.ts +14 -21
  204. package/src/gates/index.ts +1 -1
  205. package/src/hooks/bootstrap.ts +0 -3
  206. package/src/index.ts +384 -148
  207. package/src/knowledge/CONTEXT.md +2 -2
  208. package/src/knowledge/__tests__/query.test.ts +64 -0
  209. package/src/knowledge/query.ts +28 -0
  210. package/src/monitoring/CONTEXT.md +7 -13
  211. package/src/monitoring/__tests__/traces.test.ts +0 -10
  212. package/src/monitoring/analyzer-base.ts +0 -22
  213. package/src/monitoring/index.ts +6 -12
  214. package/src/monitoring/trace-analyzer.ts +2 -73
  215. package/src/monitoring/traces.ts +0 -20
  216. package/src/presets/__tests__/standard.test.ts +48 -69
  217. package/src/presets/index.ts +3 -5
  218. package/src/presets/standard.ts +14 -79
  219. package/src/spec/CONTEXT.md +5 -13
  220. package/src/types/constraint.ts +1 -51
  221. package/src/types/index.ts +0 -12
  222. package/src/types/project-config.ts +4 -10
  223. package/src/types/trace.ts +5 -30
  224. package/dist/core/constraints/interceptor.d.ts +0 -39
  225. package/dist/core/constraints/interceptor.d.ts.map +0 -1
  226. package/dist/core/constraints/interceptor.js +0 -166
  227. package/dist/core/constraints/interceptor.js.map +0 -1
  228. package/dist/dashboard/data.d.ts +0 -31
  229. package/dist/dashboard/data.d.ts.map +0 -1
  230. package/dist/dashboard/data.js +0 -81
  231. package/dist/dashboard/data.js.map +0 -1
  232. package/dist/dashboard/index.d.ts +0 -4
  233. package/dist/dashboard/index.d.ts.map +0 -1
  234. package/dist/dashboard/index.js +0 -20
  235. package/dist/dashboard/index.js.map +0 -1
  236. package/dist/dashboard/stats.d.ts +0 -20
  237. package/dist/dashboard/stats.d.ts.map +0 -1
  238. package/dist/dashboard/stats.js +0 -115
  239. package/dist/dashboard/stats.js.map +0 -1
  240. package/dist/dashboard/types.d.ts +0 -110
  241. package/dist/dashboard/types.d.ts.map +0 -1
  242. package/dist/dashboard/types.js +0 -8
  243. package/dist/dashboard/types.js.map +0 -1
  244. package/dist/monitoring/constraint-doctor.d.ts +0 -76
  245. package/dist/monitoring/constraint-doctor.d.ts.map +0 -1
  246. package/dist/monitoring/constraint-doctor.js +0 -189
  247. package/dist/monitoring/constraint-doctor.js.map +0 -1
  248. package/dist/monitoring/diagnosis-rules.d.ts +0 -18
  249. package/dist/monitoring/diagnosis-rules.d.ts.map +0 -1
  250. package/dist/monitoring/diagnosis-rules.js +0 -119
  251. package/dist/monitoring/diagnosis-rules.js.map +0 -1
  252. package/dist/monitoring/knowledge-doctor.d.ts +0 -78
  253. package/dist/monitoring/knowledge-doctor.d.ts.map +0 -1
  254. package/dist/monitoring/knowledge-doctor.js +0 -266
  255. package/dist/monitoring/knowledge-doctor.js.map +0 -1
  256. package/dist/monitoring/knowledge-evolver.d.ts +0 -72
  257. package/dist/monitoring/knowledge-evolver.d.ts.map +0 -1
  258. package/dist/monitoring/knowledge-evolver.js +0 -205
  259. package/dist/monitoring/knowledge-evolver.js.map +0 -1
  260. package/dist/monitoring/performance-analyzer.d.ts +0 -92
  261. package/dist/monitoring/performance-analyzer.d.ts.map +0 -1
  262. package/dist/monitoring/performance-analyzer.js +0 -343
  263. package/dist/monitoring/performance-analyzer.js.map +0 -1
  264. package/dist/monitoring/performance-collector.d.ts +0 -103
  265. package/dist/monitoring/performance-collector.d.ts.map +0 -1
  266. package/dist/monitoring/performance-collector.js +0 -298
  267. package/dist/monitoring/performance-collector.js.map +0 -1
  268. package/dist/safety/index.d.ts +0 -6
  269. package/dist/safety/index.d.ts.map +0 -1
  270. package/dist/safety/index.js +0 -22
  271. package/dist/safety/index.js.map +0 -1
  272. package/dist/safety/input-guardrail.d.ts +0 -36
  273. package/dist/safety/input-guardrail.d.ts.map +0 -1
  274. package/dist/safety/input-guardrail.js +0 -118
  275. package/dist/safety/input-guardrail.js.map +0 -1
  276. package/dist/safety/output-guardrail.d.ts +0 -39
  277. package/dist/safety/output-guardrail.d.ts.map +0 -1
  278. package/dist/safety/output-guardrail.js +0 -147
  279. package/dist/safety/output-guardrail.js.map +0 -1
  280. package/dist/safety/sandbox.d.ts +0 -45
  281. package/dist/safety/sandbox.d.ts.map +0 -1
  282. package/dist/safety/sandbox.js +0 -134
  283. package/dist/safety/sandbox.js.map +0 -1
  284. package/dist/safety/tool-guardrail.d.ts +0 -51
  285. package/dist/safety/tool-guardrail.d.ts.map +0 -1
  286. package/dist/safety/tool-guardrail.js +0 -147
  287. package/dist/safety/tool-guardrail.js.map +0 -1
  288. package/dist/safety/types.d.ts +0 -104
  289. package/dist/safety/types.d.ts.map +0 -1
  290. package/dist/safety/types.js +0 -6
  291. package/dist/safety/types.js.map +0 -1
  292. package/dist/spec/annotation-checker.d.ts +0 -47
  293. package/dist/spec/annotation-checker.d.ts.map +0 -1
  294. package/dist/spec/annotation-checker.js +0 -279
  295. package/dist/spec/annotation-checker.js.map +0 -1
  296. package/dist/types/enforcement.d.ts +0 -42
  297. package/dist/types/enforcement.d.ts.map +0 -1
  298. package/dist/types/enforcement.js +0 -6
  299. package/dist/types/enforcement.js.map +0 -1
  300. package/dist/types/monitoring-types.d.ts +0 -53
  301. package/dist/types/monitoring-types.d.ts.map +0 -1
  302. package/dist/types/monitoring-types.js +0 -10
  303. package/dist/types/monitoring-types.js.map +0 -1
  304. package/dist/types/performance.d.ts +0 -204
  305. package/dist/types/performance.d.ts.map +0 -1
  306. package/dist/types/performance.js +0 -12
  307. package/dist/types/performance.js.map +0 -1
  308. package/dist/verification/index.d.ts +0 -4
  309. package/dist/verification/index.d.ts.map +0 -1
  310. package/dist/verification/index.js +0 -20
  311. package/dist/verification/index.js.map +0 -1
  312. package/dist/verification/loop.d.ts +0 -30
  313. package/dist/verification/loop.d.ts.map +0 -1
  314. package/dist/verification/loop.js +0 -114
  315. package/dist/verification/loop.js.map +0 -1
  316. package/dist/verification/rules-based.d.ts +0 -40
  317. package/dist/verification/rules-based.d.ts.map +0 -1
  318. package/dist/verification/rules-based.js +0 -130
  319. package/dist/verification/rules-based.js.map +0 -1
  320. package/dist/verification/types.d.ts +0 -69
  321. package/dist/verification/types.d.ts.map +0 -1
  322. package/dist/verification/types.js +0 -6
  323. package/dist/verification/types.js.map +0 -1
  324. package/src/__tests__/annotation-checker.test.ts +0 -183
  325. package/src/__tests__/constraint-doctor.test.ts +0 -271
  326. package/src/__tests__/doctor-extra.test.ts +0 -155
  327. package/src/__tests__/extend-exceptions.test.ts +0 -149
  328. package/src/__tests__/interceptor.test.ts +0 -89
  329. package/src/__tests__/performance-analyzer.test.ts +0 -499
  330. package/src/__tests__/performance-collector.test.ts +0 -276
  331. package/src/__tests__/presets.test.ts +0 -65
  332. package/src/core/constraints/__tests__/interceptor.test.ts +0 -267
  333. package/src/core/constraints/interceptor.ts +0 -217
  334. package/src/dashboard/CONTEXT.md +0 -21
  335. package/src/dashboard/__tests__/data.test.ts +0 -111
  336. package/src/dashboard/__tests__/stats.test.ts +0 -159
  337. package/src/dashboard/data.ts +0 -103
  338. package/src/dashboard/index.ts +0 -3
  339. package/src/dashboard/stats.ts +0 -127
  340. package/src/dashboard/types.ts +0 -130
  341. package/src/monitoring/__tests__/knowledge-doctor.test.ts +0 -278
  342. package/src/monitoring/__tests__/knowledge-evolver.test.ts +0 -368
  343. package/src/monitoring/__tests__/performance-analyzer.test.ts +0 -137
  344. package/src/monitoring/__tests__/performance-collector.test.ts +0 -331
  345. package/src/monitoring/constraint-doctor.ts +0 -228
  346. package/src/monitoring/diagnosis-rules.ts +0 -132
  347. package/src/monitoring/knowledge-doctor.ts +0 -322
  348. package/src/monitoring/knowledge-evolver.ts +0 -289
  349. package/src/monitoring/performance-analyzer.ts +0 -400
  350. package/src/monitoring/performance-collector.ts +0 -326
  351. package/src/safety/CONTEXT.md +0 -23
  352. package/src/safety/__tests__/input-guardrail.test.ts +0 -105
  353. package/src/safety/__tests__/output-guardrail.test.ts +0 -108
  354. package/src/safety/__tests__/sandbox.test.ts +0 -158
  355. package/src/safety/__tests__/tool-guardrail.test.ts +0 -127
  356. package/src/safety/index.ts +0 -5
  357. package/src/safety/input-guardrail.ts +0 -133
  358. package/src/safety/output-guardrail.ts +0 -170
  359. package/src/safety/sandbox.ts +0 -148
  360. package/src/safety/tool-guardrail.ts +0 -176
  361. package/src/safety/types.ts +0 -124
  362. package/src/spec/__tests__/annotation-checker.test.ts +0 -294
  363. package/src/spec/annotation-checker.ts +0 -320
  364. package/src/types/enforcement.ts +0 -48
  365. package/src/types/monitoring-types.ts +0 -68
  366. package/src/types/performance.ts +0 -295
  367. package/src/verification/CONTEXT.md +0 -23
  368. package/src/verification/__tests__/loop.test.ts +0 -303
  369. package/src/verification/__tests__/rules-based.test.ts +0 -240
  370. package/src/verification/index.ts +0 -3
  371. package/src/verification/loop.ts +0 -137
  372. package/src/verification/rules-based.ts +0 -152
  373. package/src/verification/types.ts +0 -81
@@ -1,217 +0,0 @@
1
- /**
2
- * ConstraintInterceptor - 约束拦截器
3
- */
4
-
5
- import type {
6
- ConstraintTrigger,
7
- ConstraintContext,
8
- ConstraintLevel,
9
- ConstraintResult,
10
- } from '../../types/constraint';
11
- import { ConstraintViolationError } from '../../types/constraint';
12
- import { normalizeTriggers } from '../../utils/exec';
13
- import type {
14
- EnforcementId,
15
- EnforcementExecutor,
16
- EnforcementContext,
17
- InterceptionResult,
18
- } from '../../types/enforcement';
19
- import type { MergedConstraintsConfig } from '../../types/project-config';
20
- import { constraintChecker } from './checker';
21
-
22
- export class ConstraintInterceptor {
23
- private static instance: ConstraintInterceptor;
24
- private executors: Map<EnforcementId, EnforcementExecutor> = new Map();
25
- private executorSources: Map<EnforcementId, string> = new Map();
26
- private enabled: boolean = true;
27
- private skipEnforcements: Set<EnforcementId> = new Set();
28
-
29
- private constructor() {}
30
-
31
- static getInstance(): ConstraintInterceptor {
32
- if (!ConstraintInterceptor.instance) {
33
- ConstraintInterceptor.instance = new ConstraintInterceptor();
34
- }
35
- return ConstraintInterceptor.instance;
36
- }
37
-
38
- setEnabled(enabled: boolean): void {
39
- this.enabled = enabled;
40
- }
41
-
42
- register(
43
- enforcementId: EnforcementId,
44
- executor: EnforcementExecutor,
45
- source?: string
46
- ): void {
47
- this.executors.set(enforcementId, executor);
48
- if (source) this.executorSources.set(enforcementId, source);
49
- }
50
-
51
- registerBatch(
52
- registrations: Array<{
53
- enforcementId: EnforcementId;
54
- executor: EnforcementExecutor;
55
- }>
56
- ): void {
57
- for (const { enforcementId, executor } of registrations) {
58
- this.register(enforcementId, executor);
59
- }
60
- }
61
-
62
- unregister(enforcementId: EnforcementId): boolean {
63
- return this.executors.delete(enforcementId);
64
- }
65
-
66
- hasExecutor(enforcementId: EnforcementId): boolean {
67
- return this.executors.has(enforcementId);
68
- }
69
-
70
- getExecutor(enforcementId: EnforcementId): EnforcementExecutor | undefined {
71
- return this.executors.get(enforcementId);
72
- }
73
-
74
- getRegistrations(): { id: EnforcementId; executor: EnforcementExecutor; registeredAt: Date; source?: string }[] {
75
- return Array.from(this.executors.entries()).map(([id, executor]) => ({
76
- id,
77
- executor,
78
- registeredAt: new Date(),
79
- source: this.executorSources.get(id),
80
- }));
81
- }
82
-
83
- skip(enforcementIds: EnforcementId[]): void {
84
- for (const id of enforcementIds) {
85
- this.skipEnforcements.add(id);
86
- }
87
- }
88
-
89
- clearSkips(): void {
90
- this.skipEnforcements.clear();
91
- }
92
-
93
- async intercept(
94
- trigger: ConstraintTrigger,
95
- context: ConstraintContext,
96
- customConfig?: MergedConstraintsConfig | null
97
- ): Promise<InterceptionResult> {
98
- if (!this.enabled) {
99
- return {
100
- passed: true,
101
- constraints: [],
102
- violations: [],
103
- message: '拦截器已禁用',
104
- interceptedAt: new Date(),
105
- };
106
- }
107
-
108
- const result: InterceptionResult = {
109
- passed: true,
110
- constraints: [],
111
- violations: [],
112
- interceptedAt: new Date(),
113
- };
114
-
115
- const constraints = constraintChecker.getConstraints(customConfig);
116
- // prompt 类约束不参与拦截执行(ADR-0001:仅参与注入)
117
- const allConstraints = [
118
- ...Object.values(constraints.ironLaws),
119
- ...Object.values(constraints.guidelines),
120
- ].filter(c => c.kind !== 'prompt');
121
-
122
- const applicableConstraints = allConstraints.filter(
123
- (c) => normalizeTriggers<ConstraintTrigger>(c.trigger).includes(trigger)
124
- );
125
-
126
- const order: Record<ConstraintLevel, number> = { iron_law: 0, guideline: 1, prompt: 2 };
127
- const ordered = applicableConstraints.sort((a, b) => order[a.level] - order[b.level]);
128
-
129
- for (const constraint of ordered) {
130
- if (this.skipEnforcements.has(constraint.enforcement)) {
131
- result.constraints.push({ constraint, skipped: true, skipReason: 'configured to skip' });
132
- continue;
133
- }
134
-
135
- // Custom executor overrides built-in check
136
- const executor = this.executors.get(constraint.enforcement);
137
- let checkResult: ConstraintResult;
138
-
139
- if (executor) {
140
- const enforcementContext: EnforcementContext = { ...context, enforcementId: constraint.enforcement, constraint };
141
- const start = Date.now();
142
- try {
143
- const enforcementResult = await executor.execute(enforcementContext);
144
- enforcementResult.duration = Date.now() - start;
145
- result.constraints.push({ constraint, enforcementResult });
146
- checkResult = {
147
- id: constraint.id, level: constraint.level,
148
- satisfied: enforcementResult.passed,
149
- message: enforcementResult.message,
150
- checkedAt: new Date(),
151
- constraint,
152
- };
153
- } catch (error) {
154
- if (error instanceof ConstraintViolationError) throw error;
155
- result.constraints.push({ constraint, enforcementResult: { passed: false, error: (error as Error).message, duration: Date.now() - start } });
156
- checkResult = { id: constraint.id, level: constraint.level, satisfied: false, message: (error as Error).message, checkedAt: new Date(), constraint };
157
- }
158
- } else {
159
- // Unified: constraint.check(context) delegates to checker
160
- checkResult = await (constraint as any).check(context);
161
- result.constraints.push({ constraint, enforcementResult: { passed: checkResult.satisfied, message: checkResult.message } });
162
- }
163
-
164
- if (!checkResult.satisfied) {
165
- if (constraint.level === 'iron_law') {
166
- result.passed = false;
167
- result.violations.push(constraint);
168
- throw new ConstraintViolationError(checkResult);
169
- }
170
- if (constraint.level === 'guideline') {
171
- result.violations.push(constraint);
172
- }
173
- }
174
- }
175
-
176
- result.message = result.violations.length === 0 ? '✅ 拦截通过' : `❌ ${result.violations.length} 个约束违规`;
177
- return result;
178
- }
179
-
180
- async claim(trigger: ConstraintTrigger, context: ConstraintContext): Promise<void> {
181
- const result = await this.intercept(trigger, context);
182
- if (!result.passed) {
183
- throw new ConstraintViolationError({
184
- id: result.violations[0]?.id || 'unknown',
185
- level: 'iron_law',
186
- satisfied: false,
187
- message: result.message,
188
- checkedAt: new Date(),
189
- });
190
- }
191
- }
192
-
193
- async canProceed(trigger: ConstraintTrigger, context: ConstraintContext): Promise<boolean> {
194
- try {
195
- return (await this.intercept(trigger, context)).passed;
196
- } catch {
197
- return false;
198
- }
199
- }
200
- }
201
-
202
- export const constraintInterceptor = ConstraintInterceptor.getInstance();
203
-
204
- export async function interceptOperation(
205
- trigger: ConstraintTrigger,
206
- context: ConstraintContext,
207
- customConfig?: MergedConstraintsConfig | null
208
- ): Promise<InterceptionResult> {
209
- return constraintInterceptor.intercept(trigger, context, customConfig);
210
- }
211
-
212
- export async function claimOperation(
213
- trigger: ConstraintTrigger,
214
- context: ConstraintContext
215
- ): Promise<void> {
216
- return constraintInterceptor.claim(trigger, context);
217
- }
@@ -1,21 +0,0 @@
1
- # dashboard/
2
-
3
- ## 职责
4
- 仪表盘:统计数据聚合、数据源管理。
5
-
6
- ## 核心导出
7
- - `types.ts` — Dashboard 类型定义
8
- - `stats.ts` — 统计数据计算
9
- - `data.ts` — 数据源管理
10
-
11
- ## 依赖关系
12
- - 依赖 `src/monitoring/` 追踪/性能数据
13
- - 依赖 `src/knowledge/` 知识统计
14
- - 被 CLI status 命令消费
15
-
16
- ## 约定
17
- - 仪表盘数据从 .harness/ 运行时状态读取
18
- - 统计数据纯计算,不调用外部服务
19
-
20
- ## 注意事项
21
- - 相对较新的模块,功能在持续完善中
@@ -1,111 +0,0 @@
1
- /**
2
- * DashboardDataProvider 测试
3
- */
4
-
5
- import { DashboardDataProvider } from '../data';
6
- import type { KnowledgeEntry } from '../../knowledge/types';
7
- import type { ConstraintStats } from '../types';
8
-
9
- function makeEntry(overrides: Partial<KnowledgeEntry> = {}): KnowledgeEntry {
10
- return {
11
- id: `test-${Math.random().toString(36).slice(2, 6)}`,
12
- type: 'decision',
13
- title: 'Test',
14
- content: '',
15
- maturity: 'verified',
16
- layer: 'project',
17
- created: new Date().toISOString(),
18
- lastReferenced: new Date().toISOString(),
19
- contributors: [],
20
- projects: [],
21
- tags: [],
22
- applicablePhases: [],
23
- sourceReferences: [],
24
- referencedBy: [],
25
- executionResults: [],
26
- consumptionMode: 'reference',
27
- origin: 'agent',
28
- ...overrides,
29
- };
30
- }
31
-
32
- describe('DashboardDataProvider', () => {
33
- let provider: DashboardDataProvider;
34
-
35
- beforeEach(() => {
36
- provider = new DashboardDataProvider();
37
- });
38
-
39
- describe('generate', () => {
40
- it('应该生成完整 Dashboard 数据', () => {
41
- const entries = [makeEntry(), makeEntry({ type: 'guideline', maturity: 'proven' })];
42
- const data = provider.generate(entries);
43
-
44
- expect(data.timestamp).toBeDefined();
45
- expect(data.knowledgeOverview.total).toBe(2);
46
- expect(data.constraintHeatmap).toBeDefined();
47
- expect(data.knowledgeFlow).toBeDefined();
48
- expect(data.feedbackLoop).toBeDefined();
49
- });
50
-
51
- it('应该接受约束统计', () => {
52
- const stats: ConstraintStats[] = [{
53
- constraintId: 'no_bypass_checkpoint',
54
- triggerCount: 100,
55
- passCount: 78,
56
- interceptCount: 22,
57
- interceptRate: 22,
58
- lastTriggered: new Date().toISOString(),
59
- }];
60
-
61
- const data = provider.generate([], stats);
62
- const heatmap = data.constraintHeatmap;
63
- const entry = heatmap.constraints.find(c => c.id === 'no_bypass_checkpoint');
64
- expect(entry?.trigger).toBe(100);
65
- expect(entry?.intercept).toBe(22);
66
- });
67
- });
68
-
69
- describe('getKnowledgeOverview', () => {
70
- it('应该返回知识概览', () => {
71
- const overview = provider.getKnowledgeOverview([makeEntry()]);
72
- expect(overview.total).toBe(1);
73
- });
74
- });
75
-
76
- describe('getConstraintHeatmap', () => {
77
- it('应该包含所有约束', () => {
78
- const heatmap = provider.getConstraintHeatmap([]);
79
- expect(heatmap.constraints.length).toBeGreaterThan(0);
80
- expect(heatmap.period).toBe('近 30 天');
81
- });
82
-
83
- it('应该标记从未触发的约束', () => {
84
- const heatmap = provider.getConstraintHeatmap([]);
85
- expect(heatmap.neverTriggered.length).toBeGreaterThan(0);
86
- });
87
-
88
- it('应该检测拦截率下降的约束', () => {
89
- const stats: ConstraintStats[] = [{
90
- constraintId: 'no_bypass_checkpoint',
91
- triggerCount: 100,
92
- passCount: 90,
93
- interceptCount: 10,
94
- interceptRate: 10,
95
- }];
96
-
97
- const heatmap = provider.getConstraintHeatmap(stats);
98
- expect(heatmap.decliningInterceptRate.some(c => c.id === 'no_bypass_checkpoint')).toBe(true);
99
- });
100
- });
101
-
102
- describe('getFeedbackLoop', () => {
103
- it('应该返回反馈环状态', () => {
104
- const loop = provider.getFeedbackLoop();
105
- expect(loop.local).toBeDefined();
106
- expect(loop.push).toBeDefined();
107
- expect(loop.external).toBeDefined();
108
- expect(loop.feedbackToKnowledge).toBeDefined();
109
- });
110
- });
111
- });
@@ -1,159 +0,0 @@
1
- /**
2
- * Dashboard stats 测试
3
- */
4
-
5
- import { computeKnowledgeOverview, computeKnowledgeFlow, computeInterceptRate } from '../stats';
6
- import type { KnowledgeEntry } from '../../knowledge/types';
7
-
8
- function makeEntry(overrides: Partial<KnowledgeEntry> = {}): KnowledgeEntry {
9
- return {
10
- id: `test-${Math.random().toString(36).slice(2, 6)}`,
11
- type: 'decision',
12
- title: 'Test',
13
- content: '',
14
- maturity: 'verified',
15
- layer: 'project',
16
- created: new Date().toISOString(),
17
- lastReferenced: new Date().toISOString(),
18
- contributors: [],
19
- projects: [],
20
- tags: [],
21
- applicablePhases: [],
22
- sourceReferences: [],
23
- referencedBy: [],
24
- executionResults: [],
25
- consumptionMode: 'reference',
26
- origin: 'agent',
27
- ...overrides,
28
- };
29
- }
30
-
31
- describe('computeKnowledgeOverview', () => {
32
- it('应该返回空概览当无条目', () => {
33
- const overview = computeKnowledgeOverview([]);
34
- expect(overview.total).toBe(0);
35
- expect(overview.maturityDistribution.provenPercent).toBe(0);
36
- });
37
-
38
- it('应该按类型统计', () => {
39
- const entries = [
40
- makeEntry({ type: 'decision', maturity: 'proven' }),
41
- makeEntry({ type: 'decision', maturity: 'verified' }),
42
- makeEntry({ type: 'guideline', maturity: 'draft' }),
43
- ];
44
-
45
- const overview = computeKnowledgeOverview(entries);
46
- expect(overview.total).toBe(3);
47
- expect(overview.byType.length).toBe(2);
48
-
49
- const decisions = overview.byType.find(b => b.type === 'decision')!;
50
- expect(decisions.total).toBe(2);
51
- expect(decisions.proven).toBe(1);
52
- expect(decisions.verified).toBe(1);
53
- });
54
-
55
- it('应该计算成熟度分布百分比', () => {
56
- const entries = [
57
- makeEntry({ maturity: 'proven' }),
58
- makeEntry({ maturity: 'proven' }),
59
- makeEntry({ maturity: 'verified' }),
60
- makeEntry({ maturity: 'draft' }),
61
- ];
62
-
63
- const overview = computeKnowledgeOverview(entries);
64
- expect(overview.maturityDistribution.provenPercent).toBe(50);
65
- expect(overview.maturityDistribution.verifiedPercent).toBe(25);
66
- expect(overview.maturityDistribution.draftPercent).toBe(25);
67
- });
68
-
69
- it('应该计算衰减预警', () => {
70
- const oldDate = '2020-01-01T00:00:00.000Z';
71
- const entries = [
72
- makeEntry({ maturity: 'proven', lastReferenced: oldDate }),
73
- makeEntry({ maturity: 'verified', lastReferenced: oldDate }),
74
- makeEntry({ maturity: 'verified', lastReferenced: new Date().toISOString() }),
75
- ];
76
-
77
- const overview = computeKnowledgeOverview(entries);
78
- expect(overview.decayWarning.provenUnused6m).toBe(1);
79
- expect(overview.decayWarning.verifiedUnused3m).toBe(1);
80
- });
81
-
82
- it('应该用 created 日期当 lastReferenced 为空', () => {
83
- const oldDate = '2020-01-01T00:00:00.000Z';
84
- const entries = [
85
- makeEntry({ maturity: 'proven', lastReferenced: '', created: oldDate }),
86
- ];
87
-
88
- const overview = computeKnowledgeOverview(entries);
89
- expect(overview.decayWarning.provenUnused6m).toBe(1);
90
- });
91
- });
92
-
93
- describe('computeKnowledgeFlow', () => {
94
- it('应该计算基本流转统计', () => {
95
- const entries = [
96
- makeEntry({ id: 'a', maturity: 'verified', lastReferenced: new Date().toISOString() }),
97
- makeEntry({ id: 'b', maturity: 'proven' }),
98
- makeEntry({ id: 'c', maturity: 'draft', lastReferenced: '' }),
99
- ];
100
-
101
- const refCounts = new Map<string, number>();
102
- refCounts.set('a', 10);
103
- refCounts.set('b', 5);
104
-
105
- const flow = computeKnowledgeFlow(entries, refCounts);
106
- expect(flow.period).toBe('近 30 天');
107
- expect(flow.pipeline.referenced).toBe(2);
108
- expect(flow.topReferenced.length).toBe(2);
109
- expect(flow.topReferenced[0].id).toBe('a');
110
- expect(flow.topReferenced[0].referenceCount).toBe(10);
111
- });
112
-
113
- it('应该限制 topN', () => {
114
- const entries = [
115
- makeEntry({ id: 'a' }),
116
- makeEntry({ id: 'b' }),
117
- makeEntry({ id: 'c' }),
118
- ];
119
- const refCounts = new Map<string, number>([
120
- ['a', 3], ['b', 2], ['c', 1],
121
- ]);
122
-
123
- const flow = computeKnowledgeFlow(entries, refCounts, 2);
124
- expect(flow.topReferenced.length).toBe(2);
125
- });
126
-
127
- it('应该用 created 日期当 lastReferenced 为空', () => {
128
- const entries = [
129
- makeEntry({ id: 'a', maturity: 'verified', lastReferenced: '' }),
130
- ];
131
- const flow = computeKnowledgeFlow(entries, new Map());
132
- // lastReferenced 为空字符串,不计入 referenced
133
- expect(flow.pipeline.referenced).toBe(0);
134
- });
135
-
136
- it('应该处理引用了不存在条目的 referenceCount', () => {
137
- const entries = [makeEntry({ id: 'a' })];
138
- const refCounts = new Map<string, number>([
139
- ['a', 5],
140
- ['nonexistent', 3],
141
- ]);
142
-
143
- const flow = computeKnowledgeFlow(entries, refCounts, 5);
144
- const missing = flow.topReferenced.find(t => t.id === 'nonexistent');
145
- expect(missing).toBeDefined();
146
- expect(missing?.title).toBe('nonexistent'); // fallback to id
147
- });
148
- });
149
-
150
- describe('computeInterceptRate', () => {
151
- it('应该计算拦截率', () => {
152
- expect(computeInterceptRate(100, 22)).toBe(22);
153
- expect(computeInterceptRate(10, 0)).toBe(0);
154
- });
155
-
156
- it('应该处理零触发', () => {
157
- expect(computeInterceptRate(0, 0)).toBe(0);
158
- });
159
- });
@@ -1,103 +0,0 @@
1
- /**
2
- * Dashboard 数据聚合
3
- *
4
- * 从各模块收集数据,生成 HarnessDashboardData
5
- * 纯文件读取,零 token 开销
6
- */
7
-
8
- import type {
9
- HarnessDashboardData,
10
- KnowledgeOverview,
11
- ConstraintHeatmap,
12
- KnowledgeFlow,
13
- FeedbackLoopStatus,
14
- ConstraintStats,
15
- ConstraintLayer,
16
- } from './types';
17
- import type { KnowledgeEntry } from '../knowledge/types';
18
- import { computeKnowledgeOverview, computeKnowledgeFlow, computeInterceptRate } from './stats';
19
- import { getAllConstraints } from '../core/constraints/definitions';
20
-
21
- export class DashboardDataProvider {
22
- /**
23
- * 生成完整 Dashboard 数据
24
- */
25
- generate(
26
- entries: KnowledgeEntry[],
27
- constraintStats: ConstraintStats[] = [],
28
- referenceCounts: Map<string, number> = new Map(),
29
- ): HarnessDashboardData {
30
- return {
31
- timestamp: new Date().toISOString(),
32
- knowledgeOverview: this.getKnowledgeOverview(entries),
33
- constraintHeatmap: this.getConstraintHeatmap(constraintStats),
34
- knowledgeFlow: this.getKnowledgeFlow(entries, referenceCounts),
35
- feedbackLoop: this.getFeedbackLoop(),
36
- };
37
- }
38
-
39
- /**
40
- * 知识库全景
41
- */
42
- getKnowledgeOverview(entries: KnowledgeEntry[]): KnowledgeOverview {
43
- return computeKnowledgeOverview(entries);
44
- }
45
-
46
- /**
47
- * 约束执行热力图
48
- */
49
- getConstraintHeatmap(stats: ConstraintStats[]): ConstraintHeatmap {
50
- // P1:直接读 definitions;prompt 类不产生 trace 统计,热力图只含 check 层
51
- const allConstraints = getAllConstraints().filter(c => c.kind === 'check');
52
-
53
- const constraints = allConstraints.map(c => {
54
- const stat = stats.find(s => s.constraintId === c.id);
55
- const layer: ConstraintLayer = c.level === 'iron_law' ? 'safety' : 'quality';
56
- return {
57
- id: c.id,
58
- layer,
59
- trigger: stat?.triggerCount ?? 0,
60
- pass: stat?.passCount ?? 0,
61
- intercept: stat?.interceptCount ?? 0,
62
- interceptRate: stat ? computeInterceptRate(stat.triggerCount, stat.interceptCount) : 0,
63
- deprecationStatus: 'active' as const,
64
- permanent: false,
65
- };
66
- });
67
-
68
- const neverTriggered = constraints.filter(c => c.trigger === 0).map(c => c.id);
69
-
70
- const decliningInterceptRate = constraints
71
- .filter(c => c.interceptRate > 0 && c.interceptRate < 15)
72
- .map(c => ({ id: c.id, from: c.interceptRate, to: c.interceptRate }));
73
-
74
- return {
75
- period: '近 30 天',
76
- constraints,
77
- neverTriggered,
78
- decliningInterceptRate,
79
- };
80
- }
81
-
82
- /**
83
- * 知识流转路径
84
- */
85
- getKnowledgeFlow(
86
- entries: KnowledgeEntry[],
87
- referenceCounts: Map<string, number>,
88
- ): KnowledgeFlow {
89
- return computeKnowledgeFlow(entries, referenceCounts);
90
- }
91
-
92
- /**
93
- * 反馈环状态(基础实现,需要外部数据源补充)
94
- */
95
- getFeedbackLoop(): FeedbackLoopStatus {
96
- return {
97
- local: { active: 0 },
98
- push: { active: 0 },
99
- external: { active: 0 },
100
- feedbackToKnowledge: { total: 0, pending: 0 },
101
- };
102
- }
103
- }
@@ -1,3 +0,0 @@
1
- export * from './types';
2
- export * from './stats';
3
- export * from './data';