@chongyan/autospec 1.0.1 → 1.0.2

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 (283) hide show
  1. package/LICENSE +21 -21
  2. package/README.en.md +447 -321
  3. package/README.md +418 -286
  4. package/knowledge/01-principles/00-principles-hierarchy.md +247 -0
  5. package/knowledge/01-principles/01-first-principles.md +241 -0
  6. package/knowledge/01-principles/02-strategic-principles.md +286 -0
  7. package/knowledge/01-principles/03-tactical-principles.md +385 -0
  8. package/knowledge/01-principles/04-operational-principles.md +275 -0
  9. package/knowledge/01-principles/05-domain-principles.md +539 -0
  10. package/knowledge/01-principles/06-methodology-principles.md +281 -0
  11. package/knowledge/01-principles/07-cognitive-principles.md +277 -0
  12. package/knowledge/01-principles/08-auto-fix-principles.md +320 -0
  13. package/knowledge/01-principles/09-constitution.md +220 -0
  14. package/knowledge/{principles/evolution.md → 01-principles/10-evolution-mechanism.md} +160 -14
  15. package/knowledge/01-principles/README.en.md +385 -0
  16. package/knowledge/01-principles/README.md +385 -0
  17. package/knowledge/{process/overview.md → 02-process/00-overview.md} +90 -5
  18. package/knowledge/02-process/README.en.md +143 -0
  19. package/knowledge/02-process/README.md +186 -0
  20. package/knowledge/{guides/support/pipeline-protocol.md → 03-guides/00-pipeline-protocol.md} +10 -10
  21. package/knowledge/{guides/support/team-orchestrator.md → 03-guides/01-team-orchestrator.md} +53 -8
  22. package/knowledge/{guides/stages/requirement-analyzer.md → 03-guides/02-analyze-requirement.md} +3 -3
  23. package/knowledge/{guides/stages/ai-effect-evaluator.md → 03-guides/08-evaluate-ai-effect.md} +14 -7
  24. package/knowledge/{guides/support/skill-distiller.md → 03-guides/19-distill-skill.md} +3 -3
  25. package/knowledge/{guides/support/skill-updater.md → 03-guides/20-update-skill.md} +1 -1
  26. package/knowledge/{guides/support/methodology-extractor.md → 03-guides/22-extract-methodology.md} +2 -2
  27. package/knowledge/{guides/support/complexity-assessor.md → 03-guides/24-assess-complexity.md} +6 -4
  28. package/knowledge/{guides/support/tech-stack-analyzer.md → 03-guides/26-analyze-tech-stack.md} +1 -1
  29. package/knowledge/{guides/domain-driven-design.md → 03-guides/42-apply-ddd.md} +1 -1
  30. package/knowledge/{process/ai-sdlc.md → 03-guides/43-run-ai-sdlc.md} +1 -1
  31. package/knowledge/{guides/knowledge-management.md → 03-guides/44-manage-knowledge.md} +4 -4
  32. package/knowledge/03-guides/README.en.md +212 -0
  33. package/knowledge/03-guides/README.md +212 -0
  34. package/knowledge/{checklists/requirement.md → 04-checklists/00-requirement.md} +1 -1
  35. package/knowledge/{checklists/design.md → 04-checklists/01-design.md} +1 -1
  36. package/knowledge/{checklists/code.md → 04-checklists/02-code.md} +16 -1
  37. package/knowledge/{checklists/release.md → 04-checklists/04-release.md} +1 -1
  38. package/knowledge/04-checklists/README.en.md +119 -0
  39. package/knowledge/04-checklists/README.md +123 -0
  40. package/knowledge/{config/validation-patterns.yaml → 05-config/00-validation-patterns.yaml} +1 -1
  41. package/knowledge/{config/team-tasks.yaml → 05-config/02-team-tasks.yaml} +2 -2
  42. package/knowledge/05-config/03-role-composition.yaml +346 -0
  43. package/knowledge/{config/skill-compositions.yaml → 05-config/05-skill-compositions.yaml} +24 -24
  44. package/knowledge/05-config/README.en.md +54 -0
  45. package/knowledge/05-config/README.md +132 -0
  46. package/knowledge/06-environment/00-template-registry.md +310 -0
  47. package/knowledge/06-environment/01-detection-patterns.yaml +1692 -0
  48. package/knowledge/{environment → 06-environment}/README.en.md +4 -0
  49. package/knowledge/{environment → 06-environment}/README.md +66 -25
  50. package/knowledge/{standards/coding-style.md → 07-standards/00-coding-style.md} +123 -4
  51. package/knowledge/{standards/code-review.md → 07-standards/01-code-review.md} +3 -3
  52. package/knowledge/{standards/data-consistency.md → 07-standards/02-data-consistency.md} +1 -1
  53. package/knowledge/{standards/document-versioning.md → 07-standards/03-document-versioning.md} +1 -1
  54. package/knowledge/{standards/risk-detection.md → 07-standards/04-risk-detection.md} +5 -5
  55. package/knowledge/07-standards/README.en.md +119 -0
  56. package/knowledge/07-standards/README.md +123 -0
  57. package/knowledge/08-organization/00-vision-mission.md +113 -0
  58. package/knowledge/{organization/ai-native-team.md → 08-organization/01-ai-native-culture.md} +1 -1
  59. package/knowledge/{organization/team-metrics.md → 08-organization/02-team-metrics.md} +1 -1
  60. package/knowledge/08-organization/03-committee-structure.md +54 -0
  61. package/knowledge/08-organization/04-governance-metrics.md +55 -0
  62. package/knowledge/08-organization/05-improvement-process.md +71 -0
  63. package/knowledge/08-organization/README.en.md +165 -0
  64. package/knowledge/08-organization/README.md +165 -0
  65. package/knowledge/09-templates/00-requirement-proposal.md +344 -0
  66. package/knowledge/09-templates/01-architecture-design.md +494 -0
  67. package/knowledge/09-templates/02-api-design.md +408 -0
  68. package/knowledge/09-templates/03-database-design.md +313 -0
  69. package/knowledge/09-templates/04-product-design.md +237 -0
  70. package/knowledge/09-templates/05-domain-business.md +388 -0
  71. package/knowledge/09-templates/06-test-design.md +268 -0
  72. package/knowledge/09-templates/07-evaluation-design.md +372 -0
  73. package/knowledge/09-templates/08-component-knowledge.md +272 -0
  74. package/knowledge/09-templates/09-best-practices.md +218 -0
  75. package/knowledge/{environment/middleware-knowledge.md → 09-templates/10-middleware-knowledge.md} +106 -1
  76. package/knowledge/09-templates/README.en.md +222 -0
  77. package/knowledge/09-templates/README.md +216 -0
  78. package/knowledge/README.en.md +372 -0
  79. package/knowledge/README.md +354 -99
  80. package/package.json +1 -1
  81. package/plugins/.claude-plugin/plugin.json +460 -81
  82. package/plugins/agents/roles/ceo.md +1 -1
  83. package/plugins/agents/roles/product-owner.md +1 -1
  84. package/plugins/agents/roles/tech-lead.md +1 -1
  85. package/plugins/agents/support/consistency-checker.md +36 -3
  86. package/plugins/agents/support/monitoring-agent.md +215 -0
  87. package/plugins/agents/support/safety-auditor.md +2 -2
  88. package/plugins/agents/support/stage-gate-evaluator.md +95 -11
  89. package/plugins/agents/support/test-coverage-reviewer.md +1 -1
  90. package/plugins/benchmarks/templates/README.md +165 -13
  91. package/plugins/benchmarks/templates/commands/apply-template.yaml +108 -0
  92. package/plugins/benchmarks/templates/commands/archive-template.yaml +65 -0
  93. package/plugins/benchmarks/templates/commands/env-export-template.yaml +64 -0
  94. package/plugins/benchmarks/templates/commands/env-sync-template.yaml +104 -0
  95. package/plugins/benchmarks/templates/commands/env-template-template.yaml +96 -0
  96. package/plugins/benchmarks/templates/commands/env-template.yaml +58 -0
  97. package/plugins/benchmarks/templates/commands/env-update-template.yaml +110 -0
  98. package/plugins/benchmarks/templates/commands/env-validate-template.yaml +95 -0
  99. package/plugins/benchmarks/templates/commands/field-evolve-template.yaml +104 -0
  100. package/plugins/benchmarks/templates/commands/project-evolve-template.yaml +104 -0
  101. package/plugins/benchmarks/templates/commands/propose-template.yaml +88 -0
  102. package/plugins/benchmarks/templates/commands/review-template.yaml +124 -0
  103. package/plugins/benchmarks/templates/commands/run-template.yaml +127 -0
  104. package/plugins/benchmarks/templates/commands/test-template.yaml +149 -0
  105. package/plugins/benchmarks/templates/pipeline/experiment-template.yaml +92 -0
  106. package/plugins/benchmarks/templates/pipeline/hotfix-template.yaml +81 -0
  107. package/plugins/benchmarks/templates/skills/agile-iteration-template.yaml +78 -0
  108. package/plugins/benchmarks/templates/skills/benchmark-executor-template.yaml +114 -0
  109. package/plugins/benchmarks/templates/skills/benchmark-generator-template.yaml +52 -0
  110. package/plugins/benchmarks/templates/skills/delivery-stage-template.yaml +130 -0
  111. package/plugins/benchmarks/templates/skills/design-stage-template.yaml +131 -0
  112. package/plugins/benchmarks/templates/skills/experiment-iteration-template.yaml +60 -0
  113. package/plugins/benchmarks/templates/skills/exploration-phase-template.yaml +114 -0
  114. package/plugins/benchmarks/templates/skills/field-evolve-analyzer-template.yaml +51 -0
  115. package/plugins/benchmarks/templates/skills/field-evolve-distiller-template.yaml +34 -0
  116. package/plugins/benchmarks/templates/skills/field-evolve-executor-template.yaml +50 -0
  117. package/plugins/benchmarks/templates/skills/field-evolve-fixer-template.yaml +52 -0
  118. package/plugins/benchmarks/templates/skills/field-evolve-learner-template.yaml +33 -0
  119. package/plugins/benchmarks/templates/skills/field-evolve-scanner-template.yaml +74 -0
  120. package/plugins/benchmarks/templates/skills/field-evolve-template.yaml +71 -0
  121. package/plugins/benchmarks/templates/skills/field-evolve-verifier-template.yaml +51 -0
  122. package/plugins/benchmarks/templates/skills/hotfix-iteration-template.yaml +54 -0
  123. package/plugins/benchmarks/templates/skills/implementation-stage-template.yaml +127 -0
  124. package/plugins/benchmarks/templates/skills/layer1-validation-template.yaml +121 -0
  125. package/plugins/benchmarks/templates/skills/project-evolve-analyzer-template.yaml +51 -0
  126. package/plugins/benchmarks/templates/skills/project-evolve-fixer-template.yaml +52 -0
  127. package/plugins/benchmarks/templates/skills/project-evolve-generator-template.yaml +34 -0
  128. package/plugins/benchmarks/templates/skills/project-evolve-learner-template.yaml +50 -0
  129. package/plugins/benchmarks/templates/skills/project-evolve-reviewer-template.yaml +50 -0
  130. package/plugins/benchmarks/templates/skills/project-evolve-scanner-template.yaml +75 -0
  131. package/plugins/benchmarks/templates/skills/project-evolve-template.yaml +72 -0
  132. package/plugins/benchmarks/templates/skills/project-evolve-verifier-template.yaml +51 -0
  133. package/plugins/benchmarks/templates/skills/skill-forge-template.yaml +117 -0
  134. package/plugins/benchmarks/templates/skills/startup-guard-template.yaml +103 -0
  135. package/plugins/benchmarks/templates/skills/testing-stage-template.yaml +146 -0
  136. package/plugins/benchmarks/templates/skills/waterfall-iteration-template.yaml +55 -0
  137. package/plugins/commands/README.en.md +2 -2
  138. package/plugins/commands/README.md +2 -2
  139. package/plugins/commands/apply.md +102 -16
  140. package/plugins/commands/archive.md +60 -4
  141. package/plugins/commands/env-sync.md +1047 -406
  142. package/plugins/commands/env-template.md +11 -135
  143. package/plugins/commands/env-update.md +1 -1
  144. package/plugins/commands/env-validate.md +3 -3
  145. package/plugins/commands/explore.md +118 -1
  146. package/plugins/commands/field-evolve.md +51 -175
  147. package/plugins/commands/project-evolve.md +167 -68
  148. package/plugins/commands/propose.md +97 -6
  149. package/plugins/commands/review.md +5 -5
  150. package/plugins/commands/run.md +841 -13
  151. package/plugins/commands/status.md +138 -17
  152. package/plugins/commands/test.md +389 -0
  153. package/plugins/hooks/constitution-guard.js +1 -1
  154. package/plugins/hooks/environment-autocommit.js +366 -24
  155. package/plugins/hooks/environment-manager.js +3 -2
  156. package/plugins/hooks/execution-tracker.js +109 -4
  157. package/plugins/hooks/layer1-validator.js +117 -1
  158. package/plugins/hooks/lib/auto-fix-loop.js +605 -0
  159. package/plugins/hooks/lib/environment-config-loader.js +11 -7
  160. package/plugins/hooks/lib/hook-state-manager.js +98 -0
  161. package/plugins/hooks/lib/memory-extractor.js +27 -5
  162. package/plugins/hooks/lib/memory-manager.js +1 -1
  163. package/plugins/hooks/lib/test-auto-fix.test.js +194 -0
  164. package/plugins/hooks/monitoring-trigger.js +467 -0
  165. package/plugins/skills/README.en.md +15 -3
  166. package/plugins/skills/README.md +21 -11
  167. package/plugins/skills/agile-iteration/SKILL.md +187 -0
  168. package/plugins/skills/delivery-stage/SKILL.md +133 -12
  169. package/plugins/skills/design-stage/SKILL.md +103 -12
  170. package/plugins/skills/experiment-evaluator/SKILL.md +271 -0
  171. package/plugins/skills/experiment-iteration/SKILL.md +154 -0
  172. package/plugins/skills/exploration-phase/SKILL.md +93 -10
  173. package/plugins/skills/field-evolve-analyzer/SKILL.md +65 -0
  174. package/plugins/skills/field-evolve-distiller/SKILL.md +66 -0
  175. package/plugins/skills/field-evolve-executor/SKILL.md +94 -0
  176. package/plugins/skills/field-evolve-executor/executor.js +342 -0
  177. package/plugins/skills/field-evolve-fixer/SKILL.md +69 -0
  178. package/plugins/skills/field-evolve-learner/SKILL.md +65 -0
  179. package/plugins/skills/field-evolve-scanner/SKILL.md +87 -0
  180. package/plugins/skills/field-evolve-scanner/scripts/fallback-scanner.js +288 -0
  181. package/plugins/skills/field-evolve-verifier/SKILL.md +64 -0
  182. package/plugins/skills/hotfix-iteration/SKILL.md +279 -0
  183. package/plugins/skills/implementation-stage/SKILL.md +156 -15
  184. package/plugins/skills/layer1-validation/SKILL.md +1 -1
  185. package/plugins/skills/pending-dashboard/SKILL.md +9 -8
  186. package/plugins/skills/project-evolve-analyzer/SKILL.md +95 -0
  187. package/plugins/skills/project-evolve-fixer/SKILL.md +99 -0
  188. package/plugins/skills/project-evolve-generator/SKILL.md +149 -0
  189. package/plugins/skills/project-evolve-learner/SKILL.md +103 -0
  190. package/plugins/skills/project-evolve-reviewer/SKILL.md +104 -0
  191. package/plugins/skills/project-evolve-scanner/SKILL.md +95 -0
  192. package/plugins/skills/project-evolve-scanner/scripts/dependency-reuse-checker.js +395 -0
  193. package/plugins/skills/project-evolve-scanner/scripts/subsystem-coverage.js +315 -0
  194. package/plugins/skills/project-evolve-verifier/SKILL.md +105 -0
  195. package/plugins/skills/requirement-stage/SKILL.md +47 -13
  196. package/plugins/skills/skill-forge/SKILL.md +2 -2
  197. package/plugins/skills/testing-stage/SKILL.md +583 -8
  198. package/plugins/skills/waterfall-iteration/SKILL.md +115 -0
  199. package/scripts/cli/index.js +1 -1
  200. package/scripts/cli/init.js +30 -4
  201. package/scripts/cli/list.js +3 -2
  202. package/scripts/config/commands.config.js +8 -8
  203. package/scripts/config/hooks.config.js +1 -1
  204. package/scripts/install/constants.js +204 -165
  205. package/scripts/state.js +210 -1
  206. package/knowledge/config/README.en.md +0 -44
  207. package/knowledge/config/README.md +0 -44
  208. package/knowledge/config/role-composition.yaml +0 -98
  209. package/knowledge/config/team-triggers.yaml +0 -198
  210. package/knowledge/domain/README.md +0 -115
  211. package/knowledge/domain/flows/README.md +0 -194
  212. package/knowledge/domain/glossary.md +0 -143
  213. package/knowledge/domain/rules.md +0 -138
  214. package/knowledge/environment/component-knowledge.md +0 -316
  215. package/knowledge/environment/detection-patterns.yaml +0 -502
  216. package/knowledge/environment/template-registry.md +0 -321
  217. package/knowledge/guides/requirement-engineering.md +0 -329
  218. package/knowledge/guides/system-design.md +0 -352
  219. package/knowledge/principles/constitution.md +0 -134
  220. package/knowledge/principles/core-principles.md +0 -368
  221. package/knowledge/principles/design-philosophy.md +0 -877
  222. package/knowledge/process/README.en.md +0 -38
  223. package/knowledge/process/README.md +0 -48
  224. package/knowledge/templates/ai-evaluation.md +0 -150
  225. package/knowledge/templates/api-design.md +0 -117
  226. package/knowledge/templates/database-design.md +0 -132
  227. package/knowledge/templates/domain-driven-design.md +0 -321
  228. package/knowledge/templates/product-proposal.md +0 -201
  229. package/knowledge/templates/system-design.md +0 -227
  230. package/knowledge/templates/task-breakdown.md +0 -107
  231. package/knowledge/templates/test-case.md +0 -170
  232. package/plugins/commands/validate.md +0 -108
  233. package/plugins/skills/benchmark-executor/README.md +0 -93
  234. package/plugins/skills/evolution-process/SKILL.md +0 -291
  235. package/plugins/skills/project-evolution/SKILL.md +0 -847
  236. package/scripts/evolution/evolution-router.js +0 -273
  237. package/scripts/evolution/evolution-signal-collector.js +0 -307
  238. package/scripts/evolution/knowledge-loader.js +0 -346
  239. package/scripts/evolution/marketplace.js +0 -317
  240. package/scripts/evolution/version-manager.js +0 -371
  241. /package/knowledge/{process → 02-process}/01-requirement.md +0 -0
  242. /package/knowledge/{process → 02-process}/02-design.md +0 -0
  243. /package/knowledge/{process → 02-process}/03-implementation.md +0 -0
  244. /package/knowledge/{process → 02-process}/04-review.md +0 -0
  245. /package/knowledge/{process → 02-process}/05-testing.md +0 -0
  246. /package/knowledge/{process → 02-process}/06-delivery.md +0 -0
  247. /package/knowledge/{guides/stages/design-planner.md → 03-guides/03-design-solution.md} +0 -0
  248. /package/knowledge/{guides/stages/code-implementer.md → 03-guides/04-implement-code.md} +0 -0
  249. /package/knowledge/{guides/stages/test-planner.md → 03-guides/05-plan-testing.md} +0 -0
  250. /package/knowledge/{guides/stages/test-generator.md → 03-guides/06-generate-tests.md} +0 -0
  251. /package/knowledge/{guides/stages/release-checker.md → 03-guides/07-check-release.md} +0 -0
  252. /package/knowledge/{guides/stages/requirement-reviewer.md → 03-guides/09-review-requirement.md} +0 -0
  253. /package/knowledge/{guides/stages/design-reviewer.md → 03-guides/10-review-design.md} +0 -0
  254. /package/knowledge/{guides/stages/code-reviewer.md → 03-guides/11-review-code.md} +0 -0
  255. /package/knowledge/{guides/stages/test-reviewer.md → 03-guides/12-review-testing.md} +0 -0
  256. /package/knowledge/{guides/stages/security-reviewer.md → 03-guides/13-audit-security.md} +0 -0
  257. /package/knowledge/{guides/stages/consistency-checker.md → 03-guides/14-check-consistency.md} +0 -0
  258. /package/knowledge/{guides/stages/unit-test-runner.md → 03-guides/15-run-unit-tests.md} +0 -0
  259. /package/knowledge/{guides/stages/integration-test-runner.md → 03-guides/16-run-integration-tests.md} +0 -0
  260. /package/knowledge/{guides/stages/test-context-analyzer.md → 03-guides/17-analyze-test-context.md} +0 -0
  261. /package/knowledge/{guides/support/practice-logger.md → 03-guides/18-log-practice.md} +0 -0
  262. /package/knowledge/{guides/support/skill-validator.md → 03-guides/21-validate-skill.md} +0 -0
  263. /package/knowledge/{guides/support/scope-inference.md → 03-guides/23-infer-scope.md} +0 -0
  264. /package/knowledge/{guides/support/component-discovery.md → 03-guides/25-discover-component.md} +0 -0
  265. /package/knowledge/{guides/support/environment-scanner.md → 03-guides/27-scan-environment.md} +0 -0
  266. /package/knowledge/{guides/support/environment-validator.md → 03-guides/28-validate-environment.md} +0 -0
  267. /package/knowledge/{guides/support/knowledge-generator.md → 03-guides/29-generate-knowledge.md} +0 -0
  268. /package/knowledge/{guides/support/ai-capability-analyzer.md → 03-guides/30-analyze-ai-capability.md} +0 -0
  269. /package/knowledge/{guides/support/ai-component-analyzer.md → 03-guides/31-analyze-ai-component.md} +0 -0
  270. /package/knowledge/{guides/support/ai-agent-analyzer.md → 03-guides/32-analyze-ai-agent.md} +0 -0
  271. /package/knowledge/{guides/support/ai-rag-analyzer.md → 03-guides/33-analyze-ai-rag.md} +0 -0
  272. /package/knowledge/{guides/support/ai-task-assessor.md → 03-guides/34-assess-ai-task.md} +0 -0
  273. /package/knowledge/{guides/support/ai-pipeline-evaluator.md → 03-guides/35-evaluate-ai-pipeline.md} +0 -0
  274. /package/knowledge/{guides/support/ai-artifact-evaluator.md → 03-guides/36-evaluate-ai-artifact.md} +0 -0
  275. /package/knowledge/{guides/support/ai-evaluation-planner.md → 03-guides/37-plan-ai-evaluation.md} +0 -0
  276. /package/knowledge/{guides/support/ai-path-evaluator.md → 03-guides/38-evaluate-ai-path.md} +0 -0
  277. /package/knowledge/{guides/support/ai-data-validator.md → 03-guides/39-validate-ai-data.md} +0 -0
  278. /package/knowledge/{guides/support/ai-anomaly-analyzer.md → 03-guides/40-detect-ai-anomaly.md} +0 -0
  279. /package/knowledge/{guides/support/ai-test-diagnostics.md → 03-guides/41-diagnose-ai-test.md} +0 -0
  280. /package/knowledge/{guides/support/test-runner.md → 03-guides/45-test-runner.md} +0 -0
  281. /package/knowledge/{checklists/test.md → 04-checklists/03-test.md} +0 -0
  282. /package/knowledge/{config/team-stage.yaml → 05-config/01-team-stage.yaml} +0 -0
  283. /package/knowledge/{config/role-extensions.yaml → 05-config/04-role-extensions.yaml} +0 -0
@@ -0,0 +1,605 @@
1
+ /**
2
+ * AutoSpec Auto-Fix Loop - 自主修复循环核心逻辑
3
+ *
4
+ * 实现"检测障碍 → 分析根因 → 决策策略 → 执行修复 → 验证结果"的自主闭环能力
5
+ *
6
+ * 核心设计原则:
7
+ * - DP15 Brownfield 适配:先搜索后实现,优先复用项目已有框架
8
+ * - P10 开闭原则:对扩展开放,对修改关闭
9
+ * - P13 面向变化设计:封装隔离变化点
10
+ * - 依赖倒转:面向接口编程
11
+ * - 单一职责:每个类/方法只做一件事
12
+ * - 高内聚低耦合:模块内聚,模块间松耦合
13
+ * - AOP:通过切面方式增强功能,不侵入业务代码
14
+ *
15
+ * 修复边界:
16
+ * - 冻结区:constitution.md, evolution.md, 核心原则 → 不可自主修改
17
+ * - 受控区:框架核心机制、接口契约变更 → 需人工批准
18
+ * - 自由区:依赖添加、配置修正、语法/类型错误、测试文件修复 → 可自主修复
19
+ *
20
+ * 重试上限:同一问题最多自主修复 3 次
21
+ */
22
+
23
+ import fs from 'fs';
24
+ import path from 'path';
25
+ import { execSync } from 'child_process';
26
+ import { createHookLogger } from './hook-logger.js';
27
+ import { getState, updateState, getTraceId } from './hook-state-manager.js';
28
+
29
+ const logger = createHookLogger('auto-fix-loop');
30
+
31
+ // 最大重试次数
32
+ const MAX_RETRY_COUNT = 3;
33
+
34
+ // 冻结区文件模式
35
+ const FROZEN_PATTERNS = [
36
+ 'constitution.md',
37
+ 'evolution.md',
38
+ 'design-philosophy.md',
39
+ 'core-principles.md',
40
+ '.autospec/constitution',
41
+ 'knowledge/01-principles/09-constitution',
42
+ 'knowledge/01-principles/10-evolution-mechanism'
43
+ ];
44
+
45
+ // 错误分类
46
+ export const ERROR_TYPES = {
47
+ DEPENDENCY: 'dependency', // 依赖类
48
+ CONFIG: 'config', // 配置类
49
+ CODE: 'code', // 代码类
50
+ RESOURCE: 'resource', // 资源类
51
+ VALIDATION: 'validation', // 验证类
52
+ LOGIC: 'logic' // 逻辑类(需人工)
53
+ };
54
+
55
+ // 修复区域
56
+ export const REPAIR_ZONES = {
57
+ FROZEN: 'frozen', // 冻结区
58
+ CONTROLLED: 'controlled', // 受控区
59
+ FREE: 'free' // 自由区
60
+ };
61
+
62
+ /**
63
+ * 检测文件是否在冻结区
64
+ * @param {string} filePath - 文件路径
65
+ * @returns {boolean} 是否在冻结区
66
+ */
67
+ export function isFrozenFile(filePath) {
68
+ if (!filePath) return false;
69
+
70
+ const normalizedPath = filePath.replace(/\\/g, '/').toLowerCase();
71
+
72
+ for (const pattern of FROZEN_PATTERNS) {
73
+ if (normalizedPath.includes(pattern.toLowerCase())) {
74
+ return true;
75
+ }
76
+ }
77
+
78
+ return false;
79
+ }
80
+
81
+ /**
82
+ * 判断修复区域
83
+ * @param {string} filePath - 文件路径
84
+ * @param {string} errorType - 错误类型
85
+ * @returns {string} 修复区域
86
+ */
87
+ export function getRepairZone(filePath, errorType) {
88
+ // 冻结区文件
89
+ if (isFrozenFile(filePath)) {
90
+ return REPAIR_ZONES.FROZEN;
91
+ }
92
+
93
+ // 逻辑类错误需要人工确认
94
+ if (errorType === ERROR_TYPES.LOGIC) {
95
+ return REPAIR_ZONES.CONTROLLED;
96
+ }
97
+
98
+ // 自由区:依赖、配置、语法错误、测试文件
99
+ if (errorType === ERROR_TYPES.DEPENDENCY ||
100
+ errorType === ERROR_TYPES.CONFIG ||
101
+ errorType === ERROR_TYPES.CODE ||
102
+ errorType === ERROR_TYPES.RESOURCE) {
103
+ return REPAIR_ZONES.FREE;
104
+ }
105
+
106
+ return REPAIR_ZONES.CONTROLLED;
107
+ }
108
+
109
+ /**
110
+ * 分析错误类型
111
+ * @param {Object} errorContext - 错误上下文
112
+ * @returns {string} 错误类型
113
+ */
114
+ export function analyzeErrorType(errorContext) {
115
+ const { errorMessage, errorOutput, command } = errorContext;
116
+
117
+ const message = (errorMessage || '').toLowerCase();
118
+ const output = (errorOutput || '').toLowerCase();
119
+ const fullText = message + ' ' + output;
120
+
121
+ // 依赖类错误
122
+ if (fullText.includes('package not found') ||
123
+ fullText.includes('cannot find module') ||
124
+ fullText.includes('dependency') ||
125
+ fullText.includes('package does not exist') ||
126
+ fullText.includes('module not found') ||
127
+ fullText.includes('npm err! cannot find module') ||
128
+ fullText.includes('maven') && fullText.includes('not found') ||
129
+ fullText.includes('does not exist')) {
130
+ return ERROR_TYPES.DEPENDENCY;
131
+ }
132
+
133
+ // 配置类错误
134
+ if (fullText.includes('config') ||
135
+ fullText.includes('configuration') ||
136
+ fullText.includes('invalid json') ||
137
+ fullText.includes('yaml') ||
138
+ fullText.includes('environment variable') ||
139
+ fullText.includes('.env')) {
140
+ return ERROR_TYPES.CONFIG;
141
+ }
142
+
143
+ // 代码类错误(优先于验证类)
144
+ if (fullText.includes('syntax error') ||
145
+ fullText.includes('type error') ||
146
+ fullText.includes('cannot find name') ||
147
+ fullText.includes('is not defined') ||
148
+ fullText.includes('property does not exist') ||
149
+ fullText.includes('import') ||
150
+ fullText.includes('compilation failed') ||
151
+ fullText.includes('unexpected token')) {
152
+ return ERROR_TYPES.CODE;
153
+ }
154
+
155
+ // 资源类错误
156
+ if (fullText.includes('not found') ||
157
+ fullText.includes('no such file') ||
158
+ fullText.includes('directory') ||
159
+ fullText.includes('ENOENT') ||
160
+ fullText.includes('resource not found')) {
161
+ return ERROR_TYPES.RESOURCE;
162
+ }
163
+
164
+ // 验证类错误
165
+ if (fullText.includes('test failed') ||
166
+ fullText.includes('assertion') ||
167
+ fullText.includes('expect') ||
168
+ fullText.includes('validation failed') ||
169
+ fullText.includes('lint') ||
170
+ command?.includes('test') ||
171
+ command?.includes('lint')) {
172
+ return ERROR_TYPES.VALIDATION;
173
+ }
174
+
175
+ // 默认为逻辑类(需要人工)
176
+ return ERROR_TYPES.LOGIC;
177
+ }
178
+
179
+ /**
180
+ * 执行修复命令
181
+ * @param {string} command - 命令
182
+ * @param {string} cwd - 工作目录
183
+ * @returns {Object} 执行结果
184
+ */
185
+ export function executeFixCommand(command, cwd) {
186
+ try {
187
+ const result = execSync(command, {
188
+ cwd,
189
+ encoding: 'utf-8',
190
+ stdio: ['pipe', 'pipe', 'pipe']
191
+ });
192
+
193
+ return {
194
+ success: true,
195
+ output: result,
196
+ command
197
+ };
198
+ } catch (e) {
199
+ return {
200
+ success: false,
201
+ error: e.message,
202
+ stdout: e.stdout,
203
+ stderr: e.stderr,
204
+ command
205
+ };
206
+ }
207
+ }
208
+
209
+ /**
210
+ * 记录实践日志
211
+ * @param {string} projectRoot - 项目根目录
212
+ * @param {Object} fixRecord - 修复记录
213
+ */
214
+ export function recordPracticeLog(projectRoot, fixRecord) {
215
+ try {
216
+ const logDir = path.join(projectRoot, '.autospec', 'practice-log');
217
+ if (!fs.existsSync(logDir)) {
218
+ fs.mkdirSync(logDir, { recursive: true });
219
+ }
220
+
221
+ const date = new Date().toISOString().split('T')[0];
222
+ const logPath = path.join(logDir, `${date}-autofix.md`);
223
+
224
+ const entry = `## [${new Date().toISOString()}] 自主修复记录
225
+
226
+ **问题**: ${fixRecord.problem}
227
+ **根因**: ${fixRecord.rootCause}
228
+ **修复方案**: ${fixRecord.fix}
229
+ **验证结果**: ${fixRecord.verification?.rerunResult || 'pending'}
230
+ **分类**: ${fixRecord.category}
231
+ **区域**: ${fixRecord.zone}
232
+ **重试次数**: ${fixRecord.retryCount || 0}
233
+
234
+ ---
235
+
236
+ `;
237
+
238
+ if (fs.existsSync(logPath)) {
239
+ fs.appendFileSync(logPath, entry, 'utf-8');
240
+ } else {
241
+ fs.writeFileSync(logPath, entry, 'utf-8');
242
+ }
243
+
244
+ logger.debug('Practice log recorded', { path: logPath });
245
+ } catch (e) {
246
+ logger.warn('Failed to record practice log', { error: e.message });
247
+ }
248
+ }
249
+
250
+ /**
251
+ * 自主修复循环
252
+ * @param {Object} errorContext - 错误上下文
253
+ * @param {string} projectRoot - 项目根目录
254
+ * @param {Function} reexecuteCommand - 重新执行原命令的函数
255
+ * @returns {Promise<Object>} 修复结果
256
+ */
257
+ export async function autoFixLoop(errorContext, projectRoot, reexecuteCommand) {
258
+ const {
259
+ errorType: initialErrorType,
260
+ errorMessage,
261
+ errorLocation,
262
+ errorOutput,
263
+ command,
264
+ retryCount = 0
265
+ } = errorContext;
266
+
267
+ // 检查是否超过最大重试次数
268
+ if (retryCount >= MAX_RETRY_COUNT) {
269
+ logger.info('Max retry count reached, escalating to human', { retryCount });
270
+
271
+ return {
272
+ status: 'blocked',
273
+ reason: 'max_retry_exceeded',
274
+ retryCount,
275
+ message: `同一问题已尝试修复 ${MAX_RETRY_COUNT} 次,需要人工介入`
276
+ };
277
+ }
278
+
279
+ // 分析错误类型
280
+ const errorType = initialErrorType || analyzeErrorType({ errorMessage, errorOutput, command });
281
+
282
+ // 判断修复区域
283
+ const repairZone = getRepairZone(errorLocation, errorType);
284
+
285
+ // 冻结区:直接拒绝
286
+ if (repairZone === REPAIR_ZONES.FROZEN) {
287
+ logger.warn('Attempted to modify frozen file, blocked', { errorLocation, errorType });
288
+
289
+ return {
290
+ status: 'blocked',
291
+ reason: 'frozen_zone',
292
+ retryCount,
293
+ message: `不可修改宪法文件或核心原则文件:${errorLocation}`
294
+ };
295
+ }
296
+
297
+ // 受控区:需要人工确认
298
+ if (repairZone === REPAIR_ZONES.CONTROLLED) {
299
+ logger.info('Controlled zone issue, needs human confirmation', { errorType });
300
+
301
+ return {
302
+ status: 'needs_human',
303
+ reason: 'controlled_zone',
304
+ retryCount,
305
+ errorType,
306
+ message: '问题需要人工确认(业务逻辑错误或架构变更)'
307
+ };
308
+ }
309
+
310
+ // 自由区:尝试自主修复
311
+ logger.info('Attempting auto-fix for free zone issue', { errorType, retryCount });
312
+
313
+ // 执行修复策略
314
+ const fixResult = await executeFixStrategy(errorType, errorContext, projectRoot);
315
+
316
+ if (!fixResult.success) {
317
+ logger.warn('Auto-fix failed', { error: fixResult.error });
318
+
319
+ // 重试
320
+ return autoFixLoop({
321
+ ...errorContext,
322
+ retryCount: retryCount + 1,
323
+ errorOutput: fixResult.error
324
+ }, projectRoot, reexecuteCommand);
325
+ }
326
+
327
+ // 验证修复结果
328
+ if (reexecuteCommand) {
329
+ const verifyResult = await reexecuteCommand();
330
+
331
+ if (verifyResult.success) {
332
+ logger.info('Auto-fix verified successfully');
333
+
334
+ // 记录实践日志
335
+ recordPracticeLog(projectRoot, {
336
+ problem: errorMessage,
337
+ rootCause: errorType,
338
+ fix: fixResult.description,
339
+ verification: { rerunResult: 'pass' },
340
+ category: errorType,
341
+ zone: repairZone,
342
+ retryCount
343
+ });
344
+
345
+ return {
346
+ status: 'fixed',
347
+ fixApplied: fixResult.description,
348
+ changes: fixResult.changes,
349
+ verification: {
350
+ rerunResult: 'pass',
351
+ output: verifyResult.output
352
+ },
353
+ retryCount
354
+ };
355
+ } else {
356
+ logger.warn('Verification failed, retrying');
357
+
358
+ // 验证失败,继续重试
359
+ return autoFixLoop({
360
+ ...errorContext,
361
+ retryCount: retryCount + 1,
362
+ errorOutput: verifyResult.error
363
+ }, projectRoot, reexecuteCommand);
364
+ }
365
+ }
366
+
367
+ // 无法验证,假设修复成功
368
+ return {
369
+ status: 'fixed',
370
+ fixApplied: fixResult.description,
371
+ changes: fixResult.changes,
372
+ retryCount
373
+ };
374
+ }
375
+
376
+ /**
377
+ * 执行修复策略
378
+ * @param {string} errorType - 错误类型
379
+ * @param {Object} errorContext - 错误上下文
380
+ * @param {string} projectRoot - 项目根目录
381
+ * @returns {Promise<Object>} 修复结果
382
+ */
383
+ async function executeFixStrategy(errorType, errorContext, projectRoot) {
384
+ switch (errorType) {
385
+ case ERROR_TYPES.DEPENDENCY:
386
+ return fixDependency(errorContext, projectRoot);
387
+
388
+ case ERROR_TYPES.CONFIG:
389
+ return fixConfig(errorContext, projectRoot);
390
+
391
+ case ERROR_TYPES.CODE:
392
+ return fixCode(errorContext, projectRoot);
393
+
394
+ case ERROR_TYPES.RESOURCE:
395
+ return fixResource(errorContext, projectRoot);
396
+
397
+ case ERROR_TYPES.VALIDATION:
398
+ return fixValidation(errorContext, projectRoot);
399
+
400
+ default:
401
+ return {
402
+ success: false,
403
+ error: `Unknown error type: ${errorType}`
404
+ };
405
+ }
406
+ }
407
+
408
+ /**
409
+ * 修复依赖类错误
410
+ */
411
+ async function fixDependency(errorContext, projectRoot) {
412
+ const { errorOutput, command } = errorContext;
413
+ const output = errorOutput || '';
414
+
415
+ // 检测 Maven 依赖缺失
416
+ const mavenMatch = output.match(/package ([\w.]+) does not exist/);
417
+ if (mavenMatch) {
418
+ const packageName = mavenMatch[1];
419
+ logger.info('Detected Maven dependency missing', { packageName });
420
+
421
+ // 尝试找到 pom.xml 并添加依赖
422
+ const pomPath = findPomXml(projectRoot);
423
+ if (pomPath) {
424
+ // 这里只是记录,实际添加依赖需要更复杂的逻辑
425
+ return {
426
+ success: true,
427
+ description: `检测到 Maven 依赖缺失:${packageName},需要添加到 ${pomPath}`,
428
+ changes: [{ file: pomPath, change: `Add dependency: ${packageName}` }],
429
+ needsHumanConfirmation: true,
430
+ suggestion: `在 ${pomPath} 中添加 ${packageName} 依赖`
431
+ };
432
+ }
433
+ }
434
+
435
+ // 检测 npm 依赖缺失
436
+ const npmMatch = output.match(/Cannot find module ['"]([^'"]+)['"]/);
437
+ if (npmMatch) {
438
+ const moduleName = npmMatch[1];
439
+ logger.info('Detected npm module missing', { moduleName });
440
+
441
+ // 尝试安装
442
+ const result = executeFixCommand(`npm install ${moduleName}`, projectRoot);
443
+
444
+ if (result.success) {
445
+ return {
446
+ success: true,
447
+ description: `已安装缺失的 npm 模块:${moduleName}`,
448
+ changes: [{ file: 'package.json', change: `npm install ${moduleName}` }]
449
+ };
450
+ }
451
+
452
+ return {
453
+ success: false,
454
+ error: `Failed to install npm module: ${moduleName}`
455
+ };
456
+ }
457
+
458
+ return {
459
+ success: false,
460
+ error: 'Could not identify specific dependency issue'
461
+ };
462
+ }
463
+
464
+ /**
465
+ * 修复配置类错误
466
+ */
467
+ async function fixConfig(errorContext, projectRoot) {
468
+ const { errorLocation, errorOutput } = errorContext;
469
+
470
+ // JSON 语法错误修复
471
+ if (errorLocation?.endsWith('.json')) {
472
+ try {
473
+ const content = fs.readFileSync(errorLocation, 'utf-8');
474
+ // 尝试解析,失败则报告
475
+ try {
476
+ JSON.parse(content);
477
+ } catch (e) {
478
+ return {
479
+ success: false,
480
+ error: `JSON syntax error: ${e.message}`,
481
+ suggestion: 'Check JSON syntax'
482
+ };
483
+ }
484
+ } catch (e) {
485
+ return {
486
+ success: false,
487
+ error: `Cannot read config file: ${errorLocation}`
488
+ };
489
+ }
490
+ }
491
+
492
+ return {
493
+ success: false,
494
+ error: 'Config fix not implemented for this case'
495
+ };
496
+ }
497
+
498
+ /**
499
+ * 修复代码类错误
500
+ */
501
+ async function fixCode(errorContext, projectRoot) {
502
+ const { errorLocation, errorOutput } = errorContext;
503
+
504
+ // 语法错误
505
+ if (errorOutput?.includes('syntax error')) {
506
+ return {
507
+ success: false,
508
+ error: 'Syntax error detected, needs manual review',
509
+ suggestion: `Check syntax at: ${errorLocation}`
510
+ };
511
+ }
512
+
513
+ // 导入缺失
514
+ if (errorOutput?.includes('is not defined') || errorOutput?.includes('cannot find name')) {
515
+ return {
516
+ success: false,
517
+ error: 'Undefined symbol detected, needs manual review',
518
+ suggestion: `Check import/definition at: ${errorLocation}`
519
+ };
520
+ }
521
+
522
+ return {
523
+ success: false,
524
+ error: 'Code fix not implemented for this case'
525
+ };
526
+ }
527
+
528
+ /**
529
+ * 修复资源类错误
530
+ */
531
+ async function fixResource(errorContext, projectRoot) {
532
+ const { errorLocation } = errorContext;
533
+
534
+ // 文件不存在,尝试创建目录
535
+ if (errorLocation) {
536
+ const dir = path.dirname(errorLocation);
537
+ try {
538
+ if (!fs.existsSync(dir)) {
539
+ fs.mkdirSync(dir, { recursive: true });
540
+ return {
541
+ success: true,
542
+ description: `Created directory: ${dir}`,
543
+ changes: [{ file: dir, change: 'mkdir -p' }]
544
+ };
545
+ }
546
+ } catch (e) {
547
+ return {
548
+ success: false,
549
+ error: `Cannot create directory: ${dir}`
550
+ };
551
+ }
552
+ }
553
+
554
+ return {
555
+ success: false,
556
+ error: 'Resource fix not implemented for this case'
557
+ };
558
+ }
559
+
560
+ /**
561
+ * 修复验证类错误
562
+ */
563
+ async function fixValidation(errorContext, projectRoot) {
564
+ // 验证错误通常需要分析具体失败原因
565
+ return {
566
+ success: false,
567
+ error: 'Validation error needs analysis',
568
+ suggestion: 'Review test output and fix underlying issue'
569
+ };
570
+ }
571
+
572
+ /**
573
+ * 查找 pom.xml 文件
574
+ * @param {string} projectRoot - 项目根目录
575
+ * @returns {string|null} pom.xml 路径
576
+ */
577
+ function findPomXml(projectRoot) {
578
+ const pomPath = path.join(projectRoot, 'pom.xml');
579
+ if (fs.existsSync(pomPath)) {
580
+ return pomPath;
581
+ }
582
+
583
+ // 查找子模块
584
+ const subdirs = ['app/service', 'service', 'backend'];
585
+ for (const subdir of subdirs) {
586
+ const subPomPath = path.join(projectRoot, subdir, 'pom.xml');
587
+ if (fs.existsSync(subPomPath)) {
588
+ return subPomPath;
589
+ }
590
+ }
591
+
592
+ return null;
593
+ }
594
+
595
+ export default {
596
+ autoFixLoop,
597
+ analyzeErrorType,
598
+ getRepairZone,
599
+ isFrozenFile,
600
+ executeFixCommand,
601
+ recordPracticeLog,
602
+ ERROR_TYPES,
603
+ REPAIR_ZONES,
604
+ MAX_RETRY_COUNT
605
+ };
@@ -141,22 +141,26 @@ function parseValue(value) {
141
141
 
142
142
  /**
143
143
  * 查找配置文件
144
+ * 搜索顺序:
145
+ * 1. .autospec/environment/ (运行时配置,优先级最高)
146
+ * 2. knowledge/06-environment/ (框架模板)
147
+ * 3. 当前工作目录
144
148
  */
145
149
  function findConfigFile(filename) {
146
150
  const searchPaths = [
151
+ // 运行时配置目录(优先级最高,由 env-sync 生成)
152
+ path.join(process.cwd(), '.autospec', 'environment'),
153
+ // 框架模板目录
154
+ path.join(process.cwd(), 'knowledge', '06-environment'),
155
+ // 当前工作目录
147
156
  process.cwd(),
148
- path.join(process.cwd(), '.autospec'),
149
- path.join(process.cwd(), 'framework'),
150
- path.join(process.cwd(), 'framework', 'environment'),
151
- path.join(process.cwd(), 'framework', 'config'),
152
157
  ];
153
158
 
154
159
  // 如果是框架内部运行,添加框架路径
155
160
  try {
156
161
  const frameworkRoot = path.dirname(path.dirname(path.dirname(import.meta.url.replace('file://', ''))));
157
162
  searchPaths.push(frameworkRoot);
158
- searchPaths.push(path.join(frameworkRoot, 'framework', 'environment'));
159
- searchPaths.push(path.join(frameworkRoot, 'framework', 'config'));
163
+ searchPaths.push(path.join(frameworkRoot, 'knowledge', '06-environment'));
160
164
  } catch (e) {
161
165
  // 忽略
162
166
  }
@@ -271,7 +275,7 @@ function getDefaultValidationConfig() {
271
275
  frozenPatterns: [
272
276
  { pattern: 'constitution\\.md$' },
273
277
  { pattern: 'evolution\\.md$' },
274
- { pattern: 'pipeline/overview\\.md$' }
278
+ { pattern: 'knowledge/02-process/00-overview\\.md$' }
275
279
  ]
276
280
  };
277
281
  }