@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.
Files changed (126) hide show
  1. package/bin/porch.js +6 -35
  2. package/dist/agent-farm/cli.d.ts.map +1 -1
  3. package/dist/agent-farm/cli.js +0 -14
  4. package/dist/agent-farm/cli.js.map +1 -1
  5. package/dist/agent-farm/commands/kickoff.d.ts.map +1 -1
  6. package/dist/agent-farm/commands/kickoff.js +22 -86
  7. package/dist/agent-farm/commands/kickoff.js.map +1 -1
  8. package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
  9. package/dist/agent-farm/commands/spawn.js +30 -54
  10. package/dist/agent-farm/commands/spawn.js.map +1 -1
  11. package/dist/agent-farm/commands/start.d.ts.map +1 -1
  12. package/dist/agent-farm/commands/start.js +8 -50
  13. package/dist/agent-farm/commands/start.js.map +1 -1
  14. package/dist/agent-farm/servers/dashboard-server.js +0 -14
  15. package/dist/agent-farm/servers/dashboard-server.js.map +1 -1
  16. package/dist/agent-farm/state.d.ts +0 -10
  17. package/dist/agent-farm/state.d.ts.map +1 -1
  18. package/dist/agent-farm/state.js +0 -24
  19. package/dist/agent-farm/state.js.map +1 -1
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +5 -17
  22. package/dist/cli.js.map +1 -1
  23. package/dist/commands/adopt.d.ts.map +1 -1
  24. package/dist/commands/adopt.js +17 -1
  25. package/dist/commands/adopt.js.map +1 -1
  26. package/dist/commands/consult/index.d.ts.map +1 -1
  27. package/dist/commands/consult/index.js +2 -1
  28. package/dist/commands/consult/index.js.map +1 -1
  29. package/dist/commands/init.d.ts.map +1 -1
  30. package/dist/commands/init.js +17 -1
  31. package/dist/commands/init.js.map +1 -1
  32. package/dist/commands/porch/checks.d.ts +16 -29
  33. package/dist/commands/porch/checks.d.ts.map +1 -1
  34. package/dist/commands/porch/checks.js +90 -144
  35. package/dist/commands/porch/checks.js.map +1 -1
  36. package/dist/commands/porch/claude.d.ts +29 -0
  37. package/dist/commands/porch/claude.d.ts.map +1 -0
  38. package/dist/commands/porch/claude.js +79 -0
  39. package/dist/commands/porch/claude.js.map +1 -0
  40. package/dist/commands/porch/index.d.ts +21 -43
  41. package/dist/commands/porch/index.d.ts.map +1 -1
  42. package/dist/commands/porch/index.js +430 -1241
  43. package/dist/commands/porch/index.js.map +1 -1
  44. package/dist/commands/porch/plan.d.ts +60 -0
  45. package/dist/commands/porch/plan.d.ts.map +1 -0
  46. package/dist/commands/porch/plan.js +162 -0
  47. package/dist/commands/porch/plan.js.map +1 -0
  48. package/dist/commands/porch/prompts.d.ts +19 -0
  49. package/dist/commands/porch/prompts.d.ts.map +1 -0
  50. package/dist/commands/porch/prompts.js +259 -0
  51. package/dist/commands/porch/prompts.js.map +1 -0
  52. package/dist/commands/porch/protocol-loader.d.ts.map +1 -1
  53. package/dist/commands/porch/protocol-loader.js +9 -0
  54. package/dist/commands/porch/protocol-loader.js.map +1 -1
  55. package/dist/commands/porch/protocol.d.ts +57 -0
  56. package/dist/commands/porch/protocol.d.ts.map +1 -0
  57. package/dist/commands/porch/protocol.js +250 -0
  58. package/dist/commands/porch/protocol.js.map +1 -0
  59. package/dist/commands/porch/repl.d.ts +33 -0
  60. package/dist/commands/porch/repl.d.ts.map +1 -0
  61. package/dist/commands/porch/repl.js +206 -0
  62. package/dist/commands/porch/repl.js.map +1 -0
  63. package/dist/commands/porch/run.d.ts +15 -0
  64. package/dist/commands/porch/run.d.ts.map +1 -0
  65. package/dist/commands/porch/run.js +551 -0
  66. package/dist/commands/porch/run.js.map +1 -0
  67. package/dist/commands/porch/signal-parser.d.ts +17 -3
  68. package/dist/commands/porch/signal-parser.d.ts.map +1 -1
  69. package/dist/commands/porch/signal-parser.js +71 -20
  70. package/dist/commands/porch/signal-parser.js.map +1 -1
  71. package/dist/commands/porch/signals.d.ts +35 -0
  72. package/dist/commands/porch/signals.d.ts.map +1 -0
  73. package/dist/commands/porch/signals.js +76 -0
  74. package/dist/commands/porch/signals.js.map +1 -0
  75. package/dist/commands/porch/state.d.ts +16 -114
  76. package/dist/commands/porch/state.d.ts.map +1 -1
  77. package/dist/commands/porch/state.js +62 -709
  78. package/dist/commands/porch/state.js.map +1 -1
  79. package/dist/commands/porch/types.d.ts +65 -173
  80. package/dist/commands/porch/types.d.ts.map +1 -1
  81. package/dist/commands/porch/types.js +2 -1
  82. package/dist/commands/porch/types.js.map +1 -1
  83. package/dist/commands/porch2/checks.d.ts +29 -0
  84. package/dist/commands/porch2/checks.d.ts.map +1 -0
  85. package/dist/commands/porch2/checks.js +141 -0
  86. package/dist/commands/porch2/checks.js.map +1 -0
  87. package/dist/commands/porch2/index.d.ts +38 -0
  88. package/dist/commands/porch2/index.d.ts.map +1 -0
  89. package/dist/commands/porch2/index.js +483 -0
  90. package/dist/commands/porch2/index.js.map +1 -0
  91. package/dist/commands/porch2/plan.d.ts +70 -0
  92. package/dist/commands/porch2/plan.d.ts.map +1 -0
  93. package/dist/commands/porch2/plan.js +227 -0
  94. package/dist/commands/porch2/plan.js.map +1 -0
  95. package/dist/commands/porch2/protocol.d.ts +37 -0
  96. package/dist/commands/porch2/protocol.d.ts.map +1 -0
  97. package/dist/commands/porch2/protocol.js +183 -0
  98. package/dist/commands/porch2/protocol.js.map +1 -0
  99. package/dist/commands/porch2/state.d.ts +35 -0
  100. package/dist/commands/porch2/state.d.ts.map +1 -0
  101. package/dist/commands/porch2/state.js +124 -0
  102. package/dist/commands/porch2/state.js.map +1 -0
  103. package/dist/commands/porch2/types.d.ts +79 -0
  104. package/dist/commands/porch2/types.d.ts.map +1 -0
  105. package/dist/commands/porch2/types.js +8 -0
  106. package/dist/commands/porch2/types.js.map +1 -0
  107. package/dist/commands/update.d.ts.map +1 -1
  108. package/dist/commands/update.js +19 -0
  109. package/dist/commands/update.js.map +1 -1
  110. package/dist/lib/scaffold.d.ts +24 -0
  111. package/dist/lib/scaffold.d.ts.map +1 -1
  112. package/dist/lib/scaffold.js +78 -0
  113. package/dist/lib/scaffold.js.map +1 -1
  114. package/package.json +3 -1
  115. package/skeleton/protocols/spider/prompts/specify.md +9 -2
  116. package/skeleton/protocols/spider/protocol.json +79 -153
  117. package/skeleton/protocols/spider/templates/plan.md +14 -0
  118. package/skeleton/roles/architect.md +40 -48
  119. package/skeleton/roles/builder.md +152 -29
  120. package/templates/dashboard/index.html +0 -27
  121. package/templates/dashboard/js/utils.js +0 -86
  122. package/skeleton/porch/protocols/bugfix.json +0 -85
  123. package/skeleton/porch/protocols/spider.json +0 -135
  124. package/skeleton/porch/protocols/tick.json +0 -76
  125. package/templates/dashboard/css/activity.css +0 -151
  126. 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"}