@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,501 +0,0 @@
1
- /**
2
- * 约束提案流程
3
- *
4
- * 根据诊断结果提出约束修改建议
5
- *
6
- * 成本控制:
7
- * - 仅在诊断有结论时触发
8
- * - 精简 prompt
9
- * - ~3000 Token/次
10
- */
11
-
12
- import type {
13
- Diagnosis,
14
- ConstraintProposal,
15
- ProposalReviewResult,
16
- } from '../types/monitoring-types';
17
- import type { Constraint } from '../types/constraint';
18
-
19
- // 类型定义已归位 types 层(工单 14),此处再导出保持模块公开面不变
20
- export type { ConstraintProposal, ProposalReviewResult };
21
-
22
- /**
23
- * 约束查找函数(工单 15:约束集参数化,替代对 core/constraints/definitions 的值依赖)
24
- */
25
- export type ConstraintLookup = (constraintId: string) => Constraint | null | undefined;
26
-
27
- /**
28
- * Constraint Evolver - 约束进化器
29
- *
30
- * 使用方式:
31
- * ```typescript
32
- * const evolver = new ConstraintEvolver();
33
- * const proposal = await evolver.propose(diagnosis);
34
- *
35
- * // 审核
36
- * const review = evolver.review(proposal);
37
- *
38
- * // 如果接受,实施
39
- * if (review.accepted) {
40
- * evolver.implement(proposal);
41
- * }
42
- * ```
43
- */
44
- export class ConstraintEvolver {
45
- private proposalsDir: string;
46
- private constraintLookup: ConstraintLookup | undefined;
47
-
48
- constructor(proposalsDir?: string, constraintLookup?: ConstraintLookup) {
49
- this.proposalsDir = proposalsDir || '.harness/proposals';
50
- this.constraintLookup = constraintLookup;
51
- }
52
-
53
- /**
54
- * 根据诊断生成提案
55
- *
56
- * 如果诊断不需要变更,返回 null
57
- */
58
- async propose(diagnosis: Diagnosis): Promise<ConstraintProposal | null> {
59
- if (!diagnosis.needsChange) {
60
- return null;
61
- }
62
-
63
- // 找到最适合的建议
64
- const topRecommendation = diagnosis.recommendations[0];
65
- if (!topRecommendation) {
66
- return null;
67
- }
68
-
69
- // 生成提案
70
- const proposal: ConstraintProposal = {
71
- id: `proposal-${diagnosis.constraintId}-${Date.now()}`,
72
- proposedAt: Date.now(),
73
- diagnosisId: diagnosis.anomalyId,
74
- constraintId: diagnosis.constraintId,
75
- type: this.mapRecommendationType(topRecommendation.type),
76
- content: this.generateProposalContent(diagnosis, topRecommendation),
77
- reasoning: diagnosis.rootCause.primary,
78
- expectedOutcome: topRecommendation.expectedOutcome,
79
- risk: this.assessRisk(diagnosis, topRecommendation),
80
- implementation: this.estimateImplementation(diagnosis.constraintId),
81
- status: 'proposed',
82
- };
83
-
84
- return proposal;
85
- }
86
-
87
- /**
88
- * 批量生成提案
89
- */
90
- async proposeBatch(diagnoses: Diagnosis[]): Promise<ConstraintProposal[]> {
91
- const proposals = await Promise.all(diagnoses.map(d => this.propose(d)));
92
- return proposals.filter((p): p is ConstraintProposal => p !== null);
93
- }
94
-
95
- /**
96
- * 审核提案
97
- *
98
- * 基于规则的审核(不消耗 Token)
99
- */
100
- review(proposal: ConstraintProposal): ProposalReviewResult {
101
- // 检查约束层级影响
102
- const constraint = this.findConstraint(proposal.constraintId);
103
- const level = constraint?.level;
104
-
105
- // Iron Law 修改需要谨慎
106
- if (level === 'iron_law' && proposal.type !== 'add_exception') {
107
- return {
108
- accepted: false,
109
- comment: 'Iron Law 约束的修改需要人工审核,建议仅添加例外条件',
110
- modifications: {
111
- type: 'add_exception',
112
- },
113
- };
114
- }
115
-
116
- // 高风险提案需要人工审核
117
- if (proposal.risk.level === 'high') {
118
- return {
119
- accepted: false,
120
- comment: '高风险提案需要人工审核',
121
- };
122
- }
123
-
124
- // 检查提案合理性
125
- if (!proposal.content.proposed || !proposal.content.description) {
126
- return {
127
- accepted: false,
128
- comment: '提案内容不完整',
129
- };
130
- }
131
-
132
- // 低风险 + 合理内容 → 自动接受
133
- if (proposal.risk.level === 'low' && proposal.implementation.testsRequired) {
134
- return {
135
- accepted: true,
136
- comment: '低风险提案,建议实施后验证效果',
137
- };
138
- }
139
-
140
- // 中风险 → 需要审核
141
- return {
142
- accepted: false,
143
- comment: '中等风险提案,建议人工审核后再实施',
144
- };
145
- }
146
-
147
- /**
148
- * 实施提案(返回实施建议,不自动修改代码)
149
- */
150
- implement(proposal: ConstraintProposal): {
151
- instructions: string[];
152
- filesToModify: string[];
153
- testsToRun: string[];
154
- } {
155
- const instructions: string[] = [];
156
- const filesToModify: string[] = [];
157
- const testsToRun: string[] = [];
158
-
159
- // 根据提案类型生成实施指导
160
- switch (proposal.type) {
161
- case 'add_exception':
162
- instructions.push(`在约束 ${proposal.constraintId} 的 exceptions 数组中添加新例外条件`);
163
- instructions.push(`例外条件: ${proposal.content.proposed}`);
164
- filesToModify.push('src/core/constraints/definitions.ts');
165
- testsToRun.push('src/__tests__/iron-laws.test.ts');
166
- break;
167
-
168
- case 'remove_exception':
169
- instructions.push(`从约束 ${proposal.constraintId} 的 exceptions 数组中移除例外条件`);
170
- instructions.push(`移除: ${proposal.content.proposed}`);
171
- filesToModify.push('src/core/constraints/definitions.ts');
172
- testsToRun.push('src/__tests__/iron-laws.test.ts');
173
- break;
174
-
175
- case 'adjust_trigger':
176
- instructions.push(`调整约束 ${proposal.constraintId} 的 trigger 条件`);
177
- instructions.push(`当前: ${proposal.content.current}`);
178
- instructions.push(`建议: ${proposal.content.proposed}`);
179
- filesToModify.push('src/core/constraints/definitions.ts');
180
- testsToRun.push('src/__tests__/iron-laws.test.ts');
181
- break;
182
-
183
- case 'change_level':
184
- instructions.push(`更改约束 ${proposal.constraintId} 的层级`);
185
- instructions.push(`当前: ${proposal.content.current}`);
186
- instructions.push(`建议: ${proposal.content.proposed}`);
187
- instructions.push(`注意:这会改变约束的强制程度`);
188
- filesToModify.push('src/core/constraints/definitions.ts');
189
- testsToRun.push('src/__tests__/iron-laws.test.ts');
190
- break;
191
-
192
- case 'modify_message':
193
- instructions.push(`修改约束 ${proposal.constraintId} 的提示消息`);
194
- filesToModify.push('src/core/constraints/definitions.ts');
195
- break;
196
-
197
- case 'new_constraint':
198
- instructions.push(`创建新约束 ${proposal.content.proposed.id}`);
199
- instructions.push(`层级: ${proposal.content.proposed.level}`);
200
- instructions.push(`规则: ${proposal.content.proposed.rule}`);
201
- filesToModify.push('src/core/constraints/definitions.ts');
202
- filesToModify.push('src/types/constraint.ts');
203
- testsToRun.push('src/__tests__/iron-laws.test.ts');
204
- break;
205
- }
206
-
207
- // 添加通用步骤
208
- instructions.push('运行测试验证变更');
209
- instructions.push('更新文档说明变更内容');
210
-
211
- return {
212
- instructions,
213
- filesToModify,
214
- testsToRun,
215
- };
216
- }
217
-
218
- /**
219
- * 保存提案
220
- */
221
- saveProposal(proposal: ConstraintProposal): void {
222
- const fs = require('fs');
223
- const path = require('path');
224
-
225
- const proposalFile = path.join(this.proposalsDir, `${proposal.id}.json`);
226
-
227
- // 确保目录存在
228
- if (!fs.existsSync(this.proposalsDir)) {
229
- fs.mkdirSync(this.proposalsDir, { recursive: true });
230
- }
231
-
232
- // 保存提案
233
- fs.writeFileSync(proposalFile, JSON.stringify(proposal, null, 2), 'utf-8');
234
-
235
- // 保存人类可读版本
236
- const mdFile = path.join(this.proposalsDir, `${proposal.id}.md`);
237
- fs.writeFileSync(mdFile, this.generateProposalMarkdown(proposal), 'utf-8');
238
- }
239
-
240
- /**
241
- * 加载提案
242
- */
243
- loadProposal(proposalId: string): ConstraintProposal {
244
- const fs = require('fs');
245
- const path = require('path');
246
-
247
- const proposalFile = path.join(this.proposalsDir, `${proposalId}.json`);
248
- const content = fs.readFileSync(proposalFile, 'utf-8');
249
-
250
- return JSON.parse(content) as ConstraintProposal;
251
- }
252
-
253
- /**
254
- * 列出所有提案
255
- */
256
- listProposals(status?: ConstraintProposal['status']): ConstraintProposal[] {
257
- const fs = require('fs');
258
- const path = require('path');
259
-
260
- if (!fs.existsSync(this.proposalsDir)) {
261
- return [];
262
- }
263
-
264
- const files = fs.readdirSync(this.proposalsDir)
265
- .filter((f: string) => f.endsWith('.json'));
266
-
267
- const proposals = files.map((f: string) => {
268
- const content = fs.readFileSync(path.join(this.proposalsDir, f), 'utf-8');
269
- return JSON.parse(content) as ConstraintProposal;
270
- });
271
-
272
- if (status) {
273
- return proposals.filter((p: ConstraintProposal) => p.status === status);
274
- }
275
-
276
- return proposals;
277
- }
278
-
279
- /**
280
- * 更新提案状态
281
- */
282
- updateProposalStatus(
283
- proposalId: string,
284
- status: ConstraintProposal['status'],
285
- reviewComment?: string
286
- ): void {
287
- const proposal = this.loadProposal(proposalId);
288
- proposal.status = status;
289
- if (reviewComment) {
290
- proposal.reviewComment = reviewComment;
291
- }
292
- this.saveProposal(proposal);
293
- }
294
-
295
- // ========================================
296
- // 私有方法
297
- // ========================================
298
-
299
- /**
300
- * 映射建议类型到提案类型
301
- */
302
- private mapRecommendationType(type: string): ConstraintProposal['type'] {
303
- const map: Record<string, ConstraintProposal['type']> = {
304
- 'add_exception': 'add_exception',
305
- 'adjust_threshold': 'adjust_trigger',
306
- 'modify_constraint': 'modify_message',
307
- 'user_training': 'modify_message', // 用户培训不需要修改约束
308
- };
309
- return map[type] || 'modify_message';
310
- }
311
-
312
- /**
313
- * 生成提案内容
314
- */
315
- private generateProposalContent(
316
- diagnosis: Diagnosis,
317
- recommendation: Diagnosis['recommendations'][0]
318
- ): ConstraintProposal['content'] {
319
- const constraint = this.findConstraint(diagnosis.constraintId);
320
-
321
- switch (recommendation.type) {
322
- case 'add_exception':
323
- return {
324
- current: constraint?.exceptions || [],
325
- proposed: this.suggestException(diagnosis),
326
- description: `为约束 ${diagnosis.constraintId} 添加新例外条件`,
327
- };
328
-
329
- case 'adjust_threshold':
330
- return {
331
- current: constraint?.trigger,
332
- proposed: this.suggestTrigger(diagnosis),
333
- description: `调整约束 ${diagnosis.constraintId} 的触发条件`,
334
- };
335
-
336
- case 'modify_constraint':
337
- return {
338
- current: constraint?.message,
339
- proposed: this.suggestMessage(diagnosis),
340
- description: `修改约束 ${diagnosis.constraintId} 的提示消息`,
341
- };
342
-
343
- default:
344
- return {
345
- proposed: recommendation.content,
346
- description: recommendation.content,
347
- };
348
- }
349
- }
350
-
351
- /**
352
- * 建议例外条件
353
- */
354
- private suggestException(diagnosis: Diagnosis): string {
355
- // 根据诊断生成例外建议
356
- const constraintId = diagnosis.constraintId;
357
-
358
- // 基于约束类型的预设例外
359
- const presetExceptions: Record<string, string[]> = {
360
- 'no_fix_without_root_cause': ['simple_typo', 'config_error', 'missing_config'],
361
- 'no_code_without_test': ['config_file', 'type_definition', 'simple_accessor'],
362
- 'simplest_solution_first': ['scalability_required', 'security_required', 'performance_required'],
363
- };
364
-
365
- const presets = presetExceptions[constraintId] || [];
366
- if (presets.length > 0) {
367
- return presets[0]; // 返回第一个预设例外
368
- }
369
-
370
- // 通用例外建议
371
- return `custom_exception_for_${constraintId}`;
372
- }
373
-
374
- /**
375
- * 建议触发条件
376
- */
377
- private suggestTrigger(diagnosis: Diagnosis): string {
378
- // 根据约束类型建议更精确的触发条件
379
- return `specific_trigger_for_${diagnosis.constraintId}`;
380
- }
381
-
382
- /**
383
- * 建议提示消息
384
- */
385
- private suggestMessage(diagnosis: Diagnosis): string {
386
- // 根据诊断生成更清晰的提示消息
387
- return `${diagnosis.rootCause.primary} - 建议检查约束定义`;
388
- }
389
-
390
- /**
391
- * 风险评估
392
- */
393
- private assessRisk(
394
- diagnosis: Diagnosis,
395
- recommendation: Diagnosis['recommendations'][0]
396
- ): ConstraintProposal['risk'] {
397
- // 根据影响程度和实施成本评估风险
398
- const severity = diagnosis.impact.severity;
399
- const cost = recommendation.implementationCost;
400
-
401
- if (severity === 'high' && cost === 'high') {
402
- return {
403
- level: 'high',
404
- description: '高影响 + 高成本,需要谨慎评估',
405
- rollbackPlan: '保留原约束定义,通过配置切换',
406
- };
407
- }
408
-
409
- if (severity === 'high' || cost === 'high') {
410
- return {
411
- level: 'medium',
412
- description: '影响较大或成本较高',
413
- rollbackPlan: '记录原值,必要时回滚',
414
- };
415
- }
416
-
417
- return {
418
- level: 'low',
419
- description: '低风险变更',
420
- };
421
- }
422
-
423
- /**
424
- * 估算实施信息
425
- */
426
- private estimateImplementation(_constraintId: string): ConstraintProposal['implementation'] {
427
- return {
428
- files: ['src/core/constraints/definitions.ts'],
429
- linesChanged: 10, // 通常只需修改几行
430
- testsRequired: true,
431
- };
432
- }
433
-
434
- /**
435
- * 查找约束定义(经注入的 lookup;未注入时返回 null)
436
- */
437
- private findConstraint(constraintId: string): Constraint | null {
438
- return this.constraintLookup?.(constraintId) ?? null;
439
- }
440
-
441
- /**
442
- * 生成提案 Markdown
443
- */
444
- private generateProposalMarkdown(proposal: ConstraintProposal): string {
445
- const lines: string[] = [];
446
-
447
- lines.push(`# Constraint Proposal: ${proposal.id}`);
448
- lines.push('');
449
- lines.push(`- **Constraint**: ${proposal.constraintId}`);
450
- lines.push(`- **Type**: ${proposal.type}`);
451
- lines.push(`- **Status**: ${proposal.status}`);
452
- lines.push(`- **Proposed**: ${new Date(proposal.proposedAt).toISOString()}`);
453
- lines.push('');
454
-
455
- lines.push(`## Content`);
456
- lines.push('');
457
- lines.push(`**Description**: ${proposal.content.description}`);
458
- if (proposal.content.current) {
459
- lines.push(`**Current**: ${JSON.stringify(proposal.content.current)}`);
460
- }
461
- lines.push(`**Proposed**: ${JSON.stringify(proposal.content.proposed)}`);
462
- lines.push('');
463
-
464
- lines.push(`## Reasoning`);
465
- lines.push('');
466
- lines.push(proposal.reasoning);
467
- lines.push('');
468
-
469
- lines.push(`## Expected Outcome`);
470
- lines.push('');
471
- lines.push(proposal.expectedOutcome);
472
- lines.push('');
473
-
474
- lines.push(`## Risk Assessment`);
475
- lines.push('');
476
- lines.push(`- **Level**: ${proposal.risk.level}`);
477
- lines.push(`- **Description**: ${proposal.risk.description}`);
478
- if (proposal.risk.rollbackPlan) {
479
- lines.push(`- **Rollback**: ${proposal.risk.rollbackPlan}`);
480
- }
481
- lines.push('');
482
-
483
- lines.push(`## Implementation`);
484
- lines.push('');
485
- lines.push(`- **Files**: ${proposal.implementation.files.join(', ')}`);
486
- lines.push(`- **Lines Changed**: ~${proposal.implementation.linesChanged}`);
487
- lines.push(`- **Tests Required**: ${proposal.implementation.testsRequired ? 'Yes' : 'No'}`);
488
-
489
- return lines.join('\n');
490
- }
491
- }
492
-
493
- /**
494
- * 创建进化器
495
- */
496
- export function createEvolver(
497
- proposalsDir?: string,
498
- constraintLookup?: ConstraintLookup
499
- ): ConstraintEvolver {
500
- return new ConstraintEvolver(proposalsDir, constraintLookup);
501
- }