@dommaker/harness 1.1.0 → 1.2.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 (349) hide show
  1. package/CHANGELOG.md +19 -2
  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 +7 -32
  7. package/dist/cli/commands/check.js.map +1 -1
  8. package/dist/cli/commands/definitions.d.ts +2 -0
  9. package/dist/cli/commands/definitions.d.ts.map +1 -1
  10. package/dist/cli/commands/definitions.js.map +1 -1
  11. package/dist/cli/commands/init.d.ts.map +1 -1
  12. package/dist/cli/commands/init.js +6 -37
  13. package/dist/cli/commands/init.js.map +1 -1
  14. package/dist/cli/commands/knowledge.d.ts.map +1 -1
  15. package/dist/cli/commands/knowledge.js +1 -12
  16. package/dist/cli/commands/knowledge.js.map +1 -1
  17. package/dist/cli/commands/report.d.ts.map +1 -1
  18. package/dist/cli/commands/report.js +0 -2
  19. package/dist/cli/commands/report.js.map +1 -1
  20. package/dist/cli/commands/status.d.ts.map +1 -1
  21. package/dist/cli/commands/status.js +2 -11
  22. package/dist/cli/commands/status.js.map +1 -1
  23. package/dist/context/index.d.ts +9 -6
  24. package/dist/context/index.d.ts.map +1 -1
  25. package/dist/context/index.js +18 -20
  26. package/dist/context/index.js.map +1 -1
  27. package/dist/core/constraints/capabilities-parser.d.ts +3 -2
  28. package/dist/core/constraints/capabilities-parser.d.ts.map +1 -1
  29. package/dist/core/constraints/capabilities-parser.js +25 -47
  30. package/dist/core/constraints/capabilities-parser.js.map +1 -1
  31. package/dist/core/constraints/checker.d.ts +32 -33
  32. package/dist/core/constraints/checker.d.ts.map +1 -1
  33. package/dist/core/constraints/checker.js +38 -128
  34. package/dist/core/constraints/checker.js.map +1 -1
  35. package/dist/core/constraints/checkers/index.d.ts +2 -1
  36. package/dist/core/constraints/checkers/index.d.ts.map +1 -1
  37. package/dist/core/constraints/checkers/index.js +3 -0
  38. package/dist/core/constraints/checkers/index.js.map +1 -1
  39. package/dist/core/constraints/checkers/types.d.ts +25 -0
  40. package/dist/core/constraints/checkers/types.d.ts.map +1 -1
  41. package/dist/core/constraints/checkers/types.js +24 -0
  42. package/dist/core/constraints/checkers/types.js.map +1 -1
  43. package/dist/core/constraints/definitions/guidelines.d.ts.map +1 -1
  44. package/dist/core/constraints/definitions/guidelines.js +0 -2
  45. package/dist/core/constraints/definitions/guidelines.js.map +1 -1
  46. package/dist/core/constraints/definitions/prompts.d.ts.map +1 -1
  47. package/dist/core/constraints/definitions/prompts.js +0 -5
  48. package/dist/core/constraints/definitions/prompts.js.map +1 -1
  49. package/dist/core/constraints/index.d.ts +1 -2
  50. package/dist/core/constraints/index.d.ts.map +1 -1
  51. package/dist/core/constraints/index.js +1 -7
  52. package/dist/core/constraints/index.js.map +1 -1
  53. package/dist/core/constraints/usage-report.d.ts +1 -2
  54. package/dist/core/constraints/usage-report.d.ts.map +1 -1
  55. package/dist/core/constraints/usage-report.js +2 -5
  56. package/dist/core/constraints/usage-report.js.map +1 -1
  57. package/dist/core/effective-constraints.d.ts +24 -4
  58. package/dist/core/effective-constraints.d.ts.map +1 -1
  59. package/dist/core/effective-constraints.js +28 -7
  60. package/dist/core/effective-constraints.js.map +1 -1
  61. package/dist/core/effective-set.d.ts +30 -0
  62. package/dist/core/effective-set.d.ts.map +1 -0
  63. package/dist/core/effective-set.js +35 -0
  64. package/dist/core/effective-set.js.map +1 -0
  65. package/dist/core/index.d.ts +13 -6
  66. package/dist/core/index.d.ts.map +1 -1
  67. package/dist/core/index.js +44 -21
  68. package/dist/core/index.js.map +1 -1
  69. package/dist/core/project-config-loader.d.ts +3 -6
  70. package/dist/core/project-config-loader.d.ts.map +1 -1
  71. package/dist/core/project-config-loader.js +47 -61
  72. package/dist/core/project-config-loader.js.map +1 -1
  73. package/dist/failure/constraint-handler.d.ts +1 -1
  74. package/dist/failure/constraint-handler.js +1 -1
  75. package/dist/gates/checker-gate.d.ts +1 -4
  76. package/dist/gates/checker-gate.d.ts.map +1 -1
  77. package/dist/gates/checker-gate.js +3 -11
  78. package/dist/gates/checker-gate.js.map +1 -1
  79. package/dist/gates/definitions.d.ts +9 -38
  80. package/dist/gates/definitions.d.ts.map +1 -1
  81. package/dist/gates/definitions.js +24 -13
  82. package/dist/gates/definitions.js.map +1 -1
  83. package/dist/gates/effective-gates.d.ts.map +1 -1
  84. package/dist/gates/effective-gates.js +14 -18
  85. package/dist/gates/effective-gates.js.map +1 -1
  86. package/dist/gates/index.d.ts +1 -1
  87. package/dist/gates/index.d.ts.map +1 -1
  88. package/dist/gates/index.js.map +1 -1
  89. package/dist/hooks/bootstrap.d.ts.map +1 -1
  90. package/dist/hooks/bootstrap.js +0 -3
  91. package/dist/hooks/bootstrap.js.map +1 -1
  92. package/dist/index.d.ts +43 -53
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +180 -138
  95. package/dist/index.js.map +1 -1
  96. package/dist/knowledge/query.d.ts +15 -0
  97. package/dist/knowledge/query.d.ts.map +1 -1
  98. package/dist/knowledge/query.js +23 -0
  99. package/dist/knowledge/query.js.map +1 -1
  100. package/dist/monitoring/analyzer-base.d.ts +0 -4
  101. package/dist/monitoring/analyzer-base.d.ts.map +1 -1
  102. package/dist/monitoring/analyzer-base.js +0 -21
  103. package/dist/monitoring/analyzer-base.js.map +1 -1
  104. package/dist/monitoring/index.d.ts +6 -12
  105. package/dist/monitoring/index.d.ts.map +1 -1
  106. package/dist/monitoring/index.js +13 -29
  107. package/dist/monitoring/index.js.map +1 -1
  108. package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
  109. package/dist/monitoring/trace-analyzer.js +2 -68
  110. package/dist/monitoring/trace-analyzer.js.map +1 -1
  111. package/dist/monitoring/traces.d.ts +2 -6
  112. package/dist/monitoring/traces.d.ts.map +1 -1
  113. package/dist/monitoring/traces.js +0 -14
  114. package/dist/monitoring/traces.js.map +1 -1
  115. package/dist/presets/index.d.ts +2 -2
  116. package/dist/presets/index.d.ts.map +1 -1
  117. package/dist/presets/index.js +3 -4
  118. package/dist/presets/index.js.map +1 -1
  119. package/dist/presets/standard.d.ts +10 -22
  120. package/dist/presets/standard.d.ts.map +1 -1
  121. package/dist/presets/standard.js +15 -75
  122. package/dist/presets/standard.js.map +1 -1
  123. package/dist/types/constraint.d.ts +1 -29
  124. package/dist/types/constraint.d.ts.map +1 -1
  125. package/dist/types/constraint.js +1 -1
  126. package/dist/types/constraint.js.map +1 -1
  127. package/dist/types/index.d.ts +0 -3
  128. package/dist/types/index.d.ts.map +1 -1
  129. package/dist/types/index.js +0 -4
  130. package/dist/types/index.js.map +1 -1
  131. package/dist/types/project-config.d.ts +4 -8
  132. package/dist/types/project-config.d.ts.map +1 -1
  133. package/dist/types/trace.d.ts +9 -22
  134. package/dist/types/trace.d.ts.map +1 -1
  135. package/package.json +2 -2
  136. package/src/CONTEXT.md +5 -7
  137. package/src/__tests__/checker-extra.test.ts +80 -139
  138. package/src/__tests__/checker.test.ts +0 -376
  139. package/src/__tests__/project-config-loader-extra.test.ts +42 -29
  140. package/src/__tests__/public-exports.test.ts +138 -0
  141. package/src/__tests__/trace-analyzer-extra.test.ts +6 -86
  142. package/src/__tests__/trace-analyzer.test.ts +4 -5
  143. package/src/__tests__/trace-collector.test.ts +0 -11
  144. package/src/__tests__/traces.test.ts +3 -22
  145. package/src/cli/commands/CONTEXT.md +2 -2
  146. package/src/cli/commands/__tests__/check-skip-output.test.ts +10 -7
  147. package/src/cli/commands/__tests__/check.test.ts +29 -69
  148. package/src/cli/commands/__tests__/constraints-report.test.ts +1 -1
  149. package/src/cli/commands/__tests__/knowledge.test.ts +90 -1
  150. package/src/cli/commands/__tests__/registry.test.ts +8 -6
  151. package/src/cli/commands/__tests__/status-extra.test.ts +6 -28
  152. package/src/cli/commands/__tests__/status.test.ts +6 -21
  153. package/src/cli/commands/check.ts +8 -34
  154. package/src/cli/commands/definitions.ts +2 -0
  155. package/src/cli/commands/init.ts +6 -37
  156. package/src/cli/commands/knowledge.ts +1 -16
  157. package/src/cli/commands/report.ts +0 -2
  158. package/src/cli/commands/status.ts +2 -12
  159. package/src/context/index.ts +29 -6
  160. package/src/core/CONTEXT.md +4 -3
  161. package/src/core/__tests__/effective-set.test.ts +80 -0
  162. package/src/core/constraints/capabilities-parser.ts +43 -49
  163. package/src/core/constraints/checker.ts +56 -147
  164. package/src/core/constraints/checkers/index.ts +2 -1
  165. package/src/core/constraints/checkers/types.ts +42 -0
  166. package/src/core/constraints/definitions/guidelines.ts +0 -2
  167. package/src/core/constraints/definitions/prompts.ts +0 -5
  168. package/src/core/constraints/index.ts +2 -17
  169. package/src/core/constraints/usage-report.ts +5 -8
  170. package/src/core/effective-constraints.ts +35 -7
  171. package/src/core/effective-set.ts +56 -0
  172. package/src/core/index.ts +80 -6
  173. package/src/core/project-config-loader.ts +53 -68
  174. package/src/failure/CONTEXT.md +1 -1
  175. package/src/failure/constraint-handler.ts +1 -1
  176. package/src/gates/CONTEXT.md +3 -3
  177. package/src/gates/checker-gate.ts +4 -12
  178. package/src/gates/definitions.ts +27 -50
  179. package/src/gates/effective-gates.ts +14 -21
  180. package/src/gates/index.ts +1 -1
  181. package/src/hooks/bootstrap.ts +0 -3
  182. package/src/index.ts +384 -137
  183. package/src/knowledge/CONTEXT.md +2 -2
  184. package/src/knowledge/__tests__/query.test.ts +64 -0
  185. package/src/knowledge/query.ts +28 -0
  186. package/src/monitoring/CONTEXT.md +7 -13
  187. package/src/monitoring/__tests__/traces.test.ts +0 -10
  188. package/src/monitoring/analyzer-base.ts +0 -22
  189. package/src/monitoring/index.ts +6 -12
  190. package/src/monitoring/trace-analyzer.ts +2 -73
  191. package/src/monitoring/traces.ts +2 -22
  192. package/src/presets/__tests__/standard.test.ts +48 -69
  193. package/src/presets/index.ts +3 -5
  194. package/src/presets/standard.ts +14 -79
  195. package/src/spec/CONTEXT.md +5 -13
  196. package/src/types/constraint.ts +1 -51
  197. package/src/types/index.ts +0 -12
  198. package/src/types/project-config.ts +4 -10
  199. package/src/types/trace.ts +9 -34
  200. package/dist/core/constraints/interceptor.d.ts +0 -38
  201. package/dist/core/constraints/interceptor.d.ts.map +0 -1
  202. package/dist/core/constraints/interceptor.js +0 -166
  203. package/dist/core/constraints/interceptor.js.map +0 -1
  204. package/dist/dashboard/data.d.ts +0 -31
  205. package/dist/dashboard/data.d.ts.map +0 -1
  206. package/dist/dashboard/data.js +0 -81
  207. package/dist/dashboard/data.js.map +0 -1
  208. package/dist/dashboard/index.d.ts +0 -4
  209. package/dist/dashboard/index.d.ts.map +0 -1
  210. package/dist/dashboard/index.js +0 -20
  211. package/dist/dashboard/index.js.map +0 -1
  212. package/dist/dashboard/stats.d.ts +0 -20
  213. package/dist/dashboard/stats.d.ts.map +0 -1
  214. package/dist/dashboard/stats.js +0 -115
  215. package/dist/dashboard/stats.js.map +0 -1
  216. package/dist/dashboard/types.d.ts +0 -110
  217. package/dist/dashboard/types.d.ts.map +0 -1
  218. package/dist/dashboard/types.js +0 -8
  219. package/dist/dashboard/types.js.map +0 -1
  220. package/dist/monitoring/constraint-doctor.d.ts +0 -82
  221. package/dist/monitoring/constraint-doctor.d.ts.map +0 -1
  222. package/dist/monitoring/constraint-doctor.js +0 -191
  223. package/dist/monitoring/constraint-doctor.js.map +0 -1
  224. package/dist/monitoring/diagnosis-rules.d.ts +0 -18
  225. package/dist/monitoring/diagnosis-rules.d.ts.map +0 -1
  226. package/dist/monitoring/diagnosis-rules.js +0 -119
  227. package/dist/monitoring/diagnosis-rules.js.map +0 -1
  228. package/dist/monitoring/knowledge-doctor.d.ts +0 -78
  229. package/dist/monitoring/knowledge-doctor.d.ts.map +0 -1
  230. package/dist/monitoring/knowledge-doctor.js +0 -266
  231. package/dist/monitoring/knowledge-doctor.js.map +0 -1
  232. package/dist/monitoring/knowledge-evolver.d.ts +0 -72
  233. package/dist/monitoring/knowledge-evolver.d.ts.map +0 -1
  234. package/dist/monitoring/knowledge-evolver.js +0 -205
  235. package/dist/monitoring/knowledge-evolver.js.map +0 -1
  236. package/dist/monitoring/performance-analyzer.d.ts +0 -92
  237. package/dist/monitoring/performance-analyzer.d.ts.map +0 -1
  238. package/dist/monitoring/performance-analyzer.js +0 -343
  239. package/dist/monitoring/performance-analyzer.js.map +0 -1
  240. package/dist/monitoring/performance-collector.d.ts +0 -103
  241. package/dist/monitoring/performance-collector.d.ts.map +0 -1
  242. package/dist/monitoring/performance-collector.js +0 -298
  243. package/dist/monitoring/performance-collector.js.map +0 -1
  244. package/dist/safety/index.d.ts +0 -6
  245. package/dist/safety/index.d.ts.map +0 -1
  246. package/dist/safety/index.js +0 -22
  247. package/dist/safety/index.js.map +0 -1
  248. package/dist/safety/input-guardrail.d.ts +0 -36
  249. package/dist/safety/input-guardrail.d.ts.map +0 -1
  250. package/dist/safety/input-guardrail.js +0 -118
  251. package/dist/safety/input-guardrail.js.map +0 -1
  252. package/dist/safety/output-guardrail.d.ts +0 -39
  253. package/dist/safety/output-guardrail.d.ts.map +0 -1
  254. package/dist/safety/output-guardrail.js +0 -147
  255. package/dist/safety/output-guardrail.js.map +0 -1
  256. package/dist/safety/sandbox.d.ts +0 -45
  257. package/dist/safety/sandbox.d.ts.map +0 -1
  258. package/dist/safety/sandbox.js +0 -134
  259. package/dist/safety/sandbox.js.map +0 -1
  260. package/dist/safety/tool-guardrail.d.ts +0 -51
  261. package/dist/safety/tool-guardrail.d.ts.map +0 -1
  262. package/dist/safety/tool-guardrail.js +0 -147
  263. package/dist/safety/tool-guardrail.js.map +0 -1
  264. package/dist/safety/types.d.ts +0 -104
  265. package/dist/safety/types.d.ts.map +0 -1
  266. package/dist/safety/types.js +0 -6
  267. package/dist/safety/types.js.map +0 -1
  268. package/dist/spec/annotation-checker.d.ts +0 -47
  269. package/dist/spec/annotation-checker.d.ts.map +0 -1
  270. package/dist/spec/annotation-checker.js +0 -279
  271. package/dist/spec/annotation-checker.js.map +0 -1
  272. package/dist/types/enforcement.d.ts +0 -42
  273. package/dist/types/enforcement.d.ts.map +0 -1
  274. package/dist/types/enforcement.js +0 -6
  275. package/dist/types/enforcement.js.map +0 -1
  276. package/dist/types/monitoring-types.d.ts +0 -53
  277. package/dist/types/monitoring-types.d.ts.map +0 -1
  278. package/dist/types/monitoring-types.js +0 -10
  279. package/dist/types/monitoring-types.js.map +0 -1
  280. package/dist/types/performance.d.ts +0 -204
  281. package/dist/types/performance.d.ts.map +0 -1
  282. package/dist/types/performance.js +0 -12
  283. package/dist/types/performance.js.map +0 -1
  284. package/dist/verification/index.d.ts +0 -4
  285. package/dist/verification/index.d.ts.map +0 -1
  286. package/dist/verification/index.js +0 -20
  287. package/dist/verification/index.js.map +0 -1
  288. package/dist/verification/loop.d.ts +0 -30
  289. package/dist/verification/loop.d.ts.map +0 -1
  290. package/dist/verification/loop.js +0 -114
  291. package/dist/verification/loop.js.map +0 -1
  292. package/dist/verification/rules-based.d.ts +0 -40
  293. package/dist/verification/rules-based.d.ts.map +0 -1
  294. package/dist/verification/rules-based.js +0 -130
  295. package/dist/verification/rules-based.js.map +0 -1
  296. package/dist/verification/types.d.ts +0 -69
  297. package/dist/verification/types.d.ts.map +0 -1
  298. package/dist/verification/types.js +0 -6
  299. package/dist/verification/types.js.map +0 -1
  300. package/src/__tests__/annotation-checker.test.ts +0 -183
  301. package/src/__tests__/constraint-doctor.test.ts +0 -271
  302. package/src/__tests__/doctor-extra.test.ts +0 -155
  303. package/src/__tests__/extend-exceptions.test.ts +0 -149
  304. package/src/__tests__/interceptor.test.ts +0 -89
  305. package/src/__tests__/performance-analyzer.test.ts +0 -499
  306. package/src/__tests__/performance-collector.test.ts +0 -276
  307. package/src/__tests__/presets.test.ts +0 -65
  308. package/src/core/constraints/__tests__/interceptor.test.ts +0 -253
  309. package/src/core/constraints/interceptor.ts +0 -214
  310. package/src/dashboard/CONTEXT.md +0 -21
  311. package/src/dashboard/__tests__/data.test.ts +0 -111
  312. package/src/dashboard/__tests__/stats.test.ts +0 -159
  313. package/src/dashboard/data.ts +0 -103
  314. package/src/dashboard/index.ts +0 -3
  315. package/src/dashboard/stats.ts +0 -127
  316. package/src/dashboard/types.ts +0 -130
  317. package/src/monitoring/__tests__/knowledge-doctor.test.ts +0 -278
  318. package/src/monitoring/__tests__/knowledge-evolver.test.ts +0 -368
  319. package/src/monitoring/__tests__/performance-analyzer.test.ts +0 -137
  320. package/src/monitoring/__tests__/performance-collector.test.ts +0 -331
  321. package/src/monitoring/constraint-doctor.ts +0 -239
  322. package/src/monitoring/diagnosis-rules.ts +0 -132
  323. package/src/monitoring/knowledge-doctor.ts +0 -322
  324. package/src/monitoring/knowledge-evolver.ts +0 -289
  325. package/src/monitoring/performance-analyzer.ts +0 -400
  326. package/src/monitoring/performance-collector.ts +0 -326
  327. package/src/safety/CONTEXT.md +0 -23
  328. package/src/safety/__tests__/input-guardrail.test.ts +0 -105
  329. package/src/safety/__tests__/output-guardrail.test.ts +0 -108
  330. package/src/safety/__tests__/sandbox.test.ts +0 -158
  331. package/src/safety/__tests__/tool-guardrail.test.ts +0 -127
  332. package/src/safety/index.ts +0 -5
  333. package/src/safety/input-guardrail.ts +0 -133
  334. package/src/safety/output-guardrail.ts +0 -170
  335. package/src/safety/sandbox.ts +0 -148
  336. package/src/safety/tool-guardrail.ts +0 -176
  337. package/src/safety/types.ts +0 -124
  338. package/src/spec/__tests__/annotation-checker.test.ts +0 -294
  339. package/src/spec/annotation-checker.ts +0 -320
  340. package/src/types/enforcement.ts +0 -48
  341. package/src/types/monitoring-types.ts +0 -68
  342. package/src/types/performance.ts +0 -295
  343. package/src/verification/CONTEXT.md +0 -23
  344. package/src/verification/__tests__/loop.test.ts +0 -303
  345. package/src/verification/__tests__/rules-based.test.ts +0 -240
  346. package/src/verification/index.ts +0 -3
  347. package/src/verification/loop.ts +0 -137
  348. package/src/verification/rules-based.ts +0 -152
  349. package/src/verification/types.ts +0 -81
@@ -1,214 +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 { constraintChecker } from './checker';
20
-
21
- export class ConstraintInterceptor {
22
- private static instance: ConstraintInterceptor;
23
- private executors: Map<EnforcementId, EnforcementExecutor> = new Map();
24
- private executorSources: Map<EnforcementId, string> = new Map();
25
- private enabled: boolean = true;
26
- private skipEnforcements: Set<EnforcementId> = new Set();
27
-
28
- private constructor() {}
29
-
30
- static getInstance(): ConstraintInterceptor {
31
- if (!ConstraintInterceptor.instance) {
32
- ConstraintInterceptor.instance = new ConstraintInterceptor();
33
- }
34
- return ConstraintInterceptor.instance;
35
- }
36
-
37
- setEnabled(enabled: boolean): void {
38
- this.enabled = enabled;
39
- }
40
-
41
- register(
42
- enforcementId: EnforcementId,
43
- executor: EnforcementExecutor,
44
- source?: string
45
- ): void {
46
- this.executors.set(enforcementId, executor);
47
- if (source) this.executorSources.set(enforcementId, source);
48
- }
49
-
50
- registerBatch(
51
- registrations: Array<{
52
- enforcementId: EnforcementId;
53
- executor: EnforcementExecutor;
54
- }>
55
- ): void {
56
- for (const { enforcementId, executor } of registrations) {
57
- this.register(enforcementId, executor);
58
- }
59
- }
60
-
61
- unregister(enforcementId: EnforcementId): boolean {
62
- return this.executors.delete(enforcementId);
63
- }
64
-
65
- hasExecutor(enforcementId: EnforcementId): boolean {
66
- return this.executors.has(enforcementId);
67
- }
68
-
69
- getExecutor(enforcementId: EnforcementId): EnforcementExecutor | undefined {
70
- return this.executors.get(enforcementId);
71
- }
72
-
73
- getRegistrations(): { id: EnforcementId; executor: EnforcementExecutor; registeredAt: Date; source?: string }[] {
74
- return Array.from(this.executors.entries()).map(([id, executor]) => ({
75
- id,
76
- executor,
77
- registeredAt: new Date(),
78
- source: this.executorSources.get(id),
79
- }));
80
- }
81
-
82
- skip(enforcementIds: EnforcementId[]): void {
83
- for (const id of enforcementIds) {
84
- this.skipEnforcements.add(id);
85
- }
86
- }
87
-
88
- clearSkips(): void {
89
- this.skipEnforcements.clear();
90
- }
91
-
92
- async intercept(
93
- trigger: ConstraintTrigger,
94
- context: ConstraintContext
95
- ): Promise<InterceptionResult> {
96
- if (!this.enabled) {
97
- return {
98
- passed: true,
99
- constraints: [],
100
- violations: [],
101
- message: '拦截器已禁用',
102
- interceptedAt: new Date(),
103
- };
104
- }
105
-
106
- const result: InterceptionResult = {
107
- passed: true,
108
- constraints: [],
109
- violations: [],
110
- interceptedAt: new Date(),
111
- };
112
-
113
- const constraints = constraintChecker.getConstraints();
114
- // prompt 类约束不参与拦截执行(ADR-0001:仅参与注入)
115
- const allConstraints = [
116
- ...Object.values(constraints.ironLaws),
117
- ...Object.values(constraints.guidelines),
118
- ].filter(c => c.kind !== 'prompt');
119
-
120
- const applicableConstraints = allConstraints.filter(
121
- (c) => normalizeTriggers<ConstraintTrigger>(c.trigger).includes(trigger)
122
- );
123
-
124
- const order: Record<ConstraintLevel, number> = { iron_law: 0, guideline: 1, prompt: 2 };
125
- const ordered = applicableConstraints.sort((a, b) => order[a.level] - order[b.level]);
126
-
127
- for (const constraint of ordered) {
128
- if (this.skipEnforcements.has(constraint.enforcement)) {
129
- result.constraints.push({ constraint, skipped: true, skipReason: 'configured to skip' });
130
- continue;
131
- }
132
-
133
- // Custom executor overrides built-in check
134
- const executor = this.executors.get(constraint.enforcement);
135
- let checkResult: ConstraintResult;
136
-
137
- if (executor) {
138
- const enforcementContext: EnforcementContext = { ...context, enforcementId: constraint.enforcement, constraint };
139
- const start = Date.now();
140
- try {
141
- const enforcementResult = await executor.execute(enforcementContext);
142
- enforcementResult.duration = Date.now() - start;
143
- result.constraints.push({ constraint, enforcementResult });
144
- checkResult = {
145
- id: constraint.id, level: constraint.level,
146
- satisfied: enforcementResult.passed,
147
- message: enforcementResult.message,
148
- checkedAt: new Date(),
149
- constraint,
150
- };
151
- } catch (error) {
152
- if (error instanceof ConstraintViolationError) throw error;
153
- result.constraints.push({ constraint, enforcementResult: { passed: false, error: (error as Error).message, duration: Date.now() - start } });
154
- checkResult = { id: constraint.id, level: constraint.level, satisfied: false, message: (error as Error).message, checkedAt: new Date(), constraint };
155
- }
156
- } else {
157
- // Unified: constraint.check(context) delegates to checker
158
- checkResult = await (constraint as any).check(context);
159
- result.constraints.push({ constraint, enforcementResult: { passed: checkResult.satisfied, message: checkResult.message } });
160
- }
161
-
162
- if (!checkResult.satisfied) {
163
- if (constraint.level === 'iron_law') {
164
- result.passed = false;
165
- result.violations.push(constraint);
166
- throw new ConstraintViolationError(checkResult);
167
- }
168
- if (constraint.level === 'guideline') {
169
- result.violations.push(constraint);
170
- }
171
- }
172
- }
173
-
174
- result.message = result.violations.length === 0 ? '✅ 拦截通过' : `❌ ${result.violations.length} 个约束违规`;
175
- return result;
176
- }
177
-
178
- async claim(trigger: ConstraintTrigger, context: ConstraintContext): Promise<void> {
179
- const result = await this.intercept(trigger, context);
180
- if (!result.passed) {
181
- throw new ConstraintViolationError({
182
- id: result.violations[0]?.id || 'unknown',
183
- level: 'iron_law',
184
- satisfied: false,
185
- message: result.message,
186
- checkedAt: new Date(),
187
- });
188
- }
189
- }
190
-
191
- async canProceed(trigger: ConstraintTrigger, context: ConstraintContext): Promise<boolean> {
192
- try {
193
- return (await this.intercept(trigger, context)).passed;
194
- } catch {
195
- return false;
196
- }
197
- }
198
- }
199
-
200
- export const constraintInterceptor = ConstraintInterceptor.getInstance();
201
-
202
- export async function interceptOperation(
203
- trigger: ConstraintTrigger,
204
- context: ConstraintContext
205
- ): Promise<InterceptionResult> {
206
- return constraintInterceptor.intercept(trigger, context);
207
- }
208
-
209
- export async function claimOperation(
210
- trigger: ConstraintTrigger,
211
- context: ConstraintContext
212
- ): Promise<void> {
213
- return constraintInterceptor.claim(trigger, context);
214
- }
@@ -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';