@copilot-swarm/core 0.0.33 → 0.0.35

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 (67) hide show
  1. package/defaults/agents/fleet-reviewer.md +23 -0
  2. package/defaults/agents/fleet-strategist.md +51 -0
  3. package/defaults/swarm.config.yaml +2 -0
  4. package/dist/brainstorm-engine.js +1 -1
  5. package/dist/brainstorm-engine.js.map +1 -1
  6. package/dist/central-store.d.ts +44 -0
  7. package/dist/central-store.d.ts.map +1 -0
  8. package/dist/central-store.js +200 -0
  9. package/dist/central-store.js.map +1 -0
  10. package/dist/checkpoint.d.ts.map +1 -1
  11. package/dist/checkpoint.js +5 -0
  12. package/dist/checkpoint.js.map +1 -1
  13. package/dist/config.d.ts +5 -1
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +30 -3
  16. package/dist/config.js.map +1 -1
  17. package/dist/demo.d.ts +7 -0
  18. package/dist/demo.d.ts.map +1 -0
  19. package/dist/demo.js +456 -0
  20. package/dist/demo.js.map +1 -0
  21. package/dist/finish.d.ts.map +1 -1
  22. package/dist/finish.js +4 -0
  23. package/dist/finish.js.map +1 -1
  24. package/dist/fleet-config.d.ts +7 -0
  25. package/dist/fleet-config.d.ts.map +1 -0
  26. package/dist/fleet-config.js +101 -0
  27. package/dist/fleet-config.js.map +1 -0
  28. package/dist/fleet-engine.d.ts +26 -0
  29. package/dist/fleet-engine.d.ts.map +1 -0
  30. package/dist/fleet-engine.js +405 -0
  31. package/dist/fleet-engine.js.map +1 -0
  32. package/dist/fleet-types.d.ts +55 -0
  33. package/dist/fleet-types.d.ts.map +1 -0
  34. package/dist/fleet-types.js +7 -0
  35. package/dist/fleet-types.js.map +1 -0
  36. package/dist/index.js +66 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/orchestrator.d.ts.map +1 -1
  39. package/dist/orchestrator.js +2 -0
  40. package/dist/orchestrator.js.map +1 -1
  41. package/dist/paths.d.ts +2 -0
  42. package/dist/paths.d.ts.map +1 -1
  43. package/dist/paths.js +4 -0
  44. package/dist/paths.js.map +1 -1
  45. package/dist/pipeline-engine.js +2 -2
  46. package/dist/pipeline-engine.js.map +1 -1
  47. package/dist/planning-engine.js +3 -3
  48. package/dist/planning-engine.js.map +1 -1
  49. package/dist/progress-tracker.d.ts +1 -0
  50. package/dist/progress-tracker.d.ts.map +1 -1
  51. package/dist/progress-tracker.js +1 -1
  52. package/dist/progress-tracker.js.map +1 -1
  53. package/dist/session.d.ts +2 -1
  54. package/dist/session.d.ts.map +1 -1
  55. package/dist/session.js +14 -0
  56. package/dist/session.js.map +1 -1
  57. package/dist/stats.d.ts +24 -0
  58. package/dist/stats.d.ts.map +1 -0
  59. package/dist/stats.js +85 -0
  60. package/dist/stats.js.map +1 -0
  61. package/dist/task-engine.js +1 -1
  62. package/dist/task-engine.js.map +1 -1
  63. package/dist/tui-renderer.d.ts +1 -1
  64. package/dist/tui-renderer.d.ts.map +1 -1
  65. package/dist/tui-renderer.js +44 -13
  66. package/dist/tui-renderer.js.map +1 -1
  67. package/package.json +1 -1
@@ -0,0 +1,101 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { parse as parseYaml } from "yaml";
4
+ const FLEET_CONFIG_FILE = "fleet.config.yaml";
5
+ function fail(msg) {
6
+ throw new Error(`Fleet config error: ${msg}`);
7
+ }
8
+ function requireString(obj, key, context) {
9
+ const val = obj[key];
10
+ if (typeof val !== "string" || val === "") {
11
+ fail(`"${key}" must be a non-empty string in ${context}`);
12
+ }
13
+ return val;
14
+ }
15
+ function optionalString(obj, key) {
16
+ const val = obj[key];
17
+ if (val === undefined || val === null)
18
+ return undefined;
19
+ if (typeof val !== "string")
20
+ fail(`"${key}" must be a string if provided`);
21
+ return val;
22
+ }
23
+ function resolveRepoPath(rawPath) {
24
+ const expanded = rawPath.replace(/^~(?=\/|$)/, process.env.HOME ?? "");
25
+ return path.resolve(expanded);
26
+ }
27
+ function validateRepo(raw, index) {
28
+ if (typeof raw !== "object" || raw === null)
29
+ fail(`repos[${index}] must be an object`);
30
+ const obj = raw;
31
+ const rawPath = requireString(obj, "path", `repos[${index}]`);
32
+ const resolved = resolveRepoPath(rawPath);
33
+ if (!fs.existsSync(resolved)) {
34
+ fail(`repos[${index}].path does not exist: ${resolved}`);
35
+ }
36
+ return {
37
+ path: resolved,
38
+ role: requireString(obj, "role", `repos[${index}]`),
39
+ };
40
+ }
41
+ function validateOverrides(raw) {
42
+ if (raw === undefined || raw === null)
43
+ return undefined;
44
+ if (typeof raw !== "object" || Array.isArray(raw))
45
+ fail('"overrides" must be an object if provided');
46
+ const result = {};
47
+ for (const [key, value] of Object.entries(raw)) {
48
+ if (typeof value !== "object" || value === null)
49
+ fail(`overrides["${key}"] must be an object`);
50
+ const obj = value;
51
+ result[resolveRepoPath(key)] = {
52
+ verifyBuild: optionalString(obj, "verifyBuild"),
53
+ verifyTest: optionalString(obj, "verifyTest"),
54
+ verifyLint: optionalString(obj, "verifyLint"),
55
+ };
56
+ }
57
+ return result;
58
+ }
59
+ export function parseFleetConfig(raw) {
60
+ if (typeof raw !== "object" || raw === null) {
61
+ fail("Config must be a YAML object");
62
+ }
63
+ const obj = raw;
64
+ if (!Array.isArray(obj.repos) || obj.repos.length === 0) {
65
+ fail('"repos" must be a non-empty array');
66
+ }
67
+ return {
68
+ repos: obj.repos.map((r, i) => validateRepo(r, i)),
69
+ overrides: validateOverrides(obj.overrides),
70
+ integrationTest: optionalString(obj, "integrationTest"),
71
+ };
72
+ }
73
+ /** Load fleet config from a file path or the current directory. */
74
+ export function loadFleetConfig(configPath) {
75
+ const resolved = configPath ? path.resolve(configPath) : path.resolve(FLEET_CONFIG_FILE);
76
+ if (!fs.existsSync(resolved)) {
77
+ fail(`Fleet config not found: ${resolved}`);
78
+ }
79
+ let parsed;
80
+ try {
81
+ parsed = parseYaml(fs.readFileSync(resolved, "utf-8"));
82
+ }
83
+ catch (err) {
84
+ fail(`Failed to parse ${resolved}: ${err instanceof Error ? err.message : String(err)}`);
85
+ }
86
+ return parseFleetConfig(parsed);
87
+ }
88
+ /** Build a FleetConfig from CLI --repos arguments. */
89
+ export function fleetConfigFromArgs(repoPaths) {
90
+ return {
91
+ repos: repoPaths.map((p) => {
92
+ const resolved = resolveRepoPath(p);
93
+ if (!fs.existsSync(resolved)) {
94
+ fail(`Repository path does not exist: ${resolved}`);
95
+ }
96
+ const name = path.basename(resolved);
97
+ return { path: resolved, role: name };
98
+ }),
99
+ };
100
+ }
101
+ //# sourceMappingURL=fleet-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-config.js","sourceRoot":"","sources":["../src/fleet-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { SwarmConfig } from "./config.js";
2
+ import type { FleetConfig } from "./fleet-types.js";
3
+ import type { Logger } from "./logger.js";
4
+ export declare class FleetEngine {
5
+ private readonly config;
6
+ private readonly fleetConfig;
7
+ private readonly logger;
8
+ private sessions;
9
+ constructor(config: SwarmConfig, fleetConfig: FleetConfig, logger: Logger);
10
+ start(): Promise<void>;
11
+ stop(): Promise<void>;
12
+ execute(): Promise<void>;
13
+ private analyzeAll;
14
+ private findAnalysisFile;
15
+ private strategize;
16
+ private parseStrategy;
17
+ private executeWaves;
18
+ private buildRepoPrompt;
19
+ private runSwarmTask;
20
+ private crossReview;
21
+ private loadCheckpoint;
22
+ private saveCheckpoint;
23
+ private formatStrategy;
24
+ private buildSummary;
25
+ }
26
+ //# sourceMappingURL=fleet-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-engine.d.ts","sourceRoot":"","sources":["../src/fleet-engine.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAmB,WAAW,EAAkD,MAAM,kBAAkB,CAAC;AACrH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAsB1C,qBAAa,WAAW;IAIpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,OAAO,CAAC,QAAQ,CAA+B;gBAG5B,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM;IAG3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAoEhB,UAAU;IAmCxB,OAAO,CAAC,gBAAgB;YAwBV,UAAU;IAiBxB,OAAO,CAAC,aAAa;YAoDP,YAAY;IAkD1B,OAAO,CAAC,eAAe;YAwBT,YAAY;YAuDZ,WAAW;IAgBzB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,cAAc;IAgCtB,OAAO,CAAC,YAAY;CAgBrB"}
@@ -0,0 +1,405 @@
1
+ /**
2
+ * FleetEngine — meta-orchestrator for cross-repo feature implementation.
3
+ * Coordinates independent swarm instances across multiple repositories:
4
+ * 1. Analyze all repos in parallel
5
+ * 2. Strategist agent produces cross-repo plan with waves
6
+ * 3. Execute waves: repos in each wave run in parallel via child `swarm task` processes
7
+ * 4. Cross-repo reviewer validates consistency
8
+ */
9
+ import { execSync, spawn } from "node:child_process";
10
+ import * as fs from "node:fs";
11
+ import * as os from "node:os";
12
+ import * as path from "node:path";
13
+ import { loadPipelineConfig } from "./pipeline-config.js";
14
+ import { SessionManager } from "./session.js";
15
+ const FLEET_CHECKPOINT_FILE = "fleet-checkpoint.json";
16
+ const FLEET_APPROVED_KEYWORD = "FLEET_APPROVED";
17
+ function fleetOutputDir(config) {
18
+ return path.join(config.repoRoot, config.swarmDir, "fleet", config.runId);
19
+ }
20
+ function checkpointPath(config) {
21
+ return path.join(fleetOutputDir(config), FLEET_CHECKPOINT_FILE);
22
+ }
23
+ function resolveSwarmBin() {
24
+ // Prefer the locally built dist, fall back to npx
25
+ const localBin = path.join(import.meta.dirname, "..", "dist", "index.js");
26
+ if (fs.existsSync(localBin))
27
+ return `node ${localBin}`;
28
+ return "npx @copilot-swarm/core";
29
+ }
30
+ export class FleetEngine {
31
+ config;
32
+ fleetConfig;
33
+ logger;
34
+ sessions = null;
35
+ constructor(config, fleetConfig, logger) {
36
+ this.config = config;
37
+ this.fleetConfig = fleetConfig;
38
+ this.logger = logger;
39
+ }
40
+ async start() {
41
+ const pipeline = loadPipelineConfig(this.config.repoRoot);
42
+ this.sessions = new SessionManager(this.config, pipeline, this.logger);
43
+ await this.sessions.start();
44
+ }
45
+ async stop() {
46
+ if (this.sessions) {
47
+ await this.sessions.stop();
48
+ this.sessions = null;
49
+ }
50
+ }
51
+ async execute() {
52
+ const outDir = fleetOutputDir(this.config);
53
+ fs.mkdirSync(outDir, { recursive: true });
54
+ const checkpoint = this.loadCheckpoint();
55
+ const repos = this.fleetConfig.repos;
56
+ // Phase 1: Analyze all repos
57
+ let analyses = checkpoint.analyses;
58
+ if (!checkpoint.completedPhases.includes("analyze")) {
59
+ this.logger.info(`🔍 Analyzing ${repos.length} repositories...`);
60
+ analyses = await this.analyzeAll();
61
+ checkpoint.analyses = analyses;
62
+ checkpoint.completedPhases.push("analyze");
63
+ this.saveCheckpoint(checkpoint);
64
+ }
65
+ else {
66
+ this.logger.info("⏭️ Skipping analysis (completed in previous run)");
67
+ }
68
+ // Phase 2: Strategize
69
+ let strategy = checkpoint.strategy;
70
+ if (!checkpoint.completedPhases.includes("strategize")) {
71
+ this.logger.info("🧠 Strategist analyzing cross-repo dependencies...");
72
+ strategy = await this.strategize(analyses);
73
+ checkpoint.strategy = strategy;
74
+ checkpoint.completedPhases.push("strategize");
75
+ this.saveCheckpoint(checkpoint);
76
+ }
77
+ else {
78
+ this.logger.info("⏭️ Skipping strategy (completed in previous run)");
79
+ }
80
+ if (!strategy)
81
+ throw new Error("Strategy not produced — cannot continue");
82
+ // Save strategy to output
83
+ const strategyPath = path.join(outDir, "strategy.md");
84
+ fs.writeFileSync(strategyPath, this.formatStrategy(strategy), "utf-8");
85
+ this.logger.info(`📋 Strategy saved to ${strategyPath}`);
86
+ // Phase 3: Execute waves
87
+ if (!checkpoint.completedPhases.includes("execute")) {
88
+ this.logger.info(`🚀 Executing ${strategy.waves.length} wave(s)...`);
89
+ await this.executeWaves(strategy, checkpoint);
90
+ checkpoint.completedPhases.push("execute");
91
+ this.saveCheckpoint(checkpoint);
92
+ }
93
+ else {
94
+ this.logger.info("⏭️ Skipping execution (completed in previous run)");
95
+ }
96
+ // Phase 4: Cross-repo review
97
+ if (!checkpoint.completedPhases.includes("review")) {
98
+ this.logger.info("🔎 Cross-repo reviewer checking consistency...");
99
+ const reviewResult = await this.crossReview(strategy, checkpoint.waveResults);
100
+ const reviewPath = path.join(outDir, "fleet-review.md");
101
+ fs.writeFileSync(reviewPath, reviewResult, "utf-8");
102
+ checkpoint.completedPhases.push("review");
103
+ this.saveCheckpoint(checkpoint);
104
+ }
105
+ else {
106
+ this.logger.info("⏭️ Skipping cross-repo review (completed in previous run)");
107
+ }
108
+ // Phase 5: Summary
109
+ const summaryPath = path.join(outDir, "fleet-summary.md");
110
+ fs.writeFileSync(summaryPath, this.buildSummary(strategy, checkpoint), "utf-8");
111
+ this.logger.info(`✅ Fleet completed — summary at ${summaryPath}`);
112
+ }
113
+ // --- Phase implementations ---
114
+ async analyzeAll() {
115
+ const analyses = {};
116
+ const swarmBin = resolveSwarmBin();
117
+ // Run analyses in parallel
118
+ const promises = this.fleetConfig.repos.map(async (repo) => {
119
+ this.logger.info(` 📂 Analyzing ${path.basename(repo.path)}...`);
120
+ try {
121
+ execSync(`${swarmBin} analyze --no-tui`, {
122
+ cwd: repo.path,
123
+ encoding: "utf-8",
124
+ stdio: "pipe",
125
+ timeout: 600_000,
126
+ });
127
+ }
128
+ catch (err) {
129
+ this.logger.warn(` ⚠️ Analysis failed for ${repo.path}: ${err instanceof Error ? err.message : String(err)}`);
130
+ }
131
+ // Read the generated analysis
132
+ const analysisFile = path.join(repo.path, ".swarm", "analysis", "repo-analysis.md");
133
+ // Also check session-scoped paths
134
+ const swarmDir = path.join(repo.path, ".swarm");
135
+ const analysis = this.findAnalysisFile(swarmDir) ?? (fs.existsSync(analysisFile) ? analysisFile : null);
136
+ if (analysis) {
137
+ analyses[repo.path] = fs.readFileSync(analysis, "utf-8");
138
+ }
139
+ else {
140
+ analyses[repo.path] = `Repository at ${repo.path} — no analysis available. Role: ${repo.role}`;
141
+ }
142
+ });
143
+ await Promise.all(promises);
144
+ return analyses;
145
+ }
146
+ findAnalysisFile(swarmDir) {
147
+ if (!fs.existsSync(swarmDir))
148
+ return null;
149
+ // Check sessions directories for analysis files
150
+ const sessionsDir = path.join(swarmDir, "sessions");
151
+ if (fs.existsSync(sessionsDir)) {
152
+ try {
153
+ const sessions = fs.readdirSync(sessionsDir);
154
+ for (const sid of sessions.reverse()) {
155
+ const candidate = path.join(sessionsDir, sid, "analysis", "repo-analysis.md");
156
+ if (fs.existsSync(candidate))
157
+ return candidate;
158
+ }
159
+ }
160
+ catch {
161
+ // ignore
162
+ }
163
+ }
164
+ // Legacy path
165
+ const legacy = path.join(swarmDir, "analysis", "repo-analysis.md");
166
+ if (fs.existsSync(legacy))
167
+ return legacy;
168
+ return null;
169
+ }
170
+ async strategize(analyses) {
171
+ if (!this.sessions)
172
+ throw new Error("Sessions not initialized");
173
+ const repoContexts = this.fleetConfig.repos
174
+ .map((repo) => {
175
+ const analysis = analyses[repo.path] ?? "No analysis available.";
176
+ return `### ${path.basename(repo.path)} (${repo.path})\n**Role:** ${repo.role}\n\n${analysis}`;
177
+ })
178
+ .join("\n\n---\n\n");
179
+ const prompt = `## Feature Request\n\n${this.config.issueBody}\n\n## Repository Analyses\n\n${repoContexts}\n\nProduce a cross-repo strategy with shared contracts, per-repo tasks, dependencies, and execution waves.`;
180
+ const response = await this.sessions.callIsolated("fleet-strategist", prompt, undefined, "fleet-strategize");
181
+ return this.parseStrategy(response);
182
+ }
183
+ parseStrategy(markdown) {
184
+ const repoTasks = [];
185
+ const dependencies = [];
186
+ const waves = [];
187
+ let sharedContracts = "";
188
+ // Extract shared contracts
189
+ const contractsMatch = markdown.match(/## Shared Contracts\s*\n([\s\S]*?)(?=\n## |\n---|z)/);
190
+ if (contractsMatch) {
191
+ sharedContracts = contractsMatch[1].trim();
192
+ }
193
+ // Extract per-repo tasks
194
+ const tasksSection = markdown.match(/## Per-Repo Tasks\s*\n([\s\S]*?)(?=\n## |z)/);
195
+ if (tasksSection) {
196
+ const repoMatches = tasksSection[1].matchAll(/### .+?\(path:\s*(.+?)\)\s*\n([\s\S]*?)(?=\n### |z)/g);
197
+ for (const match of repoMatches) {
198
+ repoTasks.push({ repoPath: match[1].trim(), tasks: match[2].trim() });
199
+ }
200
+ }
201
+ // Extract dependencies
202
+ const depsSection = markdown.match(/## Dependencies\s*\n([\s\S]*?)(?=\n## |z)/);
203
+ if (depsSection) {
204
+ const depLines = depsSection[1].matchAll(/- (.+?) → (.+?): (.+)/g);
205
+ for (const match of depLines) {
206
+ dependencies.push({ from: match[1].trim(), to: match[2].trim(), reason: match[3].trim() });
207
+ }
208
+ }
209
+ // Extract execution waves
210
+ const wavesSection = markdown.match(/## Execution Waves\s*\n([\s\S]*?)$/);
211
+ if (wavesSection) {
212
+ const waveBlocks = wavesSection[1].matchAll(/### Wave \d+.*?\n([\s\S]*?)(?=\n### Wave |z)/g);
213
+ for (const block of waveBlocks) {
214
+ const paths = block[1].matchAll(/- (.+)/g);
215
+ const wavePaths = [];
216
+ for (const p of paths) {
217
+ wavePaths.push(p[1].trim());
218
+ }
219
+ if (wavePaths.length > 0)
220
+ waves.push(wavePaths);
221
+ }
222
+ }
223
+ // Fallback: if no waves parsed, put all repos in one wave
224
+ if (waves.length === 0) {
225
+ waves.push(this.fleetConfig.repos.map((r) => r.path));
226
+ }
227
+ return { sharedContracts, repoTasks, dependencies, waves };
228
+ }
229
+ async executeWaves(strategy, checkpoint) {
230
+ const swarmBin = resolveSwarmBin();
231
+ let priorWaveContext = "";
232
+ for (let waveIdx = checkpoint.currentWave; waveIdx < strategy.waves.length; waveIdx++) {
233
+ const wave = strategy.waves[waveIdx];
234
+ this.logger.info(`\n 🌊 Wave ${waveIdx + 1}/${strategy.waves.length}: ${wave.length} repo(s)`);
235
+ if (!checkpoint.waveResults[waveIdx]) {
236
+ checkpoint.waveResults[waveIdx] = {};
237
+ }
238
+ // Run repos in this wave in parallel
239
+ const promises = wave.map(async (repoPath) => {
240
+ if (checkpoint.waveResults[waveIdx][repoPath]) {
241
+ this.logger.info(` ⏭️ ${path.basename(repoPath)} already completed`);
242
+ return;
243
+ }
244
+ const repoTask = strategy.repoTasks.find((rt) => rt.repoPath === repoPath);
245
+ const taskPrompt = this.buildRepoPrompt(repoPath, repoTask, strategy.sharedContracts, priorWaveContext);
246
+ this.logger.info(` 🔧 ${path.basename(repoPath)} starting...`);
247
+ try {
248
+ const result = await this.runSwarmTask(swarmBin, repoPath, taskPrompt);
249
+ checkpoint.waveResults[waveIdx][repoPath] = result || "Completed (no summary)";
250
+ this.logger.info(` ✅ ${path.basename(repoPath)} completed`);
251
+ }
252
+ catch (err) {
253
+ const errMsg = err instanceof Error ? err.message : String(err);
254
+ checkpoint.waveResults[waveIdx][repoPath] = `FAILED: ${errMsg}`;
255
+ this.logger.error(` ❌ ${path.basename(repoPath)} failed: ${errMsg}`);
256
+ throw new Error(`Wave ${waveIdx + 1} failed: ${path.basename(repoPath)} — ${errMsg}`);
257
+ }
258
+ this.saveCheckpoint(checkpoint);
259
+ });
260
+ await Promise.all(promises);
261
+ // Collect context for next wave
262
+ priorWaveContext = Object.entries(checkpoint.waveResults[waveIdx])
263
+ .map(([repo, result]) => `### ${path.basename(repo)}\n${result}`)
264
+ .join("\n\n");
265
+ checkpoint.currentWave = waveIdx + 1;
266
+ this.saveCheckpoint(checkpoint);
267
+ }
268
+ }
269
+ buildRepoPrompt(_repoPath, repoTask, sharedContracts, priorWaveContext) {
270
+ const parts = [];
271
+ parts.push(`## Feature Context\n\n${this.config.issueBody}`);
272
+ if (sharedContracts) {
273
+ parts.push(`## Shared Contracts (MUST adhere to these exactly)\n\n${sharedContracts}`);
274
+ }
275
+ if (repoTask) {
276
+ parts.push(`## Tasks for This Repository\n\n${repoTask.tasks}`);
277
+ }
278
+ if (priorWaveContext) {
279
+ parts.push(`## Prior Wave Results (for context)\n\n${priorWaveContext}`);
280
+ }
281
+ return parts.join("\n\n");
282
+ }
283
+ async runSwarmTask(swarmBin, repoPath, prompt) {
284
+ // Write prompt to temp file to avoid shell escaping issues
285
+ const tmpFile = path.join(os.tmpdir(), `fleet-${Date.now()}-${path.basename(repoPath)}.md`);
286
+ fs.writeFileSync(tmpFile, prompt, "utf-8");
287
+ const overrides = this.fleetConfig.overrides?.[repoPath];
288
+ const verifyArgs = [];
289
+ if (overrides?.verifyBuild)
290
+ verifyArgs.push(`--verify-build "${overrides.verifyBuild}"`);
291
+ if (overrides?.verifyTest)
292
+ verifyArgs.push(`--verify-test "${overrides.verifyTest}"`);
293
+ if (overrides?.verifyLint)
294
+ verifyArgs.push(`--verify-lint "${overrides.verifyLint}"`);
295
+ const cmd = `${swarmBin} task --no-tui -f "${tmpFile}" ${verifyArgs.join(" ")}`.trim();
296
+ return new Promise((resolve, reject) => {
297
+ const child = spawn("sh", ["-c", cmd], {
298
+ cwd: repoPath,
299
+ stdio: ["ignore", "pipe", "pipe"],
300
+ timeout: 1_800_000,
301
+ });
302
+ let stdout = "";
303
+ let stderr = "";
304
+ child.stdout.on("data", (data) => {
305
+ stdout += data.toString();
306
+ });
307
+ child.stderr.on("data", (data) => {
308
+ stderr += data.toString();
309
+ });
310
+ child.on("close", (code) => {
311
+ // Clean up temp file
312
+ try {
313
+ fs.unlinkSync(tmpFile);
314
+ }
315
+ catch {
316
+ // ignore
317
+ }
318
+ if (code === 0) {
319
+ resolve(stdout);
320
+ }
321
+ else {
322
+ reject(new Error(`swarm task exited with code ${code}: ${stderr.slice(-500)}`));
323
+ }
324
+ });
325
+ child.on("error", (err) => {
326
+ try {
327
+ fs.unlinkSync(tmpFile);
328
+ }
329
+ catch {
330
+ // ignore
331
+ }
332
+ reject(err);
333
+ });
334
+ });
335
+ }
336
+ async crossReview(strategy, waveResults) {
337
+ if (!this.sessions)
338
+ throw new Error("Sessions not initialized");
339
+ const allResults = waveResults
340
+ .flatMap((wave, i) => Object.entries(wave).map(([repo, result]) => `### Wave ${i + 1}: ${path.basename(repo)}\n${result}`))
341
+ .join("\n\n---\n\n");
342
+ const prompt = `## Feature Request\n\n${this.config.issueBody}\n\n## Shared Contracts\n\n${strategy.sharedContracts}\n\n## Implementation Results\n\n${allResults}\n\nReview all changes for consistency across repos. Reply "${FLEET_APPROVED_KEYWORD}" if everything is consistent, or list issues.`;
343
+ return this.sessions.callIsolated("fleet-reviewer", prompt, undefined, "fleet-review");
344
+ }
345
+ // --- Checkpoint ---
346
+ loadCheckpoint() {
347
+ const cpPath = checkpointPath(this.config);
348
+ if (this.config.resume && fs.existsSync(cpPath)) {
349
+ try {
350
+ return JSON.parse(fs.readFileSync(cpPath, "utf-8"));
351
+ }
352
+ catch {
353
+ this.logger.warn("⚠️ Failed to load fleet checkpoint, starting fresh");
354
+ }
355
+ }
356
+ return { completedPhases: [], analyses: {}, waveResults: [], currentWave: 0 };
357
+ }
358
+ saveCheckpoint(checkpoint) {
359
+ const cpPath = checkpointPath(this.config);
360
+ fs.mkdirSync(path.dirname(cpPath), { recursive: true });
361
+ fs.writeFileSync(cpPath, JSON.stringify(checkpoint, null, 2), "utf-8");
362
+ }
363
+ // --- Formatting ---
364
+ formatStrategy(strategy) {
365
+ const parts = ["# Fleet Strategy\n"];
366
+ if (strategy.sharedContracts) {
367
+ parts.push(`## Shared Contracts\n\n${strategy.sharedContracts}\n`);
368
+ }
369
+ parts.push("## Per-Repo Tasks\n");
370
+ for (const rt of strategy.repoTasks) {
371
+ parts.push(`### ${path.basename(rt.repoPath)} (${rt.repoPath})\n\n${rt.tasks}\n`);
372
+ }
373
+ if (strategy.dependencies.length > 0) {
374
+ parts.push("## Dependencies\n");
375
+ for (const dep of strategy.dependencies) {
376
+ parts.push(`- ${dep.from} → ${dep.to}: ${dep.reason}`);
377
+ }
378
+ parts.push("");
379
+ }
380
+ parts.push("## Execution Waves\n");
381
+ for (let i = 0; i < strategy.waves.length; i++) {
382
+ parts.push(`### Wave ${i + 1}\n`);
383
+ for (const p of strategy.waves[i]) {
384
+ parts.push(`- ${p}`);
385
+ }
386
+ parts.push("");
387
+ }
388
+ return parts.join("\n");
389
+ }
390
+ buildSummary(strategy, checkpoint) {
391
+ const parts = ["# Fleet Summary\n"];
392
+ parts.push(`**Feature:** ${this.config.issueBody.slice(0, 200)}\n`);
393
+ parts.push(`**Repos:** ${this.fleetConfig.repos.map((r) => path.basename(r.path)).join(", ")}\n`);
394
+ parts.push(`**Waves:** ${strategy.waves.length}\n`);
395
+ for (let i = 0; i < checkpoint.waveResults.length; i++) {
396
+ parts.push(`\n## Wave ${i + 1}\n`);
397
+ for (const [repo, result] of Object.entries(checkpoint.waveResults[i])) {
398
+ const status = result.startsWith("FAILED:") ? "❌" : "✅";
399
+ parts.push(`### ${status} ${path.basename(repo)}\n\n${result.slice(0, 500)}\n`);
400
+ }
401
+ }
402
+ return parts.join("\n");
403
+ }
404
+ }
405
+ //# sourceMappingURL=fleet-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-engine.js","sourceRoot":"","sources":["../src/fleet-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Fleet configuration types.
3
+ * Defines the shape of `fleet.config.yaml` — the file that specifies
4
+ * which repositories participate in a cross-repo feature and how they relate.
5
+ */
6
+ /** A single repository in the fleet. */
7
+ export interface FleetRepo {
8
+ /** Absolute path to the repository root. */
9
+ readonly path: string;
10
+ /** Human-readable description of this repo's role in the feature. */
11
+ readonly role: string;
12
+ }
13
+ /** Per-repo verify overrides in fleet config. */
14
+ export interface FleetRepoOverrides {
15
+ readonly verifyBuild?: string;
16
+ readonly verifyTest?: string;
17
+ readonly verifyLint?: string;
18
+ }
19
+ /** Cross-repo dependency produced by the strategist agent. */
20
+ export interface FleetDependency {
21
+ /** Repo path that must complete first. */
22
+ readonly from: string;
23
+ /** Repo path that depends on `from`. */
24
+ readonly to: string;
25
+ /** Description of the dependency (e.g., "API types must exist before frontend can consume them"). */
26
+ readonly reason: string;
27
+ }
28
+ /** Per-repo task assignment from the strategist agent. */
29
+ export interface FleetRepoTasks {
30
+ readonly repoPath: string;
31
+ readonly tasks: string;
32
+ }
33
+ /** Strategy output from the strategist agent (parsed from markdown). */
34
+ export interface FleetStrategy {
35
+ readonly sharedContracts: string;
36
+ readonly repoTasks: readonly FleetRepoTasks[];
37
+ readonly dependencies: readonly FleetDependency[];
38
+ readonly waves: readonly string[][];
39
+ }
40
+ /** Fleet-level checkpoint state. */
41
+ export interface FleetCheckpoint {
42
+ completedPhases: string[];
43
+ analyses: Record<string, string>;
44
+ strategy?: FleetStrategy;
45
+ waveResults: Record<string, string>[];
46
+ currentWave: number;
47
+ }
48
+ /** Root fleet configuration loaded from `fleet.config.yaml`. */
49
+ export interface FleetConfig {
50
+ readonly repos: readonly FleetRepo[];
51
+ readonly overrides?: Readonly<Record<string, FleetRepoOverrides>>;
52
+ /** Optional integration test command to run after all repos complete. */
53
+ readonly integrationTest?: string;
54
+ }
55
+ //# sourceMappingURL=fleet-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-types.d.ts","sourceRoot":"","sources":["../src/fleet-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wCAAwC;AACxC,MAAM,WAAW,SAAS;IACxB,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,iDAAiD;AACjD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,8DAA8D;AAC9D,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,qGAAqG;IACrG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,wEAAwE;AACxE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,SAAS,eAAe,EAAE,CAAC;IAClD,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC;CACrC;AAED,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAClE,yEAAyE;IACzE,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Fleet configuration types.
3
+ * Defines the shape of `fleet.config.yaml` — the file that specifies
4
+ * which repositories participate in a cross-repo feature and how they relate.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=fleet-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-types.js","sourceRoot":"","sources":["../src/fleet-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}