@dommaker/harness 1.1.1 → 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 (348) hide show
  1. package/CHANGELOG.md +10 -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 +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.js +2 -2
  21. package/dist/cli/commands/status.js.map +1 -1
  22. package/dist/context/index.d.ts +9 -6
  23. package/dist/context/index.d.ts.map +1 -1
  24. package/dist/context/index.js +18 -20
  25. package/dist/context/index.js.map +1 -1
  26. package/dist/core/constraints/capabilities-parser.d.ts +3 -2
  27. package/dist/core/constraints/capabilities-parser.d.ts.map +1 -1
  28. package/dist/core/constraints/capabilities-parser.js +25 -47
  29. package/dist/core/constraints/capabilities-parser.js.map +1 -1
  30. package/dist/core/constraints/checker.d.ts +29 -32
  31. package/dist/core/constraints/checker.d.ts.map +1 -1
  32. package/dist/core/constraints/checker.js +34 -126
  33. package/dist/core/constraints/checker.js.map +1 -1
  34. package/dist/core/constraints/checkers/index.d.ts +2 -1
  35. package/dist/core/constraints/checkers/index.d.ts.map +1 -1
  36. package/dist/core/constraints/checkers/index.js +3 -0
  37. package/dist/core/constraints/checkers/index.js.map +1 -1
  38. package/dist/core/constraints/checkers/types.d.ts +25 -0
  39. package/dist/core/constraints/checkers/types.d.ts.map +1 -1
  40. package/dist/core/constraints/checkers/types.js +24 -0
  41. package/dist/core/constraints/checkers/types.js.map +1 -1
  42. package/dist/core/constraints/definitions/guidelines.d.ts.map +1 -1
  43. package/dist/core/constraints/definitions/guidelines.js +0 -2
  44. package/dist/core/constraints/definitions/guidelines.js.map +1 -1
  45. package/dist/core/constraints/definitions/prompts.d.ts.map +1 -1
  46. package/dist/core/constraints/definitions/prompts.js +0 -5
  47. package/dist/core/constraints/definitions/prompts.js.map +1 -1
  48. package/dist/core/constraints/index.d.ts +1 -2
  49. package/dist/core/constraints/index.d.ts.map +1 -1
  50. package/dist/core/constraints/index.js +1 -7
  51. package/dist/core/constraints/index.js.map +1 -1
  52. package/dist/core/constraints/usage-report.d.ts +1 -2
  53. package/dist/core/constraints/usage-report.d.ts.map +1 -1
  54. package/dist/core/constraints/usage-report.js +2 -5
  55. package/dist/core/constraints/usage-report.js.map +1 -1
  56. package/dist/core/effective-constraints.d.ts +24 -4
  57. package/dist/core/effective-constraints.d.ts.map +1 -1
  58. package/dist/core/effective-constraints.js +28 -7
  59. package/dist/core/effective-constraints.js.map +1 -1
  60. package/dist/core/effective-set.d.ts +30 -0
  61. package/dist/core/effective-set.d.ts.map +1 -0
  62. package/dist/core/effective-set.js +35 -0
  63. package/dist/core/effective-set.js.map +1 -0
  64. package/dist/core/index.d.ts +13 -6
  65. package/dist/core/index.d.ts.map +1 -1
  66. package/dist/core/index.js +44 -21
  67. package/dist/core/index.js.map +1 -1
  68. package/dist/core/project-config-loader.d.ts +3 -6
  69. package/dist/core/project-config-loader.d.ts.map +1 -1
  70. package/dist/core/project-config-loader.js +47 -61
  71. package/dist/core/project-config-loader.js.map +1 -1
  72. package/dist/failure/constraint-handler.d.ts +1 -1
  73. package/dist/failure/constraint-handler.js +1 -1
  74. package/dist/gates/checker-gate.d.ts +1 -4
  75. package/dist/gates/checker-gate.d.ts.map +1 -1
  76. package/dist/gates/checker-gate.js +3 -11
  77. package/dist/gates/checker-gate.js.map +1 -1
  78. package/dist/gates/definitions.d.ts +9 -38
  79. package/dist/gates/definitions.d.ts.map +1 -1
  80. package/dist/gates/definitions.js +24 -13
  81. package/dist/gates/definitions.js.map +1 -1
  82. package/dist/gates/effective-gates.d.ts.map +1 -1
  83. package/dist/gates/effective-gates.js +14 -18
  84. package/dist/gates/effective-gates.js.map +1 -1
  85. package/dist/gates/index.d.ts +1 -1
  86. package/dist/gates/index.d.ts.map +1 -1
  87. package/dist/gates/index.js.map +1 -1
  88. package/dist/hooks/bootstrap.d.ts.map +1 -1
  89. package/dist/hooks/bootstrap.js +0 -3
  90. package/dist/hooks/bootstrap.js.map +1 -1
  91. package/dist/index.d.ts +43 -60
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +180 -143
  94. package/dist/index.js.map +1 -1
  95. package/dist/knowledge/query.d.ts +15 -0
  96. package/dist/knowledge/query.d.ts.map +1 -1
  97. package/dist/knowledge/query.js +23 -0
  98. package/dist/knowledge/query.js.map +1 -1
  99. package/dist/monitoring/analyzer-base.d.ts +0 -4
  100. package/dist/monitoring/analyzer-base.d.ts.map +1 -1
  101. package/dist/monitoring/analyzer-base.js +0 -21
  102. package/dist/monitoring/analyzer-base.js.map +1 -1
  103. package/dist/monitoring/index.d.ts +6 -12
  104. package/dist/monitoring/index.d.ts.map +1 -1
  105. package/dist/monitoring/index.js +13 -29
  106. package/dist/monitoring/index.js.map +1 -1
  107. package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
  108. package/dist/monitoring/trace-analyzer.js +2 -68
  109. package/dist/monitoring/trace-analyzer.js.map +1 -1
  110. package/dist/monitoring/traces.d.ts +0 -4
  111. package/dist/monitoring/traces.d.ts.map +1 -1
  112. package/dist/monitoring/traces.js +0 -14
  113. package/dist/monitoring/traces.js.map +1 -1
  114. package/dist/presets/index.d.ts +2 -2
  115. package/dist/presets/index.d.ts.map +1 -1
  116. package/dist/presets/index.js +3 -4
  117. package/dist/presets/index.js.map +1 -1
  118. package/dist/presets/standard.d.ts +10 -22
  119. package/dist/presets/standard.d.ts.map +1 -1
  120. package/dist/presets/standard.js +15 -75
  121. package/dist/presets/standard.js.map +1 -1
  122. package/dist/types/constraint.d.ts +1 -29
  123. package/dist/types/constraint.d.ts.map +1 -1
  124. package/dist/types/constraint.js +1 -1
  125. package/dist/types/constraint.js.map +1 -1
  126. package/dist/types/index.d.ts +0 -3
  127. package/dist/types/index.d.ts.map +1 -1
  128. package/dist/types/index.js +0 -4
  129. package/dist/types/index.js.map +1 -1
  130. package/dist/types/project-config.d.ts +4 -8
  131. package/dist/types/project-config.d.ts.map +1 -1
  132. package/dist/types/trace.d.ts +5 -18
  133. package/dist/types/trace.d.ts.map +1 -1
  134. package/package.json +2 -2
  135. package/src/CONTEXT.md +4 -5
  136. package/src/__tests__/checker-extra.test.ts +33 -139
  137. package/src/__tests__/checker.test.ts +0 -376
  138. package/src/__tests__/project-config-loader-extra.test.ts +42 -29
  139. package/src/__tests__/public-exports.test.ts +138 -0
  140. package/src/__tests__/trace-analyzer-extra.test.ts +6 -86
  141. package/src/__tests__/trace-analyzer.test.ts +4 -5
  142. package/src/__tests__/trace-collector.test.ts +0 -11
  143. package/src/__tests__/traces.test.ts +3 -22
  144. package/src/cli/commands/CONTEXT.md +2 -2
  145. package/src/cli/commands/__tests__/check-skip-output.test.ts +10 -7
  146. package/src/cli/commands/__tests__/check.test.ts +29 -69
  147. package/src/cli/commands/__tests__/constraints-report.test.ts +1 -1
  148. package/src/cli/commands/__tests__/knowledge.test.ts +90 -1
  149. package/src/cli/commands/__tests__/registry.test.ts +8 -6
  150. package/src/cli/commands/__tests__/status-extra.test.ts +6 -6
  151. package/src/cli/commands/__tests__/status.test.ts +6 -6
  152. package/src/cli/commands/check.ts +8 -34
  153. package/src/cli/commands/definitions.ts +2 -0
  154. package/src/cli/commands/init.ts +6 -37
  155. package/src/cli/commands/knowledge.ts +1 -16
  156. package/src/cli/commands/report.ts +0 -2
  157. package/src/cli/commands/status.ts +2 -2
  158. package/src/context/index.ts +29 -6
  159. package/src/core/CONTEXT.md +4 -3
  160. package/src/core/__tests__/effective-set.test.ts +80 -0
  161. package/src/core/constraints/capabilities-parser.ts +43 -49
  162. package/src/core/constraints/checker.ts +51 -145
  163. package/src/core/constraints/checkers/index.ts +2 -1
  164. package/src/core/constraints/checkers/types.ts +42 -0
  165. package/src/core/constraints/definitions/guidelines.ts +0 -2
  166. package/src/core/constraints/definitions/prompts.ts +0 -5
  167. package/src/core/constraints/index.ts +2 -17
  168. package/src/core/constraints/usage-report.ts +5 -8
  169. package/src/core/effective-constraints.ts +35 -7
  170. package/src/core/effective-set.ts +56 -0
  171. package/src/core/index.ts +80 -6
  172. package/src/core/project-config-loader.ts +53 -68
  173. package/src/failure/CONTEXT.md +1 -1
  174. package/src/failure/constraint-handler.ts +1 -1
  175. package/src/gates/CONTEXT.md +3 -3
  176. package/src/gates/checker-gate.ts +4 -12
  177. package/src/gates/definitions.ts +27 -50
  178. package/src/gates/effective-gates.ts +14 -21
  179. package/src/gates/index.ts +1 -1
  180. package/src/hooks/bootstrap.ts +0 -3
  181. package/src/index.ts +384 -148
  182. package/src/knowledge/CONTEXT.md +2 -2
  183. package/src/knowledge/__tests__/query.test.ts +64 -0
  184. package/src/knowledge/query.ts +28 -0
  185. package/src/monitoring/CONTEXT.md +7 -13
  186. package/src/monitoring/__tests__/traces.test.ts +0 -10
  187. package/src/monitoring/analyzer-base.ts +0 -22
  188. package/src/monitoring/index.ts +6 -12
  189. package/src/monitoring/trace-analyzer.ts +2 -73
  190. package/src/monitoring/traces.ts +0 -20
  191. package/src/presets/__tests__/standard.test.ts +48 -69
  192. package/src/presets/index.ts +3 -5
  193. package/src/presets/standard.ts +14 -79
  194. package/src/spec/CONTEXT.md +5 -13
  195. package/src/types/constraint.ts +1 -51
  196. package/src/types/index.ts +0 -12
  197. package/src/types/project-config.ts +4 -10
  198. package/src/types/trace.ts +5 -30
  199. package/dist/core/constraints/interceptor.d.ts +0 -39
  200. package/dist/core/constraints/interceptor.d.ts.map +0 -1
  201. package/dist/core/constraints/interceptor.js +0 -166
  202. package/dist/core/constraints/interceptor.js.map +0 -1
  203. package/dist/dashboard/data.d.ts +0 -31
  204. package/dist/dashboard/data.d.ts.map +0 -1
  205. package/dist/dashboard/data.js +0 -81
  206. package/dist/dashboard/data.js.map +0 -1
  207. package/dist/dashboard/index.d.ts +0 -4
  208. package/dist/dashboard/index.d.ts.map +0 -1
  209. package/dist/dashboard/index.js +0 -20
  210. package/dist/dashboard/index.js.map +0 -1
  211. package/dist/dashboard/stats.d.ts +0 -20
  212. package/dist/dashboard/stats.d.ts.map +0 -1
  213. package/dist/dashboard/stats.js +0 -115
  214. package/dist/dashboard/stats.js.map +0 -1
  215. package/dist/dashboard/types.d.ts +0 -110
  216. package/dist/dashboard/types.d.ts.map +0 -1
  217. package/dist/dashboard/types.js +0 -8
  218. package/dist/dashboard/types.js.map +0 -1
  219. package/dist/monitoring/constraint-doctor.d.ts +0 -76
  220. package/dist/monitoring/constraint-doctor.d.ts.map +0 -1
  221. package/dist/monitoring/constraint-doctor.js +0 -189
  222. package/dist/monitoring/constraint-doctor.js.map +0 -1
  223. package/dist/monitoring/diagnosis-rules.d.ts +0 -18
  224. package/dist/monitoring/diagnosis-rules.d.ts.map +0 -1
  225. package/dist/monitoring/diagnosis-rules.js +0 -119
  226. package/dist/monitoring/diagnosis-rules.js.map +0 -1
  227. package/dist/monitoring/knowledge-doctor.d.ts +0 -78
  228. package/dist/monitoring/knowledge-doctor.d.ts.map +0 -1
  229. package/dist/monitoring/knowledge-doctor.js +0 -266
  230. package/dist/monitoring/knowledge-doctor.js.map +0 -1
  231. package/dist/monitoring/knowledge-evolver.d.ts +0 -72
  232. package/dist/monitoring/knowledge-evolver.d.ts.map +0 -1
  233. package/dist/monitoring/knowledge-evolver.js +0 -205
  234. package/dist/monitoring/knowledge-evolver.js.map +0 -1
  235. package/dist/monitoring/performance-analyzer.d.ts +0 -92
  236. package/dist/monitoring/performance-analyzer.d.ts.map +0 -1
  237. package/dist/monitoring/performance-analyzer.js +0 -343
  238. package/dist/monitoring/performance-analyzer.js.map +0 -1
  239. package/dist/monitoring/performance-collector.d.ts +0 -103
  240. package/dist/monitoring/performance-collector.d.ts.map +0 -1
  241. package/dist/monitoring/performance-collector.js +0 -298
  242. package/dist/monitoring/performance-collector.js.map +0 -1
  243. package/dist/safety/index.d.ts +0 -6
  244. package/dist/safety/index.d.ts.map +0 -1
  245. package/dist/safety/index.js +0 -22
  246. package/dist/safety/index.js.map +0 -1
  247. package/dist/safety/input-guardrail.d.ts +0 -36
  248. package/dist/safety/input-guardrail.d.ts.map +0 -1
  249. package/dist/safety/input-guardrail.js +0 -118
  250. package/dist/safety/input-guardrail.js.map +0 -1
  251. package/dist/safety/output-guardrail.d.ts +0 -39
  252. package/dist/safety/output-guardrail.d.ts.map +0 -1
  253. package/dist/safety/output-guardrail.js +0 -147
  254. package/dist/safety/output-guardrail.js.map +0 -1
  255. package/dist/safety/sandbox.d.ts +0 -45
  256. package/dist/safety/sandbox.d.ts.map +0 -1
  257. package/dist/safety/sandbox.js +0 -134
  258. package/dist/safety/sandbox.js.map +0 -1
  259. package/dist/safety/tool-guardrail.d.ts +0 -51
  260. package/dist/safety/tool-guardrail.d.ts.map +0 -1
  261. package/dist/safety/tool-guardrail.js +0 -147
  262. package/dist/safety/tool-guardrail.js.map +0 -1
  263. package/dist/safety/types.d.ts +0 -104
  264. package/dist/safety/types.d.ts.map +0 -1
  265. package/dist/safety/types.js +0 -6
  266. package/dist/safety/types.js.map +0 -1
  267. package/dist/spec/annotation-checker.d.ts +0 -47
  268. package/dist/spec/annotation-checker.d.ts.map +0 -1
  269. package/dist/spec/annotation-checker.js +0 -279
  270. package/dist/spec/annotation-checker.js.map +0 -1
  271. package/dist/types/enforcement.d.ts +0 -42
  272. package/dist/types/enforcement.d.ts.map +0 -1
  273. package/dist/types/enforcement.js +0 -6
  274. package/dist/types/enforcement.js.map +0 -1
  275. package/dist/types/monitoring-types.d.ts +0 -53
  276. package/dist/types/monitoring-types.d.ts.map +0 -1
  277. package/dist/types/monitoring-types.js +0 -10
  278. package/dist/types/monitoring-types.js.map +0 -1
  279. package/dist/types/performance.d.ts +0 -204
  280. package/dist/types/performance.d.ts.map +0 -1
  281. package/dist/types/performance.js +0 -12
  282. package/dist/types/performance.js.map +0 -1
  283. package/dist/verification/index.d.ts +0 -4
  284. package/dist/verification/index.d.ts.map +0 -1
  285. package/dist/verification/index.js +0 -20
  286. package/dist/verification/index.js.map +0 -1
  287. package/dist/verification/loop.d.ts +0 -30
  288. package/dist/verification/loop.d.ts.map +0 -1
  289. package/dist/verification/loop.js +0 -114
  290. package/dist/verification/loop.js.map +0 -1
  291. package/dist/verification/rules-based.d.ts +0 -40
  292. package/dist/verification/rules-based.d.ts.map +0 -1
  293. package/dist/verification/rules-based.js +0 -130
  294. package/dist/verification/rules-based.js.map +0 -1
  295. package/dist/verification/types.d.ts +0 -69
  296. package/dist/verification/types.d.ts.map +0 -1
  297. package/dist/verification/types.js +0 -6
  298. package/dist/verification/types.js.map +0 -1
  299. package/src/__tests__/annotation-checker.test.ts +0 -183
  300. package/src/__tests__/constraint-doctor.test.ts +0 -271
  301. package/src/__tests__/doctor-extra.test.ts +0 -155
  302. package/src/__tests__/extend-exceptions.test.ts +0 -149
  303. package/src/__tests__/interceptor.test.ts +0 -89
  304. package/src/__tests__/performance-analyzer.test.ts +0 -499
  305. package/src/__tests__/performance-collector.test.ts +0 -276
  306. package/src/__tests__/presets.test.ts +0 -65
  307. package/src/core/constraints/__tests__/interceptor.test.ts +0 -267
  308. package/src/core/constraints/interceptor.ts +0 -217
  309. package/src/dashboard/CONTEXT.md +0 -21
  310. package/src/dashboard/__tests__/data.test.ts +0 -111
  311. package/src/dashboard/__tests__/stats.test.ts +0 -159
  312. package/src/dashboard/data.ts +0 -103
  313. package/src/dashboard/index.ts +0 -3
  314. package/src/dashboard/stats.ts +0 -127
  315. package/src/dashboard/types.ts +0 -130
  316. package/src/monitoring/__tests__/knowledge-doctor.test.ts +0 -278
  317. package/src/monitoring/__tests__/knowledge-evolver.test.ts +0 -368
  318. package/src/monitoring/__tests__/performance-analyzer.test.ts +0 -137
  319. package/src/monitoring/__tests__/performance-collector.test.ts +0 -331
  320. package/src/monitoring/constraint-doctor.ts +0 -228
  321. package/src/monitoring/diagnosis-rules.ts +0 -132
  322. package/src/monitoring/knowledge-doctor.ts +0 -322
  323. package/src/monitoring/knowledge-evolver.ts +0 -289
  324. package/src/monitoring/performance-analyzer.ts +0 -400
  325. package/src/monitoring/performance-collector.ts +0 -326
  326. package/src/safety/CONTEXT.md +0 -23
  327. package/src/safety/__tests__/input-guardrail.test.ts +0 -105
  328. package/src/safety/__tests__/output-guardrail.test.ts +0 -108
  329. package/src/safety/__tests__/sandbox.test.ts +0 -158
  330. package/src/safety/__tests__/tool-guardrail.test.ts +0 -127
  331. package/src/safety/index.ts +0 -5
  332. package/src/safety/input-guardrail.ts +0 -133
  333. package/src/safety/output-guardrail.ts +0 -170
  334. package/src/safety/sandbox.ts +0 -148
  335. package/src/safety/tool-guardrail.ts +0 -176
  336. package/src/safety/types.ts +0 -124
  337. package/src/spec/__tests__/annotation-checker.test.ts +0 -294
  338. package/src/spec/annotation-checker.ts +0 -320
  339. package/src/types/enforcement.ts +0 -48
  340. package/src/types/monitoring-types.ts +0 -68
  341. package/src/types/performance.ts +0 -295
  342. package/src/verification/CONTEXT.md +0 -23
  343. package/src/verification/__tests__/loop.test.ts +0 -303
  344. package/src/verification/__tests__/rules-based.test.ts +0 -240
  345. package/src/verification/index.ts +0 -3
  346. package/src/verification/loop.ts +0 -137
  347. package/src/verification/rules-based.ts +0 -152
  348. package/src/verification/types.ts +0 -81
@@ -1,127 +0,0 @@
1
- /**
2
- * Dashboard 统计计算
3
- *
4
- * 纯函数,从原始数据计算统计指标
5
- */
6
-
7
- import type { KnowledgeEntry, KnowledgeSubsystem } from '../knowledge/types';
8
- import type { KnowledgeOverview, KnowledgeFlow } from './types';
9
-
10
- /**
11
- * 计算知识库概览
12
- */
13
- export function computeKnowledgeOverview(entries: KnowledgeEntry[]): KnowledgeOverview {
14
- const byType = computeByType(entries);
15
- const total = entries.length;
16
- const proven = entries.filter(e => e.maturity === 'proven').length;
17
- const verified = entries.filter(e => e.maturity === 'verified').length;
18
- const draft = entries.filter(e => e.maturity === 'draft').length;
19
-
20
- return {
21
- byType,
22
- total,
23
- maturityDistribution: {
24
- proven,
25
- verified,
26
- draft,
27
- provenPercent: total > 0 ? Math.round((proven / total) * 100) : 0,
28
- verifiedPercent: total > 0 ? Math.round((verified / total) * 100) : 0,
29
- draftPercent: total > 0 ? Math.round((draft / total) * 100) : 0,
30
- },
31
- decayWarning: computeDecayWarning(entries),
32
- };
33
- }
34
-
35
- /**
36
- * 按类型分组统计
37
- */
38
- function computeByType(entries: KnowledgeEntry[]): KnowledgeOverview['byType'] {
39
- const typeMap = new Map<KnowledgeSubsystem, { total: number; proven: number; verified: number; draft: number }>();
40
-
41
- for (const entry of entries) {
42
- const existing = typeMap.get(entry.type) || { total: 0, proven: 0, verified: 0, draft: 0 };
43
- existing.total++;
44
- if (entry.maturity === 'proven') existing.proven++;
45
- else if (entry.maturity === 'verified') existing.verified++;
46
- else if (entry.maturity === 'draft') existing.draft++;
47
- typeMap.set(entry.type, existing);
48
- }
49
-
50
- return [...typeMap.entries()].map(([type, stats]) => ({ type, ...stats }));
51
- }
52
-
53
- /**
54
- * 计算衰减预警
55
- */
56
- function computeDecayWarning(entries: KnowledgeEntry[]): KnowledgeOverview['decayWarning'] {
57
- const now = new Date();
58
- const sixMonthsAgo = new Date(now);
59
- sixMonthsAgo.setMonth(sixMonthsAgo.getMonth() - 6);
60
- const threeMonthsAgo = new Date(now);
61
- threeMonthsAgo.setMonth(threeMonthsAgo.getMonth() - 3);
62
-
63
- let provenUnused6m = 0;
64
- let verifiedUnused3m = 0;
65
-
66
- for (const entry of entries) {
67
- const lastRef = entry.lastReferenced ? new Date(entry.lastReferenced) : new Date(entry.created);
68
-
69
- if (entry.maturity === 'proven' && lastRef < sixMonthsAgo) {
70
- provenUnused6m++;
71
- }
72
- if (entry.maturity === 'verified' && lastRef < threeMonthsAgo) {
73
- verifiedUnused3m++;
74
- }
75
- }
76
-
77
- return { provenUnused6m, verifiedUnused3m };
78
- }
79
-
80
- /**
81
- * 计算知识流转统计
82
- */
83
- export function computeKnowledgeFlow(
84
- entries: KnowledgeEntry[],
85
- referenceCounts: Map<string, number>,
86
- topN: number = 5,
87
- ): KnowledgeFlow {
88
- // 成熟度转换统计(基于当前状态推断)
89
- const transitions = {
90
- draftToVerified: entries.filter(e => e.maturity === 'verified' && e.lastReferenced).length,
91
- verifiedToProven: entries.filter(e => e.maturity === 'proven').length,
92
- provenToVerified: 0, // 需要历史数据
93
- verifiedToDraft: 0, // 需要历史数据
94
- };
95
-
96
- // Top N 高频引用
97
- const topReferenced = [...referenceCounts.entries()]
98
- .map(([id, count]) => {
99
- const entry = entries.find(e => e.id === id);
100
- return { id, title: entry?.title ?? id, referenceCount: count };
101
- })
102
- .sort((a, b) => b.referenceCount - a.referenceCount)
103
- .slice(0, topN);
104
-
105
- const referenced = entries.filter(e => e.lastReferenced).length;
106
-
107
- return {
108
- period: '近 30 天',
109
- pipeline: {
110
- extracted: 0, // 需要 ingestion 日志
111
- ingested: 0, // 需要 ingestion 日志
112
- referenced,
113
- upgraded: transitions.draftToVerified + transitions.verifiedToProven,
114
- downgraded: transitions.provenToVerified + transitions.verifiedToDraft,
115
- },
116
- transitions,
117
- topReferenced,
118
- };
119
- }
120
-
121
- /**
122
- * 计算约束拦截率
123
- */
124
- export function computeInterceptRate(triggerCount: number, interceptCount: number): number {
125
- if (triggerCount === 0) return 0;
126
- return Math.round((interceptCount / triggerCount) * 100);
127
- }
@@ -1,130 +0,0 @@
1
- /**
2
- * Dashboard 数据类型定义
3
- *
4
- * harness 提供数据,studio 负责渲染
5
- */
6
-
7
- import type { KnowledgeSubsystem } from '../knowledge/types';
8
-
9
- // ── 约束分层(原 src/constraints/types,约束分层子系统删除后归位 dashboard)──
10
-
11
- /** 约束分层 */
12
- export type ConstraintLayer = 'safety' | 'quality';
13
-
14
- /** 退化状态(生命周期机制已删除,保留字段供消费方兼容,恒为 active) */
15
- export type DeprecationStatus = 'active' | 'scheduled' | 'deprecated' | 'removed';
16
-
17
- /** 约束拦截统计(generate/getConstraintHeatmap 的输入) */
18
- export interface ConstraintStats {
19
- constraintId: string;
20
- triggerCount: number;
21
- passCount: number;
22
- interceptCount: number;
23
- interceptRate: number;
24
- lastTriggered?: string;
25
- }
26
-
27
- // ── 知识库全景 ───────────────────────────────────────────
28
-
29
- export interface KnowledgeOverview {
30
- byType: Array<{
31
- type: KnowledgeSubsystem;
32
- total: number;
33
- proven: number;
34
- verified: number;
35
- draft: number;
36
- }>;
37
- total: number;
38
- maturityDistribution: {
39
- proven: number;
40
- verified: number;
41
- draft: number;
42
- provenPercent: number;
43
- verifiedPercent: number;
44
- draftPercent: number;
45
- };
46
- decayWarning: {
47
- provenUnused6m: number;
48
- verifiedUnused3m: number;
49
- };
50
- }
51
-
52
- // ── 约束执行热力图 ───────────────────────────────────────
53
-
54
- export interface ConstraintHeatmap {
55
- period: string; // e.g. "近 30 天"
56
- constraints: Array<{
57
- id: string;
58
- layer: ConstraintLayer;
59
- trigger: number;
60
- pass: number;
61
- intercept: number;
62
- interceptRate: number;
63
- deprecationStatus: DeprecationStatus;
64
- permanent?: boolean;
65
- }>;
66
- neverTriggered: string[];
67
- decliningInterceptRate: Array<{
68
- id: string;
69
- from: number;
70
- to: number;
71
- }>;
72
- }
73
-
74
- // ── 知识流转路径 ─────────────────────────────────────────
75
-
76
- export interface KnowledgeFlow {
77
- period: string;
78
- pipeline: {
79
- extracted: number;
80
- ingested: number;
81
- referenced: number;
82
- upgraded: number;
83
- downgraded: number;
84
- };
85
- transitions: {
86
- draftToVerified: number;
87
- verifiedToProven: number;
88
- provenToVerified: number;
89
- verifiedToDraft: number;
90
- };
91
- topReferenced: Array<{
92
- id: string;
93
- title: string;
94
- referenceCount: number;
95
- }>;
96
- }
97
-
98
- // ── 反馈环状态 ───────────────────────────────────────────
99
-
100
- export interface FeedbackLoopStatus {
101
- local: {
102
- active: number;
103
- lastFeedback?: string;
104
- lastType?: string;
105
- };
106
- push: {
107
- active: number;
108
- lastFeedback?: string;
109
- lastType?: string;
110
- };
111
- external: {
112
- active: number;
113
- lastFeedback?: string;
114
- lastType?: string;
115
- };
116
- feedbackToKnowledge: {
117
- total: number;
118
- pending: number;
119
- };
120
- }
121
-
122
- // ── 汇总 ────────────────────────────────────────────────
123
-
124
- export interface HarnessDashboardData {
125
- timestamp: string;
126
- knowledgeOverview: KnowledgeOverview;
127
- constraintHeatmap: ConstraintHeatmap;
128
- knowledgeFlow: KnowledgeFlow;
129
- feedbackLoop: FeedbackLoopStatus;
130
- }
@@ -1,278 +0,0 @@
1
- import { KnowledgeDoctor } from '../knowledge-doctor';
2
- import type { KnowledgeEntry, LintIssue } from '../../knowledge/types';
3
-
4
- function makeEntry(overrides: Partial<KnowledgeEntry> = {}): KnowledgeEntry {
5
- return {
6
- id: 'entry-1',
7
- type: 'guideline',
8
- title: 'Test Entry',
9
- content: 'content',
10
- maturity: 'draft',
11
- layer: 'team',
12
- created: '2025-01-01T00:00:00Z',
13
- lastReferenced: new Date().toISOString(),
14
- contributors: ['user-1'],
15
- projects: ['proj-1'],
16
- tags: ['test'],
17
- applicablePhases: ['implementation'],
18
- sourceReferences: [],
19
- referencedBy: ['ref-1'],
20
- executionResults: [],
21
- consumptionMode: 'reference',
22
- origin: 'agent',
23
- ...overrides,
24
- };
25
- }
26
-
27
- describe('KnowledgeDoctor', () => {
28
- describe('基础诊断', () => {
29
- it('空知识库返回满分', () => {
30
- const doctor = new KnowledgeDoctor();
31
- const report = doctor.diagnose([]);
32
- expect(report.healthScore).toBe(100);
33
- expect(report.totalEntries).toBe(0);
34
- expect(report.diagnoses).toHaveLength(0);
35
- });
36
-
37
- it('健康条目不产生诊断', () => {
38
- const doctor = new KnowledgeDoctor();
39
- const entry = makeEntry({ maturity: 'verified', referencedBy: ['r1', 'r2', 'r3'], projects: ['p1'] });
40
- const report = doctor.diagnose([entry]);
41
- // 可能有 low_reference 诊断,但不会有 orphan/outdated/decay
42
- const criticalDiags = report.diagnoses.filter(d => d.type === 'orphan' || d.type === 'outdated' || d.type === 'decay');
43
- expect(criticalDiags).toHaveLength(0);
44
- });
45
- });
46
-
47
- describe('孤儿检测', () => {
48
- it('检测无引用、无贡献者、无项目的 draft 条目', () => {
49
- const doctor = new KnowledgeDoctor();
50
- const orphan = makeEntry({
51
- id: 'orphan-1',
52
- maturity: 'draft',
53
- referencedBy: [],
54
- contributors: [],
55
- projects: [],
56
- });
57
- const report = doctor.diagnose([orphan]);
58
- const orphanDiags = report.diagnoses.filter(d => d.type === 'orphan');
59
- expect(orphanDiags).toHaveLength(1);
60
- expect(orphanDiags[0].entryId).toBe('orphan-1');
61
- expect(orphanDiags[0].severity).toBe('low');
62
- });
63
-
64
- it('archived 条目不检测为孤儿', () => {
65
- const doctor = new KnowledgeDoctor();
66
- const archived = makeEntry({
67
- maturity: 'archived',
68
- referencedBy: [],
69
- contributors: [],
70
- projects: [],
71
- });
72
- const report = doctor.diagnose([archived]);
73
- expect(report.diagnoses.filter(d => d.type === 'orphan')).toHaveLength(0);
74
- });
75
-
76
- it('有引用的 draft 条目不检测为孤儿', () => {
77
- const doctor = new KnowledgeDoctor();
78
- const entry = makeEntry({ maturity: 'draft', referencedBy: ['r1'], contributors: [], projects: [] });
79
- const report = doctor.diagnose([entry]);
80
- expect(report.diagnoses.filter(d => d.type === 'orphan')).toHaveLength(0);
81
- });
82
- });
83
-
84
- describe('过时检测', () => {
85
- it('检测超过阈值天数未引用的 draft 条目', () => {
86
- const doctor = new KnowledgeDoctor({ outdatedDays: 30 });
87
- const old = makeEntry({
88
- id: 'old-1',
89
- maturity: 'draft',
90
- lastReferenced: '2020-01-01T00:00:00Z',
91
- });
92
- const report = doctor.diagnose([old]);
93
- const outdated = report.diagnoses.filter(d => d.type === 'outdated');
94
- expect(outdated).toHaveLength(1);
95
- expect(outdated[0].entryId).toBe('old-1');
96
- });
97
-
98
- it('verified/proven 条目不检测为过时', () => {
99
- const doctor = new KnowledgeDoctor({ outdatedDays: 1 });
100
- const entry = makeEntry({
101
- maturity: 'verified',
102
- lastReferenced: '2020-01-01T00:00:00Z',
103
- });
104
- const report = doctor.diagnose([entry]);
105
- expect(report.diagnoses.filter(d => d.type === 'outdated')).toHaveLength(0);
106
- });
107
- });
108
-
109
- describe('衰减检测', () => {
110
- it('检测长期未引用的 proven 条目', () => {
111
- const doctor = new KnowledgeDoctor({ decayWarningDays: 30 });
112
- const entry = makeEntry({
113
- id: 'decay-1',
114
- maturity: 'proven',
115
- lastReferenced: '2020-01-01T00:00:00Z',
116
- });
117
- const report = doctor.diagnose([entry]);
118
- const decay = report.diagnoses.filter(d => d.type === 'decay');
119
- expect(decay).toHaveLength(1);
120
- expect(decay[0].severity).toBe('high');
121
- });
122
-
123
- it('检测长期未引用的 verified 条目(medium severity)', () => {
124
- const doctor = new KnowledgeDoctor({ decayWarningDays: 30 });
125
- const entry = makeEntry({
126
- maturity: 'verified',
127
- lastReferenced: '2020-01-01T00:00:00Z',
128
- });
129
- const report = doctor.diagnose([entry]);
130
- const decay = report.diagnoses.filter(d => d.type === 'decay');
131
- expect(decay).toHaveLength(1);
132
- expect(decay[0].severity).toBe('medium');
133
- });
134
-
135
- it('draft 条目不检测衰减', () => {
136
- const doctor = new KnowledgeDoctor({ decayWarningDays: 1 });
137
- const entry = makeEntry({
138
- maturity: 'draft',
139
- lastReferenced: '2020-01-01T00:00:00Z',
140
- });
141
- const report = doctor.diagnose([entry]);
142
- expect(report.diagnoses.filter(d => d.type === 'decay')).toHaveLength(0);
143
- });
144
- });
145
-
146
- describe('低引用检测', () => {
147
- it('检测引用次数低于阈值的非 draft 条目', () => {
148
- const doctor = new KnowledgeDoctor({ lowReferenceThreshold: 5 });
149
- const entry = makeEntry({
150
- maturity: 'verified',
151
- referencedBy: ['r1'],
152
- });
153
- const report = doctor.diagnose([entry]);
154
- const lowRef = report.diagnoses.filter(d => d.type === 'low_reference');
155
- expect(lowRef).toHaveLength(1);
156
- expect(lowRef[0].severity).toBe('low');
157
- });
158
-
159
- it('archived 和 draft 条目不检测低引用', () => {
160
- const doctor = new KnowledgeDoctor({ lowReferenceThreshold: 100 });
161
- const archived = makeEntry({ id: 'a1', maturity: 'archived', referencedBy: [] });
162
- const draft = makeEntry({ id: 'd1', maturity: 'draft', referencedBy: [] });
163
- const report = doctor.diagnose([archived, draft]);
164
- expect(report.diagnoses.filter(d => d.type === 'low_reference')).toHaveLength(0);
165
- });
166
- });
167
-
168
- describe('Lint issues 转换', () => {
169
- it('将 LintIssue 转换为诊断', () => {
170
- const doctor = new KnowledgeDoctor();
171
- const issue: LintIssue = {
172
- type: 'orphan',
173
- entryId: 'e1',
174
- severity: 'medium',
175
- description: 'Orphan entry',
176
- suggestion: 'Archive it',
177
- };
178
- const report = doctor.diagnose([], [issue]);
179
- expect(report.diagnoses).toHaveLength(1);
180
- expect(report.diagnoses[0].type).toBe('orphan');
181
- expect(report.diagnoses[0].severity).toBe('medium');
182
- expect(report.diagnoses[0].recommendations).toContain('Archive it');
183
- });
184
-
185
- it('覆盖所有 LintIssue 类型的根因和影响推断', () => {
186
- const doctor = new KnowledgeDoctor();
187
- const types: LintIssue['type'][] = ['contradiction', 'outdated', 'duplicate', 'index_inconsistent'];
188
- for (const type of types) {
189
- const issue: LintIssue = { type, severity: 'low', description: `test ${type}`, suggestion: 'fix' };
190
- const report = doctor.diagnose([], [issue]);
191
- const diag = report.diagnoses.find(d => d.type === type);
192
- expect(diag).toBeDefined();
193
- expect(diag!.rootCause).toBeTruthy();
194
- expect(diag!.impact).toBeTruthy();
195
- }
196
- });
197
-
198
- it('未知 LintIssue 类型使用默认根因和影响', () => {
199
- const doctor = new KnowledgeDoctor();
200
- const issue = { type: 'unknown_type', severity: 'low', description: 'unknown', suggestion: 'fix' } as unknown as LintIssue;
201
- const report = doctor.diagnose([], [issue]);
202
- expect(report.diagnoses[0].rootCause).toBe('未知原因');
203
- expect(report.diagnoses[0].impact).toBe('未知影响');
204
- });
205
- });
206
-
207
- describe('健康分数', () => {
208
- it('无问题时返回 100', () => {
209
- const doctor = new KnowledgeDoctor();
210
- const entry = makeEntry({ maturity: 'verified', referencedBy: ['r1', 'r2', 'r3'], projects: ['p1', 'p2'] });
211
- const report = doctor.diagnose([entry]);
212
- expect(report.healthScore).toBe(100);
213
- });
214
-
215
- it('有问题时扣分', () => {
216
- const doctor = new KnowledgeDoctor({ decayWarningDays: 1, lowReferenceThreshold: 100 });
217
- const entry = makeEntry({
218
- maturity: 'proven',
219
- lastReferenced: '2020-01-01T00:00:00Z',
220
- referencedBy: ['r1'],
221
- projects: ['p1'],
222
- });
223
- const report = doctor.diagnose([entry]);
224
- expect(report.healthScore).toBeLessThan(100);
225
- });
226
-
227
- it('critical 严重度扣 10 分', () => {
228
- const doctor = new KnowledgeDoctor();
229
- // 直接构造 critical 诊断来测试 calculateHealthScore 的 critical 分支
230
- // LintIssue severity 只有 low/medium/high,所以通过 checkDecay 的 high 来测试
231
- const entry = makeEntry({ maturity: 'proven', lastReferenced: '2020-01-01T00:00:00Z' });
232
- const report = doctor.diagnose([entry]);
233
- const decayDiag = report.diagnoses.find(d => d.type === 'decay');
234
- expect(decayDiag).toBeDefined();
235
- expect(decayDiag!.severity).toBe('high');
236
- });
237
- });
238
-
239
- describe('报告生成', () => {
240
- it('生成 Markdown 报告', () => {
241
- const doctor = new KnowledgeDoctor();
242
- const report = doctor.diagnose([makeEntry()]);
243
- const md = doctor.generateReport(report);
244
- expect(md).toContain('# 知识库健康报告');
245
- expect(md).toContain('健康分数');
246
- expect(md).toContain('## 问题统计');
247
- });
248
-
249
- it('有诊断时生成详情', () => {
250
- const doctor = new KnowledgeDoctor({ decayWarningDays: 1 });
251
- const entry = makeEntry({
252
- maturity: 'proven',
253
- lastReferenced: '2020-01-01T00:00:00Z',
254
- });
255
- const report = doctor.diagnose([entry]);
256
- const md = doctor.generateReport(report);
257
- expect(md).toContain('## 诊断详情');
258
- expect(md).toContain('衰减预警');
259
- });
260
- });
261
-
262
- describe('配置', () => {
263
- it('使用默认配置', () => {
264
- const doctor = new KnowledgeDoctor();
265
- // 默认 lowReferenceThreshold=2
266
- const entry = makeEntry({ maturity: 'verified', referencedBy: ['r1'] });
267
- const report = doctor.diagnose([entry]);
268
- expect(report.diagnoses.filter(d => d.type === 'low_reference')).toHaveLength(1);
269
- });
270
-
271
- it('自定义配置覆盖默认值', () => {
272
- const doctor = new KnowledgeDoctor({ lowReferenceThreshold: 0 });
273
- const entry = makeEntry({ maturity: 'verified', referencedBy: [] });
274
- const report = doctor.diagnose([entry]);
275
- expect(report.diagnoses.filter(d => d.type === 'low_reference')).toHaveLength(0);
276
- });
277
- });
278
- });