@cluesmith/codev 1.6.1 → 2.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/porch.js +7 -0
- package/dist/agent-farm/cli.d.ts.map +1 -1
- package/dist/agent-farm/cli.js +23 -0
- package/dist/agent-farm/cli.js.map +1 -1
- package/dist/agent-farm/commands/index.d.ts +1 -0
- package/dist/agent-farm/commands/index.d.ts.map +1 -1
- package/dist/agent-farm/commands/index.js +1 -0
- package/dist/agent-farm/commands/index.js.map +1 -1
- package/dist/agent-farm/commands/kickoff.d.ts +19 -0
- package/dist/agent-farm/commands/kickoff.d.ts.map +1 -0
- package/dist/agent-farm/commands/kickoff.js +269 -0
- package/dist/agent-farm/commands/kickoff.js.map +1 -0
- package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn.js +17 -3
- package/dist/agent-farm/commands/spawn.js.map +1 -1
- package/dist/agent-farm/commands/start.d.ts.map +1 -1
- package/dist/agent-farm/commands/start.js +8 -0
- package/dist/agent-farm/commands/start.js.map +1 -1
- package/dist/agent-farm/hq-connector.d.ts +23 -0
- package/dist/agent-farm/hq-connector.d.ts.map +1 -0
- package/dist/agent-farm/hq-connector.js +366 -0
- package/dist/agent-farm/hq-connector.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +29 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/pcheck/cache.d.ts +48 -0
- package/dist/commands/pcheck/cache.d.ts.map +1 -0
- package/dist/commands/pcheck/cache.js +170 -0
- package/dist/commands/pcheck/cache.js.map +1 -0
- package/dist/commands/pcheck/evaluator.d.ts +15 -0
- package/dist/commands/pcheck/evaluator.d.ts.map +1 -0
- package/dist/commands/pcheck/evaluator.js +246 -0
- package/dist/commands/pcheck/evaluator.js.map +1 -0
- package/dist/commands/pcheck/index.d.ts +12 -0
- package/dist/commands/pcheck/index.d.ts.map +1 -0
- package/dist/commands/pcheck/index.js +249 -0
- package/dist/commands/pcheck/index.js.map +1 -0
- package/dist/commands/pcheck/parser.d.ts +39 -0
- package/dist/commands/pcheck/parser.d.ts.map +1 -0
- package/dist/commands/pcheck/parser.js +155 -0
- package/dist/commands/pcheck/parser.js.map +1 -0
- package/dist/commands/pcheck/types.d.ts +82 -0
- package/dist/commands/pcheck/types.d.ts.map +1 -0
- package/dist/commands/pcheck/types.js +5 -0
- package/dist/commands/pcheck/types.js.map +1 -0
- package/dist/commands/porch/checks.d.ts +42 -0
- package/dist/commands/porch/checks.d.ts.map +1 -0
- package/dist/commands/porch/checks.js +195 -0
- package/dist/commands/porch/checks.js.map +1 -0
- package/dist/commands/porch/consultation.d.ts +56 -0
- package/dist/commands/porch/consultation.d.ts.map +1 -0
- package/dist/commands/porch/consultation.js +330 -0
- package/dist/commands/porch/consultation.js.map +1 -0
- package/dist/commands/porch/index.d.ts +60 -0
- package/dist/commands/porch/index.d.ts.map +1 -0
- package/dist/commands/porch/index.js +828 -0
- package/dist/commands/porch/index.js.map +1 -0
- package/dist/commands/porch/notifications.d.ts +99 -0
- package/dist/commands/porch/notifications.d.ts.map +1 -0
- package/dist/commands/porch/notifications.js +223 -0
- package/dist/commands/porch/notifications.js.map +1 -0
- package/dist/commands/porch/plan-parser.d.ts +38 -0
- package/dist/commands/porch/plan-parser.d.ts.map +1 -0
- package/dist/commands/porch/plan-parser.js +166 -0
- package/dist/commands/porch/plan-parser.js.map +1 -0
- package/dist/commands/porch/protocol-loader.d.ts +46 -0
- package/dist/commands/porch/protocol-loader.d.ts.map +1 -0
- package/dist/commands/porch/protocol-loader.js +249 -0
- package/dist/commands/porch/protocol-loader.js.map +1 -0
- package/dist/commands/porch/signal-parser.d.ts +88 -0
- package/dist/commands/porch/signal-parser.d.ts.map +1 -0
- package/dist/commands/porch/signal-parser.js +148 -0
- package/dist/commands/porch/signal-parser.js.map +1 -0
- package/dist/commands/porch/state.d.ts +133 -0
- package/dist/commands/porch/state.d.ts.map +1 -0
- package/dist/commands/porch/state.js +760 -0
- package/dist/commands/porch/state.js.map +1 -0
- package/dist/commands/porch/types.d.ts +232 -0
- package/dist/commands/porch/types.d.ts.map +1 -0
- package/dist/commands/porch/types.js +7 -0
- package/dist/commands/porch/types.js.map +1 -0
- package/package.json +6 -2
- package/skeleton/porch/prompts/defend.md +103 -0
- package/skeleton/porch/prompts/diagnose.md +70 -0
- package/skeleton/porch/prompts/evaluate.md +132 -0
- package/skeleton/porch/prompts/fix.md +59 -0
- package/skeleton/porch/prompts/implement.md +79 -0
- package/skeleton/porch/prompts/plan.md +74 -0
- package/skeleton/porch/prompts/pr.md +84 -0
- package/skeleton/porch/prompts/review.md +179 -0
- package/skeleton/porch/prompts/specify.md +53 -0
- package/skeleton/porch/prompts/test.md +63 -0
- package/skeleton/porch/prompts/understand.md +61 -0
- package/skeleton/porch/prompts/verify.md +58 -0
- package/skeleton/porch/protocols/bugfix.json +85 -0
- package/skeleton/porch/protocols/spider.json +135 -0
- package/skeleton/porch/protocols/tick.json +76 -0
- package/skeleton/protocols/bugfix/protocol.json +127 -0
- package/skeleton/protocols/protocol-schema.json +237 -0
- package/skeleton/protocols/spider/protocol.json +204 -0
- package/skeleton/protocols/tick/protocol.json +151 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Defense Checks
|
|
3
|
+
*
|
|
4
|
+
* Runs build/test commands defined in protocol phases.
|
|
5
|
+
* Supports retry logic and configurable failure behavior.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'node:child_process';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
/**
|
|
10
|
+
* Run a single command with timeout
|
|
11
|
+
*/
|
|
12
|
+
async function runCommand(command, options = {}) {
|
|
13
|
+
const startTime = Date.now();
|
|
14
|
+
const timeout = options.timeout || 300000; // 5 minutes default
|
|
15
|
+
return new Promise((resolve) => {
|
|
16
|
+
const [cmd, ...args] = command.split(/\s+/);
|
|
17
|
+
const proc = spawn(cmd, args, {
|
|
18
|
+
cwd: options.cwd,
|
|
19
|
+
shell: true,
|
|
20
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
21
|
+
});
|
|
22
|
+
let output = '';
|
|
23
|
+
let stderr = '';
|
|
24
|
+
let timedOut = false;
|
|
25
|
+
const timeoutId = setTimeout(() => {
|
|
26
|
+
timedOut = true;
|
|
27
|
+
proc.kill('SIGTERM');
|
|
28
|
+
}, timeout);
|
|
29
|
+
proc.stdout.on('data', (data) => {
|
|
30
|
+
output += data.toString();
|
|
31
|
+
});
|
|
32
|
+
proc.stderr.on('data', (data) => {
|
|
33
|
+
stderr += data.toString();
|
|
34
|
+
});
|
|
35
|
+
proc.on('close', (code) => {
|
|
36
|
+
clearTimeout(timeoutId);
|
|
37
|
+
const duration = Date.now() - startTime;
|
|
38
|
+
if (timedOut) {
|
|
39
|
+
resolve({
|
|
40
|
+
success: false,
|
|
41
|
+
output,
|
|
42
|
+
error: `Command timed out after ${timeout}ms`,
|
|
43
|
+
duration,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
resolve({
|
|
48
|
+
success: code === 0,
|
|
49
|
+
output: output + stderr,
|
|
50
|
+
error: code !== 0 ? `Exit code: ${code}` : undefined,
|
|
51
|
+
duration,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
proc.on('error', (err) => {
|
|
56
|
+
clearTimeout(timeoutId);
|
|
57
|
+
resolve({
|
|
58
|
+
success: false,
|
|
59
|
+
output: '',
|
|
60
|
+
error: err.message,
|
|
61
|
+
duration: Date.now() - startTime,
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Run a check with retry logic
|
|
68
|
+
*/
|
|
69
|
+
async function runCheckWithRetry(name, check, options = {}) {
|
|
70
|
+
const maxRetries = check.max_retries || 3;
|
|
71
|
+
const retryDelay = check.retry_delay || 5; // seconds
|
|
72
|
+
let attempts = 0;
|
|
73
|
+
let lastResult = null;
|
|
74
|
+
while (attempts < maxRetries) {
|
|
75
|
+
attempts++;
|
|
76
|
+
console.log(chalk.blue(`[check] Running ${name} (attempt ${attempts}/${maxRetries}): ${check.command}`));
|
|
77
|
+
lastResult = await runCommand(check.command, options);
|
|
78
|
+
if (lastResult.success) {
|
|
79
|
+
console.log(chalk.green(`[check] ${name} passed (${lastResult.duration}ms)`));
|
|
80
|
+
return {
|
|
81
|
+
name,
|
|
82
|
+
success: true,
|
|
83
|
+
output: lastResult.output,
|
|
84
|
+
attempts,
|
|
85
|
+
duration: lastResult.duration,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
console.log(chalk.yellow(`[check] ${name} failed: ${lastResult.error}`));
|
|
89
|
+
// Only retry if on_fail is 'retry'
|
|
90
|
+
if (check.on_fail !== 'retry' || attempts >= maxRetries) {
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
console.log(chalk.blue(`[check] Retrying in ${retryDelay}s...`));
|
|
94
|
+
await new Promise(r => setTimeout(r, retryDelay * 1000));
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
name,
|
|
98
|
+
success: false,
|
|
99
|
+
output: lastResult?.output || '',
|
|
100
|
+
error: lastResult?.error,
|
|
101
|
+
attempts,
|
|
102
|
+
duration: lastResult?.duration || 0,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Run all checks for a phase
|
|
107
|
+
*/
|
|
108
|
+
export async function runPhaseChecks(phase, options = {}) {
|
|
109
|
+
if (!phase.checks || Object.keys(phase.checks).length === 0) {
|
|
110
|
+
return { success: true, checks: [] };
|
|
111
|
+
}
|
|
112
|
+
if (options.dryRun) {
|
|
113
|
+
console.log(chalk.yellow(`[check] [DRY RUN] Would run checks for phase ${phase.id}:`));
|
|
114
|
+
for (const [name, check] of Object.entries(phase.checks)) {
|
|
115
|
+
console.log(chalk.yellow(` - ${name}: ${check.command}`));
|
|
116
|
+
}
|
|
117
|
+
return { success: true, checks: [] };
|
|
118
|
+
}
|
|
119
|
+
const results = [];
|
|
120
|
+
let returnTo;
|
|
121
|
+
for (const [name, check] of Object.entries(phase.checks)) {
|
|
122
|
+
const result = await runCheckWithRetry(name, check, { cwd: options.cwd });
|
|
123
|
+
results.push(result);
|
|
124
|
+
if (!result.success) {
|
|
125
|
+
console.log(chalk.red(`[check] ${name} failed after ${result.attempts} attempts`));
|
|
126
|
+
// Determine failure action
|
|
127
|
+
if (check.on_fail === 'retry') {
|
|
128
|
+
// Already retried, now fail
|
|
129
|
+
returnTo = undefined;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// on_fail specifies a phase to return to
|
|
133
|
+
returnTo = check.on_fail;
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
checks: results,
|
|
138
|
+
returnTo,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
console.log(chalk.green(`[check] All checks passed for phase ${phase.id}`));
|
|
143
|
+
return {
|
|
144
|
+
success: true,
|
|
145
|
+
checks: results,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Create default checks for common phases
|
|
150
|
+
*/
|
|
151
|
+
export function getDefaultChecks(phaseName) {
|
|
152
|
+
switch (phaseName.toLowerCase()) {
|
|
153
|
+
case 'implement':
|
|
154
|
+
return {
|
|
155
|
+
build: {
|
|
156
|
+
command: 'npm run build',
|
|
157
|
+
on_fail: 'retry',
|
|
158
|
+
max_retries: 2,
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
case 'defend':
|
|
162
|
+
return {
|
|
163
|
+
tests: {
|
|
164
|
+
command: 'npm test',
|
|
165
|
+
on_fail: 'implement', // Return to implement on test failure
|
|
166
|
+
max_retries: 1,
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
default:
|
|
170
|
+
return {};
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Format check results for display
|
|
175
|
+
*/
|
|
176
|
+
export function formatCheckResults(results) {
|
|
177
|
+
if (results.checks.length === 0) {
|
|
178
|
+
return 'No checks ran';
|
|
179
|
+
}
|
|
180
|
+
const lines = ['Check Results:'];
|
|
181
|
+
for (const check of results.checks) {
|
|
182
|
+
const status = check.success ? '✓' : '✗';
|
|
183
|
+
const duration = `(${check.duration}ms)`;
|
|
184
|
+
const attempts = check.attempts > 1 ? ` [${check.attempts} attempts]` : '';
|
|
185
|
+
lines.push(` ${status} ${check.name} ${duration}${attempts}`);
|
|
186
|
+
if (!check.success && check.error) {
|
|
187
|
+
lines.push(` Error: ${check.error}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (results.returnTo) {
|
|
191
|
+
lines.push(` → Returning to phase: ${results.returnTo}`);
|
|
192
|
+
}
|
|
193
|
+
return lines.join('\n');
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checks.js","sourceRoot":"","sources":["../../../src/commands/porch/checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Agent Consultation
|
|
3
|
+
*
|
|
4
|
+
* Runs parallel 3-way consultations with external AI models (gemini, codex, claude)
|
|
5
|
+
* and collects feedback with APPROVE/REQUEST_CHANGES verdicts.
|
|
6
|
+
*/
|
|
7
|
+
import type { ConsultationConfig, ConsultationFeedback, ConsultationResult, ConsultationVerdict } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Parse verdict from consultation output
|
|
10
|
+
* Looks for APPROVE or REQUEST_CHANGES markers
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseVerdict(output: string): ConsultationVerdict;
|
|
13
|
+
/**
|
|
14
|
+
* Extract summary from consultation output
|
|
15
|
+
* Takes the first paragraph or bullet points
|
|
16
|
+
*/
|
|
17
|
+
export declare function extractSummary(output: string, maxLength?: number): string;
|
|
18
|
+
/**
|
|
19
|
+
* Run parallel 3-way consultation
|
|
20
|
+
*/
|
|
21
|
+
export declare function runParallelConsultation(config: ConsultationConfig, context: {
|
|
22
|
+
subcommand: string;
|
|
23
|
+
identifier: string;
|
|
24
|
+
cwd?: string;
|
|
25
|
+
timeout?: number;
|
|
26
|
+
dryRun?: boolean;
|
|
27
|
+
}): Promise<ConsultationFeedback[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Run consultation loop with revision support
|
|
30
|
+
*
|
|
31
|
+
* If any model returns REQUEST_CHANGES, allows revision and re-consultation
|
|
32
|
+
* up to max_rounds times.
|
|
33
|
+
*/
|
|
34
|
+
export declare function runConsultationLoop(config: ConsultationConfig, context: {
|
|
35
|
+
subcommand: string;
|
|
36
|
+
identifier: string;
|
|
37
|
+
cwd?: string;
|
|
38
|
+
timeout?: number;
|
|
39
|
+
dryRun?: boolean;
|
|
40
|
+
onRevisionNeeded?: (feedback: ConsultationFeedback[]) => Promise<boolean>;
|
|
41
|
+
}): Promise<ConsultationResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Format consultation results for display
|
|
44
|
+
*/
|
|
45
|
+
export declare function formatConsultationResults(result: ConsultationResult): string;
|
|
46
|
+
/**
|
|
47
|
+
* Check if a phase has consultation configured
|
|
48
|
+
*/
|
|
49
|
+
export declare function hasConsultation(phaseConfig: {
|
|
50
|
+
consultation?: ConsultationConfig;
|
|
51
|
+
}): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Get the default consultation config for common review types
|
|
54
|
+
*/
|
|
55
|
+
export declare function getDefaultConsultationConfig(type: string): ConsultationConfig;
|
|
56
|
+
//# sourceMappingURL=consultation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consultation.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/consultation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AA0EpB;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAwBhE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM,CAuB9E;AA4BD;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE;IACP,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GACA,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAqFjC;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE;IACP,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,oBAAoB,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3E,GACA,OAAO,CAAC,kBAAkB,CAAC,CAiD7B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAiB5E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE;IAAE,YAAY,CAAC,EAAE,kBAAkB,CAAA;CAAE,GAAG,OAAO,CAI3F;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAyC7E"}
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Agent Consultation
|
|
3
|
+
*
|
|
4
|
+
* Runs parallel 3-way consultations with external AI models (gemini, codex, claude)
|
|
5
|
+
* and collects feedback with APPROVE/REQUEST_CHANGES verdicts.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'node:child_process';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
/**
|
|
10
|
+
* Default consultation timeout (ms)
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_TIMEOUT = 300000; // 5 minutes
|
|
13
|
+
/**
|
|
14
|
+
* Run a single consultation with an AI model
|
|
15
|
+
*/
|
|
16
|
+
async function runConsultation(model, command, args, options = {}) {
|
|
17
|
+
const timeout = options.timeout || DEFAULT_TIMEOUT;
|
|
18
|
+
return new Promise((resolve) => {
|
|
19
|
+
const proc = spawn(command, args, {
|
|
20
|
+
cwd: options.cwd,
|
|
21
|
+
shell: true,
|
|
22
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
23
|
+
});
|
|
24
|
+
let output = '';
|
|
25
|
+
let stderr = '';
|
|
26
|
+
let timedOut = false;
|
|
27
|
+
const timeoutId = setTimeout(() => {
|
|
28
|
+
timedOut = true;
|
|
29
|
+
proc.kill('SIGTERM');
|
|
30
|
+
}, timeout);
|
|
31
|
+
proc.stdout.on('data', (data) => {
|
|
32
|
+
output += data.toString();
|
|
33
|
+
});
|
|
34
|
+
proc.stderr.on('data', (data) => {
|
|
35
|
+
stderr += data.toString();
|
|
36
|
+
});
|
|
37
|
+
proc.on('close', (code) => {
|
|
38
|
+
clearTimeout(timeoutId);
|
|
39
|
+
if (timedOut) {
|
|
40
|
+
resolve({
|
|
41
|
+
output,
|
|
42
|
+
error: `Consultation timed out after ${timeout}ms`,
|
|
43
|
+
success: false,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
resolve({
|
|
48
|
+
output: output + stderr,
|
|
49
|
+
error: code !== 0 ? `Exit code: ${code}` : undefined,
|
|
50
|
+
success: code === 0,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
proc.on('error', (err) => {
|
|
55
|
+
clearTimeout(timeoutId);
|
|
56
|
+
resolve({
|
|
57
|
+
output: '',
|
|
58
|
+
error: err.message,
|
|
59
|
+
success: false,
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Parse verdict from consultation output
|
|
66
|
+
* Looks for APPROVE or REQUEST_CHANGES markers
|
|
67
|
+
*/
|
|
68
|
+
export function parseVerdict(output) {
|
|
69
|
+
// Look for explicit verdict markers
|
|
70
|
+
if (/verdict:\s*approve/i.test(output) || /\[APPROVE\]/i.test(output)) {
|
|
71
|
+
return 'APPROVE';
|
|
72
|
+
}
|
|
73
|
+
if (/verdict:\s*request_changes/i.test(output) || /\[REQUEST_CHANGES\]/i.test(output)) {
|
|
74
|
+
return 'REQUEST_CHANGES';
|
|
75
|
+
}
|
|
76
|
+
// Look for implicit approval signals
|
|
77
|
+
if (/looks good/i.test(output) && !/but|however|should|could/i.test(output.slice(output.search(/looks good/i), output.search(/looks good/i) + 100))) {
|
|
78
|
+
return 'APPROVE';
|
|
79
|
+
}
|
|
80
|
+
if (/approved?/i.test(output) && !/not approved/i.test(output)) {
|
|
81
|
+
return 'APPROVE';
|
|
82
|
+
}
|
|
83
|
+
// Look for implicit change request signals
|
|
84
|
+
if (/must\s+(be\s+)?fix|should\s+(be\s+)?fix|need(s)?\s+to\s+fix|critical\s+issue|blocking\s+issue/i.test(output)) {
|
|
85
|
+
return 'REQUEST_CHANGES';
|
|
86
|
+
}
|
|
87
|
+
// Default to approve if no clear signal (lenient mode)
|
|
88
|
+
return 'APPROVE';
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Extract summary from consultation output
|
|
92
|
+
* Takes the first paragraph or bullet points
|
|
93
|
+
*/
|
|
94
|
+
export function extractSummary(output, maxLength = 500) {
|
|
95
|
+
// Try to find a summary section
|
|
96
|
+
const summaryMatch = output.match(/##?\s*Summary\s*\n([\s\S]*?)(?=\n##|\n\*\*|$)/i);
|
|
97
|
+
if (summaryMatch) {
|
|
98
|
+
return truncate(summaryMatch[1].trim(), maxLength);
|
|
99
|
+
}
|
|
100
|
+
// Try to find verdict section
|
|
101
|
+
const verdictMatch = output.match(/##?\s*Verdict\s*\n([\s\S]*?)(?=\n##|\n\*\*|$)/i);
|
|
102
|
+
if (verdictMatch) {
|
|
103
|
+
return truncate(verdictMatch[1].trim(), maxLength);
|
|
104
|
+
}
|
|
105
|
+
// Fall back to first paragraph
|
|
106
|
+
const paragraphs = output.split(/\n\n+/);
|
|
107
|
+
for (const p of paragraphs) {
|
|
108
|
+
const trimmed = p.trim();
|
|
109
|
+
if (trimmed.length > 50 && !trimmed.startsWith('#') && !trimmed.startsWith('```')) {
|
|
110
|
+
return truncate(trimmed, maxLength);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return truncate(output.trim(), maxLength);
|
|
114
|
+
}
|
|
115
|
+
function truncate(text, maxLength) {
|
|
116
|
+
if (text.length <= maxLength)
|
|
117
|
+
return text;
|
|
118
|
+
return text.slice(0, maxLength - 3) + '...';
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Build the consult command for a model
|
|
122
|
+
*/
|
|
123
|
+
function buildConsultCommand(model, subcommand, identifier, reviewType) {
|
|
124
|
+
const args = ['--model', model, subcommand, identifier];
|
|
125
|
+
if (reviewType) {
|
|
126
|
+
args.push('--type', reviewType);
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
command: 'consult',
|
|
130
|
+
args,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Run parallel 3-way consultation
|
|
135
|
+
*/
|
|
136
|
+
export async function runParallelConsultation(config, context) {
|
|
137
|
+
const { subcommand, identifier, cwd, timeout = DEFAULT_TIMEOUT, dryRun } = context;
|
|
138
|
+
const { models, type: reviewType, parallel = true } = config;
|
|
139
|
+
if (dryRun) {
|
|
140
|
+
console.log(chalk.yellow(`[consultation] [DRY RUN] Would run ${models.length}-way consultation:`));
|
|
141
|
+
for (const model of models) {
|
|
142
|
+
const { command, args } = buildConsultCommand(model, subcommand, identifier, reviewType);
|
|
143
|
+
console.log(chalk.yellow(` ${command} ${args.join(' ')}`));
|
|
144
|
+
}
|
|
145
|
+
return models.map(model => ({
|
|
146
|
+
model,
|
|
147
|
+
verdict: 'APPROVE',
|
|
148
|
+
summary: '[DRY RUN] Simulated approval',
|
|
149
|
+
}));
|
|
150
|
+
}
|
|
151
|
+
console.log(chalk.blue(`[consultation] Running ${models.length}-way parallel consultation...`));
|
|
152
|
+
const startTime = Date.now();
|
|
153
|
+
// Build commands for each model
|
|
154
|
+
const consultations = models.map(model => {
|
|
155
|
+
const { command, args } = buildConsultCommand(model, subcommand, identifier, reviewType);
|
|
156
|
+
console.log(chalk.blue(`[consultation] Starting ${model}...`));
|
|
157
|
+
return {
|
|
158
|
+
model,
|
|
159
|
+
promise: runConsultation(model, command, args, { timeout, cwd }),
|
|
160
|
+
};
|
|
161
|
+
});
|
|
162
|
+
// Run in parallel or sequentially based on config
|
|
163
|
+
const results = [];
|
|
164
|
+
if (parallel) {
|
|
165
|
+
// Run all in parallel
|
|
166
|
+
const outputs = await Promise.all(consultations.map(c => c.promise));
|
|
167
|
+
for (let i = 0; i < consultations.length; i++) {
|
|
168
|
+
const { model } = consultations[i];
|
|
169
|
+
const output = outputs[i];
|
|
170
|
+
if (!output.success) {
|
|
171
|
+
console.log(chalk.yellow(`[consultation] ${model} failed: ${output.error}`));
|
|
172
|
+
results.push({
|
|
173
|
+
model,
|
|
174
|
+
verdict: 'APPROVE', // Default to approve on failure (lenient)
|
|
175
|
+
summary: `Consultation failed: ${output.error}`,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
const verdict = parseVerdict(output.output);
|
|
180
|
+
const summary = extractSummary(output.output);
|
|
181
|
+
const duration = Date.now() - startTime;
|
|
182
|
+
console.log(chalk.blue(`[consultation] ${model} completed (${duration}ms): ${verdict}`));
|
|
183
|
+
results.push({ model, verdict, summary });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
// Run sequentially
|
|
189
|
+
for (const { model, promise } of consultations) {
|
|
190
|
+
const output = await promise;
|
|
191
|
+
const duration = Date.now() - startTime;
|
|
192
|
+
if (!output.success) {
|
|
193
|
+
console.log(chalk.yellow(`[consultation] ${model} failed: ${output.error}`));
|
|
194
|
+
results.push({
|
|
195
|
+
model,
|
|
196
|
+
verdict: 'APPROVE',
|
|
197
|
+
summary: `Consultation failed: ${output.error}`,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
const verdict = parseVerdict(output.output);
|
|
202
|
+
const summary = extractSummary(output.output);
|
|
203
|
+
console.log(chalk.blue(`[consultation] ${model} completed (${duration}ms): ${verdict}`));
|
|
204
|
+
results.push({ model, verdict, summary });
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
const totalDuration = Date.now() - startTime;
|
|
209
|
+
console.log(chalk.blue(`[consultation] All consultations complete (${totalDuration}ms)`));
|
|
210
|
+
return results;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Run consultation loop with revision support
|
|
214
|
+
*
|
|
215
|
+
* If any model returns REQUEST_CHANGES, allows revision and re-consultation
|
|
216
|
+
* up to max_rounds times.
|
|
217
|
+
*/
|
|
218
|
+
export async function runConsultationLoop(config, context) {
|
|
219
|
+
const maxRounds = config.max_rounds || 3;
|
|
220
|
+
let round = 1;
|
|
221
|
+
while (round <= maxRounds) {
|
|
222
|
+
console.log(chalk.blue(`[consultation] Round ${round}/${maxRounds}`));
|
|
223
|
+
const feedback = await runParallelConsultation(config, context);
|
|
224
|
+
// Check if all approved
|
|
225
|
+
const allApproved = feedback.every(f => f.verdict === 'APPROVE');
|
|
226
|
+
if (allApproved) {
|
|
227
|
+
console.log(chalk.green(`[consultation] All models approved!`));
|
|
228
|
+
return { round, feedback, allApproved: true };
|
|
229
|
+
}
|
|
230
|
+
// Some models requested changes
|
|
231
|
+
const changeRequests = feedback.filter(f => f.verdict === 'REQUEST_CHANGES');
|
|
232
|
+
console.log(chalk.yellow(`[consultation] ${changeRequests.length} model(s) requested changes:`));
|
|
233
|
+
for (const req of changeRequests) {
|
|
234
|
+
console.log(chalk.yellow(` ${req.model}: ${req.summary}`));
|
|
235
|
+
}
|
|
236
|
+
// Check if we've reached max rounds
|
|
237
|
+
if (round >= maxRounds) {
|
|
238
|
+
console.log(chalk.red(`[consultation] Max rounds (${maxRounds}) reached without full approval`));
|
|
239
|
+
return { round, feedback, allApproved: false };
|
|
240
|
+
}
|
|
241
|
+
// Call revision callback if provided
|
|
242
|
+
if (context.onRevisionNeeded) {
|
|
243
|
+
const shouldContinue = await context.onRevisionNeeded(feedback);
|
|
244
|
+
if (!shouldContinue) {
|
|
245
|
+
console.log(chalk.yellow(`[consultation] Revision declined, stopping consultation loop`));
|
|
246
|
+
return { round, feedback, allApproved: false };
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
// No revision callback - just report and exit
|
|
251
|
+
console.log(chalk.yellow(`[consultation] Changes requested but no revision handler`));
|
|
252
|
+
return { round, feedback, allApproved: false };
|
|
253
|
+
}
|
|
254
|
+
round++;
|
|
255
|
+
}
|
|
256
|
+
// Should not reach here
|
|
257
|
+
return { round, feedback: [], allApproved: false };
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Format consultation results for display
|
|
261
|
+
*/
|
|
262
|
+
export function formatConsultationResults(result) {
|
|
263
|
+
const lines = [
|
|
264
|
+
`Consultation Results (Round ${result.round}):`,
|
|
265
|
+
result.allApproved ? chalk.green(' ✓ All models approved') : chalk.yellow(' ⚠ Not all models approved'),
|
|
266
|
+
'',
|
|
267
|
+
];
|
|
268
|
+
for (const feedback of result.feedback) {
|
|
269
|
+
const icon = feedback.verdict === 'APPROVE' ? '✓' : '✗';
|
|
270
|
+
const color = feedback.verdict === 'APPROVE' ? chalk.green : chalk.yellow;
|
|
271
|
+
lines.push(color(` ${icon} ${feedback.model}: ${feedback.verdict}`));
|
|
272
|
+
if (feedback.summary) {
|
|
273
|
+
lines.push(` ${feedback.summary.slice(0, 100)}...`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return lines.join('\n');
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Check if a phase has consultation configured
|
|
280
|
+
*/
|
|
281
|
+
export function hasConsultation(phaseConfig) {
|
|
282
|
+
return phaseConfig.consultation !== undefined &&
|
|
283
|
+
phaseConfig.consultation.models !== undefined &&
|
|
284
|
+
phaseConfig.consultation.models.length > 0;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get the default consultation config for common review types
|
|
288
|
+
*/
|
|
289
|
+
export function getDefaultConsultationConfig(type) {
|
|
290
|
+
const defaultModels = ['gemini', 'codex', 'claude'];
|
|
291
|
+
switch (type) {
|
|
292
|
+
case 'spec-review':
|
|
293
|
+
return {
|
|
294
|
+
on: 'review',
|
|
295
|
+
models: defaultModels,
|
|
296
|
+
type: 'spec-review',
|
|
297
|
+
parallel: true,
|
|
298
|
+
max_rounds: 3,
|
|
299
|
+
next: 'plan',
|
|
300
|
+
};
|
|
301
|
+
case 'plan-review':
|
|
302
|
+
return {
|
|
303
|
+
on: 'review',
|
|
304
|
+
models: defaultModels,
|
|
305
|
+
type: 'plan-review',
|
|
306
|
+
parallel: true,
|
|
307
|
+
max_rounds: 3,
|
|
308
|
+
next: 'implement',
|
|
309
|
+
};
|
|
310
|
+
case 'impl-review':
|
|
311
|
+
return {
|
|
312
|
+
on: 'complete',
|
|
313
|
+
models: defaultModels,
|
|
314
|
+
type: 'impl-review',
|
|
315
|
+
parallel: true,
|
|
316
|
+
max_rounds: 2,
|
|
317
|
+
next: 'defend',
|
|
318
|
+
};
|
|
319
|
+
default:
|
|
320
|
+
return {
|
|
321
|
+
on: 'review',
|
|
322
|
+
models: defaultModels,
|
|
323
|
+
type: type,
|
|
324
|
+
parallel: true,
|
|
325
|
+
max_rounds: 2,
|
|
326
|
+
next: '',
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
//# sourceMappingURL=consultation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consultation.js","sourceRoot":"","sources":["../../../src/commands/porch/consultation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Porch - Protocol Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Generic loop orchestrator that reads protocol definitions from JSON
|
|
5
|
+
* and executes them with Claude. Implements the Ralph pattern: fresh
|
|
6
|
+
* context per iteration with state persisted to files.
|
|
7
|
+
*/
|
|
8
|
+
import type { Protocol, PorchRunOptions, PorchInitOptions } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* List available protocols
|
|
11
|
+
* Delegates to protocol-loader.ts for proper conversion
|
|
12
|
+
*/
|
|
13
|
+
export declare function listProtocols(projectRoot?: string): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Load a protocol definition
|
|
16
|
+
* Delegates to protocol-loader.ts which properly converts steps→substates
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadProtocol(name: string, projectRoot?: string): Protocol;
|
|
19
|
+
/**
|
|
20
|
+
* Initialize a new project with a protocol
|
|
21
|
+
*/
|
|
22
|
+
export declare function init(protocolName: string, projectId: string, projectName: string, options?: PorchInitOptions): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Run the protocol loop for a project
|
|
25
|
+
*/
|
|
26
|
+
export declare function run(projectId: string, options?: PorchRunOptions): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Approve a gate
|
|
29
|
+
*/
|
|
30
|
+
export declare function approve(projectId: string, gateId: string): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Show project status
|
|
33
|
+
*/
|
|
34
|
+
export declare function status(projectId?: string): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* List available protocols
|
|
37
|
+
*/
|
|
38
|
+
export declare function list(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Show protocol definition
|
|
41
|
+
*/
|
|
42
|
+
export declare function show(protocolName: string): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Show pending gates across all projects
|
|
45
|
+
*/
|
|
46
|
+
export declare function pending(): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Main porch entry point - handles subcommands
|
|
49
|
+
*/
|
|
50
|
+
export interface PorchOptions {
|
|
51
|
+
subcommand: string;
|
|
52
|
+
args: string[];
|
|
53
|
+
dryRun?: boolean;
|
|
54
|
+
noClaude?: boolean;
|
|
55
|
+
pollInterval?: number;
|
|
56
|
+
description?: string;
|
|
57
|
+
worktree?: string;
|
|
58
|
+
}
|
|
59
|
+
export declare function porch(options: PorchOptions): Promise<void>;
|
|
60
|
+
//# sourceMappingURL=index.d.ts.map
|