agentic-qe 1.0.4 → 1.1.0

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 (197) hide show
  1. package/.claude/agents/qe-quality-analyzer.md +405 -0
  2. package/CHANGELOG.md +109 -0
  3. package/CONTRIBUTING.md +51 -0
  4. package/README.md +690 -134
  5. package/bin/aqe +90 -938
  6. package/dist/adapters/MemoryStoreAdapter.d.ts.map +1 -1
  7. package/dist/adapters/MemoryStoreAdapter.js +6 -0
  8. package/dist/adapters/MemoryStoreAdapter.js.map +1 -1
  9. package/dist/agents/CoverageAnalyzerAgent.d.ts +58 -3
  10. package/dist/agents/CoverageAnalyzerAgent.d.ts.map +1 -1
  11. package/dist/agents/CoverageAnalyzerAgent.js +316 -48
  12. package/dist/agents/CoverageAnalyzerAgent.js.map +1 -1
  13. package/dist/agents/FlakyTestHunterAgent.d.ts +48 -4
  14. package/dist/agents/FlakyTestHunterAgent.d.ts.map +1 -1
  15. package/dist/agents/FlakyTestHunterAgent.js +217 -10
  16. package/dist/agents/FlakyTestHunterAgent.js.map +1 -1
  17. package/dist/agents/LearningAgent.d.ts +75 -0
  18. package/dist/agents/LearningAgent.d.ts.map +1 -0
  19. package/dist/agents/LearningAgent.js +177 -0
  20. package/dist/agents/LearningAgent.js.map +1 -0
  21. package/dist/agents/TestGeneratorAgent.d.ts +42 -2
  22. package/dist/agents/TestGeneratorAgent.d.ts.map +1 -1
  23. package/dist/agents/TestGeneratorAgent.js +232 -13
  24. package/dist/agents/TestGeneratorAgent.js.map +1 -1
  25. package/dist/cli/commands/improve/index.d.ts +70 -0
  26. package/dist/cli/commands/improve/index.d.ts.map +1 -0
  27. package/dist/cli/commands/improve/index.js +530 -0
  28. package/dist/cli/commands/improve/index.js.map +1 -0
  29. package/dist/cli/commands/init.d.ts +34 -0
  30. package/dist/cli/commands/init.d.ts.map +1 -1
  31. package/dist/cli/commands/init.js +875 -42
  32. package/dist/cli/commands/init.js.map +1 -1
  33. package/dist/cli/commands/learn/index.d.ts +68 -0
  34. package/dist/cli/commands/learn/index.d.ts.map +1 -0
  35. package/dist/cli/commands/learn/index.js +431 -0
  36. package/dist/cli/commands/learn/index.js.map +1 -0
  37. package/dist/cli/commands/patterns/index.d.ts +75 -0
  38. package/dist/cli/commands/patterns/index.d.ts.map +1 -0
  39. package/dist/cli/commands/patterns/index.js +502 -0
  40. package/dist/cli/commands/patterns/index.js.map +1 -0
  41. package/dist/cli/commands/routing/index.d.ts +95 -0
  42. package/dist/cli/commands/routing/index.d.ts.map +1 -0
  43. package/dist/cli/commands/routing/index.js +399 -0
  44. package/dist/cli/commands/routing/index.js.map +1 -0
  45. package/dist/cli/index.js +455 -8
  46. package/dist/cli/index.js.map +1 -1
  47. package/dist/core/memory/SwarmMemoryManager.d.ts +5 -0
  48. package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
  49. package/dist/core/memory/SwarmMemoryManager.js +7 -0
  50. package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
  51. package/dist/core/routing/AdaptiveModelRouter.d.ts +86 -0
  52. package/dist/core/routing/AdaptiveModelRouter.d.ts.map +1 -0
  53. package/dist/core/routing/AdaptiveModelRouter.js +264 -0
  54. package/dist/core/routing/AdaptiveModelRouter.js.map +1 -0
  55. package/dist/core/routing/ComplexityAnalyzer.d.ts +49 -0
  56. package/dist/core/routing/ComplexityAnalyzer.d.ts.map +1 -0
  57. package/dist/core/routing/ComplexityAnalyzer.js +182 -0
  58. package/dist/core/routing/ComplexityAnalyzer.js.map +1 -0
  59. package/dist/core/routing/CostTracker.d.ts +55 -0
  60. package/dist/core/routing/CostTracker.d.ts.map +1 -0
  61. package/dist/core/routing/CostTracker.js +210 -0
  62. package/dist/core/routing/CostTracker.js.map +1 -0
  63. package/dist/core/routing/FleetManagerIntegration.d.ts +68 -0
  64. package/dist/core/routing/FleetManagerIntegration.d.ts.map +1 -0
  65. package/dist/core/routing/FleetManagerIntegration.js +170 -0
  66. package/dist/core/routing/FleetManagerIntegration.js.map +1 -0
  67. package/dist/core/routing/ModelRules.d.ts +38 -0
  68. package/dist/core/routing/ModelRules.d.ts.map +1 -0
  69. package/dist/core/routing/ModelRules.js +170 -0
  70. package/dist/core/routing/ModelRules.js.map +1 -0
  71. package/dist/core/routing/QETask.d.ts +12 -0
  72. package/dist/core/routing/QETask.d.ts.map +1 -0
  73. package/dist/core/routing/QETask.js +21 -0
  74. package/dist/core/routing/QETask.js.map +1 -0
  75. package/dist/core/routing/index.d.ts +19 -0
  76. package/dist/core/routing/index.d.ts.map +1 -0
  77. package/dist/core/routing/index.js +50 -0
  78. package/dist/core/routing/index.js.map +1 -0
  79. package/dist/core/routing/types.d.ts +136 -0
  80. package/dist/core/routing/types.d.ts.map +1 -0
  81. package/dist/core/routing/types.js +28 -0
  82. package/dist/core/routing/types.js.map +1 -0
  83. package/dist/index.d.ts +10 -0
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +10 -0
  86. package/dist/index.js.map +1 -1
  87. package/dist/learning/FlakyFixRecommendations.d.ts +40 -0
  88. package/dist/learning/FlakyFixRecommendations.d.ts.map +1 -0
  89. package/dist/learning/FlakyFixRecommendations.js +247 -0
  90. package/dist/learning/FlakyFixRecommendations.js.map +1 -0
  91. package/dist/learning/FlakyPredictionModel.d.ts +57 -0
  92. package/dist/learning/FlakyPredictionModel.d.ts.map +1 -0
  93. package/dist/learning/FlakyPredictionModel.js +289 -0
  94. package/dist/learning/FlakyPredictionModel.js.map +1 -0
  95. package/dist/learning/FlakyTestDetector.d.ts +46 -0
  96. package/dist/learning/FlakyTestDetector.d.ts.map +1 -0
  97. package/dist/learning/FlakyTestDetector.js +215 -0
  98. package/dist/learning/FlakyTestDetector.js.map +1 -0
  99. package/dist/learning/ImprovementLoop.d.ts +119 -0
  100. package/dist/learning/ImprovementLoop.d.ts.map +1 -0
  101. package/dist/learning/ImprovementLoop.js +353 -0
  102. package/dist/learning/ImprovementLoop.js.map +1 -0
  103. package/dist/learning/LearningEngine.d.ts +144 -0
  104. package/dist/learning/LearningEngine.d.ts.map +1 -0
  105. package/dist/learning/LearningEngine.js +531 -0
  106. package/dist/learning/LearningEngine.js.map +1 -0
  107. package/dist/learning/PerformanceTracker.d.ts +118 -0
  108. package/dist/learning/PerformanceTracker.d.ts.map +1 -0
  109. package/dist/learning/PerformanceTracker.js +376 -0
  110. package/dist/learning/PerformanceTracker.js.map +1 -0
  111. package/dist/learning/StatisticalAnalysis.d.ts +47 -0
  112. package/dist/learning/StatisticalAnalysis.d.ts.map +1 -0
  113. package/dist/learning/StatisticalAnalysis.js +170 -0
  114. package/dist/learning/StatisticalAnalysis.js.map +1 -0
  115. package/dist/learning/SwarmIntegration.d.ts +107 -0
  116. package/dist/learning/SwarmIntegration.d.ts.map +1 -0
  117. package/dist/learning/SwarmIntegration.js +191 -0
  118. package/dist/learning/SwarmIntegration.js.map +1 -0
  119. package/dist/learning/index.d.ts +10 -0
  120. package/dist/learning/index.d.ts.map +1 -0
  121. package/dist/learning/index.js +16 -0
  122. package/dist/learning/index.js.map +1 -0
  123. package/dist/learning/types.d.ts +288 -0
  124. package/dist/learning/types.d.ts.map +1 -0
  125. package/dist/learning/types.js +9 -0
  126. package/dist/learning/types.js.map +1 -0
  127. package/dist/mcp/handlers/phase2/Phase2Tools.d.ts +175 -0
  128. package/dist/mcp/handlers/phase2/Phase2Tools.d.ts.map +1 -0
  129. package/dist/mcp/handlers/phase2/Phase2Tools.js +693 -0
  130. package/dist/mcp/handlers/phase2/Phase2Tools.js.map +1 -0
  131. package/dist/mcp/server.d.ts.map +1 -1
  132. package/dist/mcp/server.js +171 -9
  133. package/dist/mcp/server.js.map +1 -1
  134. package/dist/mcp/streaming/CoverageAnalyzeStreamHandler.d.ts +112 -0
  135. package/dist/mcp/streaming/CoverageAnalyzeStreamHandler.d.ts.map +1 -0
  136. package/dist/mcp/streaming/CoverageAnalyzeStreamHandler.js +341 -0
  137. package/dist/mcp/streaming/CoverageAnalyzeStreamHandler.js.map +1 -0
  138. package/dist/mcp/streaming/StreamingMCPTool.d.ts +80 -0
  139. package/dist/mcp/streaming/StreamingMCPTool.d.ts.map +1 -0
  140. package/dist/mcp/streaming/StreamingMCPTool.js +276 -0
  141. package/dist/mcp/streaming/StreamingMCPTool.js.map +1 -0
  142. package/dist/mcp/streaming/TestExecuteStreamHandler.d.ts +73 -0
  143. package/dist/mcp/streaming/TestExecuteStreamHandler.d.ts.map +1 -0
  144. package/dist/mcp/streaming/TestExecuteStreamHandler.js +436 -0
  145. package/dist/mcp/streaming/TestExecuteStreamHandler.js.map +1 -0
  146. package/dist/mcp/streaming/index.d.ts +14 -0
  147. package/dist/mcp/streaming/index.d.ts.map +1 -0
  148. package/dist/mcp/streaming/index.js +30 -0
  149. package/dist/mcp/streaming/index.js.map +1 -0
  150. package/dist/mcp/streaming/types.d.ts +117 -0
  151. package/dist/mcp/streaming/types.d.ts.map +1 -0
  152. package/dist/mcp/streaming/types.js +88 -0
  153. package/dist/mcp/streaming/types.js.map +1 -0
  154. package/dist/mcp/tools.d.ts +18 -1
  155. package/dist/mcp/tools.d.ts.map +1 -1
  156. package/dist/mcp/tools.js +123 -1
  157. package/dist/mcp/tools.js.map +1 -1
  158. package/dist/reasoning/CodeSignatureGenerator.d.ts +98 -0
  159. package/dist/reasoning/CodeSignatureGenerator.d.ts.map +1 -0
  160. package/dist/reasoning/CodeSignatureGenerator.js +427 -0
  161. package/dist/reasoning/CodeSignatureGenerator.js.map +1 -0
  162. package/dist/reasoning/PatternClassifier.d.ts +98 -0
  163. package/dist/reasoning/PatternClassifier.d.ts.map +1 -0
  164. package/dist/reasoning/PatternClassifier.js +345 -0
  165. package/dist/reasoning/PatternClassifier.js.map +1 -0
  166. package/dist/reasoning/PatternExtractor.d.ts +131 -0
  167. package/dist/reasoning/PatternExtractor.d.ts.map +1 -0
  168. package/dist/reasoning/PatternExtractor.js +539 -0
  169. package/dist/reasoning/PatternExtractor.js.map +1 -0
  170. package/dist/reasoning/PatternMemoryIntegration.d.ts +102 -0
  171. package/dist/reasoning/PatternMemoryIntegration.d.ts.map +1 -0
  172. package/dist/reasoning/PatternMemoryIntegration.js +336 -0
  173. package/dist/reasoning/PatternMemoryIntegration.js.map +1 -0
  174. package/dist/reasoning/QEReasoningBank.d.ts +121 -0
  175. package/dist/reasoning/QEReasoningBank.d.ts.map +1 -0
  176. package/dist/reasoning/QEReasoningBank.js +235 -0
  177. package/dist/reasoning/QEReasoningBank.js.map +1 -0
  178. package/dist/reasoning/TestTemplateCreator.d.ts +95 -0
  179. package/dist/reasoning/TestTemplateCreator.d.ts.map +1 -0
  180. package/dist/reasoning/TestTemplateCreator.js +535 -0
  181. package/dist/reasoning/TestTemplateCreator.js.map +1 -0
  182. package/dist/reasoning/index.d.ts +10 -0
  183. package/dist/reasoning/index.d.ts.map +1 -0
  184. package/dist/reasoning/index.js +31 -0
  185. package/dist/reasoning/index.js.map +1 -0
  186. package/dist/reasoning/types.d.ts +717 -0
  187. package/dist/reasoning/types.d.ts.map +1 -0
  188. package/dist/reasoning/types.js +57 -0
  189. package/dist/reasoning/types.js.map +1 -0
  190. package/dist/types/index.d.ts +20 -1
  191. package/dist/types/index.d.ts.map +1 -1
  192. package/dist/types/index.js.map +1 -1
  193. package/dist/types/pattern.types.d.ts +364 -0
  194. package/dist/types/pattern.types.d.ts.map +1 -0
  195. package/dist/types/pattern.types.js +60 -0
  196. package/dist/types/pattern.types.js.map +1 -0
  197. package/package.json +25 -3
@@ -44,7 +44,7 @@ const fs = __importStar(require("fs-extra"));
44
44
  const path = __importStar(require("path"));
45
45
  class InitCommand {
46
46
  static async execute(options) {
47
- console.log(chalk_1.default.blue.bold('\n🚀 Initializing Agentic QE Fleet\n'));
47
+ console.log(chalk_1.default.blue.bold('\n🚀 Initializing Agentic QE Project (v1.1.0)\n'));
48
48
  try {
49
49
  // Parse options
50
50
  const maxAgents = parseInt(options.maxAgents);
@@ -68,7 +68,21 @@ class InitCommand {
68
68
  maxAgents,
69
69
  testingFocus,
70
70
  environments,
71
- frameworks
71
+ frameworks,
72
+ routing: {
73
+ enabled: false, // Disabled by default for safe rollout
74
+ defaultModel: 'claude-sonnet-4.5',
75
+ enableCostTracking: true,
76
+ enableFallback: true,
77
+ maxRetries: 3,
78
+ costThreshold: 0.5
79
+ },
80
+ streaming: {
81
+ enabled: true, // Enabled by default
82
+ progressInterval: 2000,
83
+ bufferEvents: false,
84
+ timeout: 1800000
85
+ }
72
86
  };
73
87
  // Interactive project setup if needed
74
88
  if (!options.config) {
@@ -98,6 +112,18 @@ class InitCommand {
98
112
  name: 'setupCi',
99
113
  message: 'Setup CI/CD integration?',
100
114
  default: true
115
+ },
116
+ {
117
+ type: 'confirm',
118
+ name: 'enableRouting',
119
+ message: 'Enable Multi-Model Router for cost optimization? (70-81% savings)',
120
+ default: false
121
+ },
122
+ {
123
+ type: 'confirm',
124
+ name: 'enableStreaming',
125
+ message: 'Enable streaming progress updates for long-running operations?',
126
+ default: true
101
127
  }
102
128
  ]);
103
129
  fleetConfig.project = {
@@ -105,6 +131,23 @@ class InitCommand {
105
131
  path: process.cwd(),
106
132
  language: projectAnswers.language.toLowerCase()
107
133
  };
134
+ // Update routing/streaming config based on user answers
135
+ if (fleetConfig.routing) {
136
+ fleetConfig.routing.enabled = projectAnswers.enableRouting;
137
+ }
138
+ if (fleetConfig.streaming) {
139
+ fleetConfig.streaming.enabled = projectAnswers.enableStreaming;
140
+ }
141
+ // Enable Phase 2 features by default (no questions)
142
+ options.enableLearning = true;
143
+ options.enablePatterns = true;
144
+ options.enableImprovement = true;
145
+ }
146
+ else {
147
+ // Use defaults if non-interactive
148
+ options.enableLearning = true;
149
+ options.enablePatterns = true;
150
+ options.enableImprovement = true;
108
151
  }
109
152
  const spinner = (0, ora_1.default)('Setting up fleet infrastructure...').start();
110
153
  // Create directory structure
@@ -120,8 +163,28 @@ class InitCommand {
120
163
  spinner.text = 'Creating CLAUDE.md documentation...';
121
164
  // Create or update CLAUDE.md with agent documentation
122
165
  await this.createClaudeMd(fleetConfig);
166
+ // Initialize Claude Flow coordination
167
+ await this.initializeCoordination(fleetConfig);
168
+ // Phase 2: Initialize memory database FIRST (required for agents)
169
+ spinner.text = 'Initializing memory database...';
170
+ await this.initializeMemoryDatabase();
171
+ // Phase 2: Initialize pattern bank database
172
+ if (options.enablePatterns !== false) {
173
+ spinner.text = 'Initializing pattern bank database...';
174
+ await this.initializePatternDatabase(fleetConfig);
175
+ }
176
+ // Phase 2: Initialize learning system
177
+ if (options.enableLearning !== false) {
178
+ spinner.text = 'Initializing learning system...';
179
+ await this.initializeLearningSystem(fleetConfig);
180
+ }
181
+ // Phase 2: Initialize improvement loop
182
+ if (options.enableImprovement !== false) {
183
+ spinner.text = 'Setting up improvement loop...';
184
+ await this.initializeImprovementLoop(fleetConfig);
185
+ }
186
+ // Now spawn agents AFTER databases are initialized
123
187
  spinner.text = 'Spawning initial agents...';
124
- // Spawn initial fleet agents
125
188
  await this.spawnInitialAgents(fleetConfig);
126
189
  spinner.succeed(chalk_1.default.green('Fleet initialization completed successfully!'));
127
190
  // Display summary
@@ -134,19 +197,25 @@ class InitCommand {
134
197
  // Show agent status
135
198
  const agentCount = await this.countAgentFiles('.claude/agents');
136
199
  console.log(chalk_1.default.gray(` Agent Definitions: ${agentCount} agents ready`));
137
- console.log(chalk_1.default.yellow('\n💡 Next Steps:'));
138
- console.log(chalk_1.default.gray(' 1. View agents: ls .claude/agents/'));
139
- console.log(chalk_1.default.gray(' 2. Generate tests: aqe test <module-name>'));
140
- console.log(chalk_1.default.gray(' 3. Run tests: aqe run tests --parallel'));
141
- console.log(chalk_1.default.gray(' 4. Monitor fleet: aqe status --verbose'));
142
- // Initialize Claude Flow coordination
143
- await this.initializeCoordination(fleetConfig);
200
+ // Create comprehensive config.json
201
+ spinner.text = 'Creating comprehensive configuration...';
202
+ await this.createComprehensiveConfig(fleetConfig, {
203
+ enableLearning: options.enableLearning !== false,
204
+ enablePatterns: options.enablePatterns !== false,
205
+ enableImprovement: options.enableImprovement !== false
206
+ });
207
+ spinner.succeed(chalk_1.default.green('Project initialization completed successfully!'));
208
+ // Display comprehensive summary
209
+ await this.displayComprehensiveSummary(fleetConfig, {
210
+ enableLearning: options.enableLearning !== false,
211
+ enablePatterns: options.enablePatterns !== false,
212
+ enableImprovement: options.enableImprovement !== false
213
+ });
144
214
  }
145
215
  catch (error) {
146
216
  console.error(chalk_1.default.red('❌ Initialization failed:'), error.message);
147
- if (options.verbose) {
148
- console.error(chalk_1.default.gray(error.stack));
149
- }
217
+ console.error(chalk_1.default.gray('\nStack trace:'));
218
+ console.error(chalk_1.default.gray(error.stack));
150
219
  process.exit(1);
151
220
  }
152
221
  }
@@ -156,8 +225,14 @@ class InitCommand {
156
225
  '.agentic-qe/config',
157
226
  '.agentic-qe/logs',
158
227
  '.agentic-qe/data',
228
+ '.agentic-qe/data/learning', // Phase 2: Learning state
229
+ '.agentic-qe/data/patterns', // Phase 2: Pattern database
230
+ '.agentic-qe/data/improvement', // Phase 2: Improvement state
159
231
  '.agentic-qe/agents',
160
232
  '.agentic-qe/reports',
233
+ '.agentic-qe/scripts', // For coordination scripts
234
+ '.agentic-qe/state', // For state management
235
+ '.agentic-qe/state/coordination', // Coordination state
161
236
  '.claude', // For Claude Code integration
162
237
  '.claude/agents', // Where agent definitions live
163
238
  'tests/unit',
@@ -173,47 +248,102 @@ class InitCommand {
173
248
  await this.copyAgentTemplates();
174
249
  }
175
250
  static async copyAgentTemplates() {
251
+ console.log(chalk_1.default.cyan(' 🔍 Searching for agent templates...'));
176
252
  // Find the agentic-qe package location (handles both npm install and local dev)
177
253
  const possiblePaths = [
178
254
  path.join(__dirname, '../../../.claude/agents'), // From dist/cli/commands
179
255
  path.join(process.cwd(), 'node_modules/agentic-qe/.claude/agents'),
180
256
  path.join(process.cwd(), '../agentic-qe/.claude/agents') // Monorepo case
181
257
  ];
258
+ console.log(chalk_1.default.gray(' • Checking paths:'));
182
259
  let sourcePath = null;
183
260
  for (const p of possiblePaths) {
184
- if (await fs.pathExists(p)) {
261
+ const exists = await fs.pathExists(p);
262
+ console.log(chalk_1.default.gray(` ${exists ? '✓' : '✗'} ${p}`));
263
+ if (exists && !sourcePath) {
185
264
  sourcePath = p;
186
- break;
187
265
  }
188
266
  }
189
267
  if (!sourcePath) {
190
- console.warn(chalk_1.default.yellow('⚠️ Could not find agent templates, creating basic agents'));
268
+ console.warn(chalk_1.default.yellow(' ⚠️ No agent templates found in package paths'));
269
+ console.warn(chalk_1.default.yellow(' ℹ️ Falling back to programmatic generation (all 18 agents)'));
191
270
  await this.createBasicAgents();
192
271
  return;
193
272
  }
194
- // Copy all agent definition files
273
+ console.log(chalk_1.default.green(` ✓ Found agent templates at: ${sourcePath}`));
274
+ // Count available templates
275
+ const availableFiles = await fs.readdir(sourcePath);
276
+ const templateFiles = availableFiles.filter(f => f.endsWith('.md'));
277
+ console.log(chalk_1.default.cyan(` 📦 Found ${templateFiles.length} agent templates to copy`));
278
+ // Copy all agent definition files individually (not directory copy)
195
279
  const targetPath = path.join(process.cwd(), '.claude/agents');
196
- await fs.copy(sourcePath, targetPath, {
197
- overwrite: false, // Don't overwrite existing agent definitions
198
- filter: (src) => src.endsWith('.md') // Only copy markdown agent files
199
- });
200
- console.log(chalk_1.default.green(`✓ Copied ${await this.countAgentFiles(targetPath)} agent definitions`));
280
+ let copiedFiles = 0;
281
+ for (const templateFile of templateFiles) {
282
+ const sourceFile = path.join(sourcePath, templateFile);
283
+ const targetFile = path.join(targetPath, templateFile);
284
+ // Only copy if target doesn't exist
285
+ if (!await fs.pathExists(targetFile)) {
286
+ await fs.copy(sourceFile, targetFile);
287
+ copiedFiles++;
288
+ }
289
+ }
290
+ console.log(chalk_1.default.green(` ✓ Copied ${copiedFiles} new agent definitions`));
291
+ const copiedCount = await this.countAgentFiles(targetPath);
292
+ console.log(chalk_1.default.cyan(` 📋 Total agents in target: ${copiedCount}`));
293
+ // Verify all 18 agents exist (17 QE agents + 1 base template generator)
294
+ const expectedAgents = 18;
295
+ if (copiedCount < expectedAgents) {
296
+ console.warn(chalk_1.default.yellow(` ⚠️ Expected ${expectedAgents} agents, found ${copiedCount}`));
297
+ console.warn(chalk_1.default.yellow(` ℹ️ Creating missing agents programmatically...`));
298
+ // Get list of files that actually exist in TARGET (not source!)
299
+ const targetFiles = await fs.readdir(targetPath);
300
+ const existingTargetFiles = targetFiles.filter(f => f.endsWith('.md'));
301
+ await this.createMissingAgents(targetPath, existingTargetFiles);
302
+ }
303
+ else {
304
+ console.log(chalk_1.default.green(` ✓ All ${expectedAgents} agents present and ready`));
305
+ }
201
306
  }
202
307
  static async createBasicAgents() {
203
- // Fallback: Create basic agent templates if package agents not found
204
- const basicAgents = [
205
- 'qe-test-generator',
206
- 'qe-test-executor',
207
- 'qe-coverage-analyzer',
208
- 'qe-quality-gate',
209
- 'qe-performance-tester',
210
- 'qe-security-scanner'
211
- ];
212
- const targetPath = path.join(process.cwd(), '.claude/agents');
213
- for (const agentName of basicAgents) {
214
- const agentFile = path.join(targetPath, `${agentName}.md`);
215
- const agentType = agentName.replace('qe-', '');
216
- const content = `---
308
+ try {
309
+ console.log(chalk_1.default.cyan(' 🛠️ Creating all agent definitions programmatically...'));
310
+ // ALL 18 AGENTS (17 QE agents + 1 base template generator)
311
+ const allAgents = [
312
+ // Core Testing (5)
313
+ 'qe-test-generator',
314
+ 'qe-test-executor',
315
+ 'qe-coverage-analyzer',
316
+ 'qe-quality-gate',
317
+ 'qe-quality-analyzer',
318
+ // Performance & Security (2)
319
+ 'qe-performance-tester',
320
+ 'qe-security-scanner',
321
+ // Strategic Planning (3)
322
+ 'qe-requirements-validator',
323
+ 'qe-production-intelligence',
324
+ 'qe-fleet-commander',
325
+ // Deployment (1)
326
+ 'qe-deployment-readiness',
327
+ // Advanced Testing (4)
328
+ 'qe-regression-risk-analyzer',
329
+ 'qe-test-data-architect',
330
+ 'qe-api-contract-validator',
331
+ 'qe-flaky-test-hunter',
332
+ // Specialized (2)
333
+ 'qe-visual-tester',
334
+ 'qe-chaos-engineer'
335
+ ];
336
+ const targetPath = path.join(process.cwd(), '.claude/agents');
337
+ console.log(chalk_1.default.gray(` • Creating ${allAgents.length} agent definition files...`));
338
+ for (const agentName of allAgents) {
339
+ // Defensive null check
340
+ if (!agentName || typeof agentName !== 'string') {
341
+ console.warn(chalk_1.default.yellow(`⚠️ Skipping invalid agent name: ${agentName}`));
342
+ continue;
343
+ }
344
+ const agentFile = path.join(targetPath, `${agentName}.md`);
345
+ const agentType = agentName.replace('qe-', '');
346
+ const content = `---
217
347
  name: ${agentName}
218
348
  type: ${agentType}
219
349
  color: blue
@@ -224,8 +354,10 @@ capabilities:
224
354
  coordination:
225
355
  protocol: aqe-hooks
226
356
  metadata:
227
- version: "1.0.2"
357
+ version: "1.0.5"
228
358
  framework: "agentic-qe"
359
+ routing: "supported"
360
+ streaming: "supported"
229
361
  ---
230
362
 
231
363
  # ${agentName.toUpperCase()} Agent
@@ -338,10 +470,110 @@ This agent coordinates with other QE Fleet agents through:
338
470
  - **EventBus**: Event-driven communication
339
471
  - **Fleet Manager**: Lifecycle management
340
472
 
473
+ ## 💰 Cost Optimization (v1.0.5)
474
+
475
+ This agent supports the **Multi-Model Router** for intelligent model selection and cost savings.
476
+
477
+ **Routing Status**: Check \\\`.agentic-qe/config/routing.json\\\`
478
+
479
+ If routing is enabled, this agent will automatically use the most cost-effective model for each task:
480
+ - Simple tasks → GPT-3.5 (cheapest)
481
+ - Complex tasks → GPT-4 (balanced)
482
+ - Critical tasks → Claude Sonnet 4.5 (best quality)
483
+
484
+ **No code changes required** - routing is transparent infrastructure.
485
+
486
+ ## 📊 Streaming Support (v1.0.5)
487
+
488
+ This agent supports **streaming progress updates** for real-time visibility.
489
+
490
+ When using streaming MCP tools, you'll see:
491
+ - Real-time progress percentage
492
+ - Current operation status
493
+ - Incremental results
494
+
495
+ **Example**:
496
+ \\\`\\\`\\\`javascript
497
+ for await (const event of agent.execute(params)) {
498
+ console.log(\\\`\\\${event.percent}% - \\\${event.message}\\\`);
499
+ }
500
+ \\\`\\\`\\\`
501
+
502
+ For full capabilities, install the complete agentic-qe package.
503
+ `;
504
+ await fs.writeFile(agentFile, content);
505
+ console.log(chalk_1.default.gray(` ✓ Created ${agentName}.md`));
506
+ }
507
+ const finalCount = await this.countAgentFiles(targetPath);
508
+ console.log(chalk_1.default.green(` ✓ Successfully created ${finalCount} agent definitions`));
509
+ }
510
+ catch (error) {
511
+ console.error(chalk_1.default.red('❌ Error in createBasicAgents:'), error.message);
512
+ console.error(chalk_1.default.gray('Stack trace:'), error.stack);
513
+ throw error;
514
+ }
515
+ }
516
+ static async createMissingAgents(targetPath, existingFiles) {
517
+ const allAgentNames = [
518
+ 'qe-test-generator', 'qe-test-executor', 'qe-coverage-analyzer',
519
+ 'qe-quality-gate', 'qe-quality-analyzer', 'qe-performance-tester',
520
+ 'qe-security-scanner', 'qe-requirements-validator', 'qe-production-intelligence',
521
+ 'qe-fleet-commander', 'qe-deployment-readiness', 'qe-regression-risk-analyzer',
522
+ 'qe-test-data-architect', 'qe-api-contract-validator', 'qe-flaky-test-hunter',
523
+ 'qe-visual-tester', 'qe-chaos-engineer'
524
+ ];
525
+ const existingAgentNames = existingFiles.map(f => f.replace('.md', ''));
526
+ const missingAgents = allAgentNames.filter(name => !existingAgentNames.includes(name));
527
+ if (missingAgents.length === 0) {
528
+ console.log(chalk_1.default.green(' ✓ No missing agents to create'));
529
+ return;
530
+ }
531
+ console.log(chalk_1.default.cyan(` 🛠️ Creating ${missingAgents.length} missing agents:`));
532
+ for (const agentName of missingAgents) {
533
+ console.log(chalk_1.default.gray(` • ${agentName}`));
534
+ }
535
+ // Create missing agents using the same logic as createBasicAgents
536
+ for (const agentName of missingAgents) {
537
+ const agentFile = path.join(targetPath, `${agentName}.md`);
538
+ const agentType = agentName.replace('qe-', '');
539
+ const content = `---
540
+ name: ${agentName}
541
+ type: ${agentType}
542
+ color: blue
543
+ priority: medium
544
+ description: "Agentic QE Fleet ${agentType} agent"
545
+ capabilities:
546
+ - ${agentType}
547
+ coordination:
548
+ protocol: aqe-hooks
549
+ metadata:
550
+ version: "1.1.0"
551
+ framework: "agentic-qe"
552
+ routing: "supported"
553
+ streaming: "supported"
554
+ ---
555
+
556
+ # ${agentName.toUpperCase()} Agent
557
+
558
+ ## Description
559
+ This agent is part of the Agentic QE Fleet and specializes in ${agentType}.
560
+
561
+ ## Capabilities
562
+ - AI-powered ${agentType}
563
+ - Integration with Agentic QE Fleet
564
+ - Native TypeScript coordination
565
+
566
+ ## Coordination Protocol
567
+
568
+ This agent uses **AQE hooks** (Agentic QE native hooks) for coordination (zero external dependencies, 100-500x faster than external hooks).
569
+
341
570
  For full capabilities, install the complete agentic-qe package.
342
571
  `;
343
572
  await fs.writeFile(agentFile, content);
573
+ console.log(chalk_1.default.gray(` ✓ Created ${agentName}.md`));
344
574
  }
575
+ const finalCount = await this.countAgentFiles(targetPath);
576
+ console.log(chalk_1.default.green(` ✓ Total agent count: ${finalCount}`));
345
577
  }
346
578
  static async countAgentFiles(dirPath) {
347
579
  if (!await fs.pathExists(dirPath))
@@ -350,14 +582,98 @@ For full capabilities, install the complete agentic-qe package.
350
582
  return files.filter(f => f.endsWith('.md')).length;
351
583
  }
352
584
  static async writeFleetConfig(config) {
585
+ console.log(chalk_1.default.cyan(' 📝 Writing fleet configuration...'));
586
+ // Sanitize config to remove undefined values that cause jsonfile errors
587
+ const sanitizedConfig = this.sanitizeConfig(config);
353
588
  const configPath = '.agentic-qe/config/fleet.json';
354
- await fs.writeJson(configPath, config, { spaces: 2 });
589
+ await fs.writeJson(configPath, sanitizedConfig, { spaces: 2 });
590
+ console.log(chalk_1.default.gray(` ✓ Wrote ${configPath}`));
355
591
  // Create agent configurations
356
- const agentConfigs = this.generateAgentConfigs(config);
592
+ const agentConfigs = this.sanitizeConfig(this.generateAgentConfigs(config));
357
593
  await fs.writeJson('.agentic-qe/config/agents.json', agentConfigs, { spaces: 2 });
594
+ console.log(chalk_1.default.gray(` ✓ Wrote .agentic-qe/config/agents.json`));
358
595
  // Create environment configurations
359
- const envConfigs = this.generateEnvironmentConfigs(config.environments || []);
596
+ const envConfigs = this.sanitizeConfig(this.generateEnvironmentConfigs(config.environments || []));
360
597
  await fs.writeJson('.agentic-qe/config/environments.json', envConfigs, { spaces: 2 });
598
+ console.log(chalk_1.default.gray(` ✓ Wrote .agentic-qe/config/environments.json`));
599
+ // Create routing configuration (Phase 1 - v1.0.5)
600
+ await this.writeRoutingConfig(config);
601
+ console.log(chalk_1.default.green(' ✓ Fleet configuration complete'));
602
+ }
603
+ /**
604
+ * Sanitize config object by removing undefined values and ensuring all properties are serializable
605
+ */
606
+ static sanitizeConfig(obj) {
607
+ if (obj === null || obj === undefined) {
608
+ return null;
609
+ }
610
+ if (Array.isArray(obj)) {
611
+ return obj.map(item => this.sanitizeConfig(item)).filter(item => item !== null && item !== undefined);
612
+ }
613
+ if (typeof obj === 'object') {
614
+ const sanitized = {};
615
+ for (const [key, value] of Object.entries(obj)) {
616
+ // Skip undefined values
617
+ if (value === undefined) {
618
+ continue;
619
+ }
620
+ // Recursively sanitize nested objects
621
+ const sanitizedValue = this.sanitizeConfig(value);
622
+ if (sanitizedValue !== null && sanitizedValue !== undefined) {
623
+ sanitized[key] = sanitizedValue;
624
+ }
625
+ }
626
+ return sanitized;
627
+ }
628
+ return obj;
629
+ }
630
+ static async writeRoutingConfig(config) {
631
+ const routingConfig = {
632
+ multiModelRouter: {
633
+ enabled: config.routing?.enabled || false,
634
+ version: '1.0.5',
635
+ defaultModel: config.routing?.defaultModel || 'claude-sonnet-4.5',
636
+ enableCostTracking: config.routing?.enableCostTracking !== false,
637
+ enableFallback: config.routing?.enableFallback !== false,
638
+ maxRetries: config.routing?.maxRetries || 3,
639
+ costThreshold: config.routing?.costThreshold || 0.5,
640
+ modelRules: {
641
+ simple: {
642
+ model: 'gpt-3.5-turbo',
643
+ maxTokens: 2000,
644
+ estimatedCost: 0.0004
645
+ },
646
+ moderate: {
647
+ model: 'gpt-3.5-turbo',
648
+ maxTokens: 4000,
649
+ estimatedCost: 0.0008
650
+ },
651
+ complex: {
652
+ model: 'gpt-4',
653
+ maxTokens: 8000,
654
+ estimatedCost: 0.0048
655
+ },
656
+ critical: {
657
+ model: 'claude-sonnet-4.5',
658
+ maxTokens: 8000,
659
+ estimatedCost: 0.0065
660
+ }
661
+ },
662
+ fallbackChains: {
663
+ 'gpt-4': ['gpt-3.5-turbo', 'claude-haiku'],
664
+ 'gpt-3.5-turbo': ['claude-haiku', 'gpt-4'],
665
+ 'claude-sonnet-4.5': ['claude-haiku', 'gpt-4'],
666
+ 'claude-haiku': ['gpt-3.5-turbo']
667
+ }
668
+ },
669
+ streaming: {
670
+ enabled: config.streaming?.enabled !== false,
671
+ progressInterval: config.streaming?.progressInterval || 2000,
672
+ bufferEvents: config.streaming?.bufferEvents || false,
673
+ timeout: config.streaming?.timeout || 1800000
674
+ }
675
+ };
676
+ await fs.writeJson('.agentic-qe/config/routing.json', routingConfig, { spaces: 2 });
361
677
  }
362
678
  static generateAgentConfigs(fleetConfig) {
363
679
  const agentTypes = [
@@ -462,6 +778,9 @@ For full capabilities, install the complete agentic-qe package.
462
778
  await fs.writeJson('.agentic-qe/data/registry.json', agentRegistry, { spaces: 2 });
463
779
  }
464
780
  static async initializeCoordination(config) {
781
+ // Ensure config has required properties
782
+ const topology = config.topology || 'hierarchical';
783
+ const maxAgents = config.maxAgents || 10;
465
784
  // Create pre-execution coordination script (AQE native)
466
785
  const preExecutionScript = `#!/bin/bash
467
786
  # Agentic QE Fleet Pre-Execution Coordination
@@ -471,7 +790,7 @@ For full capabilities, install the complete agentic-qe package.
471
790
  agentic-qe fleet status --json > /tmp/aqe-fleet-status-pre.json 2>/dev/null || true
472
791
 
473
792
  # Log coordination event
474
- echo "[AQE] Pre-execution coordination: Fleet topology=${config.topology}, Max agents=${config.maxAgents}" >> .agentic-qe/logs/coordination.log
793
+ echo "[AQE] Pre-execution coordination: Fleet topology=${topology}, Max agents=${maxAgents}" >> .agentic-qe/logs/coordination.log
475
794
 
476
795
  # Store fleet config in coordination memory (via file-based state)
477
796
  mkdir -p .agentic-qe/state/coordination
@@ -664,10 +983,112 @@ Agents share state through the **\\\`aqe/*\\\` memory namespace**:
664
983
  **Environments**: ${config.environments?.join(', ') || 'Not specified'}
665
984
  **Frameworks**: ${config.frameworks?.join(', ') || 'jest'}
666
985
 
986
+ ## 💰 Multi-Model Router (v1.0.5)
987
+
988
+ **Status**: ${config.routing?.enabled ? '✅ Enabled' : '⚠️ Disabled (opt-in)'}
989
+
990
+ The Multi-Model Router provides **70-81% cost savings** by intelligently selecting AI models based on task complexity.
991
+
992
+ ### Features
993
+
994
+ - ✅ Intelligent model selection (GPT-3.5, GPT-4, Claude Sonnet 4.5, Claude Haiku)
995
+ - ✅ Real-time cost tracking and aggregation
996
+ - ✅ Automatic fallback chains for resilience
997
+ - ✅ Feature flags for safe rollout
998
+ - ✅ Zero breaking changes (disabled by default)
999
+
1000
+ ### Enabling Routing
1001
+
1002
+ **Option 1: Via Configuration**
1003
+ \\\`\\\`\\\`json
1004
+ // .agentic-qe/config/routing.json
1005
+ {
1006
+ "multiModelRouter": {
1007
+ "enabled": true
1008
+ }
1009
+ }
1010
+ \\\`\\\`\\\`
1011
+
1012
+ **Option 2: Via Environment Variable**
1013
+ \\\`\\\`\\\`bash
1014
+ export AQE_ROUTING_ENABLED=true
1015
+ \\\`\\\`\\\`
1016
+
1017
+ ### Model Selection Rules
1018
+
1019
+ | Task Complexity | Model | Est. Cost | Use Case |
1020
+ |----------------|-------|-----------|----------|
1021
+ | **Simple** | GPT-3.5 | $0.0004 | Unit tests, basic validation |
1022
+ | **Moderate** | GPT-3.5 | $0.0008 | Integration tests, mocks |
1023
+ | **Complex** | GPT-4 | $0.0048 | Property-based, edge cases |
1024
+ | **Critical** | Claude Sonnet 4.5 | $0.0065 | Security, architecture review |
1025
+
1026
+ ### Cost Savings Example
1027
+
1028
+ **Before Routing** (always GPT-4):
1029
+ - 100 simple tasks: $0.48
1030
+ - 50 complex tasks: $0.24
1031
+ - **Total**: $0.72
1032
+
1033
+ **After Routing**:
1034
+ - 100 simple → GPT-3.5: $0.04
1035
+ - 50 complex → GPT-4: $0.24
1036
+ - **Total**: $0.28
1037
+ - **Savings**: $0.44 (61%)
1038
+
1039
+ ### Monitoring Costs
1040
+
1041
+ \\\`\\\`\\\`bash
1042
+ # View cost dashboard
1043
+ aqe routing dashboard
1044
+
1045
+ # Export cost report
1046
+ aqe routing report --format json
1047
+
1048
+ # Check savings
1049
+ aqe routing stats
1050
+ \\\`\\\`\\\`
1051
+
1052
+ ## 📊 Streaming Progress (v1.0.5)
1053
+
1054
+ **Status**: ${config.streaming?.enabled ? '✅ Enabled' : '⚠️ Disabled'}
1055
+
1056
+ Real-time progress updates for long-running operations using AsyncGenerator pattern.
1057
+
1058
+ ### Features
1059
+
1060
+ - ✅ Real-time progress percentage
1061
+ - ✅ Current operation visibility
1062
+ - ✅ for-await-of compatibility
1063
+ - ✅ Backward compatible (non-streaming still works)
1064
+
1065
+ ### Example Usage
1066
+
1067
+ \\\`\\\`\\\`javascript
1068
+ // Using streaming MCP tool
1069
+ const handler = new TestExecuteStreamHandler();
1070
+
1071
+ for await (const event of handler.execute(params)) {
1072
+ if (event.type === 'progress') {
1073
+ console.log(\\\`Progress: \\\${event.percent}% - \\\${event.message}\\\`);
1074
+ } else if (event.type === 'result') {
1075
+ console.log('Completed:', event.data);
1076
+ }
1077
+ }
1078
+ \\\`\\\`\\\`
1079
+
1080
+ ### Supported Operations
1081
+
1082
+ - ✅ Test execution (test-by-test progress)
1083
+ - ✅ Coverage analysis (incremental gap detection)
1084
+ - ⚠️ Test generation (coming in v1.1.0)
1085
+ - ⚠️ Security scanning (coming in v1.1.0)
1086
+
667
1087
  ## 📚 Documentation
668
1088
 
669
1089
  - **Agent Definitions**: \\\`.claude/agents/\\\` - ${agentCount} specialized QE agents
670
1090
  - **Fleet Config**: \\\`.agentic-qe/config/fleet.json\\\`
1091
+ - **Routing Config**: \\\`.agentic-qe/config/routing.json\\\` (Multi-Model Router settings)
671
1092
  - **AQE Hooks Config**: \\\`.agentic-qe/config/aqe-hooks.json\\\` (zero dependencies, 100-500x faster)
672
1093
 
673
1094
  ## 🔧 Advanced Usage
@@ -727,12 +1148,424 @@ tail -f .agentic-qe/logs/fleet.log
727
1148
 
728
1149
  ---
729
1150
 
730
- **Generated by**: Agentic QE Fleet v1.0.0
1151
+ **Generated by**: Agentic QE Fleet v1.0.5
731
1152
  **Initialization Date**: ${new Date().toISOString()}
732
1153
  **Fleet Topology**: ${config.topology}
733
1154
  `;
734
1155
  await fs.writeFile(claudeMdPath, claudeMdContent);
735
1156
  }
1157
+ // ============================================================================
1158
+ // Phase 2 Initialization Methods (v1.1.0)
1159
+ // ============================================================================
1160
+ /**
1161
+ * Initialize Phase 2 Pattern Bank Database
1162
+ */
1163
+ static async initializePatternDatabase(config) {
1164
+ const Database = (await Promise.resolve().then(() => __importStar(require('better-sqlite3')))).default;
1165
+ const dbPath = path.join(process.cwd(), '.agentic-qe', 'patterns.db');
1166
+ console.log(chalk_1.default.cyan(' 📦 Initializing Pattern Bank database...'));
1167
+ const db = new Database(dbPath);
1168
+ // Enable WAL mode for better concurrency
1169
+ db.pragma('journal_mode = WAL');
1170
+ db.pragma('synchronous = NORMAL');
1171
+ db.pragma('cache_size = -64000'); // 64MB cache
1172
+ // Read and execute the schema
1173
+ const schemaPath = path.join(__dirname, '../../../docs/architecture/REASONING-BANK-SCHEMA.sql');
1174
+ let schema;
1175
+ if (await fs.pathExists(schemaPath)) {
1176
+ schema = await fs.readFile(schemaPath, 'utf-8');
1177
+ }
1178
+ else {
1179
+ // Fallback: inline schema if file not found
1180
+ schema = this.getPatternBankSchema();
1181
+ }
1182
+ // Execute schema
1183
+ db.exec(schema);
1184
+ db.close();
1185
+ console.log(chalk_1.default.green(' ✓ Pattern Bank initialized'));
1186
+ console.log(chalk_1.default.gray(` • Database: ${dbPath}`));
1187
+ console.log(chalk_1.default.gray(` • Framework: ${config.frameworks?.[0] || 'jest'}`));
1188
+ console.log(chalk_1.default.gray(` • Tables: test_patterns, pattern_usage, cross_project_mappings, pattern_similarity_index`));
1189
+ console.log(chalk_1.default.gray(` • Full-text search: enabled`));
1190
+ }
1191
+ /**
1192
+ * Initialize Phase 2 Memory Database (SwarmMemoryManager)
1193
+ */
1194
+ static async initializeMemoryDatabase() {
1195
+ const dbPath = path.join(process.cwd(), '.agentic-qe', 'memory.db');
1196
+ console.log(chalk_1.default.cyan(' 💾 Initializing Memory Manager database...'));
1197
+ // Import SwarmMemoryManager dynamically
1198
+ const { SwarmMemoryManager } = await Promise.resolve().then(() => __importStar(require('../../core/memory/SwarmMemoryManager')));
1199
+ const memoryManager = new SwarmMemoryManager(dbPath);
1200
+ await memoryManager.initialize();
1201
+ // Verify tables created
1202
+ const stats = await memoryManager.stats();
1203
+ await memoryManager.close();
1204
+ console.log(chalk_1.default.green(' ✓ Memory Manager initialized'));
1205
+ console.log(chalk_1.default.gray(` • Database: ${dbPath}`));
1206
+ console.log(chalk_1.default.gray(` • Tables: 12 tables (memory_entries, hints, events, workflow_state, patterns, etc.)`));
1207
+ console.log(chalk_1.default.gray(` • Access control: 5 levels (private, team, swarm, public, system)`));
1208
+ }
1209
+ /**
1210
+ * Initialize Phase 2 Learning System
1211
+ */
1212
+ static async initializeLearningSystem(config) {
1213
+ const learningConfig = {
1214
+ enabled: true,
1215
+ learningRate: 0.1,
1216
+ discountFactor: 0.95,
1217
+ explorationRate: 0.2,
1218
+ explorationDecay: 0.995,
1219
+ minExplorationRate: 0.01,
1220
+ targetImprovement: 0.20, // 20% improvement goal
1221
+ maxMemorySize: 100 * 1024 * 1024, // 100MB
1222
+ batchSize: 32,
1223
+ updateFrequency: 10,
1224
+ replayBufferSize: 10000
1225
+ };
1226
+ // Store learning configuration
1227
+ await fs.writeJson('.agentic-qe/config/learning.json', learningConfig, { spaces: 2 });
1228
+ // Create learning database directory
1229
+ await fs.ensureDir('.agentic-qe/data/learning');
1230
+ // Create learning state placeholder
1231
+ const learningState = {
1232
+ initialized: true,
1233
+ version: '1.1.0',
1234
+ createdAt: new Date().toISOString(),
1235
+ agents: {} // Will be populated as agents learn
1236
+ };
1237
+ await fs.writeJson('.agentic-qe/data/learning/state.json', learningState, { spaces: 2 });
1238
+ console.log(chalk_1.default.green(' ✓ Learning system initialized'));
1239
+ console.log(chalk_1.default.gray(` • Q-learning algorithm (lr=${learningConfig.learningRate}, γ=${learningConfig.discountFactor})`));
1240
+ console.log(chalk_1.default.gray(` • Experience replay buffer: ${learningConfig.replayBufferSize} experiences`));
1241
+ console.log(chalk_1.default.gray(` • Target improvement: ${learningConfig.targetImprovement * 100}%`));
1242
+ }
1243
+ /**
1244
+ * Get inline Pattern Bank schema (fallback if schema file not found)
1245
+ */
1246
+ static getPatternBankSchema() {
1247
+ return `
1248
+ -- Enable WAL mode for better concurrent access
1249
+ PRAGMA journal_mode = WAL;
1250
+ PRAGMA synchronous = NORMAL;
1251
+
1252
+ -- Core Pattern Storage
1253
+ CREATE TABLE IF NOT EXISTS test_patterns (
1254
+ id TEXT PRIMARY KEY NOT NULL,
1255
+ pattern_type TEXT NOT NULL,
1256
+ framework TEXT NOT NULL,
1257
+ language TEXT NOT NULL DEFAULT 'typescript',
1258
+ code_signature_hash TEXT NOT NULL,
1259
+ code_signature JSON NOT NULL,
1260
+ test_template JSON NOT NULL,
1261
+ metadata JSON NOT NULL,
1262
+ version TEXT NOT NULL DEFAULT '1.0.0',
1263
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
1264
+ updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
1265
+ CHECK(pattern_type IN ('edge-case', 'integration', 'boundary', 'error-handling', 'unit', 'e2e', 'performance', 'security')),
1266
+ CHECK(framework IN ('jest', 'mocha', 'cypress', 'vitest', 'playwright', 'ava', 'jasmine')),
1267
+ CHECK(json_valid(code_signature)),
1268
+ CHECK(json_valid(test_template)),
1269
+ CHECK(json_valid(metadata))
1270
+ );
1271
+
1272
+ CREATE INDEX IF NOT EXISTS idx_patterns_framework_type ON test_patterns(framework, pattern_type);
1273
+ CREATE INDEX IF NOT EXISTS idx_patterns_signature_hash ON test_patterns(code_signature_hash);
1274
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_patterns_dedup ON test_patterns(code_signature_hash, framework);
1275
+
1276
+ -- Pattern Usage Tracking
1277
+ CREATE TABLE IF NOT EXISTS pattern_usage (
1278
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
1279
+ pattern_id TEXT NOT NULL,
1280
+ project_id TEXT NOT NULL,
1281
+ usage_count INTEGER NOT NULL DEFAULT 0,
1282
+ success_count INTEGER NOT NULL DEFAULT 0,
1283
+ failure_count INTEGER NOT NULL DEFAULT 0,
1284
+ avg_execution_time REAL NOT NULL DEFAULT 0.0,
1285
+ avg_coverage_gain REAL NOT NULL DEFAULT 0.0,
1286
+ flaky_count INTEGER NOT NULL DEFAULT 0,
1287
+ quality_score REAL NOT NULL DEFAULT 0.0,
1288
+ first_used TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
1289
+ last_used TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
1290
+ FOREIGN KEY (pattern_id) REFERENCES test_patterns(id) ON DELETE CASCADE,
1291
+ UNIQUE(pattern_id, project_id)
1292
+ );
1293
+
1294
+ CREATE INDEX IF NOT EXISTS idx_usage_pattern ON pattern_usage(pattern_id);
1295
+ CREATE INDEX IF NOT EXISTS idx_usage_quality ON pattern_usage(quality_score DESC);
1296
+
1297
+ -- Cross-Project Pattern Sharing
1298
+ CREATE TABLE IF NOT EXISTS cross_project_mappings (
1299
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
1300
+ pattern_id TEXT NOT NULL,
1301
+ source_framework TEXT NOT NULL,
1302
+ target_framework TEXT NOT NULL,
1303
+ transformation_rules JSON NOT NULL,
1304
+ compatibility_score REAL NOT NULL DEFAULT 1.0,
1305
+ project_count INTEGER NOT NULL DEFAULT 0,
1306
+ success_rate REAL NOT NULL DEFAULT 0.0,
1307
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
1308
+ updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
1309
+ FOREIGN KEY (pattern_id) REFERENCES test_patterns(id) ON DELETE CASCADE,
1310
+ UNIQUE(pattern_id, source_framework, target_framework),
1311
+ CHECK(json_valid(transformation_rules))
1312
+ );
1313
+
1314
+ -- Pattern Similarity Index
1315
+ CREATE TABLE IF NOT EXISTS pattern_similarity_index (
1316
+ pattern_a TEXT NOT NULL,
1317
+ pattern_b TEXT NOT NULL,
1318
+ similarity_score REAL NOT NULL,
1319
+ structure_similarity REAL NOT NULL,
1320
+ identifier_similarity REAL NOT NULL,
1321
+ metadata_similarity REAL NOT NULL,
1322
+ algorithm TEXT NOT NULL DEFAULT 'hybrid-tfidf',
1323
+ last_computed TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
1324
+ PRIMARY KEY (pattern_a, pattern_b),
1325
+ FOREIGN KEY (pattern_a) REFERENCES test_patterns(id) ON DELETE CASCADE,
1326
+ FOREIGN KEY (pattern_b) REFERENCES test_patterns(id) ON DELETE CASCADE
1327
+ );
1328
+
1329
+ CREATE INDEX IF NOT EXISTS idx_similarity_score ON pattern_similarity_index(similarity_score DESC);
1330
+
1331
+ -- Full-Text Search
1332
+ CREATE VIRTUAL TABLE IF NOT EXISTS pattern_fts USING fts5(
1333
+ pattern_id UNINDEXED,
1334
+ pattern_name,
1335
+ description,
1336
+ tags,
1337
+ framework,
1338
+ pattern_type,
1339
+ content='',
1340
+ tokenize='porter ascii'
1341
+ );
1342
+
1343
+ -- Schema Version
1344
+ CREATE TABLE IF NOT EXISTS schema_version (
1345
+ version TEXT PRIMARY KEY,
1346
+ applied_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
1347
+ description TEXT
1348
+ );
1349
+
1350
+ INSERT OR IGNORE INTO schema_version (version, description)
1351
+ VALUES ('1.1.0', 'Initial QE ReasoningBank schema');
1352
+ `;
1353
+ }
1354
+ /**
1355
+ * Initialize Phase 2 Improvement Loop
1356
+ */
1357
+ static async initializeImprovementLoop(config) {
1358
+ const improvementConfig = {
1359
+ enabled: true,
1360
+ intervalMs: 3600000, // 1 hour
1361
+ autoApply: false, // Requires user approval
1362
+ enableABTesting: true,
1363
+ strategies: {
1364
+ parallelExecution: { enabled: true, weight: 0.8 },
1365
+ adaptiveRetry: { enabled: true, maxRetries: 3 },
1366
+ resourceOptimization: { enabled: true, adaptive: true }
1367
+ },
1368
+ thresholds: {
1369
+ minImprovement: 0.05, // 5% minimum improvement to apply
1370
+ maxFailureRate: 0.1, // 10% max failure rate
1371
+ minConfidence: 0.8 // 80% confidence required
1372
+ },
1373
+ abTesting: {
1374
+ sampleSize: 100,
1375
+ significanceLevel: 0.05,
1376
+ minSampleDuration: 3600000 // 1 hour
1377
+ }
1378
+ };
1379
+ // Store improvement configuration
1380
+ await fs.writeJson('.agentic-qe/config/improvement.json', improvementConfig, { spaces: 2 });
1381
+ // Create improvement state
1382
+ const improvementState = {
1383
+ version: '1.1.0',
1384
+ lastCycle: null,
1385
+ activeCycles: 0,
1386
+ totalImprovement: 0,
1387
+ strategies: {}
1388
+ };
1389
+ await fs.writeJson('.agentic-qe/data/improvement/state.json', improvementState, { spaces: 2 });
1390
+ console.log(chalk_1.default.green(' ✓ Improvement loop initialized'));
1391
+ console.log(chalk_1.default.gray(` • Cycle interval: ${improvementConfig.intervalMs / 3600000} hour(s)`));
1392
+ console.log(chalk_1.default.gray(` • A/B testing: enabled (sample size: ${improvementConfig.abTesting.sampleSize})`));
1393
+ console.log(chalk_1.default.gray(` • Auto-apply: ${improvementConfig.autoApply ? 'enabled' : 'disabled (requires approval)'}`));
1394
+ }
1395
+ /**
1396
+ * Create comprehensive config.json with all Phase 1 and Phase 2 settings
1397
+ */
1398
+ static async createComprehensiveConfig(fleetConfig, options) {
1399
+ const comprehensiveConfig = {
1400
+ version: '1.1.0',
1401
+ initialized: new Date().toISOString(),
1402
+ // Phase 1: Multi-Model Router
1403
+ phase1: {
1404
+ routing: {
1405
+ enabled: fleetConfig.routing?.enabled || false,
1406
+ defaultModel: fleetConfig.routing?.defaultModel || 'claude-sonnet-4.5',
1407
+ costTracking: fleetConfig.routing?.enableCostTracking !== false,
1408
+ fallback: fleetConfig.routing?.enableFallback !== false,
1409
+ maxRetries: fleetConfig.routing?.maxRetries || 3,
1410
+ modelPreferences: {
1411
+ simple: 'gpt-3.5-turbo',
1412
+ medium: 'claude-haiku',
1413
+ complex: 'claude-sonnet-4.5',
1414
+ critical: 'gpt-4'
1415
+ },
1416
+ budgets: {
1417
+ daily: 50,
1418
+ monthly: 1000
1419
+ }
1420
+ },
1421
+ streaming: {
1422
+ enabled: fleetConfig.streaming?.enabled !== false,
1423
+ progressInterval: fleetConfig.streaming?.progressInterval || 2000,
1424
+ bufferEvents: fleetConfig.streaming?.bufferEvents || false,
1425
+ timeout: fleetConfig.streaming?.timeout || 1800000
1426
+ }
1427
+ },
1428
+ // Phase 2: Learning, Patterns, and Improvement
1429
+ phase2: {
1430
+ learning: {
1431
+ enabled: options.enableLearning,
1432
+ learningRate: 0.1,
1433
+ discountFactor: 0.95,
1434
+ explorationRate: 0.2,
1435
+ targetImprovement: 0.20
1436
+ },
1437
+ patterns: {
1438
+ enabled: options.enablePatterns,
1439
+ dbPath: '.agentic-qe/data/patterns.db',
1440
+ minConfidence: 0.85,
1441
+ enableExtraction: true
1442
+ },
1443
+ improvement: {
1444
+ enabled: options.enableImprovement,
1445
+ intervalMs: 3600000,
1446
+ autoApply: false,
1447
+ enableABTesting: true
1448
+ }
1449
+ },
1450
+ // Agent configurations
1451
+ agents: {
1452
+ testGenerator: {
1453
+ enablePatterns: options.enablePatterns,
1454
+ enableLearning: options.enableLearning
1455
+ },
1456
+ coverageAnalyzer: {
1457
+ enableLearning: options.enableLearning,
1458
+ targetImprovement: 0.20
1459
+ },
1460
+ flakyTestHunter: {
1461
+ enableML: true,
1462
+ enableLearning: options.enableLearning
1463
+ },
1464
+ defaultAgents: {
1465
+ enableLearning: options.enableLearning
1466
+ }
1467
+ },
1468
+ // Fleet configuration
1469
+ fleet: {
1470
+ topology: fleetConfig.topology || 'hierarchical',
1471
+ maxAgents: fleetConfig.maxAgents || 10,
1472
+ testingFocus: fleetConfig.testingFocus || [],
1473
+ environments: fleetConfig.environments || [],
1474
+ frameworks: fleetConfig.frameworks || ['jest']
1475
+ }
1476
+ };
1477
+ await fs.writeJson('.agentic-qe/config.json', comprehensiveConfig, { spaces: 2 });
1478
+ console.log(chalk_1.default.green(' ✓ Comprehensive configuration created'));
1479
+ console.log(chalk_1.default.gray(` • Config file: .agentic-qe/config.json`));
1480
+ }
1481
+ /**
1482
+ * Display comprehensive initialization summary
1483
+ */
1484
+ static async displayComprehensiveSummary(fleetConfig, options) {
1485
+ console.log(chalk_1.default.yellow('\n📊 Initialization Summary:\n'));
1486
+ // Multi-Model Router Summary
1487
+ console.log(chalk_1.default.cyan('Multi-Model Router'));
1488
+ console.log(chalk_1.default.gray(` Status: ${fleetConfig.routing?.enabled ? '✅ Enabled' : '⚠️ Disabled (opt-in)'}`));
1489
+ if (fleetConfig.routing?.enabled) {
1490
+ console.log(chalk_1.default.gray(' • Cost optimization: 70-81% savings'));
1491
+ console.log(chalk_1.default.gray(' • Fallback chains: enabled'));
1492
+ console.log(chalk_1.default.gray(' • Budget tracking: daily $50, monthly $1000'));
1493
+ }
1494
+ console.log(chalk_1.default.cyan('\nStreaming'));
1495
+ console.log(chalk_1.default.gray(` Status: ${fleetConfig.streaming?.enabled !== false ? '✅ Enabled' : '⚠️ Disabled'}`));
1496
+ console.log(chalk_1.default.gray(' • Real-time progress updates'));
1497
+ console.log(chalk_1.default.gray(' • for-await-of compatible'));
1498
+ // Learning System Summary
1499
+ console.log(chalk_1.default.cyan('\nLearning System'));
1500
+ console.log(chalk_1.default.gray(` Status: ${options.enableLearning ? '✅ Enabled' : '⚠️ Disabled'}`));
1501
+ if (options.enableLearning) {
1502
+ console.log(chalk_1.default.gray(' • Q-learning (lr=0.1, γ=0.95)'));
1503
+ console.log(chalk_1.default.gray(' • Experience replay (10,000 buffer)'));
1504
+ console.log(chalk_1.default.gray(' • Target: 20% improvement'));
1505
+ }
1506
+ console.log(chalk_1.default.cyan('\nPattern Bank'));
1507
+ console.log(chalk_1.default.gray(` Status: ${options.enablePatterns ? '✅ Enabled' : '⚠️ Disabled'}`));
1508
+ if (options.enablePatterns) {
1509
+ console.log(chalk_1.default.gray(' • Pattern extraction: enabled'));
1510
+ console.log(chalk_1.default.gray(' • Confidence threshold: 85%'));
1511
+ console.log(chalk_1.default.gray(' • Template generation: enabled'));
1512
+ }
1513
+ console.log(chalk_1.default.cyan('\nImprovement Loop'));
1514
+ console.log(chalk_1.default.gray(` Status: ${options.enableImprovement ? '✅ Enabled' : '⚠️ Disabled'}`));
1515
+ if (options.enableImprovement) {
1516
+ console.log(chalk_1.default.gray(' • Cycle: 1 hour intervals'));
1517
+ console.log(chalk_1.default.gray(' • A/B testing: enabled'));
1518
+ console.log(chalk_1.default.gray(' • Auto-apply: OFF (requires approval)'));
1519
+ }
1520
+ // Agent Configuration
1521
+ console.log(chalk_1.default.cyan('\nAgent Configuration:'));
1522
+ console.log(chalk_1.default.gray(' • TestGeneratorAgent: Patterns + Learning'));
1523
+ console.log(chalk_1.default.gray(' • CoverageAnalyzerAgent: Learning + 20% target'));
1524
+ console.log(chalk_1.default.gray(' • FlakyTestHunterAgent: ML + Learning'));
1525
+ console.log(chalk_1.default.gray(' • All agents: Learning enabled (opt-in)'));
1526
+ // Fleet Configuration
1527
+ console.log(chalk_1.default.cyan('\nFleet Configuration:'));
1528
+ console.log(chalk_1.default.gray(` Topology: ${fleetConfig.topology}`));
1529
+ console.log(chalk_1.default.gray(` Max Agents: ${fleetConfig.maxAgents}`));
1530
+ console.log(chalk_1.default.gray(` Frameworks: ${(fleetConfig.frameworks || ['jest']).join(', ')}`));
1531
+ // Next Steps
1532
+ console.log(chalk_1.default.yellow('\n💡 Next Steps:\n'));
1533
+ console.log(chalk_1.default.gray(' 1. Review configuration: .agentic-qe/config.json'));
1534
+ console.log(chalk_1.default.gray(' 2. Generate tests: aqe test generate src/'));
1535
+ if (options.enableLearning) {
1536
+ console.log(chalk_1.default.gray(' 3. Check learning status: aqe learn status'));
1537
+ }
1538
+ if (fleetConfig.routing?.enabled) {
1539
+ console.log(chalk_1.default.gray(' 4. View routing dashboard: aqe routing dashboard'));
1540
+ }
1541
+ if (options.enablePatterns) {
1542
+ console.log(chalk_1.default.gray(' 5. List patterns: aqe patterns list'));
1543
+ }
1544
+ if (options.enableImprovement) {
1545
+ console.log(chalk_1.default.gray(' 6. Start improvement loop: aqe improve start'));
1546
+ }
1547
+ // Documentation
1548
+ console.log(chalk_1.default.yellow('\n📚 Documentation:\n'));
1549
+ console.log(chalk_1.default.gray(' • Getting Started: docs/GETTING-STARTED.md'));
1550
+ if (options.enableLearning) {
1551
+ console.log(chalk_1.default.gray(' • Learning System: docs/guides/LEARNING-SYSTEM-USER-GUIDE.md'));
1552
+ }
1553
+ if (options.enablePatterns) {
1554
+ console.log(chalk_1.default.gray(' • Pattern Management: docs/guides/PATTERN-MANAGEMENT-USER-GUIDE.md'));
1555
+ }
1556
+ if (fleetConfig.routing?.enabled) {
1557
+ console.log(chalk_1.default.gray(' • Cost Optimization: docs/guides/COST-OPTIMIZATION-GUIDE.md'));
1558
+ }
1559
+ // Performance Tips
1560
+ console.log(chalk_1.default.yellow('\n⚡ Performance Tips:\n'));
1561
+ console.log(chalk_1.default.gray(' • Learning improves over time (20% target in 100 tasks)'));
1562
+ console.log(chalk_1.default.gray(' • Patterns increase test quality (85% confidence threshold)'));
1563
+ if (fleetConfig.routing?.enabled) {
1564
+ console.log(chalk_1.default.gray(' • Routing saves 70-81% on AI costs'));
1565
+ }
1566
+ console.log(chalk_1.default.gray(' • Improvement loop optimizes continuously (1 hour cycles)'));
1567
+ console.log('');
1568
+ }
736
1569
  }
737
1570
  exports.InitCommand = InitCommand;
738
1571
  //# sourceMappingURL=init.js.map