@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.
Files changed (121) hide show
  1. package/bin/porch.js +12 -0
  2. package/dist/agent-farm/cli.d.ts.map +1 -1
  3. package/dist/agent-farm/cli.js +25 -14
  4. package/dist/agent-farm/cli.js.map +1 -1
  5. package/dist/agent-farm/commands/index.d.ts +1 -0
  6. package/dist/agent-farm/commands/index.d.ts.map +1 -1
  7. package/dist/agent-farm/commands/index.js +1 -0
  8. package/dist/agent-farm/commands/index.js.map +1 -1
  9. package/dist/agent-farm/commands/kickoff.d.ts +20 -0
  10. package/dist/agent-farm/commands/kickoff.d.ts.map +1 -0
  11. package/dist/agent-farm/commands/kickoff.js +273 -0
  12. package/dist/agent-farm/commands/kickoff.js.map +1 -0
  13. package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
  14. package/dist/agent-farm/commands/spawn.js +30 -96
  15. package/dist/agent-farm/commands/spawn.js.map +1 -1
  16. package/dist/agent-farm/commands/start.d.ts.map +1 -1
  17. package/dist/agent-farm/commands/start.js +8 -50
  18. package/dist/agent-farm/commands/start.js.map +1 -1
  19. package/dist/agent-farm/servers/dashboard-server.js +0 -14
  20. package/dist/agent-farm/servers/dashboard-server.js.map +1 -1
  21. package/dist/agent-farm/state.d.ts +0 -10
  22. package/dist/agent-farm/state.d.ts.map +1 -1
  23. package/dist/agent-farm/state.js +0 -24
  24. package/dist/agent-farm/state.js.map +1 -1
  25. package/dist/cli.d.ts.map +1 -1
  26. package/dist/cli.js +17 -0
  27. package/dist/cli.js.map +1 -1
  28. package/dist/commands/adopt.d.ts.map +1 -1
  29. package/dist/commands/adopt.js +17 -1
  30. package/dist/commands/adopt.js.map +1 -1
  31. package/dist/commands/consult/index.d.ts.map +1 -1
  32. package/dist/commands/consult/index.js +2 -1
  33. package/dist/commands/consult/index.js.map +1 -1
  34. package/dist/commands/init.d.ts.map +1 -1
  35. package/dist/commands/init.js +17 -1
  36. package/dist/commands/init.js.map +1 -1
  37. package/dist/commands/porch/checks.d.ts +29 -0
  38. package/dist/commands/porch/checks.d.ts.map +1 -0
  39. package/dist/commands/porch/checks.js +141 -0
  40. package/dist/commands/porch/checks.js.map +1 -0
  41. package/dist/commands/porch/claude.d.ts +29 -0
  42. package/dist/commands/porch/claude.d.ts.map +1 -0
  43. package/dist/commands/porch/claude.js +79 -0
  44. package/dist/commands/porch/claude.js.map +1 -0
  45. package/dist/commands/porch/index.d.ts +38 -0
  46. package/dist/commands/porch/index.d.ts.map +1 -0
  47. package/dist/commands/porch/index.js +524 -0
  48. package/dist/commands/porch/index.js.map +1 -0
  49. package/dist/commands/porch/plan.d.ts +60 -0
  50. package/dist/commands/porch/plan.d.ts.map +1 -0
  51. package/dist/commands/porch/plan.js +162 -0
  52. package/dist/commands/porch/plan.js.map +1 -0
  53. package/dist/commands/porch/prompts.d.ts +19 -0
  54. package/dist/commands/porch/prompts.d.ts.map +1 -0
  55. package/dist/commands/porch/prompts.js +259 -0
  56. package/dist/commands/porch/prompts.js.map +1 -0
  57. package/dist/commands/porch/protocol.d.ts +57 -0
  58. package/dist/commands/porch/protocol.d.ts.map +1 -0
  59. package/dist/commands/porch/protocol.js +250 -0
  60. package/dist/commands/porch/protocol.js.map +1 -0
  61. package/dist/commands/porch/repl.d.ts +33 -0
  62. package/dist/commands/porch/repl.d.ts.map +1 -0
  63. package/dist/commands/porch/repl.js +206 -0
  64. package/dist/commands/porch/repl.js.map +1 -0
  65. package/dist/commands/porch/run.d.ts +15 -0
  66. package/dist/commands/porch/run.d.ts.map +1 -0
  67. package/dist/commands/porch/run.js +551 -0
  68. package/dist/commands/porch/run.js.map +1 -0
  69. package/dist/commands/porch/signals.d.ts +35 -0
  70. package/dist/commands/porch/signals.d.ts.map +1 -0
  71. package/dist/commands/porch/signals.js +76 -0
  72. package/dist/commands/porch/signals.js.map +1 -0
  73. package/dist/commands/porch/state.d.ts +40 -0
  74. package/dist/commands/porch/state.d.ts.map +1 -0
  75. package/dist/commands/porch/state.js +153 -0
  76. package/dist/commands/porch/state.js.map +1 -0
  77. package/dist/commands/porch/types.d.ts +124 -0
  78. package/dist/commands/porch/types.d.ts.map +1 -0
  79. package/dist/commands/porch/types.js +8 -0
  80. package/dist/commands/porch/types.js.map +1 -0
  81. package/dist/commands/update.d.ts.map +1 -1
  82. package/dist/commands/update.js +19 -0
  83. package/dist/commands/update.js.map +1 -1
  84. package/dist/lib/scaffold.d.ts +24 -0
  85. package/dist/lib/scaffold.d.ts.map +1 -1
  86. package/dist/lib/scaffold.js +78 -0
  87. package/dist/lib/scaffold.js.map +1 -1
  88. package/package.json +6 -2
  89. package/skeleton/porch/prompts/defend.md +103 -0
  90. package/skeleton/porch/prompts/diagnose.md +70 -0
  91. package/skeleton/porch/prompts/evaluate.md +132 -0
  92. package/skeleton/porch/prompts/fix.md +59 -0
  93. package/skeleton/porch/prompts/implement.md +79 -0
  94. package/skeleton/porch/prompts/plan.md +74 -0
  95. package/skeleton/porch/prompts/pr.md +84 -0
  96. package/skeleton/porch/prompts/review.md +179 -0
  97. package/skeleton/porch/prompts/specify.md +53 -0
  98. package/skeleton/porch/prompts/test.md +63 -0
  99. package/skeleton/porch/prompts/understand.md +61 -0
  100. package/skeleton/porch/prompts/verify.md +58 -0
  101. package/skeleton/protocols/bugfix/protocol.json +127 -0
  102. package/skeleton/protocols/protocol-schema.json +237 -0
  103. package/skeleton/protocols/spider/prompts/defend.md +215 -0
  104. package/skeleton/protocols/spider/prompts/evaluate.md +241 -0
  105. package/skeleton/protocols/spider/prompts/implement.md +149 -0
  106. package/skeleton/protocols/spider/prompts/plan.md +214 -0
  107. package/skeleton/protocols/spider/prompts/review.md +217 -0
  108. package/skeleton/protocols/spider/prompts/specify.md +174 -0
  109. package/skeleton/protocols/spider/protocol.json +136 -0
  110. package/skeleton/protocols/spider/templates/plan.md +14 -0
  111. package/skeleton/protocols/tick/protocol.json +151 -0
  112. package/skeleton/roles/architect.md +40 -48
  113. package/skeleton/roles/builder.md +152 -29
  114. package/templates/dashboard/index.html +0 -27
  115. package/templates/dashboard/js/utils.js +0 -86
  116. package/dist/agent-farm/commands/rename.d.ts +0 -13
  117. package/dist/agent-farm/commands/rename.d.ts.map +0 -1
  118. package/dist/agent-farm/commands/rename.js +0 -33
  119. package/dist/agent-farm/commands/rename.js.map +0 -1
  120. package/templates/dashboard/css/activity.css +0 -151
  121. package/templates/dashboard/js/activity.js +0 -112
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Porch Protocol Loading
3
+ *
4
+ * Loads protocol definitions from JSON files.
5
+ * Fails loudly if protocol not found or invalid.
6
+ */
7
+ import * as fs from 'node:fs';
8
+ import * as path from 'node:path';
9
+ /** Known protocol locations (relative to project root) */
10
+ const PROTOCOL_PATHS = [
11
+ 'codev/protocols',
12
+ 'codev-skeleton/protocols',
13
+ ];
14
+ // ============================================================================
15
+ // Protocol Loading
16
+ // ============================================================================
17
+ /**
18
+ * Find and load a protocol by name
19
+ * Fails loudly if not found or invalid.
20
+ */
21
+ export function loadProtocol(projectRoot, protocolName) {
22
+ const protocolFile = findProtocolFile(projectRoot, protocolName);
23
+ if (!protocolFile) {
24
+ throw new Error(`Protocol '${protocolName}' not found.\n` +
25
+ `Searched in: ${PROTOCOL_PATHS.map(p => path.join(projectRoot, p, protocolName)).join(', ')}`);
26
+ }
27
+ try {
28
+ const content = fs.readFileSync(protocolFile, 'utf-8');
29
+ const json = JSON.parse(content);
30
+ return normalizeProtocol(json);
31
+ }
32
+ catch (err) {
33
+ if (err instanceof SyntaxError) {
34
+ throw new Error(`Invalid protocol '${protocolName}': JSON parse error\n${err.message}`);
35
+ }
36
+ throw err;
37
+ }
38
+ }
39
+ /**
40
+ * Find protocol.json file in {name}/protocol.json format
41
+ */
42
+ function findProtocolFile(projectRoot, protocolName) {
43
+ for (const basePath of PROTOCOL_PATHS) {
44
+ const fullPath = path.resolve(projectRoot, basePath, protocolName, 'protocol.json');
45
+ if (fs.existsSync(fullPath)) {
46
+ return fullPath;
47
+ }
48
+ }
49
+ return null;
50
+ }
51
+ /**
52
+ * Normalize protocol JSON to our simplified Protocol type
53
+ */
54
+ function normalizeProtocol(json) {
55
+ const obj = json;
56
+ if (!obj.name || typeof obj.name !== 'string') {
57
+ throw new Error('Invalid protocol: missing "name" field');
58
+ }
59
+ if (!obj.phases || !Array.isArray(obj.phases)) {
60
+ throw new Error('Invalid protocol: missing "phases" array');
61
+ }
62
+ const phases = obj.phases.map((p) => normalizePhase(p));
63
+ // Set next phase based on array order (if not explicitly set)
64
+ for (let i = 0; i < phases.length; i++) {
65
+ if (!phases[i].next && i + 1 < phases.length) {
66
+ phases[i].next = phases[i + 1].id;
67
+ }
68
+ }
69
+ // Extract default checks
70
+ const checks = {};
71
+ const defaults = obj.defaults;
72
+ if (defaults?.checks) {
73
+ Object.assign(checks, defaults.checks);
74
+ }
75
+ // Also collect per-phase checks
76
+ for (const phase of obj.phases) {
77
+ if (phase.checks && typeof phase.checks === 'object') {
78
+ for (const [name, check] of Object.entries(phase.checks)) {
79
+ if (typeof check === 'object' && check !== null && 'command' in check) {
80
+ checks[name] = check.command;
81
+ }
82
+ else if (typeof check === 'string') {
83
+ checks[name] = check;
84
+ }
85
+ }
86
+ }
87
+ }
88
+ return {
89
+ name: obj.name,
90
+ version: obj.version,
91
+ description: obj.description,
92
+ phases,
93
+ checks,
94
+ };
95
+ }
96
+ /**
97
+ * Normalize a phase from JSON
98
+ */
99
+ function normalizePhase(p) {
100
+ const phase = p;
101
+ if (!phase.id || typeof phase.id !== 'string') {
102
+ throw new Error('Invalid protocol phase: missing "id"');
103
+ }
104
+ // Determine next phase from transition or gate
105
+ let next;
106
+ const transition = phase.transition;
107
+ const gate = phase.gate;
108
+ if (transition?.on_complete) {
109
+ next = transition.on_complete;
110
+ }
111
+ else if (gate?.next !== undefined) {
112
+ next = gate.next;
113
+ }
114
+ // Collect check names
115
+ const checks = [];
116
+ if (phase.checks && typeof phase.checks === 'object') {
117
+ checks.push(...Object.keys(phase.checks));
118
+ }
119
+ // Parse build config (for build_verify phases)
120
+ let build;
121
+ const buildRaw = phase.build;
122
+ if (buildRaw) {
123
+ build = {
124
+ prompt: buildRaw.prompt,
125
+ artifact: buildRaw.artifact,
126
+ };
127
+ }
128
+ // Parse verify config (for build_verify phases)
129
+ let verify;
130
+ const verifyRaw = phase.verify;
131
+ if (verifyRaw) {
132
+ verify = {
133
+ type: verifyRaw.type,
134
+ models: verifyRaw.models,
135
+ parallel: verifyRaw.parallel ?? true,
136
+ };
137
+ }
138
+ // Parse on_complete config
139
+ let on_complete;
140
+ const onCompleteRaw = phase.on_complete;
141
+ if (onCompleteRaw) {
142
+ on_complete = {
143
+ commit: onCompleteRaw.commit,
144
+ push: onCompleteRaw.push,
145
+ };
146
+ }
147
+ return {
148
+ id: phase.id,
149
+ name: phase.name || phase.id,
150
+ type: phase.type,
151
+ build,
152
+ verify,
153
+ max_iterations: phase.max_iterations ?? 3,
154
+ on_complete,
155
+ gate: gate?.name,
156
+ checks: checks.length > 0 ? checks : undefined,
157
+ next,
158
+ };
159
+ }
160
+ // ============================================================================
161
+ // Phase Queries
162
+ // ============================================================================
163
+ /**
164
+ * Get phase configuration by id
165
+ */
166
+ export function getPhaseConfig(protocol, phaseId) {
167
+ return protocol.phases.find(p => p.id === phaseId) || null;
168
+ }
169
+ /**
170
+ * Get the next phase after the given phase
171
+ */
172
+ export function getNextPhase(protocol, currentPhaseId) {
173
+ const current = getPhaseConfig(protocol, currentPhaseId);
174
+ if (!current || !current.next) {
175
+ return null;
176
+ }
177
+ return getPhaseConfig(protocol, current.next);
178
+ }
179
+ /**
180
+ * Get check commands for a phase
181
+ */
182
+ export function getPhaseChecks(protocol, phaseId) {
183
+ const phase = getPhaseConfig(protocol, phaseId);
184
+ if (!phase || !phase.checks) {
185
+ return {};
186
+ }
187
+ const result = {};
188
+ for (const checkName of phase.checks) {
189
+ if (protocol.checks?.[checkName]) {
190
+ result[checkName] = protocol.checks[checkName];
191
+ }
192
+ }
193
+ return result;
194
+ }
195
+ /**
196
+ * Get gate name for a phase (if any)
197
+ */
198
+ export function getPhaseGate(protocol, phaseId) {
199
+ const phase = getPhaseConfig(protocol, phaseId);
200
+ return phase?.gate || null;
201
+ }
202
+ /**
203
+ * Check if a phase runs per plan phase
204
+ */
205
+ export function isPhased(protocol, phaseId) {
206
+ const phase = getPhaseConfig(protocol, phaseId);
207
+ return phase?.type === 'per_plan_phase';
208
+ }
209
+ /**
210
+ * Get checks to run when a plan phase completes (after evaluate stage)
211
+ */
212
+ export function getPhaseCompletionChecks(protocol) {
213
+ return protocol.phase_completion ?? {};
214
+ }
215
+ /**
216
+ * Check if a phase is a build_verify phase
217
+ */
218
+ export function isBuildVerify(protocol, phaseId) {
219
+ const phase = getPhaseConfig(protocol, phaseId);
220
+ return phase?.type === 'build_verify';
221
+ }
222
+ /**
223
+ * Get build config for a phase
224
+ */
225
+ export function getBuildConfig(protocol, phaseId) {
226
+ const phase = getPhaseConfig(protocol, phaseId);
227
+ return phase?.build || null;
228
+ }
229
+ /**
230
+ * Get verify config for a phase
231
+ */
232
+ export function getVerifyConfig(protocol, phaseId) {
233
+ const phase = getPhaseConfig(protocol, phaseId);
234
+ return phase?.verify || null;
235
+ }
236
+ /**
237
+ * Get max iterations for a build_verify phase
238
+ */
239
+ export function getMaxIterations(protocol, phaseId) {
240
+ const phase = getPhaseConfig(protocol, phaseId);
241
+ return phase?.max_iterations ?? 3;
242
+ }
243
+ /**
244
+ * Get on_complete config for a phase
245
+ */
246
+ export function getOnCompleteConfig(protocol, phaseId) {
247
+ const phase = getPhaseConfig(protocol, phaseId);
248
+ return phase?.on_complete || null;
249
+ }
250
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/commands/porch/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Porch REPL - Interactive command loop while Claude runs
3
+ *
4
+ * Commands:
5
+ * t / tail - Tail Claude's output file
6
+ * c / claude - Kill current Claude and invoke manually (interactive)
7
+ * a / approve - Approve current gate
8
+ * s / status - Show current status
9
+ * q / quit - Kill Claude and exit
10
+ * Enter - Refresh status display
11
+ */
12
+ import { type Signal } from './signals.js';
13
+ import type { ClaudeProcess } from './claude.js';
14
+ import type { ProjectState, Protocol } from './types.js';
15
+ export type ReplAction = {
16
+ type: 'quit';
17
+ } | {
18
+ type: 'signal';
19
+ signal: Signal;
20
+ } | {
21
+ type: 'claude_exit';
22
+ exitCode: number;
23
+ } | {
24
+ type: 'approved';
25
+ } | {
26
+ type: 'manual_claude';
27
+ };
28
+ /**
29
+ * Run the REPL while Claude is working.
30
+ * Returns when Claude exits, a signal is detected, or user quits.
31
+ */
32
+ export declare function runRepl(state: ProjectState, claude: ClaudeProcess, outputPath: string, statusPath: string, projectRoot: string, protocol: Protocol): Promise<ReplAction>;
33
+ //# sourceMappingURL=repl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/repl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,OAAO,EAAkB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,CAAC;AAE9B;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,UAAU,CAAC,CAmIrB"}
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Porch REPL - Interactive command loop while Claude runs
3
+ *
4
+ * Commands:
5
+ * t / tail - Tail Claude's output file
6
+ * c / claude - Kill current Claude and invoke manually (interactive)
7
+ * a / approve - Approve current gate
8
+ * s / status - Show current status
9
+ * q / quit - Kill Claude and exit
10
+ * Enter - Refresh status display
11
+ */
12
+ import * as readline from 'node:readline';
13
+ import { spawn } from 'node:child_process';
14
+ import chalk from 'chalk';
15
+ import { writeState } from './state.js';
16
+ import { getPhaseConfig, isPhased, getPhaseGate } from './protocol.js';
17
+ import { getCurrentPlanPhase } from './plan.js';
18
+ import { watchForSignal } from './signals.js';
19
+ /**
20
+ * Run the REPL while Claude is working.
21
+ * Returns when Claude exits, a signal is detected, or user quits.
22
+ */
23
+ export async function runRepl(state, claude, outputPath, statusPath, projectRoot, protocol) {
24
+ const startTime = Date.now();
25
+ // Start watching for signals
26
+ const signalWatcher = watchForSignal(outputPath);
27
+ // Set up readline for user input
28
+ const rl = readline.createInterface({
29
+ input: process.stdin,
30
+ output: process.stdout,
31
+ });
32
+ // Track tail process if running
33
+ let tailProcess = null;
34
+ return new Promise((resolve) => {
35
+ let resolved = false;
36
+ const cleanup = () => {
37
+ if (resolved)
38
+ return;
39
+ resolved = true;
40
+ signalWatcher.stop();
41
+ rl.close();
42
+ if (tailProcess) {
43
+ tailProcess.kill();
44
+ tailProcess = null;
45
+ }
46
+ };
47
+ // Check for signals periodically
48
+ const signalInterval = setInterval(async () => {
49
+ const signal = await signalWatcher.check();
50
+ if (signal) {
51
+ cleanup();
52
+ resolve({ type: 'signal', signal });
53
+ }
54
+ }, 1000);
55
+ // Handle Claude exit
56
+ claude.onExit((code) => {
57
+ clearInterval(signalInterval);
58
+ cleanup();
59
+ resolve({ type: 'claude_exit', exitCode: code });
60
+ });
61
+ // Show initial prompt
62
+ showPrompt(state, startTime, claude);
63
+ // Handle user input
64
+ rl.on('line', async (input) => {
65
+ const cmd = input.trim().toLowerCase();
66
+ // Stop tail if running
67
+ if (tailProcess) {
68
+ tailProcess.kill();
69
+ tailProcess = null;
70
+ }
71
+ switch (cmd) {
72
+ case '':
73
+ // Refresh status
74
+ showStatus(state, protocol, startTime, claude);
75
+ showPrompt(state, startTime, claude);
76
+ break;
77
+ case 't':
78
+ case 'tail':
79
+ console.log(chalk.dim('\nTailing Claude output (Ctrl+C to stop)...\n'));
80
+ tailProcess = spawn('tail', ['-f', outputPath], {
81
+ stdio: 'inherit',
82
+ });
83
+ tailProcess.on('close', () => {
84
+ tailProcess = null;
85
+ showPrompt(state, startTime, claude);
86
+ });
87
+ break;
88
+ case 'c':
89
+ case 'claude':
90
+ // Kill current Claude and return to spawn manually
91
+ console.log(chalk.yellow('\nKilling current Claude session...'));
92
+ claude.kill();
93
+ console.log(chalk.cyan('Returning to porch. Claude will be respawned.'));
94
+ console.log(chalk.dim('Use this to intervene manually or adjust approach.'));
95
+ clearInterval(signalInterval);
96
+ cleanup();
97
+ resolve({ type: 'manual_claude' });
98
+ break;
99
+ case 'a':
100
+ case 'approve':
101
+ const gateName = getPhaseGate(protocol, state.phase);
102
+ if (gateName && state.gates[gateName]?.status === 'pending') {
103
+ state.gates[gateName].status = 'approved';
104
+ state.gates[gateName].approved_at = new Date().toISOString();
105
+ writeState(statusPath, state);
106
+ console.log(chalk.green(`\nGate ${gateName} approved.`));
107
+ clearInterval(signalInterval);
108
+ cleanup();
109
+ resolve({ type: 'approved' });
110
+ }
111
+ else {
112
+ console.log(chalk.dim('\nNo gate pending approval.'));
113
+ showPrompt(state, startTime, claude);
114
+ }
115
+ break;
116
+ case 's':
117
+ case 'status':
118
+ showStatus(state, protocol, startTime, claude);
119
+ showPrompt(state, startTime, claude);
120
+ break;
121
+ case 'q':
122
+ case 'quit':
123
+ clearInterval(signalInterval);
124
+ cleanup();
125
+ resolve({ type: 'quit' });
126
+ break;
127
+ case 'help':
128
+ case '?':
129
+ showHelp();
130
+ showPrompt(state, startTime, claude);
131
+ break;
132
+ default:
133
+ console.log(chalk.dim(`Unknown command: ${cmd}. Type 'help' for commands.`));
134
+ showPrompt(state, startTime, claude);
135
+ }
136
+ });
137
+ });
138
+ }
139
+ /**
140
+ * Show the REPL prompt with status.
141
+ */
142
+ function showPrompt(state, startTime, claude) {
143
+ const elapsed = formatElapsed(Date.now() - startTime);
144
+ const status = claude.isRunning() ? chalk.green('running') : chalk.red('exited');
145
+ process.stdout.write(chalk.cyan(`[${state.id}] claude: ${status} (${elapsed}) > `));
146
+ }
147
+ /**
148
+ * Show detailed status.
149
+ */
150
+ function showStatus(state, protocol, startTime, claude) {
151
+ const phaseConfig = getPhaseConfig(protocol, state.phase);
152
+ const elapsed = formatElapsed(Date.now() - startTime);
153
+ console.log('');
154
+ console.log(chalk.bold('─'.repeat(50)));
155
+ console.log(` Project: ${state.id} - ${state.title}`);
156
+ console.log(` Protocol: ${state.protocol}`);
157
+ console.log(` Phase: ${state.phase} (${phaseConfig?.name || 'unknown'})`);
158
+ if (isPhased(protocol, state.phase) && state.plan_phases.length > 0) {
159
+ const currentPlanPhase = getCurrentPlanPhase(state.plan_phases);
160
+ if (currentPlanPhase) {
161
+ console.log(` Plan Phase: ${currentPlanPhase.id} - ${currentPlanPhase.title}`);
162
+ }
163
+ }
164
+ const gateName = getPhaseGate(protocol, state.phase);
165
+ if (gateName) {
166
+ const gateStatus = state.gates[gateName]?.status || 'pending';
167
+ const icon = gateStatus === 'approved' ? chalk.green('✓') : chalk.yellow('○');
168
+ console.log(` Gate: ${gateName} ${icon}`);
169
+ }
170
+ console.log(` Claude: ${claude.isRunning() ? 'running' : 'exited'} (${elapsed})`);
171
+ console.log(chalk.bold('─'.repeat(50)));
172
+ console.log('');
173
+ }
174
+ /**
175
+ * Show help text.
176
+ */
177
+ function showHelp() {
178
+ console.log('');
179
+ console.log(chalk.bold('Commands:'));
180
+ console.log(' t / tail - Tail Claude output');
181
+ console.log(' c / claude - Kill Claude and respawn (for manual intervention)');
182
+ console.log(' a / approve - Approve pending gate');
183
+ console.log(' s / status - Show detailed status');
184
+ console.log(' q / quit - Kill Claude and exit porch');
185
+ console.log(' Enter - Refresh prompt');
186
+ console.log(' help / ? - Show this help');
187
+ console.log('');
188
+ }
189
+ /**
190
+ * Format elapsed time.
191
+ */
192
+ function formatElapsed(ms) {
193
+ const seconds = Math.floor(ms / 1000);
194
+ const minutes = Math.floor(seconds / 60);
195
+ const hours = Math.floor(minutes / 60);
196
+ if (hours > 0) {
197
+ return `${hours}h ${minutes % 60}m`;
198
+ }
199
+ else if (minutes > 0) {
200
+ return `${minutes}m ${seconds % 60}s`;
201
+ }
202
+ else {
203
+ return `${seconds}s`;
204
+ }
205
+ }
206
+ //# sourceMappingURL=repl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.js","sourceRoot":"","sources":["../../../src/commands/porch/repl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * porch run - Main run loop (Build-Verify design)
3
+ *
4
+ * Porch orchestrates build-verify cycles:
5
+ * 1. BUILD: Spawn Claude to create artifact
6
+ * 2. VERIFY: Run 3-way consultation (Gemini, Codex, Claude)
7
+ * 3. ITERATE: If any REQUEST_CHANGES, feed back to Claude
8
+ * 4. COMPLETE: When all APPROVE (or max iterations), commit + push + gate
9
+ */
10
+ /**
11
+ * Main run loop for porch.
12
+ * Spawns Claude for each phase and monitors until protocol complete.
13
+ */
14
+ export declare function run(projectRoot: string, projectId: string): Promise<void>;
15
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAwCH;;;GAGG;AACH,wBAAsB,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6M/E"}