@cluesmith/codev 1.6.2 → 2.0.0-rc.10
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 +12 -0
- package/dist/agent-farm/cli.d.ts.map +1 -1
- package/dist/agent-farm/cli.js +25 -14
- 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 +20 -0
- package/dist/agent-farm/commands/kickoff.d.ts.map +1 -0
- package/dist/agent-farm/commands/kickoff.js +273 -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 +30 -96
- 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 +0 -14
- 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 +17 -0
- 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 +2 -1
- 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 +29 -0
- package/dist/commands/porch/checks.d.ts.map +1 -0
- package/dist/commands/porch/checks.js +141 -0
- package/dist/commands/porch/checks.js.map +1 -0
- 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 +79 -0
- package/dist/commands/porch/claude.js.map +1 -0
- package/dist/commands/porch/index.d.ts +38 -0
- package/dist/commands/porch/index.d.ts.map +1 -0
- package/dist/commands/porch/index.js +524 -0
- package/dist/commands/porch/index.js.map +1 -0
- 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 +259 -0
- package/dist/commands/porch/prompts.js.map +1 -0
- package/dist/commands/porch/protocol.d.ts +57 -0
- package/dist/commands/porch/protocol.d.ts.map +1 -0
- package/dist/commands/porch/protocol.js +250 -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 +15 -0
- package/dist/commands/porch/run.d.ts.map +1 -0
- package/dist/commands/porch/run.js +551 -0
- package/dist/commands/porch/run.js.map +1 -0
- package/dist/commands/porch/signals.d.ts +35 -0
- package/dist/commands/porch/signals.d.ts.map +1 -0
- package/dist/commands/porch/signals.js +76 -0
- package/dist/commands/porch/signals.js.map +1 -0
- package/dist/commands/porch/state.d.ts +40 -0
- package/dist/commands/porch/state.d.ts.map +1 -0
- package/dist/commands/porch/state.js +153 -0
- package/dist/commands/porch/state.js.map +1 -0
- package/dist/commands/porch/types.d.ts +124 -0
- package/dist/commands/porch/types.d.ts.map +1 -0
- package/dist/commands/porch/types.js +8 -0
- package/dist/commands/porch/types.js.map +1 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +19 -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 +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/protocols/bugfix/protocol.json +127 -0
- package/skeleton/protocols/protocol-schema.json +237 -0
- package/skeleton/protocols/spider/prompts/defend.md +215 -0
- package/skeleton/protocols/spider/prompts/evaluate.md +241 -0
- package/skeleton/protocols/spider/prompts/implement.md +149 -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 +174 -0
- package/skeleton/protocols/spider/protocol.json +136 -0
- package/skeleton/protocols/spider/templates/plan.md +14 -0
- package/skeleton/protocols/tick/protocol.json +151 -0
- package/skeleton/roles/architect.md +40 -48
- package/skeleton/roles/builder.md +152 -29
- 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/templates/dashboard/css/activity.css +0 -151
- package/templates/dashboard/js/activity.js +0 -112
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Porch - Protocol Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Claude calls porch as a tool; porch returns prescriptive instructions.
|
|
5
|
+
* All commands produce clear, actionable output.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'node:fs';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import { readState, writeState, createInitialState, findStatusPath, getStatusPath, detectProjectId, } from './state.js';
|
|
11
|
+
import { loadProtocol, getPhaseConfig, getNextPhase, getPhaseChecks, getPhaseGate, isPhased, getPhaseCompletionChecks, } from './protocol.js';
|
|
12
|
+
import { findPlanFile, extractPhasesFromFile, getCurrentPlanPhase, getPhaseContent, advancePlanPhase, allPlanPhasesComplete, } from './plan.js';
|
|
13
|
+
import { runPhaseChecks, formatCheckResults, allChecksPassed, } from './checks.js';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Output Helpers
|
|
16
|
+
// ============================================================================
|
|
17
|
+
function header(text) {
|
|
18
|
+
const line = '═'.repeat(50);
|
|
19
|
+
return `${line}\n ${text}\n${line}`;
|
|
20
|
+
}
|
|
21
|
+
function section(title, content) {
|
|
22
|
+
return `\n${chalk.bold(title)}:\n${content}`;
|
|
23
|
+
}
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Commands
|
|
26
|
+
// ============================================================================
|
|
27
|
+
/**
|
|
28
|
+
* porch status <id>
|
|
29
|
+
* Shows current state and prescriptive next steps.
|
|
30
|
+
*/
|
|
31
|
+
export async function status(projectRoot, projectId) {
|
|
32
|
+
const statusPath = findStatusPath(projectRoot, projectId);
|
|
33
|
+
if (!statusPath) {
|
|
34
|
+
throw new Error(`Project ${projectId} not found.\nRun 'porch init' to create a new project.`);
|
|
35
|
+
}
|
|
36
|
+
const state = readState(statusPath);
|
|
37
|
+
const protocol = loadProtocol(projectRoot, state.protocol);
|
|
38
|
+
const phaseConfig = getPhaseConfig(protocol, state.phase);
|
|
39
|
+
// Header
|
|
40
|
+
console.log('');
|
|
41
|
+
console.log(header(`PROJECT: ${state.id} - ${state.title}`));
|
|
42
|
+
console.log(` PROTOCOL: ${state.protocol}`);
|
|
43
|
+
console.log(` PHASE: ${state.phase} (${phaseConfig?.name || 'unknown'})`);
|
|
44
|
+
// For phased protocols, show plan phase status
|
|
45
|
+
if (isPhased(protocol, state.phase) && state.plan_phases.length > 0) {
|
|
46
|
+
console.log('');
|
|
47
|
+
console.log(chalk.bold('PLAN PHASES:'));
|
|
48
|
+
console.log('');
|
|
49
|
+
// Status icons
|
|
50
|
+
const icon = (status) => {
|
|
51
|
+
switch (status) {
|
|
52
|
+
case 'complete': return chalk.green('✓');
|
|
53
|
+
case 'in_progress': return chalk.yellow('►');
|
|
54
|
+
default: return chalk.gray('○');
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
// Show phases
|
|
58
|
+
for (const phase of state.plan_phases) {
|
|
59
|
+
const isCurrent = phase.status === 'in_progress';
|
|
60
|
+
const prefix = isCurrent ? chalk.cyan('→ ') : ' ';
|
|
61
|
+
const title = isCurrent ? chalk.bold(phase.title) : phase.title;
|
|
62
|
+
console.log(`${prefix}${icon(phase.status)} ${phase.id}: ${title}`);
|
|
63
|
+
}
|
|
64
|
+
const currentPlanPhase = getCurrentPlanPhase(state.plan_phases);
|
|
65
|
+
if (currentPlanPhase) {
|
|
66
|
+
console.log('');
|
|
67
|
+
console.log(chalk.bold(`CURRENT: ${currentPlanPhase.id} - ${currentPlanPhase.title}`));
|
|
68
|
+
// Show phase content from plan
|
|
69
|
+
const planPath = findPlanFile(projectRoot, state.id, state.title);
|
|
70
|
+
if (planPath) {
|
|
71
|
+
const content = fs.readFileSync(planPath, 'utf-8');
|
|
72
|
+
const phaseContent = getPhaseContent(content, currentPlanPhase.id);
|
|
73
|
+
if (phaseContent) {
|
|
74
|
+
console.log(section('FROM THE PLAN', phaseContent.slice(0, 500)));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Find the next phase name for the warning
|
|
78
|
+
const currentIdx = state.plan_phases.findIndex(p => p.id === currentPlanPhase.id);
|
|
79
|
+
const nextPlanPhase = state.plan_phases[currentIdx + 1];
|
|
80
|
+
console.log('');
|
|
81
|
+
console.log(chalk.red.bold('╔══════════════════════════════════════════════════════════════╗'));
|
|
82
|
+
console.log(chalk.red.bold('║ 🛑 CRITICAL RULES ║'));
|
|
83
|
+
if (nextPlanPhase) {
|
|
84
|
+
console.log(chalk.red.bold(`║ 1. DO NOT start ${nextPlanPhase.id} until you run porch again!`.padEnd(63) + '║'));
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
console.log(chalk.red.bold('║ 1. DO NOT start the next phase until you run porch again! ║'));
|
|
88
|
+
}
|
|
89
|
+
console.log(chalk.red.bold('║ 2. Run /compact before starting each new phase ║'));
|
|
90
|
+
console.log(chalk.red.bold('║ 3. After completing this phase, run: porch done ' + state.id.padEnd(12) + '║'));
|
|
91
|
+
console.log(chalk.red.bold('╚══════════════════════════════════════════════════════════════╝'));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Show checks status
|
|
95
|
+
const checks = getPhaseChecks(protocol, state.phase);
|
|
96
|
+
if (Object.keys(checks).length > 0) {
|
|
97
|
+
const checkLines = Object.keys(checks).map(name => ` ○ ${name} (not yet run)`);
|
|
98
|
+
console.log(section('CRITERIA', checkLines.join('\n')));
|
|
99
|
+
}
|
|
100
|
+
// Instructions
|
|
101
|
+
const gate = getPhaseGate(protocol, state.phase);
|
|
102
|
+
if (gate && state.gates[gate]?.status === 'pending' && state.gates[gate]?.requested_at) {
|
|
103
|
+
console.log(section('STATUS', chalk.yellow('WAITING FOR HUMAN APPROVAL')));
|
|
104
|
+
console.log(`\n Gate: ${gate}`);
|
|
105
|
+
console.log(' Do not proceed until gate is approved.');
|
|
106
|
+
console.log(`\n To approve: porch approve ${state.id} ${gate}`);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
console.log(section('INSTRUCTIONS', getInstructions(state, protocol)));
|
|
110
|
+
}
|
|
111
|
+
console.log(section('NEXT ACTION', getNextAction(state, protocol)));
|
|
112
|
+
console.log('');
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* porch check <id>
|
|
116
|
+
* Runs the phase checks and reports results.
|
|
117
|
+
*/
|
|
118
|
+
export async function check(projectRoot, projectId) {
|
|
119
|
+
const statusPath = findStatusPath(projectRoot, projectId);
|
|
120
|
+
if (!statusPath) {
|
|
121
|
+
throw new Error(`Project ${projectId} not found.`);
|
|
122
|
+
}
|
|
123
|
+
const state = readState(statusPath);
|
|
124
|
+
const protocol = loadProtocol(projectRoot, state.protocol);
|
|
125
|
+
const checks = getPhaseChecks(protocol, state.phase);
|
|
126
|
+
if (Object.keys(checks).length === 0) {
|
|
127
|
+
console.log(chalk.dim('No checks defined for this phase.'));
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const checkEnv = { PROJECT_ID: state.id, PROJECT_TITLE: state.title };
|
|
131
|
+
console.log('');
|
|
132
|
+
console.log(chalk.bold('RUNNING CHECKS...'));
|
|
133
|
+
console.log('');
|
|
134
|
+
const results = await runPhaseChecks(checks, projectRoot, checkEnv);
|
|
135
|
+
console.log(formatCheckResults(results));
|
|
136
|
+
console.log('');
|
|
137
|
+
if (allChecksPassed(results)) {
|
|
138
|
+
console.log(chalk.green('RESULT: ALL CHECKS PASSED'));
|
|
139
|
+
console.log(`\n Run: porch done ${state.id} (to advance)`);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
console.log(chalk.red('RESULT: CHECKS FAILED'));
|
|
143
|
+
console.log(`\n Fix the failures and run: porch check ${state.id}`);
|
|
144
|
+
}
|
|
145
|
+
console.log('');
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* porch done <id>
|
|
149
|
+
* Advances to next phase if checks pass. Refuses if checks fail.
|
|
150
|
+
*/
|
|
151
|
+
export async function done(projectRoot, projectId) {
|
|
152
|
+
const statusPath = findStatusPath(projectRoot, projectId);
|
|
153
|
+
if (!statusPath) {
|
|
154
|
+
throw new Error(`Project ${projectId} not found.`);
|
|
155
|
+
}
|
|
156
|
+
let state = readState(statusPath);
|
|
157
|
+
const protocol = loadProtocol(projectRoot, state.protocol);
|
|
158
|
+
const checks = getPhaseChecks(protocol, state.phase);
|
|
159
|
+
// Run checks first
|
|
160
|
+
if (Object.keys(checks).length > 0) {
|
|
161
|
+
const checkEnv = { PROJECT_ID: state.id, PROJECT_TITLE: state.title };
|
|
162
|
+
console.log('');
|
|
163
|
+
console.log(chalk.bold('RUNNING CHECKS...'));
|
|
164
|
+
const results = await runPhaseChecks(checks, projectRoot, checkEnv);
|
|
165
|
+
console.log(formatCheckResults(results));
|
|
166
|
+
if (!allChecksPassed(results)) {
|
|
167
|
+
console.log('');
|
|
168
|
+
console.log(chalk.red('CHECKS FAILED. Cannot advance.'));
|
|
169
|
+
console.log(`\n Fix the failures and try again.`);
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Check for gate
|
|
174
|
+
const gate = getPhaseGate(protocol, state.phase);
|
|
175
|
+
if (gate && state.gates[gate]?.status !== 'approved') {
|
|
176
|
+
console.log('');
|
|
177
|
+
console.log(chalk.yellow(`GATE REQUIRED: ${gate}`));
|
|
178
|
+
console.log(`\n Run: porch gate ${state.id}`);
|
|
179
|
+
console.log(' Wait for human approval before advancing.');
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
// Handle phased protocols (plan phases with checks at completion)
|
|
183
|
+
if (isPhased(protocol, state.phase) && state.plan_phases.length > 0) {
|
|
184
|
+
const currentPlanPhase = getCurrentPlanPhase(state.plan_phases);
|
|
185
|
+
if (currentPlanPhase && !allPlanPhasesComplete(state.plan_phases)) {
|
|
186
|
+
// Run phase completion checks (implement + defend + evaluate all at once)
|
|
187
|
+
const completionChecks = getPhaseCompletionChecks(protocol);
|
|
188
|
+
if (Object.keys(completionChecks).length > 0) {
|
|
189
|
+
const checkEnv = { PROJECT_ID: state.id, PROJECT_TITLE: state.title };
|
|
190
|
+
console.log('');
|
|
191
|
+
console.log(chalk.bold(`RUNNING PHASE COMPLETION CHECKS (${currentPlanPhase.id})...`));
|
|
192
|
+
const results = await runPhaseChecks(completionChecks, projectRoot, checkEnv);
|
|
193
|
+
console.log(formatCheckResults(results));
|
|
194
|
+
if (!allChecksPassed(results)) {
|
|
195
|
+
console.log('');
|
|
196
|
+
console.log(chalk.red('PHASE COMPLETION CHECKS FAILED. Cannot advance.'));
|
|
197
|
+
console.log(`\n Ensure your commit includes:`);
|
|
198
|
+
console.log(` - Implementation code`);
|
|
199
|
+
console.log(` - Tests`);
|
|
200
|
+
console.log(` - 3-way review results in commit message`);
|
|
201
|
+
console.log(`\n Then try again.`);
|
|
202
|
+
process.exit(1);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Advance to next plan phase
|
|
206
|
+
const { phases: updatedPhases, moveToReview } = advancePlanPhase(state.plan_phases, currentPlanPhase.id);
|
|
207
|
+
state.plan_phases = updatedPhases;
|
|
208
|
+
console.log('');
|
|
209
|
+
console.log(chalk.green(`PLAN PHASE COMPLETE: ${currentPlanPhase.id} - ${currentPlanPhase.title}`));
|
|
210
|
+
// Check if moving to review (all plan phases done)
|
|
211
|
+
if (moveToReview) {
|
|
212
|
+
state.phase = 'review';
|
|
213
|
+
state.current_plan_phase = null;
|
|
214
|
+
writeState(statusPath, state);
|
|
215
|
+
console.log(chalk.cyan('All plan phases complete. Moving to REVIEW phase.'));
|
|
216
|
+
console.log(`\n Run: porch status ${state.id}`);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
// Update current plan phase tracker
|
|
220
|
+
const newCurrentPhase = getCurrentPlanPhase(state.plan_phases);
|
|
221
|
+
state.current_plan_phase = newCurrentPhase?.id || null;
|
|
222
|
+
writeState(statusPath, state);
|
|
223
|
+
if (newCurrentPhase) {
|
|
224
|
+
console.log(chalk.cyan(`NEXT: ${newCurrentPhase.id} - ${newCurrentPhase.title}`));
|
|
225
|
+
}
|
|
226
|
+
console.log(`\n Run: porch status ${state.id}`);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// Advance to next protocol phase
|
|
231
|
+
advanceProtocolPhase(state, protocol, statusPath);
|
|
232
|
+
}
|
|
233
|
+
function advanceProtocolPhase(state, protocol, statusPath) {
|
|
234
|
+
const nextPhase = getNextPhase(protocol, state.phase);
|
|
235
|
+
if (!nextPhase) {
|
|
236
|
+
console.log('');
|
|
237
|
+
console.log(chalk.green.bold('🎉 PROTOCOL COMPLETE'));
|
|
238
|
+
console.log(`\n Project ${state.id} has completed the ${state.protocol} protocol.`);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
state.phase = nextPhase.id;
|
|
242
|
+
// If entering a phased phase (implement), extract plan phases
|
|
243
|
+
if (isPhased(protocol, nextPhase.id)) {
|
|
244
|
+
const planPath = findPlanFile(process.cwd(), state.id, state.title);
|
|
245
|
+
if (planPath) {
|
|
246
|
+
state.plan_phases = extractPhasesFromFile(planPath);
|
|
247
|
+
// extractPhasesFromFile already marks first phase as in_progress
|
|
248
|
+
if (state.plan_phases.length > 0) {
|
|
249
|
+
state.current_plan_phase = state.plan_phases[0].id;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
writeState(statusPath, state);
|
|
254
|
+
console.log('');
|
|
255
|
+
console.log(chalk.green(`ADVANCING TO: ${nextPhase.id} - ${nextPhase.name}`));
|
|
256
|
+
// If we just entered implement phase, show phase 1 info and the critical warning
|
|
257
|
+
if (isPhased(protocol, nextPhase.id) && state.plan_phases.length > 0) {
|
|
258
|
+
const firstPhase = state.plan_phases[0];
|
|
259
|
+
const nextPlanPhase = state.plan_phases[1];
|
|
260
|
+
console.log('');
|
|
261
|
+
console.log(chalk.bold(`YOUR TASK: ${firstPhase.id} - "${firstPhase.title}"`));
|
|
262
|
+
// Show phase content from plan
|
|
263
|
+
const planPath = findPlanFile(process.cwd(), state.id, state.title);
|
|
264
|
+
if (planPath) {
|
|
265
|
+
const content = fs.readFileSync(planPath, 'utf-8');
|
|
266
|
+
const phaseContent = getPhaseContent(content, firstPhase.id);
|
|
267
|
+
if (phaseContent) {
|
|
268
|
+
console.log(section('FROM THE PLAN', phaseContent.slice(0, 800)));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
console.log('');
|
|
272
|
+
console.log(chalk.red.bold('╔══════════════════════════════════════════════════════════════╗'));
|
|
273
|
+
console.log(chalk.red.bold('║ 🛑 CRITICAL RULES ║'));
|
|
274
|
+
if (nextPlanPhase) {
|
|
275
|
+
console.log(chalk.red.bold(`║ 1. DO NOT start ${nextPlanPhase.id} until you run porch again!`.padEnd(63) + '║'));
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
console.log(chalk.red.bold('║ 1. DO NOT start the next phase until you run porch again! ║'));
|
|
279
|
+
}
|
|
280
|
+
console.log(chalk.red.bold('║ 2. Run /compact before starting each new phase ║'));
|
|
281
|
+
console.log(chalk.red.bold('║ 3. When phase complete, run: porch done ' + state.id.padEnd(20) + '║'));
|
|
282
|
+
console.log(chalk.red.bold('╚══════════════════════════════════════════════════════════════╝'));
|
|
283
|
+
}
|
|
284
|
+
console.log(`\n Run: porch status ${state.id}`);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* porch gate <id>
|
|
288
|
+
* Requests human approval for current gate.
|
|
289
|
+
*/
|
|
290
|
+
export async function gate(projectRoot, projectId) {
|
|
291
|
+
const statusPath = findStatusPath(projectRoot, projectId);
|
|
292
|
+
if (!statusPath) {
|
|
293
|
+
throw new Error(`Project ${projectId} not found.`);
|
|
294
|
+
}
|
|
295
|
+
const state = readState(statusPath);
|
|
296
|
+
const protocol = loadProtocol(projectRoot, state.protocol);
|
|
297
|
+
const gateName = getPhaseGate(protocol, state.phase);
|
|
298
|
+
if (!gateName) {
|
|
299
|
+
console.log(chalk.dim('No gate required for this phase.'));
|
|
300
|
+
console.log(`\n Run: porch done ${state.id}`);
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
// Mark gate as requested
|
|
304
|
+
if (!state.gates[gateName]) {
|
|
305
|
+
state.gates[gateName] = { status: 'pending' };
|
|
306
|
+
}
|
|
307
|
+
if (!state.gates[gateName].requested_at) {
|
|
308
|
+
state.gates[gateName].requested_at = new Date().toISOString();
|
|
309
|
+
writeState(statusPath, state);
|
|
310
|
+
}
|
|
311
|
+
console.log('');
|
|
312
|
+
console.log(chalk.bold(`GATE: ${gateName}`));
|
|
313
|
+
console.log('');
|
|
314
|
+
// Show relevant artifact and open it for review
|
|
315
|
+
const artifact = getArtifactForPhase(projectRoot, state);
|
|
316
|
+
if (artifact) {
|
|
317
|
+
const fullPath = path.join(projectRoot, artifact);
|
|
318
|
+
if (fs.existsSync(fullPath)) {
|
|
319
|
+
console.log(` Artifact: ${artifact}`);
|
|
320
|
+
console.log('');
|
|
321
|
+
console.log(chalk.cyan(' Opening artifact for human review...'));
|
|
322
|
+
// Use af open to display in annotation viewer
|
|
323
|
+
const { spawn } = await import('node:child_process');
|
|
324
|
+
spawn('af', ['open', fullPath], {
|
|
325
|
+
stdio: 'inherit',
|
|
326
|
+
detached: true
|
|
327
|
+
}).unref();
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
console.log('');
|
|
331
|
+
console.log(chalk.yellow(' Human approval required. STOP and wait.'));
|
|
332
|
+
console.log(' Do not proceed until gate is approved.');
|
|
333
|
+
console.log('');
|
|
334
|
+
console.log(chalk.bold('STATUS: WAITING FOR HUMAN APPROVAL'));
|
|
335
|
+
console.log('');
|
|
336
|
+
console.log(chalk.dim(` To approve: porch approve ${state.id} ${gateName}`));
|
|
337
|
+
console.log('');
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* porch approve <id> <gate> --a-human-explicitly-approved-this
|
|
341
|
+
* Human approves a gate. Requires explicit flag to prevent automated approvals.
|
|
342
|
+
*/
|
|
343
|
+
export async function approve(projectRoot, projectId, gateName, hasHumanFlag) {
|
|
344
|
+
const statusPath = findStatusPath(projectRoot, projectId);
|
|
345
|
+
if (!statusPath) {
|
|
346
|
+
throw new Error(`Project ${projectId} not found.`);
|
|
347
|
+
}
|
|
348
|
+
const state = readState(statusPath);
|
|
349
|
+
if (!state.gates[gateName]) {
|
|
350
|
+
const knownGates = Object.keys(state.gates).join(', ');
|
|
351
|
+
throw new Error(`Unknown gate: ${gateName}\nKnown gates: ${knownGates || 'none'}`);
|
|
352
|
+
}
|
|
353
|
+
if (state.gates[gateName].status === 'approved') {
|
|
354
|
+
console.log(chalk.yellow(`Gate ${gateName} is already approved.`));
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
// Require explicit human flag
|
|
358
|
+
if (!hasHumanFlag) {
|
|
359
|
+
console.log('');
|
|
360
|
+
console.log(chalk.red('ERROR: Human approval required.'));
|
|
361
|
+
console.log('');
|
|
362
|
+
console.log(' To approve, please run:');
|
|
363
|
+
console.log('');
|
|
364
|
+
console.log(chalk.cyan(` porch approve ${projectId} ${gateName} --a-human-explicitly-approved-this`));
|
|
365
|
+
console.log('');
|
|
366
|
+
process.exit(1);
|
|
367
|
+
}
|
|
368
|
+
// Run phase checks before approving
|
|
369
|
+
const protocol = loadProtocol(projectRoot, state.protocol);
|
|
370
|
+
const checks = getPhaseChecks(protocol, state.phase);
|
|
371
|
+
if (Object.keys(checks).length > 0) {
|
|
372
|
+
const checkEnv = { PROJECT_ID: state.id, PROJECT_TITLE: state.title };
|
|
373
|
+
console.log('');
|
|
374
|
+
console.log(chalk.bold('RUNNING CHECKS...'));
|
|
375
|
+
const results = await runPhaseChecks(checks, projectRoot, checkEnv);
|
|
376
|
+
console.log(formatCheckResults(results));
|
|
377
|
+
if (!allChecksPassed(results)) {
|
|
378
|
+
console.log('');
|
|
379
|
+
console.log(chalk.red('CHECKS FAILED. Cannot approve gate.'));
|
|
380
|
+
console.log(`\n Fix the failures and try again.`);
|
|
381
|
+
process.exit(1);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
state.gates[gateName].status = 'approved';
|
|
385
|
+
state.gates[gateName].approved_at = new Date().toISOString();
|
|
386
|
+
writeState(statusPath, state);
|
|
387
|
+
console.log('');
|
|
388
|
+
console.log(chalk.green(`Gate ${gateName} approved.`));
|
|
389
|
+
console.log(`\n Run: porch done ${state.id} (to advance)`);
|
|
390
|
+
console.log('');
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* porch init <protocol> <id> <name>
|
|
394
|
+
* Initialize a new project.
|
|
395
|
+
*/
|
|
396
|
+
export async function init(projectRoot, protocolName, projectId, projectName) {
|
|
397
|
+
const protocol = loadProtocol(projectRoot, protocolName);
|
|
398
|
+
const statusPath = getStatusPath(projectRoot, projectId, projectName);
|
|
399
|
+
// Check if already exists
|
|
400
|
+
if (fs.existsSync(statusPath)) {
|
|
401
|
+
throw new Error(`Project ${projectId}-${projectName} already exists.`);
|
|
402
|
+
}
|
|
403
|
+
const state = createInitialState(protocol, projectId, projectName);
|
|
404
|
+
writeState(statusPath, state);
|
|
405
|
+
console.log('');
|
|
406
|
+
console.log(chalk.green(`Project initialized: ${projectId}-${projectName}`));
|
|
407
|
+
console.log(` Protocol: ${protocolName}`);
|
|
408
|
+
console.log(` Initial phase: ${state.phase}`);
|
|
409
|
+
console.log(`\n Run: porch status ${projectId}`);
|
|
410
|
+
console.log('');
|
|
411
|
+
}
|
|
412
|
+
// ============================================================================
|
|
413
|
+
// Helpers
|
|
414
|
+
// ============================================================================
|
|
415
|
+
function getInstructions(state, protocol) {
|
|
416
|
+
const phase = state.phase;
|
|
417
|
+
if (isPhased(protocol, phase) && state.plan_phases.length > 0) {
|
|
418
|
+
const current = getCurrentPlanPhase(state.plan_phases);
|
|
419
|
+
if (current) {
|
|
420
|
+
return ` You are implementing ${current.id}: "${current.title}".\n\n Complete the work, then run: porch check ${state.id}`;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
const phaseConfig = getPhaseConfig(protocol, phase);
|
|
424
|
+
return ` You are in the ${phaseConfig?.name || phase} phase.\n\n When complete, run: porch done ${state.id}`;
|
|
425
|
+
}
|
|
426
|
+
function getNextAction(state, protocol) {
|
|
427
|
+
const checks = getPhaseChecks(protocol, state.phase);
|
|
428
|
+
const gate = getPhaseGate(protocol, state.phase);
|
|
429
|
+
if (gate && state.gates[gate]?.status === 'pending' && state.gates[gate]?.requested_at) {
|
|
430
|
+
return chalk.yellow('Wait for human to approve the gate.');
|
|
431
|
+
}
|
|
432
|
+
if (isPhased(protocol, state.phase)) {
|
|
433
|
+
const current = getCurrentPlanPhase(state.plan_phases);
|
|
434
|
+
if (current) {
|
|
435
|
+
return `Implement ${current.title} as specified in the plan.`;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
if (Object.keys(checks).length > 0) {
|
|
439
|
+
return `Complete the phase work, then run: porch check ${state.id}`;
|
|
440
|
+
}
|
|
441
|
+
return `Complete the phase work, then run: porch done ${state.id}`;
|
|
442
|
+
}
|
|
443
|
+
function getArtifactForPhase(projectRoot, state) {
|
|
444
|
+
switch (state.phase) {
|
|
445
|
+
case 'specify':
|
|
446
|
+
return `codev/specs/${state.id}-${state.title}.md`;
|
|
447
|
+
case 'plan':
|
|
448
|
+
return `codev/plans/${state.id}-${state.title}.md`;
|
|
449
|
+
case 'review':
|
|
450
|
+
return `codev/reviews/${state.id}-${state.title}.md`;
|
|
451
|
+
default:
|
|
452
|
+
return null;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
// ============================================================================
|
|
456
|
+
// CLI
|
|
457
|
+
// ============================================================================
|
|
458
|
+
export async function cli(args) {
|
|
459
|
+
const [command, ...rest] = args;
|
|
460
|
+
const projectRoot = process.cwd();
|
|
461
|
+
// Auto-detect project ID for commands that need it
|
|
462
|
+
function getProjectId(provided) {
|
|
463
|
+
if (provided)
|
|
464
|
+
return provided;
|
|
465
|
+
const detected = detectProjectId(projectRoot);
|
|
466
|
+
if (detected) {
|
|
467
|
+
console.log(chalk.dim(`[auto-detected project: ${detected}]`));
|
|
468
|
+
return detected;
|
|
469
|
+
}
|
|
470
|
+
throw new Error('No project ID provided and could not auto-detect.\nProvide ID explicitly or ensure exactly one project exists in codev/projects/');
|
|
471
|
+
}
|
|
472
|
+
try {
|
|
473
|
+
switch (command) {
|
|
474
|
+
case 'run':
|
|
475
|
+
const { run } = await import('./run.js');
|
|
476
|
+
await run(projectRoot, getProjectId(rest[0]));
|
|
477
|
+
break;
|
|
478
|
+
case 'status':
|
|
479
|
+
await status(projectRoot, getProjectId(rest[0]));
|
|
480
|
+
break;
|
|
481
|
+
case 'check':
|
|
482
|
+
await check(projectRoot, getProjectId(rest[0]));
|
|
483
|
+
break;
|
|
484
|
+
case 'done':
|
|
485
|
+
await done(projectRoot, getProjectId(rest[0]));
|
|
486
|
+
break;
|
|
487
|
+
case 'gate':
|
|
488
|
+
await gate(projectRoot, getProjectId(rest[0]));
|
|
489
|
+
break;
|
|
490
|
+
case 'approve':
|
|
491
|
+
if (!rest[0] || !rest[1])
|
|
492
|
+
throw new Error('Usage: porch approve <id> <gate> --a-human-explicitly-approved-this');
|
|
493
|
+
const hasHumanFlag = rest.includes('--a-human-explicitly-approved-this');
|
|
494
|
+
await approve(projectRoot, rest[0], rest[1], hasHumanFlag);
|
|
495
|
+
break;
|
|
496
|
+
case 'init':
|
|
497
|
+
if (!rest[0] || !rest[1] || !rest[2]) {
|
|
498
|
+
throw new Error('Usage: porch init <protocol> <id> <name>');
|
|
499
|
+
}
|
|
500
|
+
await init(projectRoot, rest[0], rest[1], rest[2]);
|
|
501
|
+
break;
|
|
502
|
+
default:
|
|
503
|
+
console.log('porch - Protocol Orchestrator');
|
|
504
|
+
console.log('');
|
|
505
|
+
console.log('Commands:');
|
|
506
|
+
console.log(' run [id] Run the protocol (auto-detects if one project)');
|
|
507
|
+
console.log(' status [id] Show current state and instructions');
|
|
508
|
+
console.log(' check [id] Run checks for current phase');
|
|
509
|
+
console.log(' done [id] Advance to next phase (if checks pass)');
|
|
510
|
+
console.log(' gate [id] Request human approval');
|
|
511
|
+
console.log(' approve <id> <gate> --a-human-explicitly-approved-this');
|
|
512
|
+
console.log(' init <protocol> <id> <name> Initialize a new project');
|
|
513
|
+
console.log('');
|
|
514
|
+
console.log('Project ID is auto-detected when exactly one project exists.');
|
|
515
|
+
console.log('');
|
|
516
|
+
process.exit(command ? 1 : 0);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
catch (err) {
|
|
520
|
+
console.error(chalk.red(`Error: ${err.message}`));
|
|
521
|
+
process.exit(1);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/porch/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Porch Plan Parsing
|
|
3
|
+
*
|
|
4
|
+
* Extracts implementation phases from plan.md files.
|
|
5
|
+
* Looks for `### Phase N: <title>` headers or JSON phases block.
|
|
6
|
+
*
|
|
7
|
+
* Plan phases are simple: pending → in_progress → complete.
|
|
8
|
+
* All checks (implement, defend, evaluate) run together at the end.
|
|
9
|
+
*/
|
|
10
|
+
import type { PlanPhase } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Find the plan file for a project
|
|
13
|
+
* Searches both legacy (codev/plans/NNNN-name.md) and new (codev/projects/NNNN-name/plan.md) locations
|
|
14
|
+
*/
|
|
15
|
+
export declare function findPlanFile(projectRoot: string, projectId: string, projectName?: string): string | null;
|
|
16
|
+
/**
|
|
17
|
+
* Extract phases from plan markdown content
|
|
18
|
+
* Returns phases with status 'pending'
|
|
19
|
+
*
|
|
20
|
+
* Looks for a JSON code block:
|
|
21
|
+
* ```json
|
|
22
|
+
* {"phases": [{"id": "phase_1", "title": "..."}, ...]}
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare function extractPlanPhases(planContent: string): PlanPhase[];
|
|
26
|
+
/**
|
|
27
|
+
* Extract phases from a plan file
|
|
28
|
+
* Fails loudly if file doesn't exist
|
|
29
|
+
*/
|
|
30
|
+
export declare function extractPhasesFromFile(planFilePath: string): PlanPhase[];
|
|
31
|
+
/**
|
|
32
|
+
* Check if a plan phase is complete
|
|
33
|
+
*/
|
|
34
|
+
export declare function isPlanPhaseComplete(phase: PlanPhase): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Get the current plan phase (first non-complete phase)
|
|
37
|
+
*/
|
|
38
|
+
export declare function getCurrentPlanPhase(phases: PlanPhase[]): PlanPhase | null;
|
|
39
|
+
/**
|
|
40
|
+
* Get the next plan phase after a given phase
|
|
41
|
+
*/
|
|
42
|
+
export declare function getNextPlanPhase(phases: PlanPhase[], currentPhaseId: string): PlanPhase | null;
|
|
43
|
+
/**
|
|
44
|
+
* Check if all plan phases are complete
|
|
45
|
+
*/
|
|
46
|
+
export declare function allPlanPhasesComplete(phases: PlanPhase[]): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Advance to the next plan phase
|
|
49
|
+
* Marks current phase complete and next phase in_progress
|
|
50
|
+
* Returns updated phases array and whether to move to review
|
|
51
|
+
*/
|
|
52
|
+
export declare function advancePlanPhase(phases: PlanPhase[], currentPhaseId: string): {
|
|
53
|
+
phases: PlanPhase[];
|
|
54
|
+
moveToReview: boolean;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Get phase content from plan (the text under the phase header)
|
|
58
|
+
*/
|
|
59
|
+
export declare function getPhaseContent(planContent: string, phaseId: string): string | null;
|
|
60
|
+
//# sourceMappingURL=plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAM5C;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyBxG;AAMD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,CA0BlE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,CAOvE;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,CAOzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAM9F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAElE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EAAE,EACnB,cAAc,EAAE,MAAM,GACrB;IAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAoBhD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAanF"}
|