@cluesmith/codev 1.6.2 → 2.0.0-rc.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/porch.js +12 -0
- package/dist/agent-farm/cli.d.ts.map +1 -1
- package/dist/agent-farm/cli.js +25 -14
- package/dist/agent-farm/cli.js.map +1 -1
- package/dist/agent-farm/commands/index.d.ts +1 -0
- package/dist/agent-farm/commands/index.d.ts.map +1 -1
- package/dist/agent-farm/commands/index.js +1 -0
- package/dist/agent-farm/commands/index.js.map +1 -1
- package/dist/agent-farm/commands/kickoff.d.ts +20 -0
- package/dist/agent-farm/commands/kickoff.d.ts.map +1 -0
- package/dist/agent-farm/commands/kickoff.js +273 -0
- package/dist/agent-farm/commands/kickoff.js.map +1 -0
- package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn.js +30 -96
- package/dist/agent-farm/commands/spawn.js.map +1 -1
- package/dist/agent-farm/commands/start.d.ts.map +1 -1
- package/dist/agent-farm/commands/start.js +8 -50
- package/dist/agent-farm/commands/start.js.map +1 -1
- package/dist/agent-farm/servers/dashboard-server.js +0 -14
- package/dist/agent-farm/servers/dashboard-server.js.map +1 -1
- package/dist/agent-farm/state.d.ts +0 -10
- package/dist/agent-farm/state.d.ts.map +1 -1
- package/dist/agent-farm/state.js +0 -24
- package/dist/agent-farm/state.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +17 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt.d.ts.map +1 -1
- package/dist/commands/adopt.js +17 -1
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/consult/index.d.ts.map +1 -1
- package/dist/commands/consult/index.js +2 -1
- package/dist/commands/consult/index.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +17 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/porch/checks.d.ts +29 -0
- package/dist/commands/porch/checks.d.ts.map +1 -0
- package/dist/commands/porch/checks.js +141 -0
- package/dist/commands/porch/checks.js.map +1 -0
- package/dist/commands/porch/claude.d.ts +29 -0
- package/dist/commands/porch/claude.d.ts.map +1 -0
- package/dist/commands/porch/claude.js +79 -0
- package/dist/commands/porch/claude.js.map +1 -0
- package/dist/commands/porch/index.d.ts +38 -0
- package/dist/commands/porch/index.d.ts.map +1 -0
- package/dist/commands/porch/index.js +524 -0
- package/dist/commands/porch/index.js.map +1 -0
- package/dist/commands/porch/plan.d.ts +60 -0
- package/dist/commands/porch/plan.d.ts.map +1 -0
- package/dist/commands/porch/plan.js +162 -0
- package/dist/commands/porch/plan.js.map +1 -0
- package/dist/commands/porch/prompts.d.ts +19 -0
- package/dist/commands/porch/prompts.d.ts.map +1 -0
- package/dist/commands/porch/prompts.js +259 -0
- package/dist/commands/porch/prompts.js.map +1 -0
- package/dist/commands/porch/protocol.d.ts +57 -0
- package/dist/commands/porch/protocol.d.ts.map +1 -0
- package/dist/commands/porch/protocol.js +250 -0
- package/dist/commands/porch/protocol.js.map +1 -0
- package/dist/commands/porch/repl.d.ts +33 -0
- package/dist/commands/porch/repl.d.ts.map +1 -0
- package/dist/commands/porch/repl.js +206 -0
- package/dist/commands/porch/repl.js.map +1 -0
- package/dist/commands/porch/run.d.ts +15 -0
- package/dist/commands/porch/run.d.ts.map +1 -0
- package/dist/commands/porch/run.js +551 -0
- package/dist/commands/porch/run.js.map +1 -0
- package/dist/commands/porch/signals.d.ts +35 -0
- package/dist/commands/porch/signals.d.ts.map +1 -0
- package/dist/commands/porch/signals.js +76 -0
- package/dist/commands/porch/signals.js.map +1 -0
- package/dist/commands/porch/state.d.ts +40 -0
- package/dist/commands/porch/state.d.ts.map +1 -0
- package/dist/commands/porch/state.js +153 -0
- package/dist/commands/porch/state.js.map +1 -0
- package/dist/commands/porch/types.d.ts +124 -0
- package/dist/commands/porch/types.d.ts.map +1 -0
- package/dist/commands/porch/types.js +8 -0
- package/dist/commands/porch/types.js.map +1 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +19 -0
- package/dist/commands/update.js.map +1 -1
- package/dist/lib/scaffold.d.ts +24 -0
- package/dist/lib/scaffold.d.ts.map +1 -1
- package/dist/lib/scaffold.js +78 -0
- package/dist/lib/scaffold.js.map +1 -1
- package/package.json +6 -2
- package/skeleton/porch/prompts/defend.md +103 -0
- package/skeleton/porch/prompts/diagnose.md +70 -0
- package/skeleton/porch/prompts/evaluate.md +132 -0
- package/skeleton/porch/prompts/fix.md +59 -0
- package/skeleton/porch/prompts/implement.md +79 -0
- package/skeleton/porch/prompts/plan.md +74 -0
- package/skeleton/porch/prompts/pr.md +84 -0
- package/skeleton/porch/prompts/review.md +179 -0
- package/skeleton/porch/prompts/specify.md +53 -0
- package/skeleton/porch/prompts/test.md +63 -0
- package/skeleton/porch/prompts/understand.md +61 -0
- package/skeleton/porch/prompts/verify.md +58 -0
- package/skeleton/protocols/bugfix/protocol.json +127 -0
- package/skeleton/protocols/protocol-schema.json +237 -0
- package/skeleton/protocols/spider/prompts/defend.md +215 -0
- package/skeleton/protocols/spider/prompts/evaluate.md +241 -0
- package/skeleton/protocols/spider/prompts/implement.md +149 -0
- package/skeleton/protocols/spider/prompts/plan.md +214 -0
- package/skeleton/protocols/spider/prompts/review.md +217 -0
- package/skeleton/protocols/spider/prompts/specify.md +174 -0
- package/skeleton/protocols/spider/protocol.json +136 -0
- package/skeleton/protocols/spider/templates/plan.md +14 -0
- package/skeleton/protocols/tick/protocol.json +151 -0
- package/skeleton/roles/architect.md +40 -48
- package/skeleton/roles/builder.md +152 -29
- package/templates/dashboard/index.html +0 -27
- package/templates/dashboard/js/utils.js +0 -86
- package/dist/agent-farm/commands/rename.d.ts +0 -13
- package/dist/agent-farm/commands/rename.d.ts.map +0 -1
- package/dist/agent-farm/commands/rename.js +0 -33
- package/dist/agent-farm/commands/rename.js.map +0 -1
- package/templates/dashboard/css/activity.css +0 -151
- package/templates/dashboard/js/activity.js +0 -112
|
@@ -0,0 +1,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"}
|