@cluesmith/codev 2.0.0-rc.2 → 2.0.0-rc.23
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 +6 -35
- package/dist/agent-farm/cli.d.ts.map +1 -1
- package/dist/agent-farm/cli.js +2 -14
- package/dist/agent-farm/cli.js.map +1 -1
- package/dist/agent-farm/commands/cleanup.d.ts.map +1 -1
- package/dist/agent-farm/commands/cleanup.js +29 -2
- package/dist/agent-farm/commands/cleanup.js.map +1 -1
- package/dist/agent-farm/commands/kickoff.d.ts +1 -0
- package/dist/agent-farm/commands/kickoff.d.ts.map +1 -1
- package/dist/agent-farm/commands/kickoff.js +151 -77
- package/dist/agent-farm/commands/kickoff.js.map +1 -1
- package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn.js +30 -54
- 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 -50
- package/dist/agent-farm/commands/start.js.map +1 -1
- package/dist/agent-farm/servers/dashboard-server.js +17 -16
- package/dist/agent-farm/servers/dashboard-server.js.map +1 -1
- package/dist/agent-farm/state.d.ts +0 -10
- package/dist/agent-farm/state.d.ts.map +1 -1
- package/dist/agent-farm/state.js +0 -24
- package/dist/agent-farm/state.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +5 -17
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt.d.ts.map +1 -1
- package/dist/commands/adopt.js +17 -1
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/consult/index.d.ts.map +1 -1
- package/dist/commands/consult/index.js +83 -2
- package/dist/commands/consult/index.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +17 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/porch/checks.d.ts +16 -29
- package/dist/commands/porch/checks.d.ts.map +1 -1
- package/dist/commands/porch/checks.js +90 -144
- package/dist/commands/porch/checks.js.map +1 -1
- package/dist/commands/porch/claude.d.ts +29 -0
- package/dist/commands/porch/claude.d.ts.map +1 -0
- package/dist/commands/porch/claude.js +80 -0
- package/dist/commands/porch/claude.js.map +1 -0
- package/dist/commands/porch/index.d.ts +21 -43
- package/dist/commands/porch/index.d.ts.map +1 -1
- package/dist/commands/porch/index.js +468 -753
- package/dist/commands/porch/index.js.map +1 -1
- package/dist/commands/porch/plan.d.ts +60 -0
- package/dist/commands/porch/plan.d.ts.map +1 -0
- package/dist/commands/porch/plan.js +162 -0
- package/dist/commands/porch/plan.js.map +1 -0
- package/dist/commands/porch/prompts.d.ts +19 -0
- package/dist/commands/porch/prompts.d.ts.map +1 -0
- package/dist/commands/porch/prompts.js +270 -0
- package/dist/commands/porch/prompts.js.map +1 -0
- package/dist/commands/porch/protocol.d.ts +59 -0
- package/dist/commands/porch/protocol.d.ts.map +1 -0
- package/dist/commands/porch/protocol.js +252 -0
- package/dist/commands/porch/protocol.js.map +1 -0
- package/dist/commands/porch/repl.d.ts +33 -0
- package/dist/commands/porch/repl.d.ts.map +1 -0
- package/dist/commands/porch/repl.js +206 -0
- package/dist/commands/porch/repl.js.map +1 -0
- package/dist/commands/porch/run.d.ts +23 -0
- package/dist/commands/porch/run.d.ts.map +1 -0
- package/dist/commands/porch/run.js +743 -0
- package/dist/commands/porch/run.js.map +1 -0
- package/dist/commands/porch/signals.d.ts +38 -0
- package/dist/commands/porch/signals.d.ts.map +1 -0
- package/dist/commands/porch/signals.js +81 -0
- package/dist/commands/porch/signals.js.map +1 -0
- package/dist/commands/porch/state.d.ts +23 -112
- package/dist/commands/porch/state.d.ts.map +1 -1
- package/dist/commands/porch/state.js +119 -680
- package/dist/commands/porch/state.js.map +1 -1
- package/dist/commands/porch/types.d.ts +69 -173
- package/dist/commands/porch/types.d.ts.map +1 -1
- package/dist/commands/porch/types.js +2 -1
- package/dist/commands/porch/types.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +12 -0
- package/dist/commands/update.js.map +1 -1
- package/dist/lib/scaffold.d.ts +24 -0
- package/dist/lib/scaffold.d.ts.map +1 -1
- package/dist/lib/scaffold.js +78 -0
- package/dist/lib/scaffold.js.map +1 -1
- package/package.json +7 -2
- package/skeleton/protocols/spider/prompts/implement.md +201 -0
- package/skeleton/protocols/spider/prompts/plan.md +214 -0
- package/skeleton/protocols/spider/prompts/review.md +217 -0
- package/skeleton/protocols/spider/prompts/specify.md +192 -0
- package/skeleton/protocols/spider/protocol.json +79 -147
- package/skeleton/protocols/spider/templates/plan.md +14 -0
- package/skeleton/roles/architect.md +140 -319
- package/skeleton/roles/builder.md +135 -213
- package/templates/dashboard/index.html +0 -27
- package/templates/dashboard/js/utils.js +0 -86
- package/dist/agent-farm/commands/rename.d.ts +0 -13
- package/dist/agent-farm/commands/rename.d.ts.map +0 -1
- package/dist/agent-farm/commands/rename.js +0 -33
- package/dist/agent-farm/commands/rename.js.map +0 -1
- package/dist/commands/pcheck/cache.d.ts +0 -48
- package/dist/commands/pcheck/cache.d.ts.map +0 -1
- package/dist/commands/pcheck/cache.js +0 -170
- package/dist/commands/pcheck/cache.js.map +0 -1
- package/dist/commands/pcheck/evaluator.d.ts +0 -15
- package/dist/commands/pcheck/evaluator.d.ts.map +0 -1
- package/dist/commands/pcheck/evaluator.js +0 -246
- package/dist/commands/pcheck/evaluator.js.map +0 -1
- package/dist/commands/pcheck/index.d.ts +0 -12
- package/dist/commands/pcheck/index.d.ts.map +0 -1
- package/dist/commands/pcheck/index.js +0 -249
- package/dist/commands/pcheck/index.js.map +0 -1
- package/dist/commands/pcheck/parser.d.ts +0 -39
- package/dist/commands/pcheck/parser.d.ts.map +0 -1
- package/dist/commands/pcheck/parser.js +0 -155
- package/dist/commands/pcheck/parser.js.map +0 -1
- package/dist/commands/pcheck/types.d.ts +0 -82
- package/dist/commands/pcheck/types.d.ts.map +0 -1
- package/dist/commands/pcheck/types.js +0 -5
- package/dist/commands/pcheck/types.js.map +0 -1
- package/dist/commands/porch/consultation.d.ts +0 -56
- package/dist/commands/porch/consultation.d.ts.map +0 -1
- package/dist/commands/porch/consultation.js +0 -330
- package/dist/commands/porch/consultation.js.map +0 -1
- package/dist/commands/porch/notifications.d.ts +0 -99
- package/dist/commands/porch/notifications.d.ts.map +0 -1
- package/dist/commands/porch/notifications.js +0 -223
- package/dist/commands/porch/notifications.js.map +0 -1
- package/dist/commands/porch/plan-parser.d.ts +0 -38
- package/dist/commands/porch/plan-parser.d.ts.map +0 -1
- package/dist/commands/porch/plan-parser.js +0 -166
- package/dist/commands/porch/plan-parser.js.map +0 -1
- package/dist/commands/porch/protocol-loader.d.ts +0 -46
- package/dist/commands/porch/protocol-loader.d.ts.map +0 -1
- package/dist/commands/porch/protocol-loader.js +0 -249
- package/dist/commands/porch/protocol-loader.js.map +0 -1
- package/dist/commands/porch/signal-parser.d.ts +0 -88
- package/dist/commands/porch/signal-parser.d.ts.map +0 -1
- package/dist/commands/porch/signal-parser.js +0 -148
- package/dist/commands/porch/signal-parser.js.map +0 -1
- package/skeleton/porch/protocols/bugfix.json +0 -85
- package/skeleton/porch/protocols/spider.json +0 -135
- package/skeleton/porch/protocols/tick.json +0 -76
- package/templates/dashboard/css/activity.css +0 -151
- package/templates/dashboard/js/activity.js +0 -112
|
@@ -1,330 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"consultation.js","sourceRoot":"","sources":["../../../src/commands/porch/consultation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Porch Notifications
|
|
3
|
-
*
|
|
4
|
-
* Simple notification system for porch events.
|
|
5
|
-
* Supports console logging and optional desktop notifications.
|
|
6
|
-
*/
|
|
7
|
-
import type { ConsultationFeedback } from './types.js';
|
|
8
|
-
/**
|
|
9
|
-
* Notification event types
|
|
10
|
-
*/
|
|
11
|
-
export type NotificationEvent = 'phase-start' | 'phase-complete' | 'gate-pending' | 'gate-approved' | 'consultation-start' | 'consultation-complete' | 'check-failed' | 'blocked' | 'error';
|
|
12
|
-
/**
|
|
13
|
-
* Notification payload
|
|
14
|
-
*/
|
|
15
|
-
export interface NotificationPayload {
|
|
16
|
-
event: NotificationEvent;
|
|
17
|
-
projectId: string;
|
|
18
|
-
phase?: string;
|
|
19
|
-
message: string;
|
|
20
|
-
details?: string;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Send a notification
|
|
24
|
-
*/
|
|
25
|
-
export declare function notify(payload: NotificationPayload, options?: {
|
|
26
|
-
desktop?: boolean;
|
|
27
|
-
}): Promise<void>;
|
|
28
|
-
/**
|
|
29
|
-
* Notify phase start
|
|
30
|
-
*/
|
|
31
|
-
export declare function notifyPhaseStart(projectId: string, phase: string, options?: {
|
|
32
|
-
desktop?: boolean;
|
|
33
|
-
}): Promise<void>;
|
|
34
|
-
/**
|
|
35
|
-
* Notify phase complete
|
|
36
|
-
*/
|
|
37
|
-
export declare function notifyPhaseComplete(projectId: string, phase: string, options?: {
|
|
38
|
-
desktop?: boolean;
|
|
39
|
-
}): Promise<void>;
|
|
40
|
-
/**
|
|
41
|
-
* Notify gate pending approval
|
|
42
|
-
*/
|
|
43
|
-
export declare function notifyGatePending(projectId: string, phase: string, gateName: string, options?: {
|
|
44
|
-
desktop?: boolean;
|
|
45
|
-
}): Promise<void>;
|
|
46
|
-
/**
|
|
47
|
-
* Notify gate approved
|
|
48
|
-
*/
|
|
49
|
-
export declare function notifyGateApproved(projectId: string, gateName: string, options?: {
|
|
50
|
-
desktop?: boolean;
|
|
51
|
-
}): Promise<void>;
|
|
52
|
-
/**
|
|
53
|
-
* Notify consultation start
|
|
54
|
-
*/
|
|
55
|
-
export declare function notifyConsultationStart(projectId: string, phase: string, models: string[], options?: {
|
|
56
|
-
desktop?: boolean;
|
|
57
|
-
}): Promise<void>;
|
|
58
|
-
/**
|
|
59
|
-
* Notify consultation complete
|
|
60
|
-
*/
|
|
61
|
-
export declare function notifyConsultationComplete(projectId: string, phase: string, feedback: ConsultationFeedback[], allApproved: boolean, options?: {
|
|
62
|
-
desktop?: boolean;
|
|
63
|
-
}): Promise<void>;
|
|
64
|
-
/**
|
|
65
|
-
* Notify check failed
|
|
66
|
-
*/
|
|
67
|
-
export declare function notifyCheckFailed(projectId: string, phase: string, checkName: string, error: string, options?: {
|
|
68
|
-
desktop?: boolean;
|
|
69
|
-
}): Promise<void>;
|
|
70
|
-
/**
|
|
71
|
-
* Notify blocked
|
|
72
|
-
*/
|
|
73
|
-
export declare function notifyBlocked(projectId: string, reason: string, options?: {
|
|
74
|
-
desktop?: boolean;
|
|
75
|
-
}): Promise<void>;
|
|
76
|
-
/**
|
|
77
|
-
* Notify error
|
|
78
|
-
*/
|
|
79
|
-
export declare function notifyError(projectId: string, error: string, options?: {
|
|
80
|
-
desktop?: boolean;
|
|
81
|
-
}): Promise<void>;
|
|
82
|
-
/**
|
|
83
|
-
* Create a notification context for a project
|
|
84
|
-
* Returns bound notification functions
|
|
85
|
-
*/
|
|
86
|
-
export declare function createNotifier(projectId: string, options?: {
|
|
87
|
-
desktop?: boolean;
|
|
88
|
-
}): {
|
|
89
|
-
phaseStart: (phase: string) => Promise<void>;
|
|
90
|
-
phaseComplete: (phase: string) => Promise<void>;
|
|
91
|
-
gatePending: (phase: string, gateName: string) => Promise<void>;
|
|
92
|
-
gateApproved: (gateName: string) => Promise<void>;
|
|
93
|
-
consultationStart: (phase: string, models: string[]) => Promise<void>;
|
|
94
|
-
consultationComplete: (phase: string, feedback: ConsultationFeedback[], allApproved: boolean) => Promise<void>;
|
|
95
|
-
checkFailed: (phase: string, checkName: string, error: string) => Promise<void>;
|
|
96
|
-
blocked: (reason: string) => Promise<void>;
|
|
97
|
-
error: (error: string) => Promise<void>;
|
|
98
|
-
};
|
|
99
|
-
//# sourceMappingURL=notifications.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/notifications.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Porch Notifications
|
|
3
|
-
*
|
|
4
|
-
* Simple notification system for porch events.
|
|
5
|
-
* Supports console logging and optional desktop notifications.
|
|
6
|
-
*/
|
|
7
|
-
import { spawn } from 'node:child_process';
|
|
8
|
-
import chalk from 'chalk';
|
|
9
|
-
/**
|
|
10
|
-
* Send a desktop notification (macOS only)
|
|
11
|
-
* Fails silently if osascript is not available
|
|
12
|
-
*/
|
|
13
|
-
async function sendDesktopNotification(title, message) {
|
|
14
|
-
if (process.platform !== 'darwin') {
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
return new Promise((resolve) => {
|
|
18
|
-
const script = `display notification "${message.replace(/"/g, '\\"')}" with title "${title.replace(/"/g, '\\"')}"`;
|
|
19
|
-
const proc = spawn('osascript', ['-e', script], { stdio: 'ignore' });
|
|
20
|
-
proc.on('close', () => resolve());
|
|
21
|
-
proc.on('error', () => resolve());
|
|
22
|
-
// Don't wait forever
|
|
23
|
-
setTimeout(() => resolve(), 2000);
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Format and log a notification to console
|
|
28
|
-
*/
|
|
29
|
-
function logNotification(payload) {
|
|
30
|
-
const { event, projectId, phase, message, details } = payload;
|
|
31
|
-
let icon;
|
|
32
|
-
let color;
|
|
33
|
-
switch (event) {
|
|
34
|
-
case 'phase-start':
|
|
35
|
-
icon = '>';
|
|
36
|
-
color = chalk.blue;
|
|
37
|
-
break;
|
|
38
|
-
case 'phase-complete':
|
|
39
|
-
icon = '✓';
|
|
40
|
-
color = chalk.green;
|
|
41
|
-
break;
|
|
42
|
-
case 'gate-pending':
|
|
43
|
-
icon = '◉';
|
|
44
|
-
color = chalk.yellow;
|
|
45
|
-
break;
|
|
46
|
-
case 'gate-approved':
|
|
47
|
-
icon = '✓';
|
|
48
|
-
color = chalk.green;
|
|
49
|
-
break;
|
|
50
|
-
case 'consultation-start':
|
|
51
|
-
icon = '⟳';
|
|
52
|
-
color = chalk.blue;
|
|
53
|
-
break;
|
|
54
|
-
case 'consultation-complete':
|
|
55
|
-
icon = '✓';
|
|
56
|
-
color = chalk.green;
|
|
57
|
-
break;
|
|
58
|
-
case 'check-failed':
|
|
59
|
-
icon = '✗';
|
|
60
|
-
color = chalk.red;
|
|
61
|
-
break;
|
|
62
|
-
case 'blocked':
|
|
63
|
-
icon = '!';
|
|
64
|
-
color = chalk.yellow;
|
|
65
|
-
break;
|
|
66
|
-
case 'error':
|
|
67
|
-
icon = '✗';
|
|
68
|
-
color = chalk.red;
|
|
69
|
-
break;
|
|
70
|
-
default:
|
|
71
|
-
icon = '•';
|
|
72
|
-
color = chalk.gray;
|
|
73
|
-
}
|
|
74
|
-
const prefix = phase
|
|
75
|
-
? `[porch:${projectId}:${phase}]`
|
|
76
|
-
: `[porch:${projectId}]`;
|
|
77
|
-
console.log(color(`${icon} ${prefix} ${message}`));
|
|
78
|
-
if (details) {
|
|
79
|
-
console.log(chalk.gray(` ${details}`));
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Send a notification
|
|
84
|
-
*/
|
|
85
|
-
export async function notify(payload, options = {}) {
|
|
86
|
-
// Always log to console
|
|
87
|
-
logNotification(payload);
|
|
88
|
-
// Desktop notification for important events
|
|
89
|
-
if (options.desktop) {
|
|
90
|
-
const shouldNotify = payload.event === 'gate-pending' ||
|
|
91
|
-
payload.event === 'consultation-complete' ||
|
|
92
|
-
payload.event === 'check-failed' ||
|
|
93
|
-
payload.event === 'blocked' ||
|
|
94
|
-
payload.event === 'error';
|
|
95
|
-
if (shouldNotify) {
|
|
96
|
-
const title = `Porch: ${payload.projectId}`;
|
|
97
|
-
await sendDesktopNotification(title, payload.message);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Notify phase start
|
|
103
|
-
*/
|
|
104
|
-
export async function notifyPhaseStart(projectId, phase, options = {}) {
|
|
105
|
-
await notify({
|
|
106
|
-
event: 'phase-start',
|
|
107
|
-
projectId,
|
|
108
|
-
phase,
|
|
109
|
-
message: `Starting phase: ${phase}`,
|
|
110
|
-
}, options);
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Notify phase complete
|
|
114
|
-
*/
|
|
115
|
-
export async function notifyPhaseComplete(projectId, phase, options = {}) {
|
|
116
|
-
await notify({
|
|
117
|
-
event: 'phase-complete',
|
|
118
|
-
projectId,
|
|
119
|
-
phase,
|
|
120
|
-
message: `Completed phase: ${phase}`,
|
|
121
|
-
}, options);
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Notify gate pending approval
|
|
125
|
-
*/
|
|
126
|
-
export async function notifyGatePending(projectId, phase, gateName, options = {}) {
|
|
127
|
-
await notify({
|
|
128
|
-
event: 'gate-pending',
|
|
129
|
-
projectId,
|
|
130
|
-
phase,
|
|
131
|
-
message: `Gate pending: ${gateName}`,
|
|
132
|
-
details: `Run: porch approve ${projectId} ${gateName}`,
|
|
133
|
-
}, options);
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Notify gate approved
|
|
137
|
-
*/
|
|
138
|
-
export async function notifyGateApproved(projectId, gateName, options = {}) {
|
|
139
|
-
await notify({
|
|
140
|
-
event: 'gate-approved',
|
|
141
|
-
projectId,
|
|
142
|
-
message: `Gate approved: ${gateName}`,
|
|
143
|
-
}, options);
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Notify consultation start
|
|
147
|
-
*/
|
|
148
|
-
export async function notifyConsultationStart(projectId, phase, models, options = {}) {
|
|
149
|
-
await notify({
|
|
150
|
-
event: 'consultation-start',
|
|
151
|
-
projectId,
|
|
152
|
-
phase,
|
|
153
|
-
message: `Starting ${models.length}-way consultation`,
|
|
154
|
-
details: `Models: ${models.join(', ')}`,
|
|
155
|
-
}, options);
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Notify consultation complete
|
|
159
|
-
*/
|
|
160
|
-
export async function notifyConsultationComplete(projectId, phase, feedback, allApproved, options = {}) {
|
|
161
|
-
const approveCount = feedback.filter((f) => f.verdict === 'APPROVE').length;
|
|
162
|
-
const changeCount = feedback.filter((f) => f.verdict === 'REQUEST_CHANGES').length;
|
|
163
|
-
const message = allApproved
|
|
164
|
-
? `Consultation complete: All ${approveCount} models approved`
|
|
165
|
-
: `Consultation complete: ${approveCount} approved, ${changeCount} requested changes`;
|
|
166
|
-
await notify({
|
|
167
|
-
event: 'consultation-complete',
|
|
168
|
-
projectId,
|
|
169
|
-
phase,
|
|
170
|
-
message,
|
|
171
|
-
details: feedback.map((f) => `${f.model}: ${f.verdict}`).join(', '),
|
|
172
|
-
}, options);
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Notify check failed
|
|
176
|
-
*/
|
|
177
|
-
export async function notifyCheckFailed(projectId, phase, checkName, error, options = {}) {
|
|
178
|
-
await notify({
|
|
179
|
-
event: 'check-failed',
|
|
180
|
-
projectId,
|
|
181
|
-
phase,
|
|
182
|
-
message: `Check failed: ${checkName}`,
|
|
183
|
-
details: error,
|
|
184
|
-
}, options);
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Notify blocked
|
|
188
|
-
*/
|
|
189
|
-
export async function notifyBlocked(projectId, reason, options = {}) {
|
|
190
|
-
await notify({
|
|
191
|
-
event: 'blocked',
|
|
192
|
-
projectId,
|
|
193
|
-
message: `Blocked: ${reason}`,
|
|
194
|
-
}, options);
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Notify error
|
|
198
|
-
*/
|
|
199
|
-
export async function notifyError(projectId, error, options = {}) {
|
|
200
|
-
await notify({
|
|
201
|
-
event: 'error',
|
|
202
|
-
projectId,
|
|
203
|
-
message: `Error: ${error}`,
|
|
204
|
-
}, options);
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Create a notification context for a project
|
|
208
|
-
* Returns bound notification functions
|
|
209
|
-
*/
|
|
210
|
-
export function createNotifier(projectId, options = {}) {
|
|
211
|
-
return {
|
|
212
|
-
phaseStart: (phase) => notifyPhaseStart(projectId, phase, options),
|
|
213
|
-
phaseComplete: (phase) => notifyPhaseComplete(projectId, phase, options),
|
|
214
|
-
gatePending: (phase, gateName) => notifyGatePending(projectId, phase, gateName, options),
|
|
215
|
-
gateApproved: (gateName) => notifyGateApproved(projectId, gateName, options),
|
|
216
|
-
consultationStart: (phase, models) => notifyConsultationStart(projectId, phase, models, options),
|
|
217
|
-
consultationComplete: (phase, feedback, allApproved) => notifyConsultationComplete(projectId, phase, feedback, allApproved, options),
|
|
218
|
-
checkFailed: (phase, checkName, error) => notifyCheckFailed(projectId, phase, checkName, error, options),
|
|
219
|
-
blocked: (reason) => notifyBlocked(projectId, reason, options),
|
|
220
|
-
error: (error) => notifyError(projectId, error, options),
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
//# sourceMappingURL=notifications.js.map
|