@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,319 +0,0 @@
1
- /**
2
- * autoEvolve 函数测试
3
- */
4
-
5
- import type { ExecutionTrace, TraceAnomaly } from '../../types/trace';
6
- import type { Diagnosis, ConstraintProposal, ProposalReviewResult } from '../../types/monitoring-types';
7
- import type { ExecutionResult } from '../../constraints/lifecycle-runner';
8
-
9
- jest.mock('../../monitoring/constraint-doctor', () => {
10
- const mockDiagnose = jest.fn();
11
- const mockSetData = jest.fn();
12
- const actual = jest.requireActual('../../monitoring/constraint-doctor');
13
-
14
- return {
15
- ...actual,
16
- ConstraintDoctor: jest.fn().mockImplementation(() => ({
17
- diagnose: mockDiagnose,
18
- setData: mockSetData,
19
- })),
20
- createDoctor: jest.fn(),
21
- get mockDiagnose() { return mockDiagnose; },
22
- get mockSetData() { return mockSetData; },
23
- };
24
- });
25
-
26
- jest.mock('../../monitoring/constraint-evolver', () => {
27
- const mockPropose = jest.fn();
28
- const mockReview = jest.fn();
29
- const actual = jest.requireActual('../../monitoring/constraint-evolver');
30
-
31
- return {
32
- ...actual,
33
- ConstraintEvolver: jest.fn().mockImplementation(() => ({
34
- propose: mockPropose,
35
- review: mockReview,
36
- })),
37
- createEvolver: jest.fn(),
38
- get mockPropose() { return mockPropose; },
39
- get mockReview() { return mockReview; },
40
- };
41
- });
42
-
43
- jest.mock('../../constraints/lifecycle-runner', () => {
44
- const mockExecute = jest.fn();
45
- const actual = jest.requireActual('../../constraints/lifecycle-runner');
46
-
47
- return {
48
- ...actual,
49
- ConstraintLifecycleRunner: jest.fn().mockImplementation(() => ({
50
- execute: mockExecute,
51
- })),
52
- get mockExecute() { return mockExecute; },
53
- };
54
- });
55
-
56
- function makeProposal(overrides: Record<string, unknown> = {}): ConstraintProposal {
57
- return {
58
- id: 'test-proposal',
59
- proposedAt: Date.now(),
60
- diagnosisId: 'test-diag',
61
- constraintId: 'test-constraint',
62
- type: 'add_exception',
63
- content: { proposed: 'test', description: 'Test' },
64
- reasoning: 'Test',
65
- expectedOutcome: 'ok',
66
- risk: { level: 'low', description: 'Low risk' },
67
- implementation: { files: [], linesChanged: 1, testsRequired: true },
68
- status: 'proposed',
69
- ...overrides,
70
- } as unknown as ConstraintProposal;
71
- }
72
-
73
- function makeDiagnosis(overrides: Record<string, unknown> = {}): Diagnosis {
74
- return {
75
- anomalyId: 'test-anomaly',
76
- constraintId: 'test-constraint',
77
- diagnosedAt: Date.now(),
78
- needsChange: true,
79
- rootCause: { primary: 'Test', evidence: [] },
80
- impact: { severity: 'low', scope: 'single_project', userImpact: 'Test' },
81
- recommendations: [{ type: 'add_exception', content: 'test', expectedOutcome: 'ok', implementationCost: 'low' }],
82
- urgency: 'low',
83
- ...overrides,
84
- } as unknown as Diagnosis;
85
- }
86
-
87
- describe('autoEvolve', () => {
88
- const mockDiagnose = (jest.requireMock('../../monitoring/constraint-doctor') as any).mockDiagnose;
89
- const mockPropose = (jest.requireMock('../../monitoring/constraint-evolver') as any).mockPropose;
90
- const mockReview = (jest.requireMock('../../monitoring/constraint-evolver') as any).mockReview;
91
- const mockExecute = (jest.requireMock('../../constraints/lifecycle-runner') as any).mockExecute;
92
-
93
- beforeEach(() => {
94
- jest.clearAllMocks();
95
- });
96
-
97
- it('无异常时应该返回空结果', async () => {
98
- const { autoEvolve } = await import('../auto-evolve');
99
-
100
- const result = await autoEvolve([], []);
101
-
102
- expect(result.diagnoses).toEqual([]);
103
- expect(result.proposals).toEqual([]);
104
- expect(result.autoApproved).toBe(0);
105
- expect(result.needsReview).toBe(0);
106
- expect(result.executions).toEqual([]);
107
- expect(mockDiagnose).not.toHaveBeenCalled();
108
- });
109
-
110
- it('异常不需要变更时应该跳过', async () => {
111
- const anomalies: TraceAnomaly[] = [{
112
- type: 'high_bypass_rate',
113
- constraintId: 'test-constraint',
114
- level: 'guideline',
115
- message: 'Test anomaly',
116
- data: { currentRate: 0.5, threshold: 0.3 },
117
- detectedAt: Date.now(),
118
- }];
119
-
120
- const traces: ExecutionTrace[] = [];
121
-
122
- mockDiagnose.mockResolvedValue(makeDiagnosis({ needsChange: false }));
123
-
124
- const { autoEvolve } = await import('../auto-evolve');
125
- const result = await autoEvolve(traces, anomalies);
126
-
127
- expect(result.diagnoses).toHaveLength(1);
128
- expect(result.proposals).toEqual([]);
129
- expect(mockPropose).not.toHaveBeenCalled();
130
- });
131
-
132
- it('提案为 null 时应该跳过', async () => {
133
- const anomalies: TraceAnomaly[] = [{
134
- type: 'high_bypass_rate',
135
- constraintId: 'test-constraint',
136
- level: 'guideline',
137
- message: 'Test',
138
- data: { currentRate: 0.5, threshold: 0.3 },
139
- detectedAt: Date.now(),
140
- }];
141
-
142
- mockDiagnose.mockResolvedValue(makeDiagnosis());
143
- mockPropose.mockResolvedValue(null);
144
-
145
- const { autoEvolve } = await import('../auto-evolve');
146
- const result = await autoEvolve([], anomalies);
147
-
148
- expect(result.proposals).toEqual([]);
149
- });
150
-
151
- it('低风险提案应自动批准并执行', async () => {
152
- const anomalies: TraceAnomaly[] = [{
153
- type: 'high_bypass_rate',
154
- constraintId: 'test-constraint',
155
- level: 'guideline',
156
- message: 'Test',
157
- data: { currentRate: 0.5, threshold: 0.3 },
158
- detectedAt: Date.now(),
159
- }];
160
-
161
- mockDiagnose.mockResolvedValue(makeDiagnosis());
162
- mockPropose.mockResolvedValue(makeProposal({ id: 'proposal-1' }));
163
- mockReview.mockReturnValue({ accepted: true, comment: 'Auto-approved' } as ProposalReviewResult);
164
- mockExecute.mockReturnValue({
165
- proposalId: 'proposal-1',
166
- constraintId: 'test-constraint',
167
- action: 'add_exception',
168
- success: true,
169
- details: 'Added exception',
170
- } as ExecutionResult);
171
-
172
- const { autoEvolve } = await import('../auto-evolve');
173
- const result = await autoEvolve([], anomalies, { autoApproveLowRisk: true });
174
-
175
- expect(result.autoApproved).toBe(1);
176
- expect(result.proposals).toHaveLength(1);
177
- expect(result.proposals[0].status).toBe('implemented');
178
- expect(result.executions).toHaveLength(1);
179
- expect(mockExecute).toHaveBeenCalled();
180
- });
181
-
182
- it('审核拒绝时应标记为 reviewing', async () => {
183
- const anomalies: TraceAnomaly[] = [{
184
- type: 'high_bypass_rate',
185
- constraintId: 'test-constraint',
186
- level: 'guideline',
187
- message: 'Test',
188
- data: { currentRate: 0.5, threshold: 0.3 },
189
- detectedAt: Date.now(),
190
- }];
191
-
192
- mockDiagnose.mockResolvedValue(makeDiagnosis());
193
- mockPropose.mockResolvedValue(makeProposal({ id: 'proposal-rejected', risk: { level: 'medium', description: 'Medium risk' } }));
194
- mockReview.mockReturnValue({ accepted: false, comment: 'Needs human review' } as ProposalReviewResult);
195
-
196
- const { autoEvolve } = await import('../auto-evolve');
197
- const result = await autoEvolve([], anomalies, { autoApproveLowRisk: true });
198
-
199
- expect(result.autoApproved).toBe(0);
200
- expect(result.needsReview).toBe(1);
201
- expect(result.proposals[0].status).toBe('reviewing');
202
- expect(mockExecute).not.toHaveBeenCalled();
203
- });
204
-
205
- it('执行失败时 status 应保持 accepted', async () => {
206
- const anomalies: TraceAnomaly[] = [{
207
- type: 'high_bypass_rate',
208
- constraintId: 'test-constraint',
209
- level: 'guideline',
210
- message: 'Test',
211
- data: { currentRate: 0.5, threshold: 0.3 },
212
- detectedAt: Date.now(),
213
- }];
214
-
215
- mockDiagnose.mockResolvedValue(makeDiagnosis());
216
- mockPropose.mockResolvedValue(makeProposal({ id: 'proposal-fail-exec' }));
217
- mockReview.mockReturnValue({ accepted: true, comment: 'Auto-approved' } as ProposalReviewResult);
218
- mockExecute.mockReturnValue({
219
- proposalId: 'proposal-fail-exec',
220
- constraintId: 'test-constraint',
221
- action: 'add_exception',
222
- success: false,
223
- details: 'Execution failed',
224
- } as ExecutionResult);
225
-
226
- const { autoEvolve } = await import('../auto-evolve');
227
- const result = await autoEvolve([], anomalies);
228
-
229
- expect(result.executions[0].success).toBe(false);
230
- expect(result.proposals[0].status).toBe('accepted');
231
- });
232
-
233
- it('审核返回 modifications 时应合并到内容', async () => {
234
- const anomalies: TraceAnomaly[] = [{
235
- type: 'high_bypass_rate',
236
- constraintId: 'test-constraint',
237
- level: 'guideline',
238
- message: 'Test',
239
- data: { currentRate: 0.5, threshold: 0.3 },
240
- detectedAt: Date.now(),
241
- }];
242
-
243
- mockDiagnose.mockResolvedValue(makeDiagnosis());
244
- mockPropose.mockResolvedValue(makeProposal({
245
- id: 'proposal-mod',
246
- content: { proposed: 'old_value', description: 'Test' },
247
- }));
248
- mockReview.mockReturnValue({
249
- accepted: false,
250
- comment: 'Needs moderation',
251
- modifications: { proposed: 'new_value' },
252
- } as unknown as ProposalReviewResult);
253
-
254
- const { autoEvolve } = await import('../auto-evolve');
255
- const result = await autoEvolve([], anomalies);
256
-
257
- expect(result.proposals[0].content.proposed).toBe('new_value');
258
- });
259
-
260
- it('autoApproveLowRisk=false 时全部进入 reviewing', async () => {
261
- const anomalies: TraceAnomaly[] = [{
262
- type: 'high_bypass_rate',
263
- constraintId: 'test-constraint',
264
- level: 'guideline',
265
- message: 'Test',
266
- data: { currentRate: 0.5, threshold: 0.3 },
267
- detectedAt: Date.now(),
268
- }];
269
-
270
- mockDiagnose.mockResolvedValue(makeDiagnosis());
271
- mockPropose.mockResolvedValue(makeProposal({ id: 'proposal-no-auto' }));
272
- mockReview.mockReturnValue({ accepted: true, comment: 'Auto-approved' } as ProposalReviewResult);
273
-
274
- const { autoEvolve } = await import('../auto-evolve');
275
- const result = await autoEvolve([], anomalies, { autoApproveLowRisk: false });
276
-
277
- expect(result.autoApproved).toBe(0);
278
- expect(result.needsReview).toBe(1);
279
- expect(mockExecute).not.toHaveBeenCalled();
280
- });
281
-
282
- it('多个异常应该都为 auto-evolve 流程', async () => {
283
- const anomalies: TraceAnomaly[] = [
284
- {
285
- type: 'high_bypass_rate',
286
- constraintId: 'constraint-1',
287
- level: 'guideline',
288
- message: 'Test 1',
289
- data: { currentRate: 0.5, threshold: 0.3 },
290
- detectedAt: Date.now(),
291
- },
292
- {
293
- type: 'low_pass_rate',
294
- constraintId: 'constraint-2',
295
- level: 'guideline',
296
- message: 'Test 2',
297
- data: { currentRate: 0.1, threshold: 0.5 },
298
- detectedAt: Date.now(),
299
- },
300
- ];
301
-
302
- mockDiagnose.mockResolvedValue(makeDiagnosis({ constraintId: 'constraint-1' }));
303
- mockPropose.mockResolvedValue(makeProposal({ id: 'multi-proposal', constraintId: 'constraint-1' }));
304
- mockReview.mockReturnValue({ accepted: true, comment: 'Auto-approved' } as ProposalReviewResult);
305
- mockExecute.mockReturnValue({
306
- proposalId: 'multi-proposal',
307
- constraintId: 'constraint-1',
308
- action: 'add_exception',
309
- success: true,
310
- details: 'Done',
311
- } as ExecutionResult);
312
-
313
- const { autoEvolve } = await import('../auto-evolve');
314
- const result = await autoEvolve([], anomalies);
315
-
316
- expect(result.diagnoses).toHaveLength(2);
317
- expect(result.proposals).toHaveLength(2);
318
- });
319
- });
@@ -1,98 +0,0 @@
1
- /**
2
- * 约束自动进化
3
- *
4
- * 纯计算:接收 traces + anomalies,返回进化结果。
5
- * 不读写文件,数据存储由调用方负责。
6
- */
7
-
8
- import type { ExecutionTrace, TraceAnomaly } from '../types/trace';
9
- import type { LLMAdapter } from '../llm/types';
10
- import { ConstraintDoctor } from '../monitoring/constraint-doctor';
11
- import { ConstraintEvolver } from '../monitoring/constraint-evolver';
12
- import { getConstraint } from '../core/constraints/definitions';
13
- import type { Diagnosis, ConstraintProposal } from '../types/monitoring-types';
14
- import { ConstraintLifecycleRunner } from '../constraints/lifecycle-runner';
15
- import type { ExecutionResult } from '../constraints/lifecycle-runner';
16
-
17
- export interface AutoEvolveOptions {
18
- /** 自动审核低风险提案(默认 true) */
19
- autoApproveLowRisk?: boolean;
20
- /** LLM adapter(用于深度诊断,可选) */
21
- llm?: LLMAdapter;
22
- }
23
-
24
- export interface AutoEvolveResult {
25
- /** 诊断结果 */
26
- diagnoses: Diagnosis[];
27
- /** 提案列表 */
28
- proposals: ConstraintProposal[];
29
- /** 自动审核通过数 */
30
- autoApproved: number;
31
- /** 需要人工审核数 */
32
- needsReview: number;
33
- /** 执行结果 */
34
- executions: ExecutionResult[];
35
- }
36
-
37
- /**
38
- * 自动进化:traces + anomalies → 诊断 → 提案 → 审核 → 执行
39
- *
40
- * 纯计算,不读写文件。调用方负责数据存储。
41
- */
42
- export async function autoEvolve(
43
- traces: ExecutionTrace[],
44
- anomalies: TraceAnomaly[],
45
- options?: AutoEvolveOptions,
46
- ): Promise<AutoEvolveResult> {
47
- const { autoApproveLowRisk = true, llm } = options ?? {};
48
-
49
- const doctor = new ConstraintDoctor({ enabled: !!llm }, llm);
50
- doctor.setData(traces);
51
-
52
- const evolver = new ConstraintEvolver(undefined, getConstraint);
53
- const runner = new ConstraintLifecycleRunner();
54
-
55
- const diagnoses: Diagnosis[] = [];
56
- const proposals: ConstraintProposal[] = [];
57
- const executions: ExecutionResult[] = [];
58
- let autoApproved = 0;
59
- let needsReview = 0;
60
-
61
- // 1. 诊断每个异常
62
- for (const anomaly of anomalies) {
63
- const diagnosis = await doctor.diagnose(anomaly);
64
- diagnoses.push(diagnosis);
65
-
66
- if (!diagnosis.needsChange) continue;
67
-
68
- // 2. 生成提案
69
- const proposal = await evolver.propose(diagnosis);
70
- if (!proposal) continue;
71
-
72
- // 3. 审核
73
- const review = evolver.review(proposal);
74
-
75
- if (review.accepted && autoApproveLowRisk) {
76
- proposal.status = 'accepted';
77
- autoApproved++;
78
-
79
- // 4. 执行
80
- const result = runner.execute(proposal);
81
- executions.push(result);
82
- if (result.success) {
83
- proposal.status = 'implemented';
84
- }
85
- } else {
86
- proposal.status = 'reviewing';
87
- needsReview++;
88
- if (review.modifications) {
89
- Object.assign(proposal.content, review.modifications);
90
- }
91
- }
92
-
93
- proposal.reviewComment = review.comment;
94
- proposals.push(proposal);
95
- }
96
-
97
- return { diagnoses, proposals, autoApproved, needsReview, executions };
98
- }
@@ -1 +0,0 @@
1
- export * from './auto-evolve';