@cluesmith/codev 2.0.0-rc.5 → 2.0.0-rc.50
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/af.js +2 -2
- package/bin/consult.js +1 -1
- package/bin/porch.js +6 -35
- package/dashboard/dist/assets/index-BIHeqvy0.css +32 -0
- package/dashboard/dist/assets/index-VvUWRPNP.js +120 -0
- package/dashboard/dist/assets/index-VvUWRPNP.js.map +1 -0
- package/dashboard/dist/index.html +14 -0
- package/dist/agent-farm/cli.d.ts.map +1 -1
- package/dist/agent-farm/cli.js +93 -64
- package/dist/agent-farm/cli.js.map +1 -1
- package/dist/agent-farm/commands/architect.d.ts.map +1 -1
- package/dist/agent-farm/commands/architect.js +13 -6
- package/dist/agent-farm/commands/architect.js.map +1 -1
- package/dist/agent-farm/commands/attach.d.ts +13 -0
- package/dist/agent-farm/commands/attach.d.ts.map +1 -0
- package/dist/agent-farm/commands/attach.js +179 -0
- package/dist/agent-farm/commands/attach.js.map +1 -0
- package/dist/agent-farm/commands/cleanup.d.ts.map +1 -1
- package/dist/agent-farm/commands/cleanup.js +30 -3
- package/dist/agent-farm/commands/cleanup.js.map +1 -1
- package/dist/agent-farm/commands/consult.js +1 -1
- package/dist/agent-farm/commands/consult.js.map +1 -1
- package/dist/agent-farm/commands/index.d.ts +2 -2
- package/dist/agent-farm/commands/index.d.ts.map +1 -1
- package/dist/agent-farm/commands/index.js +2 -2
- package/dist/agent-farm/commands/index.js.map +1 -1
- package/dist/agent-farm/commands/{util.d.ts → shell.d.ts} +5 -5
- package/dist/agent-farm/commands/shell.d.ts.map +1 -0
- package/dist/agent-farm/commands/{util.js → shell.js} +23 -36
- package/dist/agent-farm/commands/shell.js.map +1 -0
- package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn.js +455 -217
- package/dist/agent-farm/commands/spawn.js.map +1 -1
- package/dist/agent-farm/commands/start.d.ts +3 -0
- package/dist/agent-farm/commands/start.d.ts.map +1 -1
- package/dist/agent-farm/commands/start.js +92 -79
- package/dist/agent-farm/commands/start.js.map +1 -1
- package/dist/agent-farm/commands/status.d.ts +2 -0
- package/dist/agent-farm/commands/status.d.ts.map +1 -1
- package/dist/agent-farm/commands/status.js +56 -1
- package/dist/agent-farm/commands/status.js.map +1 -1
- package/dist/agent-farm/commands/stop.d.ts +6 -0
- package/dist/agent-farm/commands/stop.d.ts.map +1 -1
- package/dist/agent-farm/commands/stop.js +115 -11
- package/dist/agent-farm/commands/stop.js.map +1 -1
- package/dist/agent-farm/commands/tower.d.ts +9 -0
- package/dist/agent-farm/commands/tower.d.ts.map +1 -1
- package/dist/agent-farm/commands/tower.js +59 -19
- package/dist/agent-farm/commands/tower.js.map +1 -1
- package/dist/agent-farm/db/index.d.ts.map +1 -1
- package/dist/agent-farm/db/index.js +59 -0
- package/dist/agent-farm/db/index.js.map +1 -1
- package/dist/agent-farm/db/schema.d.ts +2 -2
- package/dist/agent-farm/db/schema.d.ts.map +1 -1
- package/dist/agent-farm/db/schema.js +8 -3
- package/dist/agent-farm/db/schema.js.map +1 -1
- package/dist/agent-farm/db/types.d.ts +3 -0
- package/dist/agent-farm/db/types.d.ts.map +1 -1
- package/dist/agent-farm/db/types.js +3 -0
- package/dist/agent-farm/db/types.js.map +1 -1
- package/dist/agent-farm/hq-connector.d.ts +2 -2
- package/dist/agent-farm/hq-connector.js +2 -2
- package/dist/agent-farm/lib/tower-client.d.ts +157 -0
- package/dist/agent-farm/lib/tower-client.d.ts.map +1 -0
- package/dist/agent-farm/lib/tower-client.js +223 -0
- package/dist/agent-farm/lib/tower-client.js.map +1 -0
- package/dist/agent-farm/servers/tower-server.js +1152 -95
- package/dist/agent-farm/servers/tower-server.js.map +1 -1
- package/dist/agent-farm/state.d.ts +4 -10
- package/dist/agent-farm/state.d.ts.map +1 -1
- package/dist/agent-farm/state.js +30 -31
- package/dist/agent-farm/state.js.map +1 -1
- package/dist/agent-farm/types.d.ts +48 -0
- package/dist/agent-farm/types.d.ts.map +1 -1
- package/dist/agent-farm/utils/config.d.ts.map +1 -1
- package/dist/agent-farm/utils/config.js +12 -11
- package/dist/agent-farm/utils/config.js.map +1 -1
- package/dist/agent-farm/utils/deps.d.ts.map +1 -1
- package/dist/agent-farm/utils/deps.js +0 -16
- package/dist/agent-farm/utils/deps.js.map +1 -1
- package/dist/agent-farm/utils/notifications.d.ts +30 -0
- package/dist/agent-farm/utils/notifications.d.ts.map +1 -0
- package/dist/agent-farm/utils/notifications.js +121 -0
- package/dist/agent-farm/utils/notifications.js.map +1 -0
- package/dist/agent-farm/utils/server-utils.d.ts +2 -1
- package/dist/agent-farm/utils/server-utils.d.ts.map +1 -1
- package/dist/agent-farm/utils/server-utils.js +11 -1
- package/dist/agent-farm/utils/server-utils.js.map +1 -1
- package/dist/agent-farm/utils/shell.d.ts +9 -22
- package/dist/agent-farm/utils/shell.d.ts.map +1 -1
- package/dist/agent-farm/utils/shell.js +34 -34
- package/dist/agent-farm/utils/shell.js.map +1 -1
- package/dist/agent-farm/utils/terminal-ports.d.ts +1 -1
- package/dist/agent-farm/utils/terminal-ports.js +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +5 -54
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt.d.ts.map +1 -1
- package/dist/commands/adopt.js +39 -4
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/consult/index.d.ts.map +1 -1
- package/dist/commands/consult/index.js +63 -3
- package/dist/commands/consult/index.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +0 -15
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +31 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/porch/build-counter.d.ts +5 -0
- package/dist/commands/porch/build-counter.d.ts.map +1 -0
- package/dist/commands/porch/build-counter.js +5 -0
- package/dist/commands/porch/build-counter.js.map +1 -0
- 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 +27 -0
- package/dist/commands/porch/claude.d.ts.map +1 -0
- package/dist/commands/porch/claude.js +107 -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 +456 -1015
- package/dist/commands/porch/index.js.map +1 -1
- package/dist/commands/porch/plan.d.ts +70 -0
- package/dist/commands/porch/plan.d.ts.map +1 -0
- package/dist/commands/porch/plan.js +190 -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 +250 -0
- package/dist/commands/porch/prompts.js.map +1 -0
- package/dist/commands/porch/protocol.d.ts +59 -0
- package/dist/commands/porch/protocol.d.ts.map +1 -0
- package/dist/commands/porch/protocol.js +260 -0
- package/dist/commands/porch/protocol.js.map +1 -0
- package/dist/commands/porch/run.d.ts +40 -0
- package/dist/commands/porch/run.d.ts.map +1 -0
- package/dist/commands/porch/run.js +893 -0
- package/dist/commands/porch/run.js.map +1 -0
- package/dist/commands/porch/state.d.ts +23 -112
- package/dist/commands/porch/state.d.ts.map +1 -1
- package/dist/commands/porch/state.js +81 -699
- package/dist/commands/porch/state.js.map +1 -1
- package/dist/commands/porch/types.d.ts +72 -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/update.d.ts.map +1 -1
- package/dist/commands/update.js +22 -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/dist/terminal/index.d.ts +8 -0
- package/dist/terminal/index.d.ts.map +1 -0
- package/dist/terminal/index.js +5 -0
- package/dist/terminal/index.js.map +1 -0
- package/dist/terminal/pty-manager.d.ts +60 -0
- package/dist/terminal/pty-manager.d.ts.map +1 -0
- package/dist/terminal/pty-manager.js +334 -0
- package/dist/terminal/pty-manager.js.map +1 -0
- package/dist/terminal/pty-session.d.ts +79 -0
- package/dist/terminal/pty-session.d.ts.map +1 -0
- package/dist/terminal/pty-session.js +215 -0
- package/dist/terminal/pty-session.js.map +1 -0
- package/dist/terminal/ring-buffer.d.ts +27 -0
- package/dist/terminal/ring-buffer.d.ts.map +1 -0
- package/dist/terminal/ring-buffer.js +74 -0
- package/dist/terminal/ring-buffer.js.map +1 -0
- package/dist/terminal/ws-protocol.d.ts +27 -0
- package/dist/terminal/ws-protocol.d.ts.map +1 -0
- package/dist/terminal/ws-protocol.js +44 -0
- package/dist/terminal/ws-protocol.js.map +1 -0
- package/package.json +18 -3
- package/skeleton/DEPENDENCIES.md +3 -29
- package/skeleton/builders.md +1 -1
- package/skeleton/protocol-schema.json +282 -0
- package/skeleton/protocols/bugfix/builder-prompt.md +49 -0
- package/skeleton/protocols/bugfix/protocol.json +14 -2
- package/skeleton/protocols/experiment/builder-prompt.md +47 -0
- package/skeleton/protocols/experiment/protocol.json +101 -0
- package/skeleton/protocols/maintain/builder-prompt.md +41 -0
- package/skeleton/protocols/maintain/prompts/audit.md +111 -0
- package/skeleton/protocols/maintain/prompts/clean.md +91 -0
- package/skeleton/protocols/maintain/prompts/sync.md +113 -0
- package/skeleton/protocols/maintain/prompts/verify.md +110 -0
- package/skeleton/protocols/maintain/protocol.json +141 -0
- package/skeleton/protocols/maintain/protocol.md +13 -7
- package/skeleton/protocols/protocol-schema.json +53 -0
- package/skeleton/protocols/spider/builder-prompt.md +53 -0
- package/skeleton/protocols/spider/prompts/implement.md +109 -50
- package/skeleton/protocols/spider/prompts/specify.md +29 -4
- package/skeleton/protocols/spider/protocol.json +96 -154
- package/skeleton/protocols/spider/protocol.md +26 -16
- package/skeleton/protocols/spider/templates/plan.md +14 -0
- package/skeleton/protocols/tick/builder-prompt.md +51 -0
- package/skeleton/protocols/tick/protocol.json +7 -2
- package/skeleton/resources/commands/agent-farm.md +25 -43
- package/skeleton/resources/commands/overview.md +6 -16
- package/skeleton/resources/workflow-reference.md +2 -2
- package/skeleton/roles/architect.md +152 -315
- package/skeleton/roles/builder.md +109 -218
- package/skeleton/templates/AGENTS.md +1 -1
- package/skeleton/templates/CLAUDE.md +1 -1
- package/skeleton/templates/cheatsheet.md +4 -2
- package/templates/dashboard/index.html +17 -43
- package/templates/dashboard/js/dialogs.js +7 -7
- package/templates/dashboard/js/files.js +2 -2
- package/templates/dashboard/js/main.js +3 -3
- package/templates/dashboard/js/projects.js +3 -3
- package/templates/dashboard/js/tabs.js +1 -1
- package/templates/dashboard/js/utils.js +22 -87
- package/templates/tower.html +542 -27
- package/dist/agent-farm/commands/kickoff.d.ts +0 -19
- package/dist/agent-farm/commands/kickoff.d.ts.map +0 -1
- package/dist/agent-farm/commands/kickoff.js +0 -331
- package/dist/agent-farm/commands/kickoff.js.map +0 -1
- 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/dist/agent-farm/commands/tutorial.d.ts +0 -10
- package/dist/agent-farm/commands/tutorial.d.ts.map +0 -1
- package/dist/agent-farm/commands/tutorial.js +0 -49
- package/dist/agent-farm/commands/tutorial.js.map +0 -1
- package/dist/agent-farm/commands/util.d.ts.map +0 -1
- package/dist/agent-farm/commands/util.js.map +0 -1
- package/dist/agent-farm/servers/dashboard-server.d.ts +0 -7
- package/dist/agent-farm/servers/dashboard-server.d.ts.map +0 -1
- package/dist/agent-farm/servers/dashboard-server.js +0 -1872
- package/dist/agent-farm/servers/dashboard-server.js.map +0 -1
- package/dist/agent-farm/tutorial/index.d.ts +0 -8
- package/dist/agent-farm/tutorial/index.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/index.js +0 -8
- package/dist/agent-farm/tutorial/index.js.map +0 -1
- package/dist/agent-farm/tutorial/prompts.d.ts +0 -57
- package/dist/agent-farm/tutorial/prompts.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/prompts.js +0 -147
- package/dist/agent-farm/tutorial/prompts.js.map +0 -1
- package/dist/agent-farm/tutorial/runner.d.ts +0 -52
- package/dist/agent-farm/tutorial/runner.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/runner.js +0 -204
- package/dist/agent-farm/tutorial/runner.js.map +0 -1
- package/dist/agent-farm/tutorial/state.d.ts +0 -26
- package/dist/agent-farm/tutorial/state.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/state.js +0 -89
- package/dist/agent-farm/tutorial/state.js.map +0 -1
- package/dist/agent-farm/tutorial/steps/first-spec.d.ts +0 -7
- package/dist/agent-farm/tutorial/steps/first-spec.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/steps/first-spec.js +0 -136
- package/dist/agent-farm/tutorial/steps/first-spec.js.map +0 -1
- package/dist/agent-farm/tutorial/steps/implementation.d.ts +0 -7
- package/dist/agent-farm/tutorial/steps/implementation.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/steps/implementation.js +0 -76
- package/dist/agent-farm/tutorial/steps/implementation.js.map +0 -1
- package/dist/agent-farm/tutorial/steps/index.d.ts +0 -10
- package/dist/agent-farm/tutorial/steps/index.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/steps/index.js +0 -10
- package/dist/agent-farm/tutorial/steps/index.js.map +0 -1
- package/dist/agent-farm/tutorial/steps/planning.d.ts +0 -7
- package/dist/agent-farm/tutorial/steps/planning.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/steps/planning.js +0 -143
- package/dist/agent-farm/tutorial/steps/planning.js.map +0 -1
- package/dist/agent-farm/tutorial/steps/review.d.ts +0 -7
- package/dist/agent-farm/tutorial/steps/review.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/steps/review.js +0 -78
- package/dist/agent-farm/tutorial/steps/review.js.map +0 -1
- package/dist/agent-farm/tutorial/steps/setup.d.ts +0 -7
- package/dist/agent-farm/tutorial/steps/setup.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/steps/setup.js +0 -126
- package/dist/agent-farm/tutorial/steps/setup.js.map +0 -1
- package/dist/agent-farm/tutorial/steps/welcome.d.ts +0 -7
- package/dist/agent-farm/tutorial/steps/welcome.d.ts.map +0 -1
- package/dist/agent-farm/tutorial/steps/welcome.js +0 -50
- package/dist/agent-farm/tutorial/steps/welcome.js.map +0 -1
- package/dist/commands/pcheck/cache.d.ts +0 -48
- package/dist/commands/pcheck/cache.d.ts.map +0 -1
- package/dist/commands/pcheck/cache.js +0 -170
- package/dist/commands/pcheck/cache.js.map +0 -1
- package/dist/commands/pcheck/evaluator.d.ts +0 -15
- package/dist/commands/pcheck/evaluator.d.ts.map +0 -1
- package/dist/commands/pcheck/evaluator.js +0 -246
- package/dist/commands/pcheck/evaluator.js.map +0 -1
- package/dist/commands/pcheck/index.d.ts +0 -12
- package/dist/commands/pcheck/index.d.ts.map +0 -1
- package/dist/commands/pcheck/index.js +0 -249
- package/dist/commands/pcheck/index.js.map +0 -1
- package/dist/commands/pcheck/parser.d.ts +0 -39
- package/dist/commands/pcheck/parser.d.ts.map +0 -1
- package/dist/commands/pcheck/parser.js +0 -155
- package/dist/commands/pcheck/parser.js.map +0 -1
- package/dist/commands/pcheck/types.d.ts +0 -82
- package/dist/commands/pcheck/types.d.ts.map +0 -1
- package/dist/commands/pcheck/types.js +0 -5
- package/dist/commands/pcheck/types.js.map +0 -1
- package/dist/commands/porch/consultation.d.ts +0 -56
- package/dist/commands/porch/consultation.d.ts.map +0 -1
- package/dist/commands/porch/consultation.js +0 -330
- package/dist/commands/porch/consultation.js.map +0 -1
- package/dist/commands/porch/notifications.d.ts +0 -99
- package/dist/commands/porch/notifications.d.ts.map +0 -1
- package/dist/commands/porch/notifications.js +0 -223
- package/dist/commands/porch/notifications.js.map +0 -1
- package/dist/commands/porch/plan-parser.d.ts +0 -38
- package/dist/commands/porch/plan-parser.d.ts.map +0 -1
- package/dist/commands/porch/plan-parser.js +0 -166
- package/dist/commands/porch/plan-parser.js.map +0 -1
- package/dist/commands/porch/protocol-loader.d.ts +0 -46
- package/dist/commands/porch/protocol-loader.d.ts.map +0 -1
- package/dist/commands/porch/protocol-loader.js +0 -253
- package/dist/commands/porch/protocol-loader.js.map +0 -1
- package/dist/commands/porch/signal-parser.d.ts +0 -88
- package/dist/commands/porch/signal-parser.d.ts.map +0 -1
- package/dist/commands/porch/signal-parser.js +0 -148
- package/dist/commands/porch/signal-parser.js.map +0 -1
- package/dist/commands/tower.d.ts +0 -16
- package/dist/commands/tower.d.ts.map +0 -1
- package/dist/commands/tower.js +0 -21
- package/dist/commands/tower.js.map +0 -1
- package/skeleton/config.json +0 -7
- 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/skeleton/protocols/spider/prompts/defend.md +0 -215
- package/skeleton/protocols/spider/prompts/evaluate.md +0 -241
- package/templates/dashboard/css/activity.css +0 -151
- package/templates/dashboard/js/activity.js +0 -112
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase prompts for Porch
|
|
3
|
+
*
|
|
4
|
+
* Loads phase-specific prompts from the protocol's prompts/ directory.
|
|
5
|
+
* Prompts are markdown files with {{variable}} placeholders.
|
|
6
|
+
*
|
|
7
|
+
* For build-verify cycles, when iteration > 1, previous build outputs
|
|
8
|
+
* and review files are listed so Claude can read them for context.
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from 'node:fs';
|
|
11
|
+
import * as path from 'node:path';
|
|
12
|
+
import { getPhaseConfig, isPhased, isBuildVerify, getBuildConfig } from './protocol.js';
|
|
13
|
+
import { findPlanFile, getCurrentPlanPhase, getPhaseContent } from './plan.js';
|
|
14
|
+
/** Locations to search for protocol prompts */
|
|
15
|
+
const PROTOCOL_PATHS = [
|
|
16
|
+
'codev/protocols',
|
|
17
|
+
'codev-skeleton/protocols',
|
|
18
|
+
'skeleton/protocols', // Used in packages/codev
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* Get project summary from projectlist.md.
|
|
22
|
+
* Returns the summary field for the given project ID.
|
|
23
|
+
*/
|
|
24
|
+
function getProjectSummary(projectRoot, projectId) {
|
|
25
|
+
const projectlistPath = path.join(projectRoot, 'codev', 'projectlist.md');
|
|
26
|
+
if (!fs.existsSync(projectlistPath)) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const content = fs.readFileSync(projectlistPath, 'utf-8');
|
|
31
|
+
// Look for the project entry by ID
|
|
32
|
+
// Format: - id: "0076" followed by summary: "..."
|
|
33
|
+
const idPattern = new RegExp(`- id: ["']?${projectId}["']?`, 'i');
|
|
34
|
+
const idMatch = content.match(idPattern);
|
|
35
|
+
if (!idMatch) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
// Find the summary after this ID (within the next ~500 chars)
|
|
39
|
+
const afterId = content.slice(idMatch.index, idMatch.index + 500);
|
|
40
|
+
const summaryMatch = afterId.match(/summary:\s*["'](.+?)["']/);
|
|
41
|
+
if (summaryMatch) {
|
|
42
|
+
return summaryMatch[1];
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Find the prompts directory for a protocol.
|
|
52
|
+
*/
|
|
53
|
+
function findPromptsDir(projectRoot, protocolName) {
|
|
54
|
+
for (const basePath of PROTOCOL_PATHS) {
|
|
55
|
+
const promptsDir = path.join(projectRoot, basePath, protocolName, 'prompts');
|
|
56
|
+
if (fs.existsSync(promptsDir)) {
|
|
57
|
+
return promptsDir;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Load a prompt file from the protocol's prompts directory.
|
|
64
|
+
*/
|
|
65
|
+
function loadPromptFile(promptsDir, promptFile) {
|
|
66
|
+
const promptPath = path.join(promptsDir, promptFile);
|
|
67
|
+
if (fs.existsSync(promptPath)) {
|
|
68
|
+
return fs.readFileSync(promptPath, 'utf-8');
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Substitute template variables in a prompt.
|
|
74
|
+
*/
|
|
75
|
+
function substituteVariables(prompt, state, planPhase, summary) {
|
|
76
|
+
const variables = {
|
|
77
|
+
project_id: state.id,
|
|
78
|
+
title: state.title,
|
|
79
|
+
current_state: state.phase,
|
|
80
|
+
protocol: state.protocol,
|
|
81
|
+
};
|
|
82
|
+
// Add summary/goal if available
|
|
83
|
+
if (summary) {
|
|
84
|
+
variables.summary = summary;
|
|
85
|
+
variables.goal = summary; // Alias for convenience
|
|
86
|
+
}
|
|
87
|
+
if (planPhase) {
|
|
88
|
+
variables.plan_phase_id = planPhase.id;
|
|
89
|
+
variables.plan_phase_title = planPhase.title;
|
|
90
|
+
}
|
|
91
|
+
// Replace {{variable}} with values
|
|
92
|
+
return prompt.replace(/\{\{(\w+)\}\}/g, (match, varName) => {
|
|
93
|
+
return variables[varName] || match;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Build a header listing all previous iteration files.
|
|
98
|
+
* Claude can read these files to understand the history and feedback.
|
|
99
|
+
*/
|
|
100
|
+
function buildHistoryHeader(history, currentIteration) {
|
|
101
|
+
const lines = [
|
|
102
|
+
'# ⚠️ REVISION REQUIRED',
|
|
103
|
+
'',
|
|
104
|
+
`This is iteration ${currentIteration}. Previous iterations received feedback from reviewers.`,
|
|
105
|
+
'',
|
|
106
|
+
'**Read the files below to understand the history and address the feedback.**',
|
|
107
|
+
'',
|
|
108
|
+
'## Previous Iterations',
|
|
109
|
+
'',
|
|
110
|
+
];
|
|
111
|
+
for (const record of history) {
|
|
112
|
+
lines.push(`### Iteration ${record.iteration}`);
|
|
113
|
+
lines.push('');
|
|
114
|
+
if (record.build_output) {
|
|
115
|
+
lines.push(`**Build Output:** \`${record.build_output}\``);
|
|
116
|
+
}
|
|
117
|
+
if (record.reviews.length > 0) {
|
|
118
|
+
lines.push('');
|
|
119
|
+
lines.push('**Reviews:**');
|
|
120
|
+
for (const review of record.reviews) {
|
|
121
|
+
const icon = review.verdict === 'APPROVE' ? '✓' :
|
|
122
|
+
review.verdict === 'COMMENT' ? '💬' : '✗';
|
|
123
|
+
lines.push(`- ${review.model} (${icon} ${review.verdict}): \`${review.file}\``);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
lines.push('');
|
|
127
|
+
}
|
|
128
|
+
lines.push('## Instructions');
|
|
129
|
+
lines.push('');
|
|
130
|
+
lines.push('1. Read the review files above to understand the feedback');
|
|
131
|
+
lines.push('2. Address any REQUEST_CHANGES issues');
|
|
132
|
+
lines.push('3. Consider suggestions from COMMENT and APPROVE reviews');
|
|
133
|
+
lines.push('');
|
|
134
|
+
return lines.join('\n');
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Build a prompt for the current phase.
|
|
138
|
+
* Loads from protocol's prompts/ directory if available, otherwise uses fallback.
|
|
139
|
+
*
|
|
140
|
+
* For build-verify phases with iteration > 1, lists previous build outputs
|
|
141
|
+
* and review files so Claude can read them for context.
|
|
142
|
+
*/
|
|
143
|
+
export function buildPhasePrompt(projectRoot, state, protocol) {
|
|
144
|
+
const phaseConfig = getPhaseConfig(protocol, state.phase);
|
|
145
|
+
if (!phaseConfig) {
|
|
146
|
+
return buildFallbackPrompt(state, 'unknown');
|
|
147
|
+
}
|
|
148
|
+
// Get project summary from projectlist.md
|
|
149
|
+
const summary = getProjectSummary(projectRoot, state.id);
|
|
150
|
+
// Get current plan phase for phased protocols
|
|
151
|
+
let currentPlanPhase = null;
|
|
152
|
+
if (isPhased(protocol, state.phase) && state.plan_phases.length > 0) {
|
|
153
|
+
currentPlanPhase = getCurrentPlanPhase(state.plan_phases);
|
|
154
|
+
}
|
|
155
|
+
// Build history header if this is a retry iteration
|
|
156
|
+
let historyHeader = '';
|
|
157
|
+
if (isBuildVerify(protocol, state.phase) && state.iteration > 1 && state.history.length > 0) {
|
|
158
|
+
historyHeader = buildHistoryHeader(state.history, state.iteration);
|
|
159
|
+
}
|
|
160
|
+
// Build user answers section if they asked clarifying questions
|
|
161
|
+
let userAnswersSection = '';
|
|
162
|
+
if (state.context?.user_answers) {
|
|
163
|
+
userAnswersSection = `# User Answers to Your Questions\n\n${state.context.user_answers}\n\n---\n\n`;
|
|
164
|
+
}
|
|
165
|
+
// Try to load prompt from protocol directory
|
|
166
|
+
const promptsDir = findPromptsDir(projectRoot, state.protocol);
|
|
167
|
+
if (promptsDir) {
|
|
168
|
+
// Get prompt filename from protocol's build config, fallback to phase.md
|
|
169
|
+
const buildConfig = getBuildConfig(protocol, state.phase);
|
|
170
|
+
const promptFileName = buildConfig?.prompt || `${state.phase}.md`;
|
|
171
|
+
const promptContent = loadPromptFile(promptsDir, promptFileName);
|
|
172
|
+
if (promptContent) {
|
|
173
|
+
let result = substituteVariables(promptContent, state, currentPlanPhase, summary);
|
|
174
|
+
// Add goal/summary header if available
|
|
175
|
+
if (summary) {
|
|
176
|
+
result = `## Goal\n\n${summary}\n\n---\n\n` + result;
|
|
177
|
+
}
|
|
178
|
+
// Add user answers if Claude asked clarifying questions
|
|
179
|
+
if (userAnswersSection) {
|
|
180
|
+
result = userAnswersSection + result;
|
|
181
|
+
}
|
|
182
|
+
// Add plan phase context if applicable
|
|
183
|
+
if (currentPlanPhase) {
|
|
184
|
+
result = addPlanPhaseContext(projectRoot, state, currentPlanPhase, result);
|
|
185
|
+
}
|
|
186
|
+
// Prepend history if this is a retry
|
|
187
|
+
if (historyHeader) {
|
|
188
|
+
result = historyHeader + '\n\n---\n\n' + result;
|
|
189
|
+
}
|
|
190
|
+
return result;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Fallback to generic prompt if no protocol prompt found
|
|
194
|
+
let fallback = buildFallbackPrompt(state, phaseConfig.name, currentPlanPhase, summary);
|
|
195
|
+
// Prepend history if this is a retry
|
|
196
|
+
if (historyHeader) {
|
|
197
|
+
fallback = historyHeader + '\n\n---\n\n' + fallback;
|
|
198
|
+
}
|
|
199
|
+
return fallback;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Add plan phase context from the plan file.
|
|
203
|
+
*/
|
|
204
|
+
function addPlanPhaseContext(projectRoot, state, planPhase, prompt) {
|
|
205
|
+
const planPath = findPlanFile(projectRoot, state.id, state.title);
|
|
206
|
+
if (!planPath) {
|
|
207
|
+
return prompt;
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
const planContent = fs.readFileSync(planPath, 'utf-8');
|
|
211
|
+
const phaseContent = getPhaseContent(planContent, planPhase.id);
|
|
212
|
+
if (phaseContent) {
|
|
213
|
+
return prompt + `\n\n## Current Plan Phase Details\n\n**${planPhase.id}: ${planPhase.title}**\n\n${phaseContent}\n`;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
// Ignore errors reading plan
|
|
218
|
+
}
|
|
219
|
+
return prompt;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Build a fallback prompt when no protocol prompt is found.
|
|
223
|
+
*/
|
|
224
|
+
function buildFallbackPrompt(state, phaseName, planPhase, summary) {
|
|
225
|
+
let prompt = `# Phase: ${phaseName}
|
|
226
|
+
|
|
227
|
+
You are executing the ${phaseName} phase of the ${state.protocol.toUpperCase()} protocol.
|
|
228
|
+
|
|
229
|
+
## Context
|
|
230
|
+
|
|
231
|
+
- **Project ID**: ${state.id}
|
|
232
|
+
- **Project Title**: ${state.title}
|
|
233
|
+
- **Protocol**: ${state.protocol}
|
|
234
|
+
`;
|
|
235
|
+
if (planPhase) {
|
|
236
|
+
prompt += `- **Plan Phase**: ${planPhase.id} - ${planPhase.title}\n`;
|
|
237
|
+
}
|
|
238
|
+
// Add goal from projectlist.md summary
|
|
239
|
+
if (summary) {
|
|
240
|
+
prompt += `\n## Goal\n\n${summary}\n`;
|
|
241
|
+
}
|
|
242
|
+
prompt += `
|
|
243
|
+
## Task
|
|
244
|
+
|
|
245
|
+
Complete the work for this phase according to the protocol.
|
|
246
|
+
|
|
247
|
+
`;
|
|
248
|
+
return prompt;
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/commands/porch/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
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 type { Protocol, ProtocolPhase, BuildConfig, VerifyConfig, OnCompleteConfig } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Find and load a protocol by name
|
|
10
|
+
* Fails loudly if not found or invalid.
|
|
11
|
+
*/
|
|
12
|
+
export declare function loadProtocol(projectRoot: string, protocolName: string): Protocol;
|
|
13
|
+
/**
|
|
14
|
+
* Get phase configuration by id
|
|
15
|
+
*/
|
|
16
|
+
export declare function getPhaseConfig(protocol: Protocol, phaseId: string): ProtocolPhase | null;
|
|
17
|
+
/**
|
|
18
|
+
* Get the next phase after the given phase
|
|
19
|
+
*/
|
|
20
|
+
export declare function getNextPhase(protocol: Protocol, currentPhaseId: string): ProtocolPhase | null;
|
|
21
|
+
/**
|
|
22
|
+
* Get check commands for a phase
|
|
23
|
+
*/
|
|
24
|
+
export declare function getPhaseChecks(protocol: Protocol, phaseId: string): Record<string, string>;
|
|
25
|
+
/**
|
|
26
|
+
* Get gate name for a phase (if any)
|
|
27
|
+
*/
|
|
28
|
+
export declare function getPhaseGate(protocol: Protocol, phaseId: string): string | null;
|
|
29
|
+
/**
|
|
30
|
+
* Check if a phase runs per plan phase
|
|
31
|
+
*/
|
|
32
|
+
export declare function isPhased(protocol: Protocol, phaseId: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Get checks to run when a plan phase completes (after evaluate stage)
|
|
35
|
+
*/
|
|
36
|
+
export declare function getPhaseCompletionChecks(protocol: Protocol): Record<string, string>;
|
|
37
|
+
/**
|
|
38
|
+
* Check if a phase uses the build-verify cycle.
|
|
39
|
+
* A phase uses build-verify if it has both build and verify configs,
|
|
40
|
+
* regardless of whether type is 'build_verify' or 'per_plan_phase'.
|
|
41
|
+
*/
|
|
42
|
+
export declare function isBuildVerify(protocol: Protocol, phaseId: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Get build config for a phase
|
|
45
|
+
*/
|
|
46
|
+
export declare function getBuildConfig(protocol: Protocol, phaseId: string): BuildConfig | null;
|
|
47
|
+
/**
|
|
48
|
+
* Get verify config for a phase
|
|
49
|
+
*/
|
|
50
|
+
export declare function getVerifyConfig(protocol: Protocol, phaseId: string): VerifyConfig | null;
|
|
51
|
+
/**
|
|
52
|
+
* Get max iterations for a build_verify phase
|
|
53
|
+
*/
|
|
54
|
+
export declare function getMaxIterations(protocol: Protocol, phaseId: string): number;
|
|
55
|
+
/**
|
|
56
|
+
* Get on_complete config for a phase
|
|
57
|
+
*/
|
|
58
|
+
export declare function getOnCompleteConfig(protocol: Protocol, phaseId: string): OnCompleteConfig | null;
|
|
59
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAYvG;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,QAAQ,CAoBhF;AAwJD;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAExF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAM7F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAa1F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG/E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAGrE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEnF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAG1E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAGtF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAGxF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAG5E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAGhG"}
|
|
@@ -0,0 +1,260 @@
|
|
|
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
|
+
// Gate can be a string (gate name) or object { name, next }
|
|
108
|
+
let gateName;
|
|
109
|
+
if (typeof phase.gate === 'string') {
|
|
110
|
+
gateName = phase.gate;
|
|
111
|
+
}
|
|
112
|
+
else if (typeof phase.gate === 'object' && phase.gate !== null) {
|
|
113
|
+
const gateObj = phase.gate;
|
|
114
|
+
gateName = gateObj.name;
|
|
115
|
+
if (gateObj.next !== undefined) {
|
|
116
|
+
next = gateObj.next;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (transition?.on_complete) {
|
|
120
|
+
next = transition.on_complete;
|
|
121
|
+
}
|
|
122
|
+
// Collect check names
|
|
123
|
+
const checks = [];
|
|
124
|
+
if (phase.checks && typeof phase.checks === 'object') {
|
|
125
|
+
checks.push(...Object.keys(phase.checks));
|
|
126
|
+
}
|
|
127
|
+
// Parse build config (for build_verify phases)
|
|
128
|
+
let build;
|
|
129
|
+
const buildRaw = phase.build;
|
|
130
|
+
if (buildRaw) {
|
|
131
|
+
build = {
|
|
132
|
+
prompt: buildRaw.prompt,
|
|
133
|
+
artifact: buildRaw.artifact,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
// Parse verify config (for build_verify phases)
|
|
137
|
+
let verify;
|
|
138
|
+
const verifyRaw = phase.verify;
|
|
139
|
+
if (verifyRaw) {
|
|
140
|
+
verify = {
|
|
141
|
+
type: verifyRaw.type,
|
|
142
|
+
models: verifyRaw.models,
|
|
143
|
+
parallel: verifyRaw.parallel ?? true,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// Parse on_complete config
|
|
147
|
+
let on_complete;
|
|
148
|
+
const onCompleteRaw = phase.on_complete;
|
|
149
|
+
if (onCompleteRaw) {
|
|
150
|
+
on_complete = {
|
|
151
|
+
commit: onCompleteRaw.commit,
|
|
152
|
+
push: onCompleteRaw.push,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
id: phase.id,
|
|
157
|
+
name: phase.name || phase.id,
|
|
158
|
+
type: phase.type,
|
|
159
|
+
build,
|
|
160
|
+
verify,
|
|
161
|
+
max_iterations: phase.max_iterations ?? 7,
|
|
162
|
+
on_complete,
|
|
163
|
+
gate: gateName,
|
|
164
|
+
checks: checks.length > 0 ? checks : undefined,
|
|
165
|
+
next,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// ============================================================================
|
|
169
|
+
// Phase Queries
|
|
170
|
+
// ============================================================================
|
|
171
|
+
/**
|
|
172
|
+
* Get phase configuration by id
|
|
173
|
+
*/
|
|
174
|
+
export function getPhaseConfig(protocol, phaseId) {
|
|
175
|
+
return protocol.phases.find(p => p.id === phaseId) || null;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get the next phase after the given phase
|
|
179
|
+
*/
|
|
180
|
+
export function getNextPhase(protocol, currentPhaseId) {
|
|
181
|
+
const current = getPhaseConfig(protocol, currentPhaseId);
|
|
182
|
+
if (!current || !current.next) {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
return getPhaseConfig(protocol, current.next);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get check commands for a phase
|
|
189
|
+
*/
|
|
190
|
+
export function getPhaseChecks(protocol, phaseId) {
|
|
191
|
+
const phase = getPhaseConfig(protocol, phaseId);
|
|
192
|
+
if (!phase || !phase.checks) {
|
|
193
|
+
return {};
|
|
194
|
+
}
|
|
195
|
+
const result = {};
|
|
196
|
+
for (const checkName of phase.checks) {
|
|
197
|
+
if (protocol.checks?.[checkName]) {
|
|
198
|
+
result[checkName] = protocol.checks[checkName];
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Get gate name for a phase (if any)
|
|
205
|
+
*/
|
|
206
|
+
export function getPhaseGate(protocol, phaseId) {
|
|
207
|
+
const phase = getPhaseConfig(protocol, phaseId);
|
|
208
|
+
return phase?.gate || null;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Check if a phase runs per plan phase
|
|
212
|
+
*/
|
|
213
|
+
export function isPhased(protocol, phaseId) {
|
|
214
|
+
const phase = getPhaseConfig(protocol, phaseId);
|
|
215
|
+
return phase?.type === 'per_plan_phase';
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get checks to run when a plan phase completes (after evaluate stage)
|
|
219
|
+
*/
|
|
220
|
+
export function getPhaseCompletionChecks(protocol) {
|
|
221
|
+
return protocol.phase_completion ?? {};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Check if a phase uses the build-verify cycle.
|
|
225
|
+
* A phase uses build-verify if it has both build and verify configs,
|
|
226
|
+
* regardless of whether type is 'build_verify' or 'per_plan_phase'.
|
|
227
|
+
*/
|
|
228
|
+
export function isBuildVerify(protocol, phaseId) {
|
|
229
|
+
const phase = getPhaseConfig(protocol, phaseId);
|
|
230
|
+
return !!(phase?.build && phase?.verify);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get build config for a phase
|
|
234
|
+
*/
|
|
235
|
+
export function getBuildConfig(protocol, phaseId) {
|
|
236
|
+
const phase = getPhaseConfig(protocol, phaseId);
|
|
237
|
+
return phase?.build || null;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Get verify config for a phase
|
|
241
|
+
*/
|
|
242
|
+
export function getVerifyConfig(protocol, phaseId) {
|
|
243
|
+
const phase = getPhaseConfig(protocol, phaseId);
|
|
244
|
+
return phase?.verify || null;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Get max iterations for a build_verify phase
|
|
248
|
+
*/
|
|
249
|
+
export function getMaxIterations(protocol, phaseId) {
|
|
250
|
+
const phase = getPhaseConfig(protocol, phaseId);
|
|
251
|
+
return phase?.max_iterations ?? 7;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Get on_complete config for a phase
|
|
255
|
+
*/
|
|
256
|
+
export function getOnCompleteConfig(protocol, phaseId) {
|
|
257
|
+
const phase = getPhaseConfig(protocol, phaseId);
|
|
258
|
+
return phase?.on_complete || null;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/commands/porch/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,0DAA0D;AAC1D,MAAM,cAAc,GAAG;IACrB,iBAAiB;IACjB,0BAA0B;CAC3B,CAAC;AAEF,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,WAAmB,EAAE,YAAoB;IACpE,MAAM,YAAY,GAAG,gBAAgB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAEjE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,aAAa,YAAY,gBAAgB;YACzC,gBAAgB,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9F,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,qBAAqB,YAAY,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,WAAmB,EAAE,YAAoB;IACjE,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;QACpF,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAa;IACtC,MAAM,GAAG,GAAG,IAA+B,CAAC;IAE5C,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,MAAM,GAAoB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAElF,8DAA8D;IAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7C,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAA+C,CAAC;IACrE,IAAI,QAAQ,EAAE,MAAM,EAAE,CAAC;QACrB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,gCAAgC;IAChC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAwC,EAAE,CAAC;QACjE,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACrD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAiC,CAAC,EAAE,CAAC;gBACpF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;oBACtE,MAAM,CAAC,IAAI,CAAC,GAAI,KAA6B,CAAC,OAAO,CAAC;gBACxD,CAAC;qBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACrC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAc;QACxB,OAAO,EAAE,GAAG,CAAC,OAA6B;QAC1C,WAAW,EAAE,GAAG,CAAC,WAAiC;QAClD,MAAM;QACN,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,CAAU;IAChC,MAAM,KAAK,GAAG,CAA4B,CAAC;IAE3C,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,+CAA+C;IAC/C,IAAI,IAA+B,CAAC;IACpC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAiD,CAAC;IAE3E,4DAA4D;IAC5D,IAAI,QAA4B,CAAC;IACjC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACnC,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,CAAC;SAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,KAAK,CAAC,IAA+B,CAAC;QACtD,QAAQ,GAAG,OAAO,CAAC,IAA0B,CAAC;QAC9C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,GAAG,OAAO,CAAC,IAAqB,CAAC;QACvC,CAAC;IACH,CAAC;IAED,IAAI,UAAU,EAAE,WAAW,EAAE,CAAC;QAC5B,IAAI,GAAG,UAAU,CAAC,WAAqB,CAAC;IAC1C,CAAC;IAED,sBAAsB;IACtB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAiC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,+CAA+C;IAC/C,IAAI,KAA8B,CAAC;IACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAA4C,CAAC;IACpE,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,GAAG;YACN,MAAM,EAAE,QAAQ,CAAC,MAAgB;YACjC,QAAQ,EAAE,QAAQ,CAAC,QAAkB;SACtC,CAAC;IACJ,CAAC;IAED,gDAAgD;IAChD,IAAI,MAAgC,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAC,MAA6C,CAAC;IACtE,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,GAAG;YACP,IAAI,EAAE,SAAS,CAAC,IAAc;YAC9B,MAAM,EAAE,SAAS,CAAC,MAAkB;YACpC,QAAQ,EAAG,SAAS,CAAC,QAAoB,IAAI,IAAI;SAClD,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,IAAI,WAAyC,CAAC;IAC9C,MAAM,aAAa,GAAG,KAAK,CAAC,WAAkD,CAAC;IAC/E,IAAI,aAAa,EAAE,CAAC;QAClB,WAAW,GAAG;YACZ,MAAM,EAAE,aAAa,CAAC,MAA6B;YACnD,IAAI,EAAE,aAAa,CAAC,IAA2B;SAChD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,EAAY;QACtB,IAAI,EAAG,KAAK,CAAC,IAAe,IAAI,KAAK,CAAC,EAAY;QAClD,IAAI,EAAE,KAAK,CAAC,IAA8D;QAC1E,KAAK;QACL,MAAM;QACN,cAAc,EAAG,KAAK,CAAC,cAAyB,IAAI,CAAC;QACrD,WAAW;QACX,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAC9C,IAAI;KACL,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAkB,EAAE,OAAe;IAChE,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAkB,EAAE,cAAsB;IACrE,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACzD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAkB,EAAE,OAAe;IAChE,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACrC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAkB,EAAE,OAAe;IAC9D,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAkB,EAAE,OAAe;IAC1D,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,KAAK,EAAE,IAAI,KAAK,gBAAgB,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAkB;IACzD,OAAO,QAAQ,CAAC,gBAAgB,IAAI,EAAE,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,QAAkB,EAAE,OAAe;IAC/D,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAkB,EAAE,OAAe;IAChE,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,KAAK,EAAE,KAAK,IAAI,IAAI,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAkB,EAAE,OAAe;IACjE,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAkB,EAAE,OAAe;IAClE,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,KAAK,EAAE,cAAc,IAAI,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAkB,EAAE,OAAe;IACrE,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,KAAK,EAAE,WAAW,IAAI,IAAI,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
import type { Verdict } from './types.js';
|
|
11
|
+
export interface RunOptions {
|
|
12
|
+
/** Run a single build-verify iteration then exit (for step-by-step debugging) */
|
|
13
|
+
singleIteration?: boolean;
|
|
14
|
+
/** Run a single phase (build-verify + gate) then exit. Used by Builder (outer Claude) to stay in the loop. */
|
|
15
|
+
singlePhase?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/** Exit code when AWAITING_INPUT is detected in non-interactive mode */
|
|
18
|
+
export declare const EXIT_AWAITING_INPUT = 3;
|
|
19
|
+
/**
|
|
20
|
+
* Main run loop for porch.
|
|
21
|
+
* Spawns Claude for each phase and monitors until protocol complete.
|
|
22
|
+
*/
|
|
23
|
+
export declare function run(projectRoot: string, projectId: string, options?: RunOptions): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Parse verdict from consultation output.
|
|
26
|
+
*
|
|
27
|
+
* Looks for the verdict line in format:
|
|
28
|
+
* VERDICT: APPROVE
|
|
29
|
+
* VERDICT: REQUEST_CHANGES
|
|
30
|
+
* VERDICT: COMMENT
|
|
31
|
+
*
|
|
32
|
+
* Also handles markdown formatting like:
|
|
33
|
+
* **VERDICT: APPROVE**
|
|
34
|
+
* *VERDICT: APPROVE*
|
|
35
|
+
*
|
|
36
|
+
* Safety: If no explicit verdict found (empty output, crash, malformed),
|
|
37
|
+
* defaults to REQUEST_CHANGES to prevent proceeding with unverified code.
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseVerdict(output: string): Verdict;
|
|
40
|
+
//# 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;AAUH,OAAO,KAAK,EAAyD,OAAO,EAAE,MAAM,YAAY,CAAC;AA4DjG,MAAM,WAAW,UAAU;IACzB,iFAAiF;IACjF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,8GAA8G;IAC9G,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wEAAwE;AACxE,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAQrC;;;GAGG;AACH,wBAAsB,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAqezG;AAkMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAwBpD"}
|