@dommaker/harness 1.1.1 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +2 -4
  3. package/bin/harness.js +12 -37
  4. package/dist/cli/commands/check.d.ts +2 -2
  5. package/dist/cli/commands/check.d.ts.map +1 -1
  6. package/dist/cli/commands/check.js +8 -33
  7. package/dist/cli/commands/check.js.map +1 -1
  8. package/dist/cli/commands/constraints-report.js +1 -1
  9. package/dist/cli/commands/constraints-report.js.map +1 -1
  10. package/dist/cli/commands/constraints-retire.d.ts +6 -3
  11. package/dist/cli/commands/constraints-retire.d.ts.map +1 -1
  12. package/dist/cli/commands/constraints-retire.js +34 -25
  13. package/dist/cli/commands/constraints-retire.js.map +1 -1
  14. package/dist/cli/commands/definitions.d.ts +2 -0
  15. package/dist/cli/commands/definitions.d.ts.map +1 -1
  16. package/dist/cli/commands/definitions.js.map +1 -1
  17. package/dist/cli/commands/init.d.ts +21 -1
  18. package/dist/cli/commands/init.d.ts.map +1 -1
  19. package/dist/cli/commands/init.js +118 -40
  20. package/dist/cli/commands/init.js.map +1 -1
  21. package/dist/cli/commands/knowledge.d.ts.map +1 -1
  22. package/dist/cli/commands/knowledge.js +1 -12
  23. package/dist/cli/commands/knowledge.js.map +1 -1
  24. package/dist/cli/commands/report.d.ts.map +1 -1
  25. package/dist/cli/commands/report.js +0 -2
  26. package/dist/cli/commands/report.js.map +1 -1
  27. package/dist/cli/commands/status.js +2 -2
  28. package/dist/cli/commands/status.js.map +1 -1
  29. package/dist/context/index.d.ts +9 -6
  30. package/dist/context/index.d.ts.map +1 -1
  31. package/dist/context/index.js +18 -20
  32. package/dist/context/index.js.map +1 -1
  33. package/dist/core/constraints/capabilities-parser.d.ts +3 -2
  34. package/dist/core/constraints/capabilities-parser.d.ts.map +1 -1
  35. package/dist/core/constraints/capabilities-parser.js +25 -47
  36. package/dist/core/constraints/capabilities-parser.js.map +1 -1
  37. package/dist/core/constraints/checker.d.ts +29 -32
  38. package/dist/core/constraints/checker.d.ts.map +1 -1
  39. package/dist/core/constraints/checker.js +34 -126
  40. package/dist/core/constraints/checker.js.map +1 -1
  41. package/dist/core/constraints/checkers/governance-presence.d.ts +20 -0
  42. package/dist/core/constraints/checkers/governance-presence.d.ts.map +1 -0
  43. package/dist/core/constraints/checkers/governance-presence.js +76 -0
  44. package/dist/core/constraints/checkers/governance-presence.js.map +1 -0
  45. package/dist/core/constraints/checkers/index.d.ts +2 -1
  46. package/dist/core/constraints/checkers/index.d.ts.map +1 -1
  47. package/dist/core/constraints/checkers/index.js +5 -0
  48. package/dist/core/constraints/checkers/index.js.map +1 -1
  49. package/dist/core/constraints/checkers/types.d.ts +25 -0
  50. package/dist/core/constraints/checkers/types.d.ts.map +1 -1
  51. package/dist/core/constraints/checkers/types.js +24 -0
  52. package/dist/core/constraints/checkers/types.js.map +1 -1
  53. package/dist/core/constraints/definitions/guidelines.d.ts.map +1 -1
  54. package/dist/core/constraints/definitions/guidelines.js +21 -2
  55. package/dist/core/constraints/definitions/guidelines.js.map +1 -1
  56. package/dist/core/constraints/definitions/prompts.d.ts.map +1 -1
  57. package/dist/core/constraints/definitions/prompts.js +0 -5
  58. package/dist/core/constraints/definitions/prompts.js.map +1 -1
  59. package/dist/core/constraints/index.d.ts +1 -2
  60. package/dist/core/constraints/index.d.ts.map +1 -1
  61. package/dist/core/constraints/index.js +1 -7
  62. package/dist/core/constraints/index.js.map +1 -1
  63. package/dist/core/constraints/injection-drift.d.ts +29 -4
  64. package/dist/core/constraints/injection-drift.d.ts.map +1 -1
  65. package/dist/core/constraints/injection-drift.js +52 -20
  66. package/dist/core/constraints/injection-drift.js.map +1 -1
  67. package/dist/core/constraints/usage-report.d.ts +1 -2
  68. package/dist/core/constraints/usage-report.d.ts.map +1 -1
  69. package/dist/core/constraints/usage-report.js +2 -5
  70. package/dist/core/constraints/usage-report.js.map +1 -1
  71. package/dist/core/effective-constraints.d.ts +24 -4
  72. package/dist/core/effective-constraints.d.ts.map +1 -1
  73. package/dist/core/effective-constraints.js +28 -7
  74. package/dist/core/effective-constraints.js.map +1 -1
  75. package/dist/core/effective-set.d.ts +30 -0
  76. package/dist/core/effective-set.d.ts.map +1 -0
  77. package/dist/core/effective-set.js +35 -0
  78. package/dist/core/effective-set.js.map +1 -0
  79. package/dist/core/index.d.ts +13 -6
  80. package/dist/core/index.d.ts.map +1 -1
  81. package/dist/core/index.js +44 -21
  82. package/dist/core/index.js.map +1 -1
  83. package/dist/core/project-config-loader.d.ts +3 -6
  84. package/dist/core/project-config-loader.d.ts.map +1 -1
  85. package/dist/core/project-config-loader.js +47 -61
  86. package/dist/core/project-config-loader.js.map +1 -1
  87. package/dist/failure/constraint-handler.d.ts +1 -1
  88. package/dist/failure/constraint-handler.js +1 -1
  89. package/dist/gates/checker-gate.d.ts +1 -4
  90. package/dist/gates/checker-gate.d.ts.map +1 -1
  91. package/dist/gates/checker-gate.js +3 -11
  92. package/dist/gates/checker-gate.js.map +1 -1
  93. package/dist/gates/definitions.d.ts +9 -38
  94. package/dist/gates/definitions.d.ts.map +1 -1
  95. package/dist/gates/definitions.js +24 -13
  96. package/dist/gates/definitions.js.map +1 -1
  97. package/dist/gates/effective-gates.d.ts.map +1 -1
  98. package/dist/gates/effective-gates.js +14 -18
  99. package/dist/gates/effective-gates.js.map +1 -1
  100. package/dist/gates/index.d.ts +1 -1
  101. package/dist/gates/index.d.ts.map +1 -1
  102. package/dist/gates/index.js.map +1 -1
  103. package/dist/hooks/bootstrap.d.ts.map +1 -1
  104. package/dist/hooks/bootstrap.js +0 -3
  105. package/dist/hooks/bootstrap.js.map +1 -1
  106. package/dist/index.d.ts +43 -60
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +180 -143
  109. package/dist/index.js.map +1 -1
  110. package/dist/knowledge/query.d.ts +15 -0
  111. package/dist/knowledge/query.d.ts.map +1 -1
  112. package/dist/knowledge/query.js +23 -0
  113. package/dist/knowledge/query.js.map +1 -1
  114. package/dist/monitoring/analyzer-base.d.ts +0 -4
  115. package/dist/monitoring/analyzer-base.d.ts.map +1 -1
  116. package/dist/monitoring/analyzer-base.js +0 -21
  117. package/dist/monitoring/analyzer-base.js.map +1 -1
  118. package/dist/monitoring/index.d.ts +6 -12
  119. package/dist/monitoring/index.d.ts.map +1 -1
  120. package/dist/monitoring/index.js +13 -29
  121. package/dist/monitoring/index.js.map +1 -1
  122. package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
  123. package/dist/monitoring/trace-analyzer.js +2 -68
  124. package/dist/monitoring/trace-analyzer.js.map +1 -1
  125. package/dist/monitoring/traces.d.ts +0 -4
  126. package/dist/monitoring/traces.d.ts.map +1 -1
  127. package/dist/monitoring/traces.js +0 -14
  128. package/dist/monitoring/traces.js.map +1 -1
  129. package/dist/presets/index.d.ts +2 -2
  130. package/dist/presets/index.d.ts.map +1 -1
  131. package/dist/presets/index.js +3 -4
  132. package/dist/presets/index.js.map +1 -1
  133. package/dist/presets/standard.d.ts +10 -22
  134. package/dist/presets/standard.d.ts.map +1 -1
  135. package/dist/presets/standard.js +15 -75
  136. package/dist/presets/standard.js.map +1 -1
  137. package/dist/types/constraint.d.ts +1 -29
  138. package/dist/types/constraint.d.ts.map +1 -1
  139. package/dist/types/constraint.js +1 -1
  140. package/dist/types/constraint.js.map +1 -1
  141. package/dist/types/index.d.ts +0 -3
  142. package/dist/types/index.d.ts.map +1 -1
  143. package/dist/types/index.js +0 -4
  144. package/dist/types/index.js.map +1 -1
  145. package/dist/types/project-config.d.ts +4 -8
  146. package/dist/types/project-config.d.ts.map +1 -1
  147. package/dist/types/trace.d.ts +5 -18
  148. package/dist/types/trace.d.ts.map +1 -1
  149. package/package.json +2 -2
  150. package/src/CONTEXT.md +4 -5
  151. package/src/__tests__/checker-extra.test.ts +33 -139
  152. package/src/__tests__/checker.test.ts +0 -376
  153. package/src/__tests__/governance-presence.test.ts +129 -0
  154. package/src/__tests__/iron-laws.test.ts +7 -7
  155. package/src/__tests__/project-config-loader-extra.test.ts +42 -29
  156. package/src/__tests__/public-exports.test.ts +138 -0
  157. package/src/__tests__/trace-analyzer-extra.test.ts +6 -86
  158. package/src/__tests__/trace-analyzer.test.ts +4 -5
  159. package/src/__tests__/trace-collector.test.ts +0 -11
  160. package/src/__tests__/traces.test.ts +3 -22
  161. package/src/cli/commands/CONTEXT.md +6 -3
  162. package/src/cli/commands/__tests__/check-skip-output.test.ts +10 -7
  163. package/src/cli/commands/__tests__/check.test.ts +29 -69
  164. package/src/cli/commands/__tests__/constraints-report.test.ts +3 -3
  165. package/src/cli/commands/__tests__/constraints-retire.test.ts +45 -4
  166. package/src/cli/commands/__tests__/init-injection.test.ts +202 -0
  167. package/src/cli/commands/__tests__/knowledge.test.ts +90 -1
  168. package/src/cli/commands/__tests__/registry.test.ts +8 -6
  169. package/src/cli/commands/__tests__/status-extra.test.ts +6 -6
  170. package/src/cli/commands/__tests__/status.test.ts +6 -6
  171. package/src/cli/commands/__tests__/sync-docs-agents.test.ts +28 -0
  172. package/src/cli/commands/check.ts +9 -35
  173. package/src/cli/commands/constraints-report.ts +1 -1
  174. package/src/cli/commands/constraints-retire.ts +38 -27
  175. package/src/cli/commands/definitions.ts +2 -0
  176. package/src/cli/commands/init.ts +129 -40
  177. package/src/cli/commands/knowledge.ts +1 -16
  178. package/src/cli/commands/report.ts +0 -2
  179. package/src/cli/commands/status.ts +2 -2
  180. package/src/context/index.ts +29 -6
  181. package/src/core/CONTEXT.md +4 -3
  182. package/src/core/__tests__/effective-set.test.ts +80 -0
  183. package/src/core/constraints/__tests__/injection-drift.test.ts +90 -0
  184. package/src/core/constraints/capabilities-parser.ts +43 -49
  185. package/src/core/constraints/checker.ts +51 -145
  186. package/src/core/constraints/checkers/governance-presence.ts +74 -0
  187. package/src/core/constraints/checkers/index.ts +4 -1
  188. package/src/core/constraints/checkers/types.ts +42 -0
  189. package/src/core/constraints/definitions/guidelines.ts +22 -2
  190. package/src/core/constraints/definitions/prompts.ts +0 -5
  191. package/src/core/constraints/index.ts +2 -17
  192. package/src/core/constraints/injection-drift.ts +60 -21
  193. package/src/core/constraints/usage-report.ts +5 -8
  194. package/src/core/effective-constraints.ts +35 -7
  195. package/src/core/effective-set.ts +56 -0
  196. package/src/core/index.ts +80 -6
  197. package/src/core/project-config-loader.ts +53 -68
  198. package/src/failure/CONTEXT.md +1 -1
  199. package/src/failure/constraint-handler.ts +1 -1
  200. package/src/gates/CONTEXT.md +3 -3
  201. package/src/gates/checker-gate.ts +4 -12
  202. package/src/gates/definitions.ts +27 -50
  203. package/src/gates/effective-gates.ts +14 -21
  204. package/src/gates/index.ts +1 -1
  205. package/src/hooks/bootstrap.ts +0 -3
  206. package/src/index.ts +384 -148
  207. package/src/knowledge/CONTEXT.md +2 -2
  208. package/src/knowledge/__tests__/query.test.ts +64 -0
  209. package/src/knowledge/query.ts +28 -0
  210. package/src/monitoring/CONTEXT.md +7 -13
  211. package/src/monitoring/__tests__/traces.test.ts +0 -10
  212. package/src/monitoring/analyzer-base.ts +0 -22
  213. package/src/monitoring/index.ts +6 -12
  214. package/src/monitoring/trace-analyzer.ts +2 -73
  215. package/src/monitoring/traces.ts +0 -20
  216. package/src/presets/__tests__/standard.test.ts +48 -69
  217. package/src/presets/index.ts +3 -5
  218. package/src/presets/standard.ts +14 -79
  219. package/src/spec/CONTEXT.md +5 -13
  220. package/src/types/constraint.ts +1 -51
  221. package/src/types/index.ts +0 -12
  222. package/src/types/project-config.ts +4 -10
  223. package/src/types/trace.ts +5 -30
  224. package/dist/core/constraints/interceptor.d.ts +0 -39
  225. package/dist/core/constraints/interceptor.d.ts.map +0 -1
  226. package/dist/core/constraints/interceptor.js +0 -166
  227. package/dist/core/constraints/interceptor.js.map +0 -1
  228. package/dist/dashboard/data.d.ts +0 -31
  229. package/dist/dashboard/data.d.ts.map +0 -1
  230. package/dist/dashboard/data.js +0 -81
  231. package/dist/dashboard/data.js.map +0 -1
  232. package/dist/dashboard/index.d.ts +0 -4
  233. package/dist/dashboard/index.d.ts.map +0 -1
  234. package/dist/dashboard/index.js +0 -20
  235. package/dist/dashboard/index.js.map +0 -1
  236. package/dist/dashboard/stats.d.ts +0 -20
  237. package/dist/dashboard/stats.d.ts.map +0 -1
  238. package/dist/dashboard/stats.js +0 -115
  239. package/dist/dashboard/stats.js.map +0 -1
  240. package/dist/dashboard/types.d.ts +0 -110
  241. package/dist/dashboard/types.d.ts.map +0 -1
  242. package/dist/dashboard/types.js +0 -8
  243. package/dist/dashboard/types.js.map +0 -1
  244. package/dist/monitoring/constraint-doctor.d.ts +0 -76
  245. package/dist/monitoring/constraint-doctor.d.ts.map +0 -1
  246. package/dist/monitoring/constraint-doctor.js +0 -189
  247. package/dist/monitoring/constraint-doctor.js.map +0 -1
  248. package/dist/monitoring/diagnosis-rules.d.ts +0 -18
  249. package/dist/monitoring/diagnosis-rules.d.ts.map +0 -1
  250. package/dist/monitoring/diagnosis-rules.js +0 -119
  251. package/dist/monitoring/diagnosis-rules.js.map +0 -1
  252. package/dist/monitoring/knowledge-doctor.d.ts +0 -78
  253. package/dist/monitoring/knowledge-doctor.d.ts.map +0 -1
  254. package/dist/monitoring/knowledge-doctor.js +0 -266
  255. package/dist/monitoring/knowledge-doctor.js.map +0 -1
  256. package/dist/monitoring/knowledge-evolver.d.ts +0 -72
  257. package/dist/monitoring/knowledge-evolver.d.ts.map +0 -1
  258. package/dist/monitoring/knowledge-evolver.js +0 -205
  259. package/dist/monitoring/knowledge-evolver.js.map +0 -1
  260. package/dist/monitoring/performance-analyzer.d.ts +0 -92
  261. package/dist/monitoring/performance-analyzer.d.ts.map +0 -1
  262. package/dist/monitoring/performance-analyzer.js +0 -343
  263. package/dist/monitoring/performance-analyzer.js.map +0 -1
  264. package/dist/monitoring/performance-collector.d.ts +0 -103
  265. package/dist/monitoring/performance-collector.d.ts.map +0 -1
  266. package/dist/monitoring/performance-collector.js +0 -298
  267. package/dist/monitoring/performance-collector.js.map +0 -1
  268. package/dist/safety/index.d.ts +0 -6
  269. package/dist/safety/index.d.ts.map +0 -1
  270. package/dist/safety/index.js +0 -22
  271. package/dist/safety/index.js.map +0 -1
  272. package/dist/safety/input-guardrail.d.ts +0 -36
  273. package/dist/safety/input-guardrail.d.ts.map +0 -1
  274. package/dist/safety/input-guardrail.js +0 -118
  275. package/dist/safety/input-guardrail.js.map +0 -1
  276. package/dist/safety/output-guardrail.d.ts +0 -39
  277. package/dist/safety/output-guardrail.d.ts.map +0 -1
  278. package/dist/safety/output-guardrail.js +0 -147
  279. package/dist/safety/output-guardrail.js.map +0 -1
  280. package/dist/safety/sandbox.d.ts +0 -45
  281. package/dist/safety/sandbox.d.ts.map +0 -1
  282. package/dist/safety/sandbox.js +0 -134
  283. package/dist/safety/sandbox.js.map +0 -1
  284. package/dist/safety/tool-guardrail.d.ts +0 -51
  285. package/dist/safety/tool-guardrail.d.ts.map +0 -1
  286. package/dist/safety/tool-guardrail.js +0 -147
  287. package/dist/safety/tool-guardrail.js.map +0 -1
  288. package/dist/safety/types.d.ts +0 -104
  289. package/dist/safety/types.d.ts.map +0 -1
  290. package/dist/safety/types.js +0 -6
  291. package/dist/safety/types.js.map +0 -1
  292. package/dist/spec/annotation-checker.d.ts +0 -47
  293. package/dist/spec/annotation-checker.d.ts.map +0 -1
  294. package/dist/spec/annotation-checker.js +0 -279
  295. package/dist/spec/annotation-checker.js.map +0 -1
  296. package/dist/types/enforcement.d.ts +0 -42
  297. package/dist/types/enforcement.d.ts.map +0 -1
  298. package/dist/types/enforcement.js +0 -6
  299. package/dist/types/enforcement.js.map +0 -1
  300. package/dist/types/monitoring-types.d.ts +0 -53
  301. package/dist/types/monitoring-types.d.ts.map +0 -1
  302. package/dist/types/monitoring-types.js +0 -10
  303. package/dist/types/monitoring-types.js.map +0 -1
  304. package/dist/types/performance.d.ts +0 -204
  305. package/dist/types/performance.d.ts.map +0 -1
  306. package/dist/types/performance.js +0 -12
  307. package/dist/types/performance.js.map +0 -1
  308. package/dist/verification/index.d.ts +0 -4
  309. package/dist/verification/index.d.ts.map +0 -1
  310. package/dist/verification/index.js +0 -20
  311. package/dist/verification/index.js.map +0 -1
  312. package/dist/verification/loop.d.ts +0 -30
  313. package/dist/verification/loop.d.ts.map +0 -1
  314. package/dist/verification/loop.js +0 -114
  315. package/dist/verification/loop.js.map +0 -1
  316. package/dist/verification/rules-based.d.ts +0 -40
  317. package/dist/verification/rules-based.d.ts.map +0 -1
  318. package/dist/verification/rules-based.js +0 -130
  319. package/dist/verification/rules-based.js.map +0 -1
  320. package/dist/verification/types.d.ts +0 -69
  321. package/dist/verification/types.d.ts.map +0 -1
  322. package/dist/verification/types.js +0 -6
  323. package/dist/verification/types.js.map +0 -1
  324. package/src/__tests__/annotation-checker.test.ts +0 -183
  325. package/src/__tests__/constraint-doctor.test.ts +0 -271
  326. package/src/__tests__/doctor-extra.test.ts +0 -155
  327. package/src/__tests__/extend-exceptions.test.ts +0 -149
  328. package/src/__tests__/interceptor.test.ts +0 -89
  329. package/src/__tests__/performance-analyzer.test.ts +0 -499
  330. package/src/__tests__/performance-collector.test.ts +0 -276
  331. package/src/__tests__/presets.test.ts +0 -65
  332. package/src/core/constraints/__tests__/interceptor.test.ts +0 -267
  333. package/src/core/constraints/interceptor.ts +0 -217
  334. package/src/dashboard/CONTEXT.md +0 -21
  335. package/src/dashboard/__tests__/data.test.ts +0 -111
  336. package/src/dashboard/__tests__/stats.test.ts +0 -159
  337. package/src/dashboard/data.ts +0 -103
  338. package/src/dashboard/index.ts +0 -3
  339. package/src/dashboard/stats.ts +0 -127
  340. package/src/dashboard/types.ts +0 -130
  341. package/src/monitoring/__tests__/knowledge-doctor.test.ts +0 -278
  342. package/src/monitoring/__tests__/knowledge-evolver.test.ts +0 -368
  343. package/src/monitoring/__tests__/performance-analyzer.test.ts +0 -137
  344. package/src/monitoring/__tests__/performance-collector.test.ts +0 -331
  345. package/src/monitoring/constraint-doctor.ts +0 -228
  346. package/src/monitoring/diagnosis-rules.ts +0 -132
  347. package/src/monitoring/knowledge-doctor.ts +0 -322
  348. package/src/monitoring/knowledge-evolver.ts +0 -289
  349. package/src/monitoring/performance-analyzer.ts +0 -400
  350. package/src/monitoring/performance-collector.ts +0 -326
  351. package/src/safety/CONTEXT.md +0 -23
  352. package/src/safety/__tests__/input-guardrail.test.ts +0 -105
  353. package/src/safety/__tests__/output-guardrail.test.ts +0 -108
  354. package/src/safety/__tests__/sandbox.test.ts +0 -158
  355. package/src/safety/__tests__/tool-guardrail.test.ts +0 -127
  356. package/src/safety/index.ts +0 -5
  357. package/src/safety/input-guardrail.ts +0 -133
  358. package/src/safety/output-guardrail.ts +0 -170
  359. package/src/safety/sandbox.ts +0 -148
  360. package/src/safety/tool-guardrail.ts +0 -176
  361. package/src/safety/types.ts +0 -124
  362. package/src/spec/__tests__/annotation-checker.test.ts +0 -294
  363. package/src/spec/annotation-checker.ts +0 -320
  364. package/src/types/enforcement.ts +0 -48
  365. package/src/types/monitoring-types.ts +0 -68
  366. package/src/types/performance.ts +0 -295
  367. package/src/verification/CONTEXT.md +0 -23
  368. package/src/verification/__tests__/loop.test.ts +0 -303
  369. package/src/verification/__tests__/rules-based.test.ts +0 -240
  370. package/src/verification/index.ts +0 -3
  371. package/src/verification/loop.ts +0 -137
  372. package/src/verification/rules-based.ts +0 -152
  373. package/src/verification/types.ts +0 -81
@@ -1,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
- });