copilot-flow 1.4.0 → 2.0.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.
package/README.md CHANGED
@@ -86,6 +86,13 @@ copilot-flow agent spawn --type coder --task "..." \
86
86
  # Disable retries entirely
87
87
  copilot-flow agent spawn --type coder --task "..." --no-retry
88
88
 
89
+ # Override session timeout (default: 120 s — increase for large/complex tasks)
90
+ copilot-flow agent spawn --task "..." --timeout 300000 # 5 minutes
91
+ copilot-flow swarm start --spec big-task.md --timeout 600000 # 10 minutes
92
+
93
+ # Verbose mode: see session lifecycle, model, prompt size, and retry events
94
+ copilot-flow agent spawn --task "..." --verbose
95
+
89
96
  # List agent states
90
97
  copilot-flow agent list
91
98
  copilot-flow agent types
@@ -120,6 +127,75 @@ copilot-flow swarm init --topology hierarchical --max-agents 8
120
127
  copilot-flow swarm status
121
128
  ```
122
129
 
130
+ ### `plan` / `exec` — phased pipelines
131
+
132
+ For multi-phase projects where one swarm feeds into the next, use `plan` to generate
133
+ a structured YAML plan from a spec, then `exec` to run it.
134
+
135
+ ```bash
136
+ # 1. Generate a phases.yaml from a spec file
137
+ copilot-flow plan spec.md # writes phases.yaml
138
+ copilot-flow plan spec.md -f my-plan.yaml # custom output file
139
+
140
+ # 2. Execute all phases in order
141
+ copilot-flow exec phases.yaml
142
+
143
+ # 3. Execute a single phase (deps must already have output files on disk)
144
+ copilot-flow exec phases.yaml --phase implement
145
+
146
+ # 4. Re-run a phase even if its output file exists
147
+ copilot-flow exec phases.yaml --phase implement --force
148
+
149
+ # 5. Stream output as it arrives
150
+ copilot-flow exec phases.yaml --stream
151
+ ```
152
+
153
+ **How it works:**
154
+
155
+ 1. `plan` runs an `analyst` agent against your spec and produces a `phases.yaml` file.
156
+ 2. `exec` reads the plan, resolves execution order, and runs each phase:
157
+ - **`type: agent`** — single specialist agent
158
+ - **`type: swarm`** — multi-agent pipeline with a configurable topology
159
+ 3. Each phase writes its output to `phase-{id}.md` (or a custom filename set in the YAML).
160
+ 4. Each phase's prompt automatically includes the original spec **and** the output files of all its dependencies — so context flows through the pipeline automatically.
161
+ 5. If a phase output file already exists, `exec` skips it and moves on. Use `--force` to re-run.
162
+
163
+ **`phases.yaml` format:**
164
+
165
+ ```yaml
166
+ version: "1"
167
+ spec: spec.md # injected into every phase prompt
168
+ phases:
169
+ - id: research
170
+ description: Investigate the problem domain and gather context.
171
+ type: agent
172
+ agentType: researcher
173
+ dependsOn: []
174
+
175
+ - id: design
176
+ description: Design the solution architecture based on the research.
177
+ type: swarm
178
+ topology: hierarchical
179
+ agents: [architect, analyst]
180
+ dependsOn: [research]
181
+
182
+ - id: implement
183
+ description: Implement the designed solution.
184
+ type: swarm
185
+ topology: hierarchical
186
+ agents: [coder, coder, tester]
187
+ dependsOn: [design]
188
+
189
+ - id: review
190
+ description: Review the implementation for quality and correctness.
191
+ type: agent
192
+ agentType: reviewer
193
+ output: final-review.md # optional: override the default phase-{id}.md name
194
+ dependsOn: [implement]
195
+ ```
196
+
197
+ ---
198
+
123
199
  ### `memory`
124
200
 
125
201
  ```bash
@@ -350,6 +426,7 @@ const result2 = await withRetry(
350
426
  {
351
427
  "version": "1.0.0",
352
428
  "defaultModel": "gpt-4o",
429
+ "defaultTimeoutMs": 120000,
353
430
  "swarm": {
354
431
  "topology": "hierarchical",
355
432
  "maxAgents": 8
@@ -375,8 +452,10 @@ const result2 = await withRetry(
375
452
 
376
453
  Environment variable overrides:
377
454
  ```bash
378
- GITHUB_TOKEN=ghp_... # GitHub token (uses logged-in user by default)
455
+ GITHUB_TOKEN=ghp_... # GitHub token (bypasses keychain on managed Macs)
456
+ GH_TOKEN=$(gh auth token) # Alternative: reuse the GitHub CLI token
379
457
  COPILOT_FLOW_DEFAULT_MODEL=gpt-4o
458
+ COPILOT_FLOW_TIMEOUT_MS=300000 # Default session timeout in ms (default: 120000)
380
459
  COPILOT_FLOW_MAX_RETRIES=3
381
460
  COPILOT_FLOW_RETRY_DELAY_MS=1000
382
461
  COPILOT_FLOW_LOG_LEVEL=info # debug | info | warn | error | silent
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerExec(program: Command): void;
3
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0EpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8HnD"}
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerExec = registerExec;
7
+ const fs_1 = require("fs");
8
+ const js_yaml_1 = __importDefault(require("js-yaml"));
9
+ const executor_js_1 = require("../agents/executor.js");
10
+ const coordinator_js_1 = require("../swarm/coordinator.js");
11
+ const output_js_1 = require("../output.js");
12
+ const config_js_1 = require("../config.js");
13
+ const client_manager_js_1 = require("../core/client-manager.js");
14
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
15
+ function phaseOutputFile(phase) {
16
+ return phase.output ?? `phase-${phase.id}.md`;
17
+ }
18
+ /**
19
+ * Topological sort: returns phases in a valid execution order
20
+ * where every dependency appears before the phase that needs it.
21
+ */
22
+ function topoSort(phases) {
23
+ const byId = new Map(phases.map(p => [p.id, p]));
24
+ const result = [];
25
+ const visited = new Set();
26
+ function visit(id) {
27
+ if (visited.has(id))
28
+ return;
29
+ visited.add(id);
30
+ const phase = byId.get(id);
31
+ if (!phase)
32
+ throw new Error(`Unknown phase id in dependsOn: "${id}"`);
33
+ for (const dep of phase.dependsOn ?? [])
34
+ visit(dep);
35
+ result.push(phase);
36
+ }
37
+ for (const phase of phases)
38
+ visit(phase.id);
39
+ return result;
40
+ }
41
+ /**
42
+ * Build the prompt for a phase: original spec + outputs from all dependencies
43
+ * (read from the in-memory results map first, then fall back to disk).
44
+ */
45
+ function buildPhasePrompt(phase, plan, phaseResults) {
46
+ const sections = [];
47
+ if (plan.spec && (0, fs_1.existsSync)(plan.spec)) {
48
+ sections.push(`## Original specification (${plan.spec})\n\n${(0, fs_1.readFileSync)(plan.spec, 'utf-8').trim()}`);
49
+ }
50
+ for (const depId of phase.dependsOn ?? []) {
51
+ const depPhase = plan.phases.find(p => p.id === depId);
52
+ if (!depPhase)
53
+ continue;
54
+ const content = phaseResults.get(depId) ??
55
+ ((0, fs_1.existsSync)(phaseOutputFile(depPhase))
56
+ ? (0, fs_1.readFileSync)(phaseOutputFile(depPhase), 'utf-8').trim()
57
+ : null);
58
+ if (content) {
59
+ sections.push(`## Output from phase "${depId}"\n\n${content}`);
60
+ }
61
+ }
62
+ sections.push(`## Your task — phase "${phase.id}"\n\n${phase.description}`);
63
+ return sections.join('\n\n---\n\n');
64
+ }
65
+ // ─── Command ──────────────────────────────────────────────────────────────────
66
+ function registerExec(program) {
67
+ program
68
+ .command('exec <plan>')
69
+ .description('Execute a phased plan — all phases or a single one')
70
+ .option('--phase <id>', 'Run only this phase (dependency output files must exist on disk)')
71
+ .option('--force', 'Re-run phases even if their output file already exists')
72
+ .option('--timeout <ms>', 'Session timeout per agent in ms (overrides config)')
73
+ .option('--stream', 'Stream agent output as it arrives')
74
+ .action(async (planFile, opts) => {
75
+ if (!(0, fs_1.existsSync)(planFile)) {
76
+ output_js_1.output.error(`Plan file not found: ${planFile}`);
77
+ process.exit(1);
78
+ }
79
+ let plan;
80
+ try {
81
+ plan = js_yaml_1.default.load((0, fs_1.readFileSync)(planFile, 'utf-8'));
82
+ if (!Array.isArray(plan?.phases) || plan.phases.length === 0) {
83
+ throw new Error('No phases found');
84
+ }
85
+ }
86
+ catch (err) {
87
+ output_js_1.output.error(`Invalid plan file: ${err instanceof Error ? err.message : String(err)}`);
88
+ process.exit(1);
89
+ }
90
+ const config = (0, config_js_1.loadConfig)();
91
+ const timeoutMs = opts.timeout ? parseInt(opts.timeout, 10) : config.defaultTimeoutMs;
92
+ const phaseResults = new Map();
93
+ // Determine which phases to run
94
+ let phasesToRun;
95
+ if (opts.phase) {
96
+ const target = plan.phases.find(p => p.id === opts.phase);
97
+ if (!target) {
98
+ output_js_1.output.error(`Phase not found: "${opts.phase}". Available: ${plan.phases.map(p => p.id).join(', ')}`);
99
+ process.exit(1);
100
+ }
101
+ phasesToRun = [target];
102
+ }
103
+ else {
104
+ phasesToRun = topoSort(plan.phases);
105
+ }
106
+ output_js_1.output.header(`Executing plan: ${planFile}`);
107
+ output_js_1.output.dim(`Phases: ${phasesToRun.map(p => p.id).join(' → ')}`);
108
+ output_js_1.output.blank();
109
+ for (const phase of phasesToRun) {
110
+ const outFile = phaseOutputFile(phase);
111
+ output_js_1.output.header(`Phase: ${phase.id}`);
112
+ output_js_1.output.dim(phase.description);
113
+ // Skip already-complete phases unless --force
114
+ if (!opts.force && (0, fs_1.existsSync)(outFile)) {
115
+ const existing = (0, fs_1.readFileSync)(outFile, 'utf-8').trim();
116
+ phaseResults.set(phase.id, existing);
117
+ output_js_1.output.dim(` Already complete — skipping (${outFile}). Use --force to re-run.`);
118
+ output_js_1.output.blank();
119
+ continue;
120
+ }
121
+ const prompt = buildPhasePrompt(phase, plan, phaseResults);
122
+ let phaseOutput;
123
+ if (phase.type === 'swarm') {
124
+ const topology = phase.topology ?? 'hierarchical';
125
+ const agentTypes = phase.agents ?? ['researcher', 'coder', 'reviewer'];
126
+ output_js_1.output.info(`Swarm (${topology}): ${agentTypes.map(a => (0, output_js_1.agentBadge)(a)).join(' → ')}`);
127
+ const tasks = agentTypes.map((agentType, i) => ({
128
+ id: `${phase.id}-task-${i + 1}`,
129
+ agentType,
130
+ prompt,
131
+ dependsOn: i > 0 ? [`${phase.id}-task-${i}`] : undefined,
132
+ sessionOptions: { timeoutMs },
133
+ }));
134
+ const results = await (0, coordinator_js_1.runSwarm)(tasks, topology, {
135
+ onProgress: opts.stream
136
+ ? (_taskId, agentType, chunk) => process.stdout.write(`${(0, output_js_1.agentBadge)(agentType)} ${chunk}`)
137
+ : undefined,
138
+ });
139
+ const last = results.get(tasks[tasks.length - 1].id);
140
+ if (!last?.success) {
141
+ output_js_1.output.error(`Phase "${phase.id}" failed: ${last?.error ?? 'unknown error'}`);
142
+ await client_manager_js_1.clientManager.shutdown();
143
+ process.exit(1);
144
+ }
145
+ phaseOutput = last.output;
146
+ }
147
+ else {
148
+ const agentType = phase.agentType ?? 'analyst';
149
+ output_js_1.output.info(`Agent: ${(0, output_js_1.agentBadge)(agentType)}`);
150
+ const result = await (0, executor_js_1.runAgentTask)(agentType, prompt, {
151
+ timeoutMs,
152
+ onChunk: opts.stream ? chunk => process.stdout.write(chunk) : undefined,
153
+ });
154
+ if (!result.success) {
155
+ output_js_1.output.error(`Phase "${phase.id}" failed: ${result.error}`);
156
+ await client_manager_js_1.clientManager.shutdown();
157
+ process.exit(1);
158
+ }
159
+ phaseOutput = result.output;
160
+ }
161
+ (0, fs_1.writeFileSync)(outFile, `# Phase: ${phase.id}\n\n${phaseOutput}\n`, 'utf-8');
162
+ phaseResults.set(phase.id, phaseOutput);
163
+ if (opts.stream)
164
+ output_js_1.output.blank();
165
+ output_js_1.output.success(`Phase "${phase.id}" complete → ${outFile}`);
166
+ output_js_1.output.blank();
167
+ }
168
+ output_js_1.output.success('All phases complete.');
169
+ await client_manager_js_1.clientManager.shutdown();
170
+ process.exit(0);
171
+ });
172
+ }
173
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,8 @@ const hooks_js_1 = require("./hooks.js");
12
12
  const route_js_1 = require("./route.js");
13
13
  const status_js_1 = require("./status.js");
14
14
  const doctor_js_1 = require("./doctor.js");
15
+ const plan_js_1 = require("./plan.js");
16
+ const exec_js_1 = require("./exec.js");
15
17
  const program = new commander_1.Command();
16
18
  program
17
19
  .name('copilot-flow')
@@ -27,5 +29,7 @@ program
27
29
  (0, route_js_1.registerRoute)(program);
28
30
  (0, status_js_1.registerStatus)(program);
29
31
  (0, doctor_js_1.registerDoctor)(program);
32
+ (0, plan_js_1.registerPlan)(program);
33
+ (0, exec_js_1.registerExec)(program);
30
34
  program.parse(process.argv);
31
35
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAEH,yCAAoC;AACpC,uCAAyC;AACzC,yCAA2C;AAC3C,yCAA2C;AAC3C,2CAA6C;AAC7C,yCAA2C;AAC3C,yCAA2C;AAC3C,2CAA6C;AAC7C,2CAA6C;AAE7C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,cAAc,CAAC;KACpB,WAAW,CACV,8DAA8D;IAC9D,yEAAyE,CAC1E;KACA,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,wBAAwB;AACxB,IAAA,sBAAY,EAAC,OAAO,CAAC,CAAC;AACtB,IAAA,wBAAa,EAAC,OAAO,CAAC,CAAC;AACvB,IAAA,wBAAa,EAAC,OAAO,CAAC,CAAC;AACvB,IAAA,0BAAc,EAAC,OAAO,CAAC,CAAC;AACxB,IAAA,wBAAa,EAAC,OAAO,CAAC,CAAC;AACvB,IAAA,wBAAa,EAAC,OAAO,CAAC,CAAC;AACvB,IAAA,0BAAc,EAAC,OAAO,CAAC,CAAC;AACxB,IAAA,0BAAc,EAAC,OAAO,CAAC,CAAC;AAExB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAEH,yCAAoC;AACpC,uCAAyC;AACzC,yCAA2C;AAC3C,yCAA2C;AAC3C,2CAA6C;AAC7C,yCAA2C;AAC3C,yCAA2C;AAC3C,2CAA6C;AAC7C,2CAA6C;AAC7C,uCAAyC;AACzC,uCAAyC;AAEzC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,cAAc,CAAC;KACpB,WAAW,CACV,8DAA8D;IAC9D,yEAAyE,CAC1E;KACA,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,wBAAwB;AACxB,IAAA,sBAAY,EAAC,OAAO,CAAC,CAAC;AACtB,IAAA,wBAAa,EAAC,OAAO,CAAC,CAAC;AACvB,IAAA,wBAAa,EAAC,OAAO,CAAC,CAAC;AACvB,IAAA,0BAAc,EAAC,OAAO,CAAC,CAAC;AACxB,IAAA,wBAAa,EAAC,OAAO,CAAC,CAAC;AACvB,IAAA,wBAAa,EAAC,OAAO,CAAC,CAAC;AACvB,IAAA,0BAAc,EAAC,OAAO,CAAC,CAAC;AACxB,IAAA,0BAAc,EAAC,OAAO,CAAC,CAAC;AACxB,IAAA,sBAAY,EAAC,OAAO,CAAC,CAAC;AACtB,IAAA,sBAAY,EAAC,OAAO,CAAC,CAAC;AAEtB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerPlan(program: Command): void;
3
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8DpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6EnD"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerPlan = registerPlan;
7
+ const fs_1 = require("fs");
8
+ const js_yaml_1 = __importDefault(require("js-yaml"));
9
+ const executor_js_1 = require("../agents/executor.js");
10
+ const output_js_1 = require("../output.js");
11
+ const config_js_1 = require("../config.js");
12
+ const client_manager_js_1 = require("../core/client-manager.js");
13
+ const AGENT_TYPES = [
14
+ 'coder', 'researcher', 'tester', 'reviewer', 'architect',
15
+ 'coordinator', 'analyst', 'debugger', 'documenter', 'optimizer',
16
+ 'security-auditor', 'performance-engineer',
17
+ ].join(', ');
18
+ function buildPlannerPrompt(specContent) {
19
+ return `You are a software project planner for an AI agent pipeline. \
20
+ Analyse the following specification and produce a YAML execution plan \
21
+ that breaks the work into sequential phases.
22
+
23
+ Rules:
24
+ - Each phase must have a unique kebab-case id.
25
+ - type must be "agent" (single specialist) or "swarm" (multi-agent pipeline).
26
+ - agentType (type: agent) must be one of: ${AGENT_TYPES}
27
+ - topology (type: swarm) must be one of: hierarchical, sequential, mesh
28
+ - agents (type: swarm) is a list of agentType values forming the pipeline.
29
+ - dependsOn lists phase ids that must complete before this phase starts.
30
+ - The first phase must have an empty dependsOn list.
31
+ - output is optional — if omitted the file will be named phase-{id}.md.
32
+ - Output ONLY valid YAML inside a single \`\`\`yaml code block. No other text.
33
+
34
+ Example structure:
35
+ \`\`\`yaml
36
+ version: "1"
37
+ phases:
38
+ - id: research
39
+ description: Investigate the problem domain and gather requirements.
40
+ type: agent
41
+ agentType: researcher
42
+ dependsOn: []
43
+ - id: design
44
+ description: Design the solution architecture based on research.
45
+ type: swarm
46
+ topology: hierarchical
47
+ agents: [architect, analyst]
48
+ dependsOn: [research]
49
+ - id: implement
50
+ description: Implement the designed solution.
51
+ type: swarm
52
+ topology: hierarchical
53
+ agents: [coder, coder, tester]
54
+ dependsOn: [design]
55
+ - id: review
56
+ description: Review the implementation for quality and correctness.
57
+ type: agent
58
+ agentType: reviewer
59
+ dependsOn: [implement]
60
+ \`\`\`
61
+
62
+ Specification to plan:
63
+ ${specContent}`;
64
+ }
65
+ function registerPlan(program) {
66
+ program
67
+ .command('plan <spec>')
68
+ .description('Analyse a spec file and generate a phased execution plan (YAML)')
69
+ .option('-f, --file <path>', 'Output path for the plan file', 'phases.yaml')
70
+ .option('--model <model>', 'Model override')
71
+ .action(async (spec, opts) => {
72
+ if (!(0, fs_1.existsSync)(spec)) {
73
+ output_js_1.output.error(`Spec file not found: ${spec}`);
74
+ process.exit(1);
75
+ }
76
+ const specContent = (0, fs_1.readFileSync)(spec, 'utf-8').trim();
77
+ const config = (0, config_js_1.loadConfig)();
78
+ output_js_1.output.info(`Analysing spec: ${spec}`);
79
+ output_js_1.output.info(`Generating plan → ${opts.file}`);
80
+ output_js_1.output.blank();
81
+ const result = await (0, executor_js_1.runAgentTask)('analyst', buildPlannerPrompt(specContent), {
82
+ model: opts.model ?? config.defaultModel,
83
+ timeoutMs: config.defaultTimeoutMs,
84
+ });
85
+ if (!result.success) {
86
+ output_js_1.output.error(`Planning failed: ${result.error}`);
87
+ await client_manager_js_1.clientManager.shutdown();
88
+ process.exit(1);
89
+ }
90
+ // Extract YAML from a ```yaml code block, or treat the whole response as YAML
91
+ const match = result.output.match(/```ya?ml\s*\n([\s\S]*?)```/);
92
+ const rawYaml = match ? match[1].trim() : result.output.trim();
93
+ let plan;
94
+ try {
95
+ plan = js_yaml_1.default.load(rawYaml);
96
+ if (!Array.isArray(plan?.phases) || plan.phases.length === 0) {
97
+ throw new Error('No phases found in the generated plan');
98
+ }
99
+ }
100
+ catch (err) {
101
+ output_js_1.output.error(`Generated YAML is invalid: ${err instanceof Error ? err.message : String(err)}`);
102
+ output_js_1.output.dim('Raw model output:');
103
+ output_js_1.output.dim(result.output.slice(0, 600));
104
+ await client_manager_js_1.clientManager.shutdown();
105
+ process.exit(1);
106
+ }
107
+ // Stamp in the spec path and version before saving
108
+ plan.spec = spec;
109
+ plan.version = plan.version ?? '1';
110
+ // Normalise optional fields
111
+ for (const phase of plan.phases) {
112
+ phase.dependsOn = phase.dependsOn ?? [];
113
+ if (phase.type === 'swarm') {
114
+ phase.topology = phase.topology ?? 'hierarchical';
115
+ phase.agents = phase.agents ?? ['researcher', 'coder', 'reviewer'];
116
+ }
117
+ }
118
+ (0, fs_1.writeFileSync)(opts.file, js_yaml_1.default.dump(plan, { lineWidth: 100 }), 'utf-8');
119
+ output_js_1.output.success(`Plan written to ${opts.file}`);
120
+ output_js_1.output.blank();
121
+ output_js_1.output.print(` ${plan.phases.length} phase(s):`);
122
+ for (const phase of plan.phases) {
123
+ const typeLabel = phase.type === 'swarm'
124
+ ? `swarm/${phase.topology} [${(phase.agents ?? []).join(', ')}]`
125
+ : `agent/${phase.agentType}`;
126
+ const deps = phase.dependsOn?.length ? ` (after: ${phase.dependsOn.join(', ')})` : '';
127
+ output_js_1.output.print(` ${phase.id.padEnd(22)} ${typeLabel}${deps}`);
128
+ }
129
+ await client_manager_js_1.clientManager.shutdown();
130
+ process.exit(0);
131
+ });
132
+ }
133
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -129,6 +129,30 @@ export interface CopilotFlowConfig {
129
129
  directories: string[];
130
130
  };
131
131
  }
132
+ export interface PlanPhase {
133
+ /** Unique kebab-case identifier used for output filename and dependsOn references. */
134
+ id: string;
135
+ /** Human-readable description of what this phase should accomplish. */
136
+ description: string;
137
+ /** 'agent' runs a single specialist; 'swarm' runs a multi-agent pipeline. */
138
+ type: 'agent' | 'swarm';
139
+ /** Agent type (required when type is 'agent'). */
140
+ agentType?: AgentType;
141
+ /** Swarm topology (used when type is 'swarm'). Default: 'hierarchical'. */
142
+ topology?: SwarmTopology;
143
+ /** Agent types in the swarm pipeline (used when type is 'swarm'). */
144
+ agents?: AgentType[];
145
+ /** Output filename. Defaults to phase-{id}.md. */
146
+ output?: string;
147
+ /** IDs of phases that must complete before this one. */
148
+ dependsOn?: string[];
149
+ }
150
+ export interface Plan {
151
+ version: string;
152
+ /** Path to the original spec file — injected into every phase prompt. */
153
+ spec: string;
154
+ phases: PlanPhase[];
155
+ }
132
156
  export interface CommandContext {
133
157
  args: string[];
134
158
  flags: Record<string, unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAI7D,eAAO,MAAM,eAAe,kLAalB,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,YAAY,CAAC;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0FAA0F;IAC1F,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,4CAA4C;IAC5C,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACnC,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,MAAM,GAAG,YAAY,CAAC;AAEnE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACnC,oFAAoF;IACpF,cAAc,CAAC,EAAE,iBAAiB,CAAC;CACpC;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAID,MAAM,MAAM,SAAS,GACjB,UAAU,GACV,WAAW,GACX,eAAe,GACf,aAAa,GACb,aAAa,GACb,iBAAiB,GACjB,aAAa,GACb,WAAW,CAAC;AAEhB,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAI9E,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;IACrB,+FAA+F;IAC/F,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE;QACL,QAAQ,EAAE,aAAa,CAAC;QACxB,8CAA8C;QAC9C,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,MAAM,EAAE;QACN,OAAO,EAAE,QAAQ,GAAG,QAAQ,CAAC;QAC7B,4DAA4D;QAC5D,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE;QACL,OAAO,EAAE,OAAO,CAAC;QACjB,sDAAsD;QACtD,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,YAAY,EAAE;QACZ,+EAA+E;QAC/E,IAAI,EAAE,MAAM,CAAC;QACb,8EAA8E;QAC9E,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,MAAM,EAAE;QACN,2DAA2D;QAC3D,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,uCAAuC;QACvC,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,MAAM,EAAE;QACN,oEAAoE;QACpE,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;CACH;AAID,MAAM,WAAW,SAAS;IACxB,sFAAsF;IACtF,EAAE,EAAE,MAAM,CAAC;IACX,uEAAuE;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,kDAAkD;IAClD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,qEAAqE;IACrE,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,IAAI;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAID,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "copilot-flow",
3
- "version": "1.4.0",
3
+ "version": "2.0.0",
4
4
  "description": "Multi-agent orchestration framework for GitHub Copilot CLI — inspired by Ruflo (claude-flow)",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -37,9 +37,11 @@
37
37
  "commander": "^12.1.0",
38
38
  "dotenv": "^16.4.5",
39
39
  "gray-matter": "^4.0.3",
40
+ "js-yaml": "^4.1.1",
40
41
  "ora": "^8.1.1"
41
42
  },
42
43
  "devDependencies": {
44
+ "@types/js-yaml": "^4.0.9",
43
45
  "@types/node": "^22.0.0",
44
46
  "ts-node": "^10.9.2",
45
47
  "typescript": "^5.5.4",