@chongyan/autospec 1.0.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 (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +472 -0
  3. package/README.md +476 -0
  4. package/bin/autospec.js +3 -0
  5. package/knowledge/README.md +144 -0
  6. package/knowledge/checklists/code.md +182 -0
  7. package/knowledge/checklists/design.md +196 -0
  8. package/knowledge/checklists/release.md +70 -0
  9. package/knowledge/checklists/requirement.md +169 -0
  10. package/knowledge/checklists/test.md +46 -0
  11. package/knowledge/config/README.en.md +44 -0
  12. package/knowledge/config/README.md +44 -0
  13. package/knowledge/config/role-composition.yaml +98 -0
  14. package/knowledge/config/role-extensions.yaml +140 -0
  15. package/knowledge/config/skill-compositions.yaml +142 -0
  16. package/knowledge/config/team-stage.yaml +95 -0
  17. package/knowledge/config/team-tasks.yaml +139 -0
  18. package/knowledge/config/team-triggers.yaml +198 -0
  19. package/knowledge/config/validation-patterns.yaml +137 -0
  20. package/knowledge/domain/README.md +115 -0
  21. package/knowledge/domain/flows/README.md +194 -0
  22. package/knowledge/domain/glossary.md +143 -0
  23. package/knowledge/domain/rules.md +138 -0
  24. package/knowledge/environment/README.en.md +36 -0
  25. package/knowledge/environment/README.md +87 -0
  26. package/knowledge/environment/component-knowledge.md +316 -0
  27. package/knowledge/environment/detection-patterns.yaml +502 -0
  28. package/knowledge/environment/middleware-knowledge.md +237 -0
  29. package/knowledge/environment/template-registry.md +321 -0
  30. package/knowledge/guides/domain-driven-design.md +345 -0
  31. package/knowledge/guides/knowledge-management.md +369 -0
  32. package/knowledge/guides/requirement-engineering.md +329 -0
  33. package/knowledge/guides/stages/ai-effect-evaluator.md +93 -0
  34. package/knowledge/guides/stages/code-implementer.md +205 -0
  35. package/knowledge/guides/stages/code-reviewer.md +111 -0
  36. package/knowledge/guides/stages/consistency-checker.md +177 -0
  37. package/knowledge/guides/stages/design-planner.md +401 -0
  38. package/knowledge/guides/stages/design-reviewer.md +83 -0
  39. package/knowledge/guides/stages/integration-test-runner.md +105 -0
  40. package/knowledge/guides/stages/release-checker.md +205 -0
  41. package/knowledge/guides/stages/requirement-analyzer.md +195 -0
  42. package/knowledge/guides/stages/requirement-reviewer.md +83 -0
  43. package/knowledge/guides/stages/security-reviewer.md +89 -0
  44. package/knowledge/guides/stages/test-context-analyzer.md +250 -0
  45. package/knowledge/guides/stages/test-generator.md +241 -0
  46. package/knowledge/guides/stages/test-planner.md +183 -0
  47. package/knowledge/guides/stages/test-reviewer.md +76 -0
  48. package/knowledge/guides/stages/unit-test-runner.md +83 -0
  49. package/knowledge/guides/support/ai-agent-analyzer.md +362 -0
  50. package/knowledge/guides/support/ai-anomaly-analyzer.md +213 -0
  51. package/knowledge/guides/support/ai-artifact-evaluator.md +192 -0
  52. package/knowledge/guides/support/ai-capability-analyzer.md +193 -0
  53. package/knowledge/guides/support/ai-component-analyzer.md +169 -0
  54. package/knowledge/guides/support/ai-data-validator.md +276 -0
  55. package/knowledge/guides/support/ai-evaluation-planner.md +374 -0
  56. package/knowledge/guides/support/ai-path-evaluator.md +274 -0
  57. package/knowledge/guides/support/ai-pipeline-evaluator.md +219 -0
  58. package/knowledge/guides/support/ai-rag-analyzer.md +339 -0
  59. package/knowledge/guides/support/ai-task-assessor.md +418 -0
  60. package/knowledge/guides/support/ai-test-diagnostics.md +133 -0
  61. package/knowledge/guides/support/complexity-assessor.md +268 -0
  62. package/knowledge/guides/support/component-discovery.md +183 -0
  63. package/knowledge/guides/support/environment-scanner.md +207 -0
  64. package/knowledge/guides/support/environment-validator.md +207 -0
  65. package/knowledge/guides/support/knowledge-generator.md +234 -0
  66. package/knowledge/guides/support/methodology-extractor.md +55 -0
  67. package/knowledge/guides/support/pipeline-protocol.md +438 -0
  68. package/knowledge/guides/support/practice-logger.md +359 -0
  69. package/knowledge/guides/support/scope-inference.md +174 -0
  70. package/knowledge/guides/support/skill-distiller.md +91 -0
  71. package/knowledge/guides/support/skill-updater.md +45 -0
  72. package/knowledge/guides/support/skill-validator.md +72 -0
  73. package/knowledge/guides/support/team-orchestrator.md +323 -0
  74. package/knowledge/guides/support/tech-stack-analyzer.md +139 -0
  75. package/knowledge/guides/support/test-runner.md +254 -0
  76. package/knowledge/guides/system-design.md +352 -0
  77. package/knowledge/organization/ai-native-team.md +318 -0
  78. package/knowledge/organization/team-metrics.md +228 -0
  79. package/knowledge/principles/constitution.md +134 -0
  80. package/knowledge/principles/core-principles.md +368 -0
  81. package/knowledge/principles/design-philosophy.md +877 -0
  82. package/knowledge/principles/evolution.md +553 -0
  83. package/knowledge/process/01-requirement.md +113 -0
  84. package/knowledge/process/02-design.md +123 -0
  85. package/knowledge/process/03-implementation.md +90 -0
  86. package/knowledge/process/04-review.md +80 -0
  87. package/knowledge/process/05-testing.md +90 -0
  88. package/knowledge/process/06-delivery.md +88 -0
  89. package/knowledge/process/README.en.md +38 -0
  90. package/knowledge/process/README.md +48 -0
  91. package/knowledge/process/ai-sdlc.md +475 -0
  92. package/knowledge/process/overview.md +319 -0
  93. package/knowledge/standards/code-review.md +876 -0
  94. package/knowledge/standards/coding-style.md +940 -0
  95. package/knowledge/standards/data-consistency.md +1085 -0
  96. package/knowledge/standards/document-versioning.md +210 -0
  97. package/knowledge/standards/risk-detection.md +186 -0
  98. package/knowledge/templates/ai-evaluation.md +150 -0
  99. package/knowledge/templates/api-design.md +117 -0
  100. package/knowledge/templates/database-design.md +132 -0
  101. package/knowledge/templates/domain-driven-design.md +321 -0
  102. package/knowledge/templates/product-proposal.md +201 -0
  103. package/knowledge/templates/system-design.md +227 -0
  104. package/knowledge/templates/task-breakdown.md +107 -0
  105. package/knowledge/templates/test-case.md +170 -0
  106. package/package.json +53 -0
  107. package/plugins/.claude-plugin/plugin.json +134 -0
  108. package/plugins/agents/roles/ai-engineer.md +129 -0
  109. package/plugins/agents/roles/backend-engineer.md +165 -0
  110. package/plugins/agents/roles/ceo.md +94 -0
  111. package/plugins/agents/roles/data-engineer.md +135 -0
  112. package/plugins/agents/roles/devops-engineer.md +181 -0
  113. package/plugins/agents/roles/frontend-engineer.md +129 -0
  114. package/plugins/agents/roles/product-owner.md +98 -0
  115. package/plugins/agents/roles/quality-engineer.md +129 -0
  116. package/plugins/agents/roles/security-engineer.md +180 -0
  117. package/plugins/agents/roles/tech-lead.md +97 -0
  118. package/plugins/agents/support/blind-comparator.md +88 -0
  119. package/plugins/agents/support/consistency-checker.md +103 -0
  120. package/plugins/agents/support/failure-diagnostician.md +141 -0
  121. package/plugins/agents/support/independent-reviewer.md +80 -0
  122. package/plugins/agents/support/safety-auditor.md +121 -0
  123. package/plugins/agents/support/skill-benchmarker.md +86 -0
  124. package/plugins/agents/support/skill-forger.md +105 -0
  125. package/plugins/agents/support/stage-gate-evaluator.md +121 -0
  126. package/plugins/agents/support/test-coverage-reviewer.md +73 -0
  127. package/plugins/benchmarks/templates/README.md +44 -0
  128. package/plugins/benchmarks/templates/commands/explore-template.yaml +48 -0
  129. package/plugins/benchmarks/templates/pipeline/agile-template.yaml +84 -0
  130. package/plugins/benchmarks/templates/pipeline/waterfall-template.yaml +106 -0
  131. package/plugins/benchmarks/templates/skills/requirement-analyzer-template.yaml +48 -0
  132. package/plugins/commands/README.en.md +96 -0
  133. package/plugins/commands/README.md +96 -0
  134. package/plugins/commands/apply.md +191 -0
  135. package/plugins/commands/archive.md +76 -0
  136. package/plugins/commands/env-export.md +79 -0
  137. package/plugins/commands/env-sync.md +640 -0
  138. package/plugins/commands/env-template.md +223 -0
  139. package/plugins/commands/env-update.md +264 -0
  140. package/plugins/commands/env-validate.md +176 -0
  141. package/plugins/commands/env.md +79 -0
  142. package/plugins/commands/explore.md +76 -0
  143. package/plugins/commands/field-evolve.md +536 -0
  144. package/plugins/commands/memory.md +249 -0
  145. package/plugins/commands/project-evolve.md +821 -0
  146. package/plugins/commands/propose.md +93 -0
  147. package/plugins/commands/review.md +140 -0
  148. package/plugins/commands/run.md +224 -0
  149. package/plugins/commands/status.md +62 -0
  150. package/plugins/commands/validate.md +108 -0
  151. package/plugins/hooks/README.en.md +56 -0
  152. package/plugins/hooks/README.md +56 -0
  153. package/plugins/hooks/ai-project-guard.js +329 -0
  154. package/plugins/hooks/artifact-evaluation-hook.js +237 -0
  155. package/plugins/hooks/constitution-guard.js +211 -0
  156. package/plugins/hooks/environment-autocommit.js +264 -0
  157. package/plugins/hooks/environment-manager.js +778 -0
  158. package/plugins/hooks/execution-tracker.js +354 -0
  159. package/plugins/hooks/frozen-zone-guard.js +140 -0
  160. package/plugins/hooks/layer1-validator.js +423 -0
  161. package/plugins/hooks/lib/artifact-evaluator.js +414 -0
  162. package/plugins/hooks/lib/benchmarks/change-detector.js +390 -0
  163. package/plugins/hooks/lib/benchmarks/evaluator.js +605 -0
  164. package/plugins/hooks/lib/benchmarks/integration-example.js +169 -0
  165. package/plugins/hooks/lib/data-and-ai-detector.js +275 -0
  166. package/plugins/hooks/lib/detection-pattern-loader.js +865 -0
  167. package/plugins/hooks/lib/directory-discovery.js +395 -0
  168. package/plugins/hooks/lib/environment-config-loader.js +341 -0
  169. package/plugins/hooks/lib/environment-detector.js +553 -0
  170. package/plugins/hooks/lib/environment-evolver.js +564 -0
  171. package/plugins/hooks/lib/environment-registry.js +813 -0
  172. package/plugins/hooks/lib/execution-path.js +427 -0
  173. package/plugins/hooks/lib/hook-error-recorder.js +245 -0
  174. package/plugins/hooks/lib/hook-logger.js +538 -0
  175. package/plugins/hooks/lib/hook-runner.js +97 -0
  176. package/plugins/hooks/lib/hook-runner.sh +44 -0
  177. package/plugins/hooks/lib/hook-state-manager.js +480 -0
  178. package/plugins/hooks/lib/memory-extractor.js +377 -0
  179. package/plugins/hooks/lib/memory-manager.js +673 -0
  180. package/plugins/hooks/lib/metrics-analyzer.js +489 -0
  181. package/plugins/hooks/lib/project-evolution/auto-fixer.js +511 -0
  182. package/plugins/hooks/lib/project-evolution/memory-manager.js +346 -0
  183. package/plugins/hooks/lib/project-evolution/pattern-detector.js +476 -0
  184. package/plugins/hooks/lib/project-evolution/semantic-indexer.js +480 -0
  185. package/plugins/hooks/lib/project-structure-detector.js +326 -0
  186. package/plugins/hooks/lib/rollback-tracker.js +346 -0
  187. package/plugins/hooks/lib/source-code-scanner.js +596 -0
  188. package/plugins/hooks/lib/technology-stack-detector.js +374 -0
  189. package/plugins/hooks/lib/test-failure-analyzer.js +375 -0
  190. package/plugins/hooks/lib/test-failure-fixer.js +268 -0
  191. package/plugins/hooks/lib/trace-context.js +277 -0
  192. package/plugins/hooks/lib/validation-patterns.js +415 -0
  193. package/plugins/hooks/memory-sync.js +171 -0
  194. package/plugins/hooks/pipeline-observer.js +413 -0
  195. package/plugins/hooks/scope-sentinel.js +204 -0
  196. package/plugins/hooks/trace-initialization.js +169 -0
  197. package/plugins/memory/templates/code-quality.yaml +149 -0
  198. package/plugins/memory/templates/multi-system.yaml +155 -0
  199. package/plugins/memory/templates/team-habits.yaml +119 -0
  200. package/plugins/memory/templates/testing.yaml +121 -0
  201. package/plugins/skills/README.en.md +47 -0
  202. package/plugins/skills/README.md +104 -0
  203. package/plugins/skills/benchmark-executor/README.md +93 -0
  204. package/plugins/skills/benchmark-executor/SKILL.md +647 -0
  205. package/plugins/skills/benchmark-generator/SKILL.md +349 -0
  206. package/plugins/skills/delivery-stage/SKILL.md +203 -0
  207. package/plugins/skills/design-stage/SKILL.md +216 -0
  208. package/plugins/skills/evolution-process/SKILL.md +291 -0
  209. package/plugins/skills/exploration-phase/SKILL.md +133 -0
  210. package/plugins/skills/implementation-stage/SKILL.md +179 -0
  211. package/plugins/skills/layer1-validation/SKILL.md +79 -0
  212. package/plugins/skills/pending-dashboard/SKILL.md +109 -0
  213. package/plugins/skills/project-evolution/SKILL.md +847 -0
  214. package/plugins/skills/requirement-stage/SKILL.md +183 -0
  215. package/plugins/skills/skill-forge/SKILL.md +223 -0
  216. package/plugins/skills/skill-forge/references/description-guide.md +92 -0
  217. package/plugins/skills/skill-forge/references/quality-rubric.md +104 -0
  218. package/plugins/skills/skill-forge/references/skill-template.md +106 -0
  219. package/plugins/skills/startup-guard/SKILL.md +38 -0
  220. package/plugins/skills/testing-stage/SKILL.md +195 -0
  221. package/scripts/cli/global-init.js +288 -0
  222. package/scripts/cli/global.js +324 -0
  223. package/scripts/cli/index.js +55 -0
  224. package/scripts/cli/init.js +382 -0
  225. package/scripts/cli/list.js +69 -0
  226. package/scripts/cli/org.js +340 -0
  227. package/scripts/cli/update.js +44 -0
  228. package/scripts/config/commands.config.js +145 -0
  229. package/scripts/config/hooks.config.js +197 -0
  230. package/scripts/evolution/evolution-router.js +273 -0
  231. package/scripts/evolution/evolution-signal-collector.js +307 -0
  232. package/scripts/evolution/knowledge-loader.js +346 -0
  233. package/scripts/evolution/marketplace.js +317 -0
  234. package/scripts/evolution/version-manager.js +371 -0
  235. package/scripts/install/agents.js +106 -0
  236. package/scripts/install/commands.js +133 -0
  237. package/scripts/install/constants.js +424 -0
  238. package/scripts/install/hook-logger.js +536 -0
  239. package/scripts/install/hooks.js +110 -0
  240. package/scripts/install/index.js +39 -0
  241. package/scripts/install/skills.js +95 -0
  242. package/scripts/postinstall.js +25 -0
  243. package/scripts/state.js +376 -0
@@ -0,0 +1,564 @@
1
+ /**
2
+ * Environment Knowledge Evolver
3
+ *
4
+ * 环境知识进化器,从实践中发现和沉淀环境知识
5
+ */
6
+
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import yaml from 'js-yaml';
10
+ import { ENV_DIRS, KNOWLEDGE_ZONES, KNOWLEDGE_TYPES } from '../../constants.js';
11
+ import { PatternLoader } from './detection-pattern-loader.js';
12
+ import { EnvironmentRegistry } from './environment-registry.js';
13
+ import {
14
+ scanCodePatterns,
15
+ scanEnvVarPatterns,
16
+ scanDependencies,
17
+ discoverSourceDirs,
18
+ } from './source-code-scanner.js';
19
+
20
+ // 简单的 UUID 生成函数
21
+ function uuidv4() {
22
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
23
+ const r = Math.random() * 16 | 0;
24
+ const v = c === 'x' ? r : (r & 0x3 | 0x8);
25
+ return v.toString(16);
26
+ });
27
+ }
28
+
29
+ /**
30
+ * 环境知识进化器
31
+ */
32
+ export class EnvironmentEvolver {
33
+ constructor(projectRoot, config = {}) {
34
+ this.projectRoot = projectRoot;
35
+ this.config = config;
36
+ this.autospecDir = path.join(projectRoot, '.autospec');
37
+ this.envDir = path.join(this.autospecDir, ENV_DIRS.ROOT);
38
+ this.evolutionDir = path.join(this.autospecDir, 'evolution');
39
+ this.practiceLogDir = path.join(this.evolutionDir, 'practice-log');
40
+ this.proposalsDir = path.join(this.evolutionDir, 'proposals');
41
+
42
+ // 使用可配置的检测模式
43
+ this.patternLoader = new PatternLoader(this.autospecDir);
44
+ this.patternLoader.load();
45
+ }
46
+
47
+ /**
48
+ * 检测新的中间件使用模式
49
+ */
50
+ async detectNewMiddlewarePatterns() {
51
+ const patterns = [];
52
+
53
+ // 1. 扫描代码中的中间件使用
54
+ const codePatterns = await this.scanMiddlewareInCode();
55
+
56
+ // 2. 与现有知识库对比
57
+ const existingKnowledge = this.loadExistingMiddlewareKnowledge();
58
+
59
+ for (const pattern of codePatterns) {
60
+ const exists = existingKnowledge.some(
61
+ (k) => k.metadata?.name === pattern.name || k.meta?.name === pattern.name
62
+ );
63
+
64
+ if (!exists) {
65
+ patterns.push({
66
+ type: 'new-middleware',
67
+ name: pattern.name,
68
+ evidence: pattern.evidence,
69
+ suggestedConfig: pattern.suggestedConfig,
70
+ zone: KNOWLEDGE_ZONES.CONTROLLED, // 受控区,需要人工批准
71
+ });
72
+ }
73
+ }
74
+
75
+ return patterns;
76
+ }
77
+
78
+ /**
79
+ * 检测新的组件使用模式
80
+ */
81
+ async detectNewComponentPatterns() {
82
+ const patterns = [];
83
+
84
+ // 1. 扫描 practice-log 中的模式
85
+ const practiceLogs = this.loadPracticeLogs();
86
+
87
+ // 2. 识别重复出现的使用模式
88
+ const usagePatterns = this.extractUsagePatterns(practiceLogs);
89
+
90
+ // 3. 检查是否在组件库中
91
+ const existingComponents = this.loadExistingComponents();
92
+
93
+ for (const pattern of usagePatterns) {
94
+ const count = this.countPatternOccurrences(practiceLogs, pattern);
95
+
96
+ if (count >= 3) {
97
+ // 同类问题出现 3 次
98
+ const exists = existingComponents.some(
99
+ (c) => c.metadata?.name === pattern.name || c.meta?.name === pattern.name
100
+ );
101
+
102
+ if (!exists) {
103
+ patterns.push({
104
+ type: 'new-component',
105
+ name: pattern.name,
106
+ evidence: pattern.evidence,
107
+ occurrences: count,
108
+ suggestedDefinition: pattern.suggestedDefinition,
109
+ zone: KNOWLEDGE_ZONES.FREE, // 自由区,可自动进化
110
+ });
111
+ }
112
+ }
113
+ }
114
+
115
+ return patterns;
116
+ }
117
+
118
+ /**
119
+ * 扫描代码中的中间件使用
120
+ */
121
+ async scanMiddlewareInCode() {
122
+ const patterns = [];
123
+
124
+ // 从 PatternLoader 获取检测模式
125
+ const middlewarePatterns = this.patternLoader.getMiddlewarePatterns();
126
+
127
+ // 获取源码目录
128
+ const sourceDirs = this.discoverSourceDirectories();
129
+
130
+ // 扫描项目文件
131
+ for (const [name, middleware] of Object.entries(middlewarePatterns)) {
132
+ const evidence = await this.findMiddlewareEvidence(name, middleware, sourceDirs);
133
+
134
+ if (evidence.length > 0) {
135
+ patterns.push({
136
+ name: name,
137
+ evidence: evidence,
138
+ suggestedConfig: this.generateMiddlewareConfigSuggestion(name, middleware, evidence),
139
+ });
140
+ }
141
+ }
142
+
143
+ return patterns;
144
+ }
145
+
146
+ /**
147
+ * 发现源码目录 - 使用公共模块
148
+ */
149
+ discoverSourceDirectories() {
150
+ return discoverSourceDirs(this.projectRoot, this.config);
151
+ }
152
+
153
+ /**
154
+ * 查找中间件使用证据
155
+ */
156
+ async findMiddlewareEvidence(name, middleware, sourceDirs) {
157
+ const evidence = [];
158
+
159
+ // 如果没有源码目录,使用旧逻辑扫描 src/
160
+ if (sourceDirs.length === 0) {
161
+ const srcDir = path.join(this.projectRoot, 'src');
162
+ if (fs.existsSync(srcDir)) {
163
+ sourceDirs = [{ path: 'src', type: 'unknown', techStack: 'Unknown' }];
164
+ }
165
+ }
166
+
167
+ // 扫描每个源码目录
168
+ for (const dir of sourceDirs) {
169
+ const dirPath = path.join(this.projectRoot, dir.path);
170
+ if (!fs.existsSync(dirPath)) continue;
171
+
172
+ // 扫描代码模式
173
+ if (middleware.codePatterns) {
174
+ const codeEvidence = this.scanCodePatterns(dirPath, middleware.codePatterns);
175
+ evidence.push(...codeEvidence);
176
+ }
177
+
178
+ // 扫描环境变量模式
179
+ if (middleware.envVarPatterns) {
180
+ const envEvidence = this.scanEnvVarPatterns(dirPath, middleware.envVarPatterns);
181
+ evidence.push(...envEvidence);
182
+ }
183
+ }
184
+
185
+ // 从依赖文件检测
186
+ if (middleware.dependencies) {
187
+ const depEvidence = this.scanDependencies(middleware.dependencies);
188
+ evidence.push(...depEvidence);
189
+ }
190
+
191
+ return evidence.slice(0, 10); // 最多返回 10 条证据
192
+ }
193
+
194
+ /**
195
+ * 扫描代码模式 - 使用公共模块
196
+ */
197
+ scanCodePatterns(dirPath, codePatterns) {
198
+ return scanCodePatterns(dirPath, codePatterns, { maxDepth: 4 }, this.projectRoot);
199
+ }
200
+
201
+ /**
202
+ * 扫描环境变量模式 - 使用公共模块
203
+ */
204
+ scanEnvVarPatterns(dirPath, envVarPatterns) {
205
+ return scanEnvVarPatterns(dirPath, envVarPatterns, { maxDepth: 4 }, this.projectRoot);
206
+ }
207
+
208
+ /**
209
+ * 扫描依赖文件 - 使用公共模块
210
+ */
211
+ scanDependencies(dependencies) {
212
+ return scanDependencies(this.projectRoot, dependencies);
213
+ }
214
+
215
+ /**
216
+ * 生成中间件配置建议
217
+ */
218
+ generateMiddlewareConfigSuggestion(name, middleware, evidence) {
219
+ // 从证据中提取环境变量
220
+ const envVars = new Set();
221
+ for (const e of evidence) {
222
+ if (e.type === 'env-var' && e.envVars) {
223
+ for (const v of e.envVars) {
224
+ envVars.add(v);
225
+ }
226
+ }
227
+ }
228
+
229
+ return {
230
+ apiVersion: 'autospec/v1',
231
+ kind: KNOWLEDGE_TYPES.MIDDLEWARE,
232
+ meta: {
233
+ name: name,
234
+ version: '1.0',
235
+ autoGenerated: true,
236
+ generatedAt: new Date().toISOString(),
237
+ },
238
+ spec: {
239
+ type: this.inferMiddlewareType(name),
240
+ connection: {
241
+ template: `# 请补充 ${name} 连接模板`,
242
+ requiredEnvVars: [...envVars],
243
+ detectedEnvVars: [...envVars],
244
+ },
245
+ bestPractices: middleware.bestPractices || [],
246
+ antiPatterns: middleware.antiPatterns || [],
247
+ detectionSource: {
248
+ patterns: middleware.codePatterns?.map(cp => cp.pattern) || [],
249
+ evidence: evidence.slice(0, 5),
250
+ },
251
+ },
252
+ };
253
+ }
254
+
255
+ /**
256
+ * 推断中间件类型
257
+ */
258
+ inferMiddlewareType(name) {
259
+ const typeMap = {
260
+ 'mysql': 'relational-database',
261
+ 'postgresql': 'relational-database',
262
+ 'mongodb': 'document-database',
263
+ 'redis': 'cache',
264
+ 'kafka': 'message-queue',
265
+ 'rabbitmq': 'message-queue',
266
+ 'elasticsearch': 'search-engine',
267
+ };
268
+ return typeMap[name.toLowerCase()] || 'unknown';
269
+ }
270
+
271
+ /**
272
+ * 检测并自动激活
273
+ */
274
+ async detectAndActivate() {
275
+ const middlewarePatterns = await this.detectNewMiddlewarePatterns();
276
+ const componentPatterns = await this.detectNewComponentPatterns();
277
+
278
+ const detected = [...middlewarePatterns, ...componentPatterns];
279
+ const activated = [];
280
+
281
+ // 自动注册并激活检测到的知识
282
+ const registry = new EnvironmentRegistry(this.autospecDir);
283
+ registry.load();
284
+
285
+ for (const item of detected) {
286
+ // 检查是否已注册
287
+ const existing = registry.find('middleware', item.name);
288
+
289
+ if (!existing) {
290
+ // 自动注册
291
+ registry.register('middleware', {
292
+ name: item.name,
293
+ path: `env-knowledge/middleware/${item.name}.yaml`,
294
+ version: '1.0.0',
295
+ autoDetected: true,
296
+ detectedAt: new Date().toISOString(),
297
+ evidence: item.evidence?.slice(0, 3),
298
+ });
299
+ }
300
+
301
+ // 自动激活
302
+ if (!registry.isActive('middleware', item.name)) {
303
+ registry.activate('middleware', item.name);
304
+ activated.push(item.name);
305
+ }
306
+ }
307
+
308
+ registry.save();
309
+
310
+ return {
311
+ detected: detected.map(d => d.name),
312
+ activated,
313
+ };
314
+ }
315
+
316
+ /**
317
+ * 加载现有中间件知识
318
+ */
319
+ loadExistingMiddlewareKnowledge() {
320
+ const knowledge = [];
321
+ const middlewareDir = path.join(this.envDir, 'env-knowledge/middleware');
322
+
323
+ if (!fs.existsSync(middlewareDir)) {
324
+ return knowledge;
325
+ }
326
+
327
+ const files = fs.readdirSync(middlewareDir, { withFileTypes: true });
328
+
329
+ for (const file of files) {
330
+ if (file.isFile() && (file.name.endsWith('.yaml') || file.name.endsWith('.yml'))) {
331
+ try {
332
+ const content = fs.readFileSync(path.join(middlewareDir, file.name), 'utf-8');
333
+ knowledge.push(yaml.load(content));
334
+ } catch (e) {
335
+ // 忽略解析错误
336
+ }
337
+ }
338
+ }
339
+
340
+ return knowledge;
341
+ }
342
+
343
+ /**
344
+ * 加载现有组件
345
+ */
346
+ loadExistingComponents() {
347
+ const components = [];
348
+ const componentsDir = path.join(this.envDir, 'component-lib/components');
349
+
350
+ if (!fs.existsSync(componentsDir)) {
351
+ return components;
352
+ }
353
+
354
+ const dirs = fs.readdirSync(componentsDir, { withFileTypes: true });
355
+
356
+ for (const dir of dirs) {
357
+ if (dir.isDirectory()) {
358
+ const componentFile = path.join(componentsDir, dir.name, 'component.yaml');
359
+ if (fs.existsSync(componentFile)) {
360
+ try {
361
+ const content = fs.readFileSync(componentFile, 'utf-8');
362
+ components.push(yaml.load(content));
363
+ } catch (e) {
364
+ // 忽略解析错误
365
+ }
366
+ }
367
+ }
368
+ }
369
+
370
+ return components;
371
+ }
372
+
373
+ /**
374
+ * 加载实践日志
375
+ */
376
+ loadPracticeLogs() {
377
+ const logs = [];
378
+
379
+ if (!fs.existsSync(this.practiceLogDir)) {
380
+ return logs;
381
+ }
382
+
383
+ const files = fs.readdirSync(this.practiceLogDir, { withFileTypes: true });
384
+
385
+ for (const file of files) {
386
+ if (file.isFile() && file.name.endsWith('.md')) {
387
+ try {
388
+ const content = fs.readFileSync(path.join(this.practiceLogDir, file.name), 'utf-8');
389
+ logs.push({
390
+ file: file.name,
391
+ content: content,
392
+ });
393
+ } catch (e) {
394
+ // 忽略读取错误
395
+ }
396
+ }
397
+ }
398
+
399
+ return logs;
400
+ }
401
+
402
+ /**
403
+ * 从实践日志提取使用模式
404
+ */
405
+ extractUsagePatterns(logs) {
406
+ const patterns = [];
407
+
408
+ // 简单的模式提取逻辑
409
+ for (const log of logs) {
410
+ // 查找重复的代码模式或配置模式
411
+ const codeBlocks = log.content.match(/```[\s\S]*?```/g) || [];
412
+
413
+ for (const block of codeBlocks) {
414
+ // 提取关键模式
415
+ const matches = block.match(/(?:import|require|from)\s+['"]([^'"]+)['"]/g);
416
+ if (matches) {
417
+ for (const match of matches) {
418
+ const moduleName = match.match(/['"]([^'"]+)['"]/)?.[1];
419
+ if (moduleName && !moduleName.startsWith('.')) {
420
+ patterns.push({
421
+ name: moduleName,
422
+ evidence: log.file,
423
+ suggestedDefinition: null,
424
+ });
425
+ }
426
+ }
427
+ }
428
+ }
429
+ }
430
+
431
+ return patterns;
432
+ }
433
+
434
+ /**
435
+ * 统计模式出现次数
436
+ */
437
+ countPatternOccurrences(logs, pattern) {
438
+ let count = 0;
439
+
440
+ for (const log of logs) {
441
+ if (log.content.includes(pattern.name)) {
442
+ count++;
443
+ }
444
+ }
445
+
446
+ return count;
447
+ }
448
+
449
+ /**
450
+ * 生成进化提案
451
+ */
452
+ async generateEvolutionProposals(patterns) {
453
+ const proposals = [];
454
+
455
+ for (const middleware of patterns.middleware || []) {
456
+ const proposal = {
457
+ id: uuidv4(),
458
+ timestamp: new Date().toISOString(),
459
+ type: 'environment-knowledge',
460
+ subType: 'middleware',
461
+ action: 'create',
462
+ zone: middleware.zone,
463
+ target: `env-knowledge/middleware/${middleware.name}.yaml`,
464
+ content: yaml.dump(middleware.suggestedConfig, { lineWidth: -1 }),
465
+ evidence: middleware.evidence,
466
+ status: middleware.zone === KNOWLEDGE_ZONES.CONTROLLED ? 'pending-approval' : 'pending-validation',
467
+ };
468
+
469
+ proposals.push(proposal);
470
+ }
471
+
472
+ for (const component of patterns.components || []) {
473
+ const proposal = {
474
+ id: uuidv4(),
475
+ timestamp: new Date().toISOString(),
476
+ type: 'environment-knowledge',
477
+ subType: 'component',
478
+ action: 'create',
479
+ zone: component.zone,
480
+ target: `component-lib/components/${component.name}/component.yaml`,
481
+ content: yaml.dump(component.suggestedDefinition || this.generateDefaultComponentConfig(component), { lineWidth: -1 }),
482
+ evidence: component.evidence,
483
+ occurrences: component.occurrences,
484
+ status: component.zone === KNOWLEDGE_ZONES.CONTROLLED ? 'pending-approval' : 'pending-validation',
485
+ };
486
+
487
+ proposals.push(proposal);
488
+ }
489
+
490
+ // 写入提案文件
491
+ for (const proposal of proposals) {
492
+ const proposalPath = path.join(this.proposalsDir, `env-${proposal.id}.json`);
493
+ fs.writeFileSync(proposalPath, JSON.stringify(proposal, null, 2));
494
+ }
495
+
496
+ return proposals;
497
+ }
498
+
499
+ /**
500
+ * 生成默认组件配置
501
+ */
502
+ generateDefaultComponentConfig(component) {
503
+ return {
504
+ apiVersion: 'autospec/v1',
505
+ kind: KNOWLEDGE_TYPES.COMPONENT,
506
+ meta: {
507
+ name: component.name,
508
+ version: '1.0',
509
+ },
510
+ spec: {
511
+ type: 'utility',
512
+ description: `从实践中发现的 ${component.name} 组件使用模式`,
513
+ usage: {},
514
+ configuration: {
515
+ required: [],
516
+ optional: [],
517
+ },
518
+ },
519
+ };
520
+ }
521
+
522
+ /**
523
+ * 执行进化(自由区自动执行)
524
+ */
525
+ async executeEvolution(proposal) {
526
+ if (proposal.zone === KNOWLEDGE_ZONES.CONTROLLED) {
527
+ throw new Error('受控区进化需要人工批准');
528
+ }
529
+
530
+ const targetPath = path.join(this.envDir, proposal.target);
531
+ const dir = path.dirname(targetPath);
532
+
533
+ if (!fs.existsSync(dir)) {
534
+ fs.mkdirSync(dir, { recursive: true });
535
+ }
536
+
537
+ fs.writeFileSync(targetPath, proposal.content);
538
+
539
+ return { success: true, path: targetPath };
540
+ }
541
+
542
+ /**
543
+ * 执行完整的进化扫描
544
+ */
545
+ async runEvolutionScan() {
546
+ const middlewarePatterns = await this.detectNewMiddlewarePatterns();
547
+ const componentPatterns = await this.detectNewComponentPatterns();
548
+
549
+ const proposals = await this.generateEvolutionProposals({
550
+ middleware: middlewarePatterns,
551
+ components: componentPatterns,
552
+ });
553
+
554
+ return {
555
+ patterns: {
556
+ middleware: middlewarePatterns,
557
+ components: componentPatterns,
558
+ },
559
+ proposals: proposals,
560
+ };
561
+ }
562
+ }
563
+
564
+ export default EnvironmentEvolver;