@dommaker/harness 0.16.9 → 0.17.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 (337) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +33 -32
  3. package/bin/harness.js +33 -20
  4. package/dist/cli/commands/check.d.ts +3 -2
  5. package/dist/cli/commands/check.d.ts.map +1 -1
  6. package/dist/cli/commands/check.js +69 -36
  7. package/dist/cli/commands/check.js.map +1 -1
  8. package/dist/cli/commands/constraints-report.d.ts +42 -0
  9. package/dist/cli/commands/constraints-report.d.ts.map +1 -0
  10. package/dist/cli/commands/constraints-report.js +233 -0
  11. package/dist/cli/commands/constraints-report.js.map +1 -0
  12. package/dist/cli/commands/constraints-retire.d.ts +71 -0
  13. package/dist/cli/commands/constraints-retire.d.ts.map +1 -0
  14. package/dist/cli/commands/constraints-retire.js +384 -0
  15. package/dist/cli/commands/constraints-retire.js.map +1 -0
  16. package/dist/cli/commands/constraints.d.ts +1 -1
  17. package/dist/cli/commands/constraints.d.ts.map +1 -1
  18. package/dist/cli/commands/constraints.js +4 -4
  19. package/dist/cli/commands/constraints.js.map +1 -1
  20. package/dist/cli/commands/index.d.ts +2 -1
  21. package/dist/cli/commands/index.d.ts.map +1 -1
  22. package/dist/cli/commands/index.js +10 -4
  23. package/dist/cli/commands/index.js.map +1 -1
  24. package/dist/cli/commands/init.d.ts +20 -0
  25. package/dist/cli/commands/init.d.ts.map +1 -1
  26. package/dist/cli/commands/init.js +81 -59
  27. package/dist/cli/commands/init.js.map +1 -1
  28. package/dist/cli/commands/report.js +4 -4
  29. package/dist/cli/commands/report.js.map +1 -1
  30. package/dist/cli/commands/status.d.ts.map +1 -1
  31. package/dist/cli/commands/status.js +3 -4
  32. package/dist/cli/commands/status.js.map +1 -1
  33. package/dist/cli/commands/sync-docs/capabilities-syncer.d.ts +5 -1
  34. package/dist/cli/commands/sync-docs/capabilities-syncer.d.ts.map +1 -1
  35. package/dist/cli/commands/sync-docs/capabilities-syncer.js +2 -10
  36. package/dist/cli/commands/sync-docs/capabilities-syncer.js.map +1 -1
  37. package/dist/cli/commands/validate.d.ts.map +1 -1
  38. package/dist/cli/commands/validate.js +1 -5
  39. package/dist/cli/commands/validate.js.map +1 -1
  40. package/dist/core/constraints/capabilities-parser.d.ts +7 -0
  41. package/dist/core/constraints/capabilities-parser.d.ts.map +1 -1
  42. package/dist/core/constraints/capabilities-parser.js +13 -0
  43. package/dist/core/constraints/capabilities-parser.js.map +1 -1
  44. package/dist/core/constraints/checker.d.ts +13 -5
  45. package/dist/core/constraints/checker.d.ts.map +1 -1
  46. package/dist/core/constraints/checker.js +62 -25
  47. package/dist/core/constraints/checker.js.map +1 -1
  48. package/dist/core/constraints/checkers/capability-sync.d.ts +9 -2
  49. package/dist/core/constraints/checkers/capability-sync.d.ts.map +1 -1
  50. package/dist/core/constraints/checkers/capability-sync.js +55 -22
  51. package/dist/core/constraints/checkers/capability-sync.js.map +1 -1
  52. package/dist/core/constraints/checkers/context-doc-sync.d.ts +3 -0
  53. package/dist/core/constraints/checkers/context-doc-sync.d.ts.map +1 -1
  54. package/dist/core/constraints/checkers/context-doc-sync.js +8 -2
  55. package/dist/core/constraints/checkers/context-doc-sync.js.map +1 -1
  56. package/dist/core/constraints/checkers/docs-freshness.d.ts +1 -0
  57. package/dist/core/constraints/checkers/docs-freshness.d.ts.map +1 -1
  58. package/dist/core/constraints/checkers/docs-freshness.js +39 -0
  59. package/dist/core/constraints/checkers/docs-freshness.js.map +1 -1
  60. package/dist/core/constraints/checkers/index.d.ts +8 -4
  61. package/dist/core/constraints/checkers/index.d.ts.map +1 -1
  62. package/dist/core/constraints/checkers/index.js +29 -46
  63. package/dist/core/constraints/checkers/index.js.map +1 -1
  64. package/dist/core/constraints/checkers/iron-flags.d.ts +6 -7
  65. package/dist/core/constraints/checkers/iron-flags.d.ts.map +1 -1
  66. package/dist/core/constraints/checkers/iron-flags.js +10 -17
  67. package/dist/core/constraints/checkers/iron-flags.js.map +1 -1
  68. package/dist/core/constraints/checkers/no-hardcoded-credentials.d.ts +13 -0
  69. package/dist/core/constraints/checkers/no-hardcoded-credentials.d.ts.map +1 -0
  70. package/dist/core/constraints/checkers/no-hardcoded-credentials.js +91 -0
  71. package/dist/core/constraints/checkers/no-hardcoded-credentials.js.map +1 -0
  72. package/dist/core/constraints/checkers/types.d.ts +15 -4
  73. package/dist/core/constraints/checkers/types.d.ts.map +1 -1
  74. package/dist/core/constraints/checkers/types.js +16 -4
  75. package/dist/core/constraints/checkers/types.js.map +1 -1
  76. package/dist/core/constraints/context-builder.d.ts +6 -3
  77. package/dist/core/constraints/context-builder.d.ts.map +1 -1
  78. package/dist/core/constraints/context-builder.js +29 -20
  79. package/dist/core/constraints/context-builder.js.map +1 -1
  80. package/dist/core/constraints/definitions/guidelines.d.ts +6 -2
  81. package/dist/core/constraints/definitions/guidelines.d.ts.map +1 -1
  82. package/dist/core/constraints/definitions/guidelines.js +29 -572
  83. package/dist/core/constraints/definitions/guidelines.js.map +1 -1
  84. package/dist/core/constraints/definitions/iron-laws.d.ts +6 -2
  85. package/dist/core/constraints/definitions/iron-laws.d.ts.map +1 -1
  86. package/dist/core/constraints/definitions/iron-laws.js +48 -231
  87. package/dist/core/constraints/definitions/iron-laws.js.map +1 -1
  88. package/dist/core/constraints/definitions/prompts.d.ts +12 -0
  89. package/dist/core/constraints/definitions/prompts.d.ts.map +1 -0
  90. package/dist/core/constraints/definitions/prompts.js +405 -0
  91. package/dist/core/constraints/definitions/prompts.js.map +1 -0
  92. package/dist/core/constraints/definitions.d.ts +15 -9
  93. package/dist/core/constraints/definitions.d.ts.map +1 -1
  94. package/dist/core/constraints/definitions.js +18 -12
  95. package/dist/core/constraints/definitions.js.map +1 -1
  96. package/dist/core/constraints/index.d.ts +3 -2
  97. package/dist/core/constraints/index.d.ts.map +1 -1
  98. package/dist/core/constraints/index.js +8 -2
  99. package/dist/core/constraints/index.js.map +1 -1
  100. package/dist/core/constraints/injection-drift.d.ts +48 -0
  101. package/dist/core/constraints/injection-drift.d.ts.map +1 -0
  102. package/dist/core/constraints/injection-drift.js +140 -0
  103. package/dist/core/constraints/injection-drift.js.map +1 -0
  104. package/dist/core/constraints/injection-renderer.d.ts +23 -0
  105. package/dist/core/constraints/injection-renderer.d.ts.map +1 -0
  106. package/dist/core/constraints/injection-renderer.js +44 -0
  107. package/dist/core/constraints/injection-renderer.js.map +1 -0
  108. package/dist/core/constraints/interceptor.d.ts.map +1 -1
  109. package/dist/core/constraints/interceptor.js +3 -2
  110. package/dist/core/constraints/interceptor.js.map +1 -1
  111. package/dist/core/constraints/usage-report.d.ts +95 -0
  112. package/dist/core/constraints/usage-report.d.ts.map +1 -0
  113. package/dist/core/constraints/usage-report.js +206 -0
  114. package/dist/core/constraints/usage-report.js.map +1 -0
  115. package/dist/core/effective-constraints.d.ts +47 -0
  116. package/dist/core/effective-constraints.d.ts.map +1 -0
  117. package/dist/core/effective-constraints.js +60 -0
  118. package/dist/core/effective-constraints.js.map +1 -0
  119. package/dist/core/index.d.ts +1 -0
  120. package/dist/core/index.d.ts.map +1 -1
  121. package/dist/core/index.js +2 -0
  122. package/dist/core/index.js.map +1 -1
  123. package/dist/core/project-config-loader.d.ts +17 -2
  124. package/dist/core/project-config-loader.d.ts.map +1 -1
  125. package/dist/core/project-config-loader.js +55 -8
  126. package/dist/core/project-config-loader.js.map +1 -1
  127. package/dist/dashboard/data.d.ts +1 -9
  128. package/dist/dashboard/data.d.ts.map +1 -1
  129. package/dist/dashboard/data.js +7 -15
  130. package/dist/dashboard/data.js.map +1 -1
  131. package/dist/dashboard/types.d.ts +13 -1
  132. package/dist/dashboard/types.d.ts.map +1 -1
  133. package/dist/index.d.ts +0 -4
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +1 -13
  136. package/dist/index.js.map +1 -1
  137. package/dist/monitoring/index.d.ts +0 -2
  138. package/dist/monitoring/index.d.ts.map +1 -1
  139. package/dist/monitoring/index.js +0 -2
  140. package/dist/monitoring/index.js.map +1 -1
  141. package/dist/monitoring/knowledge-evolver.d.ts +1 -1
  142. package/dist/monitoring/knowledge-evolver.js +1 -1
  143. package/dist/monitoring/trace-analyzer.d.ts +1 -1
  144. package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
  145. package/dist/monitoring/trace-analyzer.js +16 -10
  146. package/dist/monitoring/trace-analyzer.js.map +1 -1
  147. package/dist/monitoring/traces.d.ts +2 -1
  148. package/dist/monitoring/traces.d.ts.map +1 -1
  149. package/dist/monitoring/traces.js +5 -3
  150. package/dist/monitoring/traces.js.map +1 -1
  151. package/dist/presets/standard.d.ts +3 -1
  152. package/dist/presets/standard.d.ts.map +1 -1
  153. package/dist/presets/standard.js +18 -8
  154. package/dist/presets/standard.js.map +1 -1
  155. package/dist/types/constraint.d.ts +51 -11
  156. package/dist/types/constraint.d.ts.map +1 -1
  157. package/dist/types/constraint.js +8 -4
  158. package/dist/types/constraint.js.map +1 -1
  159. package/dist/types/index.d.ts +1 -1
  160. package/dist/types/index.d.ts.map +1 -1
  161. package/dist/types/index.js.map +1 -1
  162. package/dist/types/monitoring-types.d.ts +2 -63
  163. package/dist/types/monitoring-types.d.ts.map +1 -1
  164. package/dist/types/monitoring-types.js +2 -2
  165. package/dist/types/project-config.d.ts +26 -1
  166. package/dist/types/project-config.d.ts.map +1 -1
  167. package/dist/types/trace.d.ts +16 -7
  168. package/dist/types/trace.d.ts.map +1 -1
  169. package/dist/types/trace.js +8 -0
  170. package/dist/types/trace.js.map +1 -1
  171. package/package.json +1 -1
  172. package/src/CONTEXT.md +2 -2
  173. package/src/__tests__/checker-extra.test.ts +228 -333
  174. package/src/__tests__/checker.test.ts +87 -724
  175. package/src/__tests__/constraint-doctor.test.ts +5 -5
  176. package/src/__tests__/doctor-extra.test.ts +164 -0
  177. package/src/__tests__/effective-constraints.test.ts +147 -0
  178. package/src/__tests__/extend-exceptions.test.ts +3 -3
  179. package/src/__tests__/iron-laws.test.ts +115 -91
  180. package/src/__tests__/no-hardcoded-credentials.test.ts +90 -0
  181. package/src/__tests__/presets.test.ts +7 -7
  182. package/src/__tests__/project-config-loader-extra.test.ts +41 -4
  183. package/src/__tests__/skip-semantics.test.ts +322 -0
  184. package/src/cli/commands/CONTEXT.md +5 -3
  185. package/src/cli/commands/__tests__/check-drift.test.ts +127 -0
  186. package/src/cli/commands/__tests__/check-skip-output.test.ts +128 -0
  187. package/src/cli/commands/__tests__/check.test.ts +14 -25
  188. package/src/cli/commands/__tests__/constraints-report.test.ts +327 -0
  189. package/src/cli/commands/__tests__/constraints-retire.test.ts +283 -0
  190. package/src/cli/commands/__tests__/init-injection.test.ts +234 -0
  191. package/src/cli/commands/__tests__/status-extra.test.ts +11 -11
  192. package/src/cli/commands/__tests__/status.test.ts +1 -1
  193. package/src/cli/commands/check.ts +72 -38
  194. package/src/cli/commands/constraints-report.ts +234 -0
  195. package/src/cli/commands/constraints-retire.ts +443 -0
  196. package/src/cli/commands/constraints.ts +5 -5
  197. package/src/cli/commands/index.ts +2 -1
  198. package/src/cli/commands/init.ts +94 -66
  199. package/src/cli/commands/report.ts +6 -6
  200. package/src/cli/commands/status.ts +3 -4
  201. package/src/cli/commands/sync-docs/capabilities-syncer.ts +5 -7
  202. package/src/cli/commands/validate.ts +1 -5
  203. package/src/core/CONTEXT.md +7 -4
  204. package/src/core/constraints/__tests__/injection-drift.test.ts +164 -0
  205. package/src/core/constraints/__tests__/interceptor.test.ts +4 -0
  206. package/src/core/constraints/capabilities-parser.ts +13 -0
  207. package/src/core/constraints/checker.ts +73 -28
  208. package/src/core/constraints/checkers/capability-sync.ts +72 -29
  209. package/src/core/constraints/checkers/context-doc-sync.ts +9 -2
  210. package/src/core/constraints/checkers/docs-freshness.ts +43 -0
  211. package/src/core/constraints/checkers/index.ts +38 -71
  212. package/src/core/constraints/checkers/iron-flags.ts +13 -49
  213. package/src/core/constraints/checkers/no-hardcoded-credentials.ts +93 -0
  214. package/src/core/constraints/checkers/types.ts +27 -5
  215. package/src/core/constraints/context-builder.ts +28 -19
  216. package/src/core/constraints/definitions/guidelines.ts +29 -597
  217. package/src/core/constraints/definitions/iron-laws.ts +48 -239
  218. package/src/core/constraints/definitions/prompts.ts +419 -0
  219. package/src/core/constraints/definitions.ts +18 -11
  220. package/src/core/constraints/index.ts +10 -1
  221. package/src/core/constraints/injection-drift.ts +139 -0
  222. package/src/core/constraints/injection-renderer.ts +44 -0
  223. package/src/core/constraints/interceptor.ts +3 -2
  224. package/src/core/constraints/usage-report.ts +254 -0
  225. package/src/core/effective-constraints.ts +85 -0
  226. package/src/core/index.ts +4 -1
  227. package/src/core/project-config-loader.ts +59 -9
  228. package/src/dashboard/__tests__/data.test.ts +5 -12
  229. package/src/dashboard/data.ts +9 -19
  230. package/src/dashboard/types.ts +18 -1
  231. package/src/index.ts +0 -12
  232. package/src/knowledge/CONTEXT.md +2 -2
  233. package/src/monitoring/CONTEXT.md +3 -4
  234. package/src/monitoring/index.ts +0 -2
  235. package/src/monitoring/knowledge-evolver.ts +1 -1
  236. package/src/monitoring/trace-analyzer.ts +15 -10
  237. package/src/monitoring/traces.ts +10 -6
  238. package/src/presets/__tests__/standard.test.ts +11 -9
  239. package/src/presets/standard.ts +24 -15
  240. package/src/types/constraint.ts +59 -14
  241. package/src/types/index.ts +1 -3
  242. package/src/types/monitoring-types.ts +2 -84
  243. package/src/types/project-config.ts +30 -1
  244. package/src/types/trace.ts +18 -7
  245. package/src/verification/CONTEXT.md +1 -1
  246. package/dist/cli/commands/flow.d.ts +0 -22
  247. package/dist/cli/commands/flow.d.ts.map +0 -1
  248. package/dist/cli/commands/flow.js +0 -275
  249. package/dist/cli/commands/flow.js.map +0 -1
  250. package/dist/constraints/lifecycle-runner.d.ts +0 -52
  251. package/dist/constraints/lifecycle-runner.d.ts.map +0 -1
  252. package/dist/constraints/lifecycle-runner.js +0 -151
  253. package/dist/constraints/lifecycle-runner.js.map +0 -1
  254. package/dist/constraints/registry.d.ts +0 -27
  255. package/dist/constraints/registry.d.ts.map +0 -1
  256. package/dist/constraints/registry.js +0 -128
  257. package/dist/constraints/registry.js.map +0 -1
  258. package/dist/constraints/types.d.ts +0 -53
  259. package/dist/constraints/types.d.ts.map +0 -1
  260. package/dist/constraints/types.js +0 -8
  261. package/dist/constraints/types.js.map +0 -1
  262. package/dist/core/constraints/checkers/always-pass.d.ts +0 -17
  263. package/dist/core/constraints/checkers/always-pass.d.ts.map +0 -1
  264. package/dist/core/constraints/checkers/always-pass.js +0 -23
  265. package/dist/core/constraints/checkers/always-pass.js.map +0 -1
  266. package/dist/core/constraints/checkers/guideline-flags.d.ts +0 -9
  267. package/dist/core/constraints/checkers/guideline-flags.d.ts.map +0 -1
  268. package/dist/core/constraints/checkers/guideline-flags.js +0 -13
  269. package/dist/core/constraints/checkers/guideline-flags.js.map +0 -1
  270. package/dist/core/constraints/checkers/no-any-type.d.ts +0 -6
  271. package/dist/core/constraints/checkers/no-any-type.d.ts.map +0 -1
  272. package/dist/core/constraints/checkers/no-any-type.js +0 -42
  273. package/dist/core/constraints/checkers/no-any-type.js.map +0 -1
  274. package/dist/core/constraints/checkers/no-excuse-patterns.d.ts +0 -6
  275. package/dist/core/constraints/checkers/no-excuse-patterns.d.ts.map +0 -1
  276. package/dist/core/constraints/checkers/no-excuse-patterns.js +0 -25
  277. package/dist/core/constraints/checkers/no-excuse-patterns.js.map +0 -1
  278. package/dist/core/constraints/checkers/no-fuzzy-completion-claim.d.ts +0 -6
  279. package/dist/core/constraints/checkers/no-fuzzy-completion-claim.d.ts.map +0 -1
  280. package/dist/core/constraints/checkers/no-fuzzy-completion-claim.js +0 -34
  281. package/dist/core/constraints/checkers/no-fuzzy-completion-claim.js.map +0 -1
  282. package/dist/core/constraints/checkers/no-performative-agreement.d.ts +0 -8
  283. package/dist/core/constraints/checkers/no-performative-agreement.d.ts.map +0 -1
  284. package/dist/core/constraints/checkers/no-performative-agreement.js +0 -23
  285. package/dist/core/constraints/checkers/no-performative-agreement.js.map +0 -1
  286. package/dist/core/constraints/checkers/no-simplification-without-approval.d.ts +0 -6
  287. package/dist/core/constraints/checkers/no-simplification-without-approval.d.ts.map +0 -1
  288. package/dist/core/constraints/checkers/no-simplification-without-approval.js +0 -30
  289. package/dist/core/constraints/checkers/no-simplification-without-approval.js.map +0 -1
  290. package/dist/core/constraints/checkers/test-coverage.d.ts +0 -6
  291. package/dist/core/constraints/checkers/test-coverage.d.ts.map +0 -1
  292. package/dist/core/constraints/checkers/test-coverage.js +0 -33
  293. package/dist/core/constraints/checkers/test-coverage.js.map +0 -1
  294. package/dist/core/constraints/checkers/yagni.d.ts +0 -8
  295. package/dist/core/constraints/checkers/yagni.d.ts.map +0 -1
  296. package/dist/core/constraints/checkers/yagni.js +0 -96
  297. package/dist/core/constraints/checkers/yagni.js.map +0 -1
  298. package/dist/core/constraints/definitions/tips.d.ts +0 -7
  299. package/dist/core/constraints/definitions/tips.d.ts.map +0 -1
  300. package/dist/core/constraints/definitions/tips.js +0 -62
  301. package/dist/core/constraints/definitions/tips.js.map +0 -1
  302. package/dist/evolution/auto-evolve.d.ts +0 -35
  303. package/dist/evolution/auto-evolve.d.ts.map +0 -1
  304. package/dist/evolution/auto-evolve.js +0 -64
  305. package/dist/evolution/auto-evolve.js.map +0 -1
  306. package/dist/evolution/index.d.ts +0 -2
  307. package/dist/evolution/index.d.ts.map +0 -1
  308. package/dist/evolution/index.js +0 -18
  309. package/dist/evolution/index.js.map +0 -1
  310. package/dist/monitoring/constraint-evolver.d.ts +0 -120
  311. package/dist/monitoring/constraint-evolver.d.ts.map +0 -1
  312. package/dist/monitoring/constraint-evolver.js +0 -410
  313. package/dist/monitoring/constraint-evolver.js.map +0 -1
  314. package/src/__tests__/constraint-evolver.test.ts +0 -405
  315. package/src/__tests__/doctor-evolver.test.ts +0 -381
  316. package/src/cli/commands/__tests__/flow.test.ts +0 -343
  317. package/src/cli/commands/flow.ts +0 -277
  318. package/src/constraints/__tests__/lifecycle-runner.test.ts +0 -246
  319. package/src/constraints/__tests__/registry.test.ts +0 -196
  320. package/src/constraints/lifecycle-runner.ts +0 -184
  321. package/src/constraints/registry.ts +0 -134
  322. package/src/constraints/types.ts +0 -59
  323. package/src/core/constraints/checkers/always-pass.ts +0 -22
  324. package/src/core/constraints/checkers/guideline-flags.ts +0 -30
  325. package/src/core/constraints/checkers/no-any-type.ts +0 -42
  326. package/src/core/constraints/checkers/no-excuse-patterns.ts +0 -24
  327. package/src/core/constraints/checkers/no-fuzzy-completion-claim.ts +0 -33
  328. package/src/core/constraints/checkers/no-performative-agreement.ts +0 -22
  329. package/src/core/constraints/checkers/no-simplification-without-approval.ts +0 -29
  330. package/src/core/constraints/checkers/test-coverage.ts +0 -35
  331. package/src/core/constraints/checkers/yagni.ts +0 -65
  332. package/src/core/constraints/definitions/tips.ts +0 -63
  333. package/src/evolution/CONTEXT.md +0 -22
  334. package/src/evolution/__tests__/auto-evolve.test.ts +0 -319
  335. package/src/evolution/auto-evolve.ts +0 -98
  336. package/src/evolution/index.ts +0 -1
  337. package/src/monitoring/constraint-evolver.ts +0 -501
@@ -1,405 +0,0 @@
1
- /**
2
- * constraint-evolver 测试
3
- */
4
-
5
- import { describe, it, expect } from '@jest/globals';
6
- import { ConstraintEvolver } from '../monitoring/constraint-evolver';
7
- import { getConstraint } from '../core/constraints/definitions';
8
- import type { Diagnosis } from '../types/monitoring-types';
9
-
10
- describe('ConstraintEvolver', () => {
11
- describe('constructor', () => {
12
- it('应该创建实例', () => {
13
- const evolver = new ConstraintEvolver(undefined, getConstraint);
14
- expect(evolver).toBeDefined();
15
- });
16
-
17
- it('支持自定义 proposalsDir', () => {
18
- const evolver = new ConstraintEvolver('/tmp/test-proposals', getConstraint);
19
- expect(evolver).toBeDefined();
20
- });
21
- });
22
-
23
- describe('propose', () => {
24
- it('应该根据诊断生成提案', async () => {
25
- const evolver = new ConstraintEvolver(undefined, getConstraint);
26
-
27
- const diagnosis: Diagnosis = {
28
- anomalyId: 'anomaly-001',
29
- constraintId: 'no_fix_without_root_cause',
30
- diagnosedAt: Date.now(),
31
- rootCause: {
32
- primary: '例外使用过多',
33
- evidence: [],
34
- },
35
- impact: {
36
- severity: 'medium',
37
- scope: 'single_project',
38
- userImpact: '质量下降',
39
- },
40
- recommendations: [
41
- {
42
- type: 'add_exception',
43
- content: '添加 simple_typo 例外',
44
- expectedOutcome: '减少误报',
45
- implementationCost: 'low',
46
- },
47
- ],
48
- needsChange: true,
49
- urgency: 'medium',
50
- };
51
-
52
- const proposal = await evolver.propose(diagnosis);
53
-
54
- expect(proposal).toBeDefined();
55
- expect(proposal?.constraintId).toBe('no_fix_without_root_cause');
56
- });
57
-
58
- it('needsChange=false 应该返回 null', async () => {
59
- const evolver = new ConstraintEvolver(undefined, getConstraint);
60
-
61
- const diagnosis: Diagnosis = {
62
- anomalyId: 'anomaly-no-change',
63
- constraintId: 'test_constraint',
64
- diagnosedAt: Date.now(),
65
- rootCause: { primary: '正常', evidence: [] },
66
- impact: { severity: 'low', scope: 'single_project', userImpact: '无' },
67
- recommendations: [],
68
- needsChange: false,
69
- urgency: 'low',
70
- };
71
-
72
- const proposal = await evolver.propose(diagnosis);
73
- expect(proposal).toBeNull();
74
- });
75
-
76
- it('recommendations 为空应该返回 null', async () => {
77
- const evolver = new ConstraintEvolver(undefined, getConstraint);
78
-
79
- const diagnosis: Diagnosis = {
80
- anomalyId: 'anomaly-no-rec',
81
- constraintId: 'test_constraint',
82
- diagnosedAt: Date.now(),
83
- rootCause: { primary: '测试', evidence: [] },
84
- impact: { severity: 'medium', scope: 'single_project', userImpact: '测试' },
85
- recommendations: [],
86
- needsChange: true,
87
- urgency: 'medium',
88
- };
89
-
90
- const proposal = await evolver.propose(diagnosis);
91
- expect(proposal).toBeNull();
92
- });
93
-
94
- it('应该处理 adjust_threshold 类型', async () => {
95
- const evolver = new ConstraintEvolver(undefined, getConstraint);
96
-
97
- const diagnosis: Diagnosis = {
98
- anomalyId: 'anomaly-002',
99
- constraintId: 'no_fix_without_root_cause',
100
- diagnosedAt: Date.now(),
101
- rootCause: { primary: '触发条件过宽', evidence: [] },
102
- impact: { severity: 'low', scope: 'single_project', userImpact: '少量误报' },
103
- recommendations: [
104
- { type: 'adjust_threshold', content: '缩小触发范围', expectedOutcome: '减少误报', implementationCost: 'low' },
105
- ],
106
- needsChange: true,
107
- urgency: 'low',
108
- };
109
-
110
- const proposal = await evolver.propose(diagnosis);
111
- expect(proposal).toBeDefined();
112
- expect(proposal?.type).toBe('adjust_trigger');
113
- });
114
-
115
- it('应该处理 modify_constraint 类型', async () => {
116
- const evolver = new ConstraintEvolver(undefined, getConstraint);
117
-
118
- const diagnosis: Diagnosis = {
119
- anomalyId: 'anomaly-003',
120
- constraintId: 'no_fix_without_root_cause',
121
- diagnosedAt: Date.now(),
122
- rootCause: { primary: '消息不清晰', evidence: [] },
123
- impact: { severity: 'low', scope: 'single_project', userImpact: '用户体验差' },
124
- recommendations: [
125
- { type: 'modify_constraint', content: '优化提示消息', expectedOutcome: '更清晰', implementationCost: 'low' },
126
- ],
127
- needsChange: true,
128
- urgency: 'low',
129
- };
130
-
131
- const proposal = await evolver.propose(diagnosis);
132
- expect(proposal).toBeDefined();
133
- expect(proposal?.type).toBe('modify_message');
134
- });
135
- });
136
-
137
- describe('proposeBatch', () => {
138
- it('应该批量生成提案', async () => {
139
- const evolver = new ConstraintEvolver(undefined, getConstraint);
140
-
141
- const diagnoses: Diagnosis[] = [
142
- {
143
- anomalyId: 'batch-001',
144
- constraintId: 'no_fix_without_root_cause',
145
- diagnosedAt: Date.now(),
146
- rootCause: { primary: '测试1', evidence: [] },
147
- impact: { severity: 'low', scope: 'single_project', userImpact: '无' },
148
- recommendations: [{ type: 'add_exception', content: 'test', expectedOutcome: 'ok', implementationCost: 'low' }],
149
- needsChange: true,
150
- urgency: 'low',
151
- },
152
- {
153
- anomalyId: 'batch-002',
154
- constraintId: 'no_code_without_test',
155
- diagnosedAt: Date.now(),
156
- rootCause: { primary: '测试2', evidence: [] },
157
- impact: { severity: 'low', scope: 'single_project', userImpact: '无' },
158
- recommendations: [{ type: 'add_exception', content: 'test', expectedOutcome: 'ok', implementationCost: 'low' }],
159
- needsChange: true,
160
- urgency: 'low',
161
- },
162
- {
163
- anomalyId: 'batch-003',
164
- constraintId: 'unknown_constraint',
165
- diagnosedAt: Date.now(),
166
- rootCause: { primary: '测试3', evidence: [] },
167
- impact: { severity: 'low', scope: 'single_project', userImpact: '无' },
168
- recommendations: [],
169
- needsChange: false,
170
- urgency: 'low',
171
- },
172
- ];
173
-
174
- const proposals = await evolver.proposeBatch(diagnoses);
175
- expect(proposals.length).toBe(2);
176
- });
177
- });
178
-
179
- describe('review', () => {
180
- it('Iron Law 非添加例外应该被拒绝', async () => {
181
- const evolver = new ConstraintEvolver(undefined, getConstraint);
182
-
183
- const diagnosis: Diagnosis = {
184
- anomalyId: 'review-001',
185
- constraintId: 'no_bypass_checkpoint', // iron_law
186
- diagnosedAt: Date.now(),
187
- rootCause: { primary: '测试', evidence: [] },
188
- impact: { severity: 'high', scope: 'single_project', userImpact: '严重' },
189
- recommendations: [{ type: 'modify_constraint', content: '修改消息', expectedOutcome: '更清晰', implementationCost: 'low' }],
190
- needsChange: true,
191
- urgency: 'high',
192
- };
193
-
194
- const proposal = await evolver.propose(diagnosis);
195
- const review = evolver.review(proposal!);
196
-
197
- expect(review.accepted).toBe(false);
198
- expect(review.comment).toContain('Iron Law');
199
- });
200
-
201
- it('高风险提案应该被拒绝', async () => {
202
- const evolver = new ConstraintEvolver(undefined, getConstraint);
203
-
204
- const diagnosis: Diagnosis = {
205
- anomalyId: 'review-002',
206
- constraintId: 'no_fix_without_root_cause',
207
- diagnosedAt: Date.now(),
208
- rootCause: { primary: '高风险', evidence: [] },
209
- impact: { severity: 'high', scope: 'multiple_projects', userImpact: '严重' },
210
- recommendations: [{ type: 'add_exception', content: 'test', expectedOutcome: '高风险', implementationCost: 'high' }],
211
- needsChange: true,
212
- urgency: 'high',
213
- };
214
-
215
- const proposal = await evolver.propose(diagnosis);
216
- const review = evolver.review(proposal!);
217
-
218
- expect(review.accepted).toBe(false);
219
- expect(review.comment).toContain('高风险');
220
- });
221
-
222
- it('低风险 + 有测试应该通过', async () => {
223
- const evolver = new ConstraintEvolver(undefined, getConstraint);
224
-
225
- const diagnosis: Diagnosis = {
226
- anomalyId: 'review-003',
227
- constraintId: 'no_fix_without_root_cause',
228
- diagnosedAt: Date.now(),
229
- rootCause: { primary: '低风险变更', evidence: [] },
230
- impact: { severity: 'low', scope: 'single_project', userImpact: '无' },
231
- recommendations: [{ type: 'add_exception', content: 'test', expectedOutcome: '低风险', implementationCost: 'low' }],
232
- needsChange: true,
233
- urgency: 'low',
234
- };
235
-
236
- const proposal = await evolver.propose(diagnosis);
237
- const review = evolver.review(proposal!);
238
-
239
- expect(review.accepted).toBe(true);
240
- });
241
-
242
- it('中风险需要人工审核', async () => {
243
- const evolver = new ConstraintEvolver(undefined, getConstraint);
244
-
245
- const diagnosis: Diagnosis = {
246
- anomalyId: 'review-004',
247
- constraintId: 'no_fix_without_root_cause',
248
- diagnosedAt: Date.now(),
249
- rootCause: { primary: '中风险', evidence: [] },
250
- impact: { severity: 'medium', scope: 'single_project', userImpact: '中等' },
251
- recommendations: [{ type: 'adjust_threshold', content: 'test', expectedOutcome: '中风险', implementationCost: 'high' }],
252
- needsChange: true,
253
- urgency: 'medium',
254
- };
255
-
256
- const proposal = await evolver.propose(diagnosis);
257
- const review = evolver.review(proposal!);
258
-
259
- expect(review.accepted).toBe(false);
260
- expect(review.comment).toContain('人工审核');
261
- });
262
- });
263
-
264
- describe('implement', () => {
265
- it('add_exception 应该生成正确指令', async () => {
266
- const evolver = new ConstraintEvolver(undefined, getConstraint);
267
-
268
- const diagnosis: Diagnosis = {
269
- anomalyId: 'impl-001',
270
- constraintId: 'no_fix_without_root_cause',
271
- diagnosedAt: Date.now(),
272
- rootCause: { primary: '测试', evidence: [] },
273
- impact: { severity: 'low', scope: 'single_project', userImpact: '无' },
274
- recommendations: [{ type: 'add_exception', content: 'test_exception', expectedOutcome: 'ok', implementationCost: 'low' }],
275
- needsChange: true,
276
- urgency: 'low',
277
- };
278
-
279
- const proposal = await evolver.propose(diagnosis);
280
- const impl = evolver.implement(proposal!);
281
-
282
- expect(impl.instructions.length).toBeGreaterThan(0);
283
- expect(impl.filesToModify).toContain('src/core/constraints/definitions.ts');
284
- });
285
-
286
- it('remove_exception 应该生成正确指令', async () => {
287
- const evolver = new ConstraintEvolver(undefined, getConstraint);
288
-
289
- const proposal = {
290
- id: 'test-remove',
291
- proposedAt: Date.now(),
292
- diagnosisId: 'diag-001',
293
- constraintId: 'test',
294
- type: 'remove_exception' as const,
295
- content: { proposed: 'old_exception', description: 'test' },
296
- reasoning: 'test',
297
- expectedOutcome: 'ok',
298
- risk: { level: 'low' as const, description: 'test' },
299
- implementation: { files: ['test.ts'], linesChanged: 5, testsRequired: true },
300
- status: 'proposed' as const,
301
- };
302
-
303
- const impl = evolver.implement(proposal);
304
- expect(impl.instructions.some(i => i.includes('移除'))).toBe(true);
305
- });
306
-
307
- it('adjust_trigger 应该生成正确指令', async () => {
308
- const evolver = new ConstraintEvolver(undefined, getConstraint);
309
-
310
- const proposal = {
311
- id: 'test-adjust',
312
- proposedAt: Date.now(),
313
- diagnosisId: 'diag-002',
314
- constraintId: 'test',
315
- type: 'adjust_trigger' as const,
316
- content: { current: 'old_trigger', proposed: 'new_trigger', description: 'test' },
317
- reasoning: 'test',
318
- expectedOutcome: 'ok',
319
- risk: { level: 'low' as const, description: 'test' },
320
- implementation: { files: ['test.ts'], linesChanged: 5, testsRequired: true },
321
- status: 'proposed' as const,
322
- };
323
-
324
- const impl = evolver.implement(proposal);
325
- expect(impl.instructions.some(i => i.includes('调整'))).toBe(true);
326
- });
327
-
328
- it('change_level 应该生成正确指令', async () => {
329
- const evolver = new ConstraintEvolver(undefined, getConstraint);
330
-
331
- const proposal = {
332
- id: 'test-level',
333
- proposedAt: Date.now(),
334
- diagnosisId: 'diag-003',
335
- constraintId: 'test',
336
- type: 'change_level' as const,
337
- content: { current: 'iron_law', proposed: 'guideline', description: 'test' },
338
- reasoning: 'test',
339
- expectedOutcome: 'ok',
340
- risk: { level: 'low' as const, description: 'test' },
341
- implementation: { files: ['test.ts'], linesChanged: 5, testsRequired: true },
342
- status: 'proposed' as const,
343
- };
344
-
345
- const impl = evolver.implement(proposal);
346
- expect(impl.instructions.some(i => i.includes('层级'))).toBe(true);
347
- });
348
-
349
- it('modify_message 应该生成正确指令', async () => {
350
- const evolver = new ConstraintEvolver(undefined, getConstraint);
351
-
352
- const proposal = {
353
- id: 'test-msg',
354
- proposedAt: Date.now(),
355
- diagnosisId: 'diag-004',
356
- constraintId: 'test',
357
- type: 'modify_message' as const,
358
- content: { current: 'old msg', proposed: 'new msg', description: 'test' },
359
- reasoning: 'test',
360
- expectedOutcome: 'ok',
361
- risk: { level: 'low' as const, description: 'test' },
362
- implementation: { files: ['test.ts'], linesChanged: 5, testsRequired: true },
363
- status: 'proposed' as const,
364
- };
365
-
366
- const impl = evolver.implement(proposal);
367
- expect(impl.instructions.some(i => i.includes('修改'))).toBe(true);
368
- });
369
-
370
- it('new_constraint 应该生成正确指令', async () => {
371
- const evolver = new ConstraintEvolver(undefined, getConstraint);
372
-
373
- const proposal = {
374
- id: 'test-new',
375
- proposedAt: Date.now(),
376
- diagnosisId: 'diag-005',
377
- constraintId: 'test',
378
- type: 'new_constraint' as const,
379
- content: { proposed: { id: 'new_constraint', level: 'guideline', rule: 'test' }, description: 'test' },
380
- reasoning: 'test',
381
- expectedOutcome: 'ok',
382
- risk: { level: 'low' as const, description: 'test' },
383
- implementation: { files: ['test.ts'], linesChanged: 20, testsRequired: true },
384
- status: 'proposed' as const,
385
- };
386
-
387
- const impl = evolver.implement(proposal);
388
- expect(impl.filesToModify.length).toBeGreaterThan(1);
389
- });
390
- });
391
-
392
- describe('listProposals', () => {
393
- it('应该返回所有提案', () => {
394
- const evolver = new ConstraintEvolver(undefined, getConstraint);
395
- const proposals = evolver.listProposals();
396
- expect(Array.isArray(proposals)).toBe(true);
397
- });
398
-
399
- it('应该返回待审核提案', () => {
400
- const evolver = new ConstraintEvolver(undefined, getConstraint);
401
- const pending = evolver.listProposals('proposed');
402
- expect(Array.isArray(pending)).toBe(true);
403
- });
404
- });
405
- });