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