@cluesmith/codev 2.0.0-rc.57 → 2.0.0-rc.59
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/dashboard/dist/assets/index-CXloFYpB.css +32 -0
- package/dashboard/dist/assets/index-Ca2fjOJf.js +131 -0
- package/dashboard/dist/assets/index-Ca2fjOJf.js.map +1 -0
- package/dashboard/dist/index.html +2 -2
- package/dist/agent-farm/commands/attach.d.ts.map +1 -1
- package/dist/agent-farm/commands/attach.js +31 -8
- package/dist/agent-farm/commands/attach.js.map +1 -1
- package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn.js +38 -28
- 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 +3 -226
- package/dist/agent-farm/commands/start.js.map +1 -1
- package/dist/agent-farm/commands/status.d.ts.map +1 -1
- package/dist/agent-farm/commands/status.js +5 -2
- package/dist/agent-farm/commands/status.js.map +1 -1
- package/dist/agent-farm/db/index.d.ts.map +1 -1
- package/dist/agent-farm/db/index.js +45 -0
- package/dist/agent-farm/db/index.js.map +1 -1
- package/dist/agent-farm/db/schema.d.ts +1 -1
- package/dist/agent-farm/db/schema.d.ts.map +1 -1
- package/dist/agent-farm/db/schema.js +2 -2
- package/dist/agent-farm/hq-connector.d.ts +0 -4
- package/dist/agent-farm/hq-connector.d.ts.map +1 -1
- package/dist/agent-farm/hq-connector.js +0 -15
- package/dist/agent-farm/hq-connector.js.map +1 -1
- package/dist/agent-farm/servers/tower-server.js +82 -22
- package/dist/agent-farm/servers/tower-server.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/consult/index.d.ts +1 -0
- package/dist/commands/consult/index.d.ts.map +1 -1
- package/dist/commands/consult/index.js +23 -4
- package/dist/commands/consult/index.js.map +1 -1
- package/dist/commands/porch/checks.d.ts +3 -2
- package/dist/commands/porch/checks.d.ts.map +1 -1
- package/dist/commands/porch/checks.js +8 -2
- package/dist/commands/porch/checks.js.map +1 -1
- package/dist/commands/porch/index.d.ts.map +1 -1
- package/dist/commands/porch/index.js +21 -23
- package/dist/commands/porch/index.js.map +1 -1
- package/dist/commands/porch/next.d.ts +22 -0
- package/dist/commands/porch/next.d.ts.map +1 -0
- package/dist/commands/porch/next.js +475 -0
- package/dist/commands/porch/next.js.map +1 -0
- package/dist/commands/porch/protocol.d.ts +3 -3
- package/dist/commands/porch/protocol.d.ts.map +1 -1
- package/dist/commands/porch/protocol.js +40 -6
- package/dist/commands/porch/protocol.js.map +1 -1
- package/dist/commands/porch/types.d.ts +36 -1
- package/dist/commands/porch/types.d.ts.map +1 -1
- package/dist/commands/porch/verdict.d.ts +31 -0
- package/dist/commands/porch/verdict.d.ts.map +1 -0
- package/dist/commands/porch/verdict.js +59 -0
- package/dist/commands/porch/verdict.js.map +1 -0
- package/package.json +5 -7
- package/skeleton/porch/prompts/defend.md +1 -1
- package/skeleton/porch/prompts/evaluate.md +2 -2
- package/skeleton/porch/prompts/implement.md +1 -1
- package/skeleton/porch/prompts/plan.md +1 -1
- package/skeleton/porch/prompts/review.md +4 -4
- package/skeleton/porch/prompts/specify.md +1 -1
- package/skeleton/porch/prompts/understand.md +2 -2
- package/skeleton/protocol-schema.json +3 -3
- package/skeleton/protocols/bugfix/builder-prompt.md +1 -1
- package/skeleton/protocols/experiment/protocol.md +3 -3
- package/skeleton/protocols/experiment/templates/notes.md +1 -1
- package/skeleton/protocols/maintain/protocol.md +1 -1
- package/skeleton/protocols/protocol-schema.json +1 -1
- package/skeleton/protocols/{spider → spir}/builder-prompt.md +1 -1
- package/skeleton/protocols/{spider → spir}/prompts/implement.md +1 -1
- package/skeleton/protocols/{spider → spir}/prompts/plan.md +2 -2
- package/skeleton/protocols/{spider → spir}/prompts/review.md +2 -2
- package/skeleton/protocols/{spider → spir}/prompts/specify.md +1 -1
- package/skeleton/protocols/{spider → spir}/protocol.json +2 -2
- package/skeleton/protocols/{spider → spir}/protocol.md +6 -8
- package/skeleton/protocols/{spider → spir}/templates/review.md +1 -1
- package/skeleton/protocols/tick/builder-prompt.md +1 -1
- package/skeleton/protocols/tick/protocol.md +18 -18
- package/skeleton/protocols/tick/templates/review.md +1 -1
- package/skeleton/resources/commands/overview.md +1 -1
- package/skeleton/resources/workflow-reference.md +2 -2
- package/skeleton/roles/architect.md +2 -2
- package/skeleton/roles/builder.md +2 -2
- package/skeleton/templates/AGENTS.md +1 -1
- package/skeleton/templates/CLAUDE.md +1 -1
- package/skeleton/templates/cheatsheet.md +3 -3
- package/skeleton/templates/projectlist.md +1 -1
- package/templates/dashboard/js/main.js +1 -1
- package/templates/open.html +26 -0
- package/dashboard/dist/assets/index-BV7KQvFU.css +0 -32
- package/dashboard/dist/assets/index-bhDjF0Oa.js +0 -131
- package/dashboard/dist/assets/index-bhDjF0Oa.js.map +0 -1
- package/dist/commands/porch/claude.d.ts +0 -27
- package/dist/commands/porch/claude.d.ts.map +0 -1
- package/dist/commands/porch/claude.js +0 -107
- package/dist/commands/porch/claude.js.map +0 -1
- package/dist/commands/porch/run.d.ts +0 -40
- package/dist/commands/porch/run.d.ts.map +0 -1
- package/dist/commands/porch/run.js +0 -893
- package/dist/commands/porch/run.js.map +0 -1
- /package/skeleton/protocols/{spider → spir}/templates/plan.md +0 -0
- /package/skeleton/protocols/{spider → spir}/templates/spec.md +0 -0
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* porch next - Pure planner for protocol execution.
|
|
3
|
+
*
|
|
4
|
+
* Given the current state (status.yaml + filesystem), emits structured
|
|
5
|
+
* JSON task definitions for the builder to execute. No subprocess spawning,
|
|
6
|
+
* no while loop — just read state, compute tasks, output JSON.
|
|
7
|
+
*
|
|
8
|
+
* The builder loop:
|
|
9
|
+
* porch next → execute tasks → porch done → porch next → ...
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from 'node:fs';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import { globSync } from 'glob';
|
|
14
|
+
import { readState, writeState, findStatusPath, getProjectDir } from './state.js';
|
|
15
|
+
import { loadProtocol, getPhaseConfig, getNextPhase, getPhaseGate, isPhased, isBuildVerify, getBuildConfig, getVerifyConfig, getMaxIterations, getPhaseChecks, } from './protocol.js';
|
|
16
|
+
import { findPlanFile, extractPhasesFromFile, getCurrentPlanPhase, advancePlanPhase, } from './plan.js';
|
|
17
|
+
import { buildPhasePrompt } from './prompts.js';
|
|
18
|
+
import { parseVerdict, allApprove } from './verdict.js';
|
|
19
|
+
/**
|
|
20
|
+
* Check if an artifact file has YAML frontmatter indicating it was
|
|
21
|
+
* already approved and validated (3-way review).
|
|
22
|
+
*
|
|
23
|
+
* Frontmatter format:
|
|
24
|
+
* ---
|
|
25
|
+
* approved: 2026-01-29
|
|
26
|
+
* validated: [gemini, codex, claude]
|
|
27
|
+
* ---
|
|
28
|
+
*/
|
|
29
|
+
function isArtifactPreApproved(projectRoot, artifactGlob) {
|
|
30
|
+
const matches = globSync(artifactGlob, { cwd: projectRoot });
|
|
31
|
+
if (matches.length === 0)
|
|
32
|
+
return false;
|
|
33
|
+
const filePath = path.join(projectRoot, matches[0]);
|
|
34
|
+
try {
|
|
35
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
36
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
37
|
+
if (!frontmatterMatch)
|
|
38
|
+
return false;
|
|
39
|
+
const frontmatter = frontmatterMatch[1];
|
|
40
|
+
const hasApproved = /^approved:\s*.+$/m.test(frontmatter);
|
|
41
|
+
const hasValidated = /^validated:\s*\[.+\]$/m.test(frontmatter);
|
|
42
|
+
return hasApproved && hasValidated;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Find review files for the current iteration in the project directory.
|
|
50
|
+
* Review files are created by the `consult` CLI and follow the pattern:
|
|
51
|
+
* <id>-<phase>-iter<N>-<model>.txt
|
|
52
|
+
*/
|
|
53
|
+
function findReviewFiles(projectRoot, state, verifyModels) {
|
|
54
|
+
const projectDir = getProjectDir(projectRoot, state.id, state.title);
|
|
55
|
+
if (!fs.existsSync(projectDir))
|
|
56
|
+
return [];
|
|
57
|
+
const results = [];
|
|
58
|
+
const phase = state.current_plan_phase || state.phase;
|
|
59
|
+
for (const model of verifyModels) {
|
|
60
|
+
const fileName = `${state.id}-${phase}-iter${state.iteration}-${model}.txt`;
|
|
61
|
+
const filePath = path.join(projectDir, fileName);
|
|
62
|
+
if (fs.existsSync(filePath)) {
|
|
63
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
64
|
+
const verdict = parseVerdict(content);
|
|
65
|
+
results.push({ model, verdict, file: filePath });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return results;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Compute the expected review file path for a given model.
|
|
72
|
+
* This must match the pattern used by findReviewFiles().
|
|
73
|
+
*/
|
|
74
|
+
function getReviewFilePath(projectRoot, state, model) {
|
|
75
|
+
const projectDir = getProjectDir(projectRoot, state.id, state.title);
|
|
76
|
+
const phase = state.current_plan_phase || state.phase;
|
|
77
|
+
const fileName = `${state.id}-${phase}-iter${state.iteration}-${model}.txt`;
|
|
78
|
+
return path.join(projectDir, fileName);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Compute the next tasks for a project.
|
|
82
|
+
*
|
|
83
|
+
* This is a pure planner — it reads state and filesystem, infers what
|
|
84
|
+
* happened since the last call, and emits the next batch of tasks.
|
|
85
|
+
*
|
|
86
|
+
* State is only mutated when completed work is detected (filesystem-as-truth).
|
|
87
|
+
* If called twice without filesystem changes, returns the same output.
|
|
88
|
+
*/
|
|
89
|
+
export async function next(projectRoot, projectId) {
|
|
90
|
+
const statusPath = findStatusPath(projectRoot, projectId);
|
|
91
|
+
if (!statusPath) {
|
|
92
|
+
return {
|
|
93
|
+
status: 'error',
|
|
94
|
+
phase: 'unknown',
|
|
95
|
+
iteration: 0,
|
|
96
|
+
error: `Project ${projectId} not found. Run 'porch init' to create a new project.`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
const state = readState(statusPath);
|
|
100
|
+
const protocol = loadProtocol(projectRoot, state.protocol);
|
|
101
|
+
const phaseConfig = getPhaseConfig(protocol, state.phase);
|
|
102
|
+
// Protocol complete
|
|
103
|
+
if (state.phase === 'complete' || !phaseConfig) {
|
|
104
|
+
return {
|
|
105
|
+
status: 'complete',
|
|
106
|
+
phase: state.phase,
|
|
107
|
+
iteration: state.iteration,
|
|
108
|
+
summary: `Project ${state.id} has completed the ${state.protocol} protocol.`,
|
|
109
|
+
tasks: [{
|
|
110
|
+
subject: 'Merge the pull request',
|
|
111
|
+
activeForm: 'Merging pull request',
|
|
112
|
+
description: `The protocol is complete. Merge the PR using:\n\ngh pr merge --merge\n\nDo NOT squash merge. Use regular merge commits to preserve development history.\n\nAfter merging, notify the architect that the work is complete.`,
|
|
113
|
+
sequential: true,
|
|
114
|
+
}],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// Check for pre-approved artifacts (skip build+verify)
|
|
118
|
+
if (isBuildVerify(protocol, state.phase) && !state.build_complete && state.iteration === 1) {
|
|
119
|
+
const buildConfig = getBuildConfig(protocol, state.phase);
|
|
120
|
+
if (buildConfig?.artifact) {
|
|
121
|
+
const artifactGlob = buildConfig.artifact.replace('${PROJECT_ID}', state.id);
|
|
122
|
+
if (isArtifactPreApproved(projectRoot, artifactGlob)) {
|
|
123
|
+
// Auto-approve gate and advance
|
|
124
|
+
const gateName = getPhaseGate(protocol, state.phase);
|
|
125
|
+
if (gateName) {
|
|
126
|
+
state.gates[gateName] = { status: 'approved', approved_at: new Date().toISOString() };
|
|
127
|
+
}
|
|
128
|
+
// Advance to next phase
|
|
129
|
+
const nextPhase = getNextPhase(protocol, state.phase);
|
|
130
|
+
if (nextPhase) {
|
|
131
|
+
state.phase = nextPhase.id;
|
|
132
|
+
// If entering phased protocol, extract plan phases
|
|
133
|
+
if (isPhased(protocol, nextPhase.id)) {
|
|
134
|
+
const planPath = findPlanFile(projectRoot, state.id, state.title);
|
|
135
|
+
if (planPath) {
|
|
136
|
+
state.plan_phases = extractPhasesFromFile(planPath);
|
|
137
|
+
if (state.plan_phases.length > 0) {
|
|
138
|
+
state.current_plan_phase = state.plan_phases[0].id;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
state.iteration = 1;
|
|
143
|
+
state.build_complete = false;
|
|
144
|
+
state.history = [];
|
|
145
|
+
writeState(statusPath, state);
|
|
146
|
+
// Recurse to compute tasks for the new phase
|
|
147
|
+
return next(projectRoot, projectId);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Check gate status
|
|
153
|
+
const gateName = getPhaseGate(protocol, state.phase);
|
|
154
|
+
if (gateName) {
|
|
155
|
+
const gateStatus = state.gates[gateName];
|
|
156
|
+
// Gate pending and requested — tell builder to wait
|
|
157
|
+
if (gateStatus?.status === 'pending' && gateStatus?.requested_at) {
|
|
158
|
+
return {
|
|
159
|
+
status: 'gate_pending',
|
|
160
|
+
phase: state.phase,
|
|
161
|
+
iteration: state.iteration,
|
|
162
|
+
plan_phase: state.current_plan_phase || undefined,
|
|
163
|
+
gate: gateName,
|
|
164
|
+
tasks: [{
|
|
165
|
+
subject: `Request human approval: ${gateName}`,
|
|
166
|
+
activeForm: `Requesting ${gateName} approval`,
|
|
167
|
+
description: `Run: porch gate ${state.id}\nThis will open the artifact for human review.\nSTOP and wait for human approval before proceeding.`,
|
|
168
|
+
}],
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
// Gate approved — advance to next phase
|
|
172
|
+
if (gateStatus?.status === 'approved') {
|
|
173
|
+
const nextPhase = getNextPhase(protocol, state.phase);
|
|
174
|
+
if (!nextPhase) {
|
|
175
|
+
state.phase = 'complete';
|
|
176
|
+
writeState(statusPath, state);
|
|
177
|
+
return next(projectRoot, projectId);
|
|
178
|
+
}
|
|
179
|
+
state.phase = nextPhase.id;
|
|
180
|
+
state.iteration = 1;
|
|
181
|
+
state.build_complete = false;
|
|
182
|
+
state.history = [];
|
|
183
|
+
// If entering phased protocol, extract plan phases
|
|
184
|
+
if (isPhased(protocol, nextPhase.id)) {
|
|
185
|
+
const planPath = findPlanFile(projectRoot, state.id, state.title);
|
|
186
|
+
if (planPath) {
|
|
187
|
+
state.plan_phases = extractPhasesFromFile(planPath);
|
|
188
|
+
if (state.plan_phases.length > 0) {
|
|
189
|
+
state.current_plan_phase = state.plan_phases[0].id;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
writeState(statusPath, state);
|
|
194
|
+
return next(projectRoot, projectId);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// Handle build_verify / per_plan_phase phases
|
|
198
|
+
if (isBuildVerify(protocol, state.phase)) {
|
|
199
|
+
return await handleBuildVerify(projectRoot, projectId, state, protocol, phaseConfig, statusPath);
|
|
200
|
+
}
|
|
201
|
+
// Handle 'once' phases (TICK, BUGFIX)
|
|
202
|
+
return handleOncePhase(projectRoot, state, protocol, phaseConfig);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Handle build_verify and per_plan_phase phases.
|
|
206
|
+
*/
|
|
207
|
+
async function handleBuildVerify(projectRoot, projectId, state, protocol, phaseConfig, statusPath) {
|
|
208
|
+
const verifyConfig = getVerifyConfig(protocol, state.phase);
|
|
209
|
+
const maxIterations = getMaxIterations(protocol, state.phase);
|
|
210
|
+
// Determine plan phase context for per_plan_phase protocols
|
|
211
|
+
const planPhase = isPhased(protocol, state.phase)
|
|
212
|
+
? getCurrentPlanPhase(state.plan_phases)
|
|
213
|
+
: null;
|
|
214
|
+
const baseResponse = {
|
|
215
|
+
phase: state.phase,
|
|
216
|
+
iteration: state.iteration,
|
|
217
|
+
plan_phase: planPhase?.id || state.current_plan_phase || undefined,
|
|
218
|
+
};
|
|
219
|
+
// --- NEED BUILD ---
|
|
220
|
+
if (!state.build_complete) {
|
|
221
|
+
const prompt = buildPhasePrompt(projectRoot, state, protocol);
|
|
222
|
+
const tasks = [];
|
|
223
|
+
// Main build task with full phase prompt
|
|
224
|
+
if (state.iteration === 1) {
|
|
225
|
+
tasks.push({
|
|
226
|
+
subject: `${phaseConfig.name}: Build artifact`,
|
|
227
|
+
activeForm: `Building ${phaseConfig.name.toLowerCase()} artifact`,
|
|
228
|
+
description: prompt,
|
|
229
|
+
sequential: true,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
tasks.push({
|
|
234
|
+
subject: `${phaseConfig.name}: Fix issues from iteration ${state.iteration - 1}`,
|
|
235
|
+
activeForm: `Fixing ${phaseConfig.name.toLowerCase()} issues (iteration ${state.iteration})`,
|
|
236
|
+
description: prompt,
|
|
237
|
+
sequential: true,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
// Add check tasks
|
|
241
|
+
const checks = getPhaseChecks(protocol, state.phase);
|
|
242
|
+
for (const [name, checkDef] of Object.entries(checks)) {
|
|
243
|
+
const cwdNote = checkDef.cwd ? `\n\nIMPORTANT: Run this from the \`${checkDef.cwd}\` subdirectory (relative to project root).` : '';
|
|
244
|
+
tasks.push({
|
|
245
|
+
subject: `Run check: ${name}`,
|
|
246
|
+
activeForm: `Running ${name} check`,
|
|
247
|
+
description: `Run: ${checkDef.command}${cwdNote}\n\nFix any failures before proceeding.`,
|
|
248
|
+
sequential: true,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
// Signal completion
|
|
252
|
+
tasks.push({
|
|
253
|
+
subject: `Signal build complete`,
|
|
254
|
+
activeForm: 'Signaling build complete',
|
|
255
|
+
description: `Run: porch done ${state.id}\n\nThis validates checks and marks the build as complete for verification.`,
|
|
256
|
+
sequential: true,
|
|
257
|
+
});
|
|
258
|
+
return { status: 'tasks', ...baseResponse, tasks };
|
|
259
|
+
}
|
|
260
|
+
// --- NEED VERIFY ---
|
|
261
|
+
if (state.build_complete && verifyConfig) {
|
|
262
|
+
const reviews = findReviewFiles(projectRoot, state, verifyConfig.models);
|
|
263
|
+
// No review files yet — emit consultation tasks
|
|
264
|
+
if (reviews.length === 0) {
|
|
265
|
+
const tasks = [];
|
|
266
|
+
// Build consultation commands with --output so review files land where porch expects them
|
|
267
|
+
const consultType = getConsultArtifactType(state.phase);
|
|
268
|
+
const consultCmds = verifyConfig.models.map(m => `consult --model ${m} --type ${verifyConfig.type} --output "${getReviewFilePath(projectRoot, state, m)}" ${consultType} ${state.id}`);
|
|
269
|
+
tasks.push({
|
|
270
|
+
subject: `Run ${verifyConfig.models.length}-way consultation`,
|
|
271
|
+
activeForm: `Running ${verifyConfig.models.length}-way consultation`,
|
|
272
|
+
description: `Run these commands in parallel in the background:\n\n${consultCmds.join('\n')}\n\nWait for all to complete, then call \`porch next ${state.id}\` to get the next step.`,
|
|
273
|
+
});
|
|
274
|
+
return { status: 'tasks', ...baseResponse, tasks };
|
|
275
|
+
}
|
|
276
|
+
// Review files exist — check if all models reviewed
|
|
277
|
+
if (reviews.length < verifyConfig.models.length) {
|
|
278
|
+
// Partial reviews — still waiting. Emit same consultation tasks (idempotent).
|
|
279
|
+
const consultType = getConsultArtifactType(state.phase);
|
|
280
|
+
const missingModels = verifyConfig.models.filter(m => !reviews.find(r => r.model === m));
|
|
281
|
+
const consultCmds = missingModels.map(m => `consult --model ${m} --type ${verifyConfig.type} --output "${getReviewFilePath(projectRoot, state, m)}" ${consultType} ${state.id}`);
|
|
282
|
+
return {
|
|
283
|
+
status: 'tasks',
|
|
284
|
+
...baseResponse,
|
|
285
|
+
tasks: [{
|
|
286
|
+
subject: `Run remaining consultations (${missingModels.join(', ')})`,
|
|
287
|
+
activeForm: `Running remaining consultations`,
|
|
288
|
+
description: `Some consultations are still missing. Run:\n\n${consultCmds.join('\n')}\n\nThen call \`porch next ${state.id}\` again.`,
|
|
289
|
+
}],
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
// All reviews in — parse verdicts and decide
|
|
293
|
+
if (allApprove(reviews)) {
|
|
294
|
+
// All approve — advance
|
|
295
|
+
return await handleVerifyApproved(projectRoot, projectId, state, protocol, statusPath, reviews);
|
|
296
|
+
}
|
|
297
|
+
// Some request changes
|
|
298
|
+
if (state.iteration >= maxIterations) {
|
|
299
|
+
// Max iterations — proceed to gate anyway
|
|
300
|
+
const gateName = getPhaseGate(protocol, state.phase);
|
|
301
|
+
if (gateName && state.gates[gateName]?.status !== 'approved') {
|
|
302
|
+
state.gates[gateName] = { status: 'pending', requested_at: new Date().toISOString() };
|
|
303
|
+
state.build_complete = false;
|
|
304
|
+
state.iteration = 1;
|
|
305
|
+
state.history = [];
|
|
306
|
+
writeState(statusPath, state);
|
|
307
|
+
return {
|
|
308
|
+
status: 'gate_pending',
|
|
309
|
+
phase: state.phase,
|
|
310
|
+
iteration: state.iteration,
|
|
311
|
+
plan_phase: state.current_plan_phase || undefined,
|
|
312
|
+
gate: gateName,
|
|
313
|
+
tasks: [{
|
|
314
|
+
subject: `Request human approval: ${gateName} (max iterations reached)`,
|
|
315
|
+
activeForm: `Requesting ${gateName} approval`,
|
|
316
|
+
description: `Max iterations (${maxIterations}) reached without unanimous approval.\n\nReviewer verdicts:\n${formatVerdicts(reviews)}\n\nRun: porch gate ${state.id}\nSTOP and wait for human approval.`,
|
|
317
|
+
}],
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// Increment iteration and emit fix tasks
|
|
322
|
+
state.iteration++;
|
|
323
|
+
state.build_complete = false;
|
|
324
|
+
// Record reviews in history
|
|
325
|
+
const existingRecord = state.history.find(h => h.iteration === state.iteration - 1);
|
|
326
|
+
if (existingRecord) {
|
|
327
|
+
existingRecord.reviews = reviews;
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
state.history.push({
|
|
331
|
+
iteration: state.iteration - 1,
|
|
332
|
+
build_output: '',
|
|
333
|
+
reviews,
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
writeState(statusPath, state);
|
|
337
|
+
// Emit fix tasks (prompt will include history with feedback)
|
|
338
|
+
const prompt = buildPhasePrompt(projectRoot, state, protocol);
|
|
339
|
+
return {
|
|
340
|
+
status: 'tasks',
|
|
341
|
+
phase: state.phase,
|
|
342
|
+
iteration: state.iteration,
|
|
343
|
+
plan_phase: state.current_plan_phase || undefined,
|
|
344
|
+
tasks: [
|
|
345
|
+
{
|
|
346
|
+
subject: `${phaseConfig.name}: Fix issues from review (iteration ${state.iteration})`,
|
|
347
|
+
activeForm: `Fixing review issues (iteration ${state.iteration})`,
|
|
348
|
+
description: prompt,
|
|
349
|
+
sequential: true,
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
subject: `Signal build complete`,
|
|
353
|
+
activeForm: 'Signaling build complete',
|
|
354
|
+
description: `Run: porch done ${state.id}\n\nThis validates checks and marks the build as complete for re-verification.`,
|
|
355
|
+
sequential: true,
|
|
356
|
+
},
|
|
357
|
+
],
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
// build_complete but no verifyConfig — shouldn't happen for build_verify, but handle gracefully
|
|
361
|
+
return {
|
|
362
|
+
status: 'error',
|
|
363
|
+
phase: state.phase,
|
|
364
|
+
iteration: state.iteration,
|
|
365
|
+
error: `Phase ${state.phase} has build_complete=true but no verify config.`,
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Handle the case where all reviewers approve.
|
|
370
|
+
* Advances plan phase or requests gate.
|
|
371
|
+
*/
|
|
372
|
+
async function handleVerifyApproved(projectRoot, projectId, state, protocol, statusPath, reviews) {
|
|
373
|
+
const gateName = getPhaseGate(protocol, state.phase);
|
|
374
|
+
// For per_plan_phase: advance to next plan phase (no gate between phases)
|
|
375
|
+
if (isPhased(protocol, state.phase) && state.plan_phases.length > 0) {
|
|
376
|
+
const currentPlanPhase = getCurrentPlanPhase(state.plan_phases);
|
|
377
|
+
if (currentPlanPhase) {
|
|
378
|
+
const { phases: updatedPhases, moveToReview } = advancePlanPhase(state.plan_phases, currentPlanPhase.id);
|
|
379
|
+
state.plan_phases = updatedPhases;
|
|
380
|
+
state.build_complete = false;
|
|
381
|
+
state.iteration = 1;
|
|
382
|
+
state.history = [];
|
|
383
|
+
if (moveToReview) {
|
|
384
|
+
// All plan phases done — move to review
|
|
385
|
+
state.phase = 'review';
|
|
386
|
+
state.current_plan_phase = null;
|
|
387
|
+
writeState(statusPath, state);
|
|
388
|
+
return next(projectRoot, projectId);
|
|
389
|
+
}
|
|
390
|
+
// Next plan phase
|
|
391
|
+
const newCurrent = getCurrentPlanPhase(state.plan_phases);
|
|
392
|
+
state.current_plan_phase = newCurrent?.id || null;
|
|
393
|
+
writeState(statusPath, state);
|
|
394
|
+
return next(projectRoot, projectId);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
// Request gate (for non-phased phases like specify, plan, review)
|
|
398
|
+
if (gateName) {
|
|
399
|
+
state.gates[gateName] = { status: 'pending', requested_at: new Date().toISOString() };
|
|
400
|
+
state.build_complete = false;
|
|
401
|
+
state.iteration = 1;
|
|
402
|
+
state.history = [];
|
|
403
|
+
writeState(statusPath, state);
|
|
404
|
+
return {
|
|
405
|
+
status: 'gate_pending',
|
|
406
|
+
phase: state.phase,
|
|
407
|
+
iteration: 1,
|
|
408
|
+
gate: gateName,
|
|
409
|
+
tasks: [{
|
|
410
|
+
subject: `Request human approval: ${gateName}`,
|
|
411
|
+
activeForm: `Requesting ${gateName} approval`,
|
|
412
|
+
description: `All reviewers approved!\n\nReviewer verdicts:\n${formatVerdicts(reviews)}\n\nRun: porch gate ${state.id}\nSTOP and wait for human approval.`,
|
|
413
|
+
}],
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
// No gate — advance to next phase directly
|
|
417
|
+
const nextPhase = getNextPhase(protocol, state.phase);
|
|
418
|
+
if (!nextPhase) {
|
|
419
|
+
state.phase = 'complete';
|
|
420
|
+
writeState(statusPath, state);
|
|
421
|
+
return next(projectRoot, projectId);
|
|
422
|
+
}
|
|
423
|
+
state.phase = nextPhase.id;
|
|
424
|
+
state.iteration = 1;
|
|
425
|
+
state.build_complete = false;
|
|
426
|
+
state.history = [];
|
|
427
|
+
writeState(statusPath, state);
|
|
428
|
+
return next(projectRoot, projectId);
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Handle 'once' phases (TICK, BUGFIX).
|
|
432
|
+
* These don't have build/verify config — emit a single task.
|
|
433
|
+
*/
|
|
434
|
+
function handleOncePhase(projectRoot, state, protocol, phaseConfig) {
|
|
435
|
+
// Try to load a prompt file for this phase
|
|
436
|
+
const prompt = buildPhasePrompt(projectRoot, state, protocol);
|
|
437
|
+
// If prompt is just a generic fallback, try to use phase steps from protocol
|
|
438
|
+
let description = prompt;
|
|
439
|
+
if (phaseConfig.checks && phaseConfig.checks.length > 0) {
|
|
440
|
+
description += `\n\nAfter completing the work, run these checks:\n${phaseConfig.checks.map(c => `- ${c}`).join('\n')}`;
|
|
441
|
+
}
|
|
442
|
+
description += `\n\nWhen complete, run: porch done ${state.id}`;
|
|
443
|
+
return {
|
|
444
|
+
status: 'tasks',
|
|
445
|
+
phase: state.phase,
|
|
446
|
+
iteration: state.iteration,
|
|
447
|
+
tasks: [{
|
|
448
|
+
subject: `${phaseConfig.name}: Complete phase work`,
|
|
449
|
+
activeForm: `Working on ${phaseConfig.name.toLowerCase()}`,
|
|
450
|
+
description,
|
|
451
|
+
sequential: true,
|
|
452
|
+
}],
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Get the consult artifact type for a phase.
|
|
457
|
+
*/
|
|
458
|
+
function getConsultArtifactType(phaseId) {
|
|
459
|
+
switch (phaseId) {
|
|
460
|
+
case 'specify': return 'spec';
|
|
461
|
+
case 'plan': return 'plan';
|
|
462
|
+
case 'implement': return 'impl';
|
|
463
|
+
case 'review': return 'review';
|
|
464
|
+
default: return 'spec';
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Format review verdicts for display.
|
|
469
|
+
*/
|
|
470
|
+
function formatVerdicts(reviews) {
|
|
471
|
+
return reviews
|
|
472
|
+
.map(r => ` ${r.model}: ${r.verdict}`)
|
|
473
|
+
.join('\n');
|
|
474
|
+
}
|
|
475
|
+
//# sourceMappingURL=next.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"next.js","sourceRoot":"","sources":["../../../src/commands/porch/next.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Loads protocol definitions from JSON files.
|
|
5
5
|
* Fails loudly if protocol not found or invalid.
|
|
6
6
|
*/
|
|
7
|
-
import type { Protocol, ProtocolPhase, BuildConfig, VerifyConfig, OnCompleteConfig } from './types.js';
|
|
7
|
+
import type { Protocol, ProtocolPhase, BuildConfig, VerifyConfig, OnCompleteConfig, CheckDef } from './types.js';
|
|
8
8
|
/**
|
|
9
9
|
* Find and load a protocol by name
|
|
10
10
|
* Fails loudly if not found or invalid.
|
|
@@ -19,9 +19,9 @@ export declare function getPhaseConfig(protocol: Protocol, phaseId: string): Pro
|
|
|
19
19
|
*/
|
|
20
20
|
export declare function getNextPhase(protocol: Protocol, currentPhaseId: string): ProtocolPhase | null;
|
|
21
21
|
/**
|
|
22
|
-
* Get check
|
|
22
|
+
* Get check definitions for a phase
|
|
23
23
|
*/
|
|
24
|
-
export declare function getPhaseChecks(protocol: Protocol, phaseId: string): Record<string,
|
|
24
|
+
export declare function getPhaseChecks(protocol: Protocol, phaseId: string): Record<string, CheckDef>;
|
|
25
25
|
/**
|
|
26
26
|
* Get gate name for a phase (if any)
|
|
27
27
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAYjH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,QAAQ,CAoBhF;AAuLD;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAExF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAM7F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAa5F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG/E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAGrE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEnF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAG1E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAGtF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAGxF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAG5E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAGhG"}
|
|
@@ -37,15 +37,40 @@ export function loadProtocol(projectRoot, protocolName) {
|
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
/**
|
|
40
|
-
* Find protocol.json file in {name}/protocol.json format
|
|
40
|
+
* Find protocol.json file in {name}/protocol.json format.
|
|
41
|
+
* Falls back to alias lookup: scans all protocol.json files for a matching "alias" field.
|
|
41
42
|
*/
|
|
42
43
|
function findProtocolFile(projectRoot, protocolName) {
|
|
44
|
+
// Direct lookup first
|
|
43
45
|
for (const basePath of PROTOCOL_PATHS) {
|
|
44
46
|
const fullPath = path.resolve(projectRoot, basePath, protocolName, 'protocol.json');
|
|
45
47
|
if (fs.existsSync(fullPath)) {
|
|
46
48
|
return fullPath;
|
|
47
49
|
}
|
|
48
50
|
}
|
|
51
|
+
// Alias lookup: scan all protocol.json files for matching alias
|
|
52
|
+
for (const basePath of PROTOCOL_PATHS) {
|
|
53
|
+
const protocolsDir = path.resolve(projectRoot, basePath);
|
|
54
|
+
if (!fs.existsSync(protocolsDir))
|
|
55
|
+
continue;
|
|
56
|
+
try {
|
|
57
|
+
const dirs = fs.readdirSync(protocolsDir, { withFileTypes: true })
|
|
58
|
+
.filter(d => d.isDirectory());
|
|
59
|
+
for (const dir of dirs) {
|
|
60
|
+
const jsonPath = path.join(protocolsDir, dir.name, 'protocol.json');
|
|
61
|
+
if (!fs.existsSync(jsonPath))
|
|
62
|
+
continue;
|
|
63
|
+
try {
|
|
64
|
+
const content = JSON.parse(fs.readFileSync(jsonPath, 'utf-8'));
|
|
65
|
+
if (content.alias === protocolName) {
|
|
66
|
+
return jsonPath;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch { /* skip invalid JSON */ }
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch { /* skip unreadable dirs */ }
|
|
73
|
+
}
|
|
49
74
|
return null;
|
|
50
75
|
}
|
|
51
76
|
/**
|
|
@@ -70,17 +95,26 @@ function normalizeProtocol(json) {
|
|
|
70
95
|
const checks = {};
|
|
71
96
|
const defaults = obj.defaults;
|
|
72
97
|
if (defaults?.checks) {
|
|
73
|
-
Object.
|
|
98
|
+
for (const [name, val] of Object.entries(defaults.checks)) {
|
|
99
|
+
if (typeof val === 'string') {
|
|
100
|
+
checks[name] = { command: val };
|
|
101
|
+
}
|
|
102
|
+
else if (typeof val === 'object' && val !== null && 'command' in val) {
|
|
103
|
+
const checkObj = val;
|
|
104
|
+
checks[name] = { command: checkObj.command, cwd: checkObj.cwd };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
74
107
|
}
|
|
75
|
-
// Also collect per-phase checks
|
|
108
|
+
// Also collect per-phase checks (override defaults)
|
|
76
109
|
for (const phase of obj.phases) {
|
|
77
110
|
if (phase.checks && typeof phase.checks === 'object') {
|
|
78
111
|
for (const [name, check] of Object.entries(phase.checks)) {
|
|
79
112
|
if (typeof check === 'object' && check !== null && 'command' in check) {
|
|
80
|
-
|
|
113
|
+
const checkObj = check;
|
|
114
|
+
checks[name] = { command: checkObj.command, cwd: checkObj.cwd };
|
|
81
115
|
}
|
|
82
116
|
else if (typeof check === 'string') {
|
|
83
|
-
checks[name] = check;
|
|
117
|
+
checks[name] = { command: check };
|
|
84
118
|
}
|
|
85
119
|
}
|
|
86
120
|
}
|
|
@@ -185,7 +219,7 @@ export function getNextPhase(protocol, currentPhaseId) {
|
|
|
185
219
|
return getPhaseConfig(protocol, current.next);
|
|
186
220
|
}
|
|
187
221
|
/**
|
|
188
|
-
* Get check
|
|
222
|
+
* Get check definitions for a phase
|
|
189
223
|
*/
|
|
190
224
|
export function getPhaseChecks(protocol, phaseId) {
|
|
191
225
|
const phase = getPhaseConfig(protocol, phaseId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/commands/porch/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,0DAA0D;AAC1D,MAAM,cAAc,GAAG;IACrB,iBAAiB;IACjB,0BAA0B;CAC3B,CAAC;AAEF,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,WAAmB,EAAE,YAAoB;IACpE,MAAM,YAAY,GAAG,gBAAgB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAEjE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,aAAa,YAAY,gBAAgB;YACzC,gBAAgB,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9F,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,qBAAqB,YAAY,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/commands/porch/protocol.ts"],"names":[],"mappings":"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"}
|