@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,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
- });