@bradtaylorsf/alpha-loop 1.2.0 → 1.4.0
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/README.md +60 -19
- package/dist/cli.js +83 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/auth.js +1 -1
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/eval.d.ts +53 -0
- package/dist/commands/eval.js +538 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/evolve.d.ts +25 -0
- package/dist/commands/evolve.js +270 -0
- package/dist/commands/evolve.js.map +1 -0
- package/dist/commands/history.d.ts +1 -1
- package/dist/commands/history.js +4 -4
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/init.d.ts +14 -0
- package/dist/commands/init.js +199 -30
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/resume.js +1 -0
- package/dist/commands/resume.js.map +1 -1
- package/dist/commands/run.js +170 -12
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/scan.d.ts +1 -1
- package/dist/commands/scan.js +12 -9
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/sync.d.ts +5 -0
- package/dist/commands/sync.js +24 -5
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/vision.js +5 -3
- package/dist/commands/vision.js.map +1 -1
- package/dist/engine/agents.d.ts +6 -1
- package/dist/engine/agents.js +14 -12
- package/dist/engine/agents.js.map +1 -1
- package/dist/engine/prerequisites.d.ts +4 -7
- package/dist/engine/prerequisites.js +12 -36
- package/dist/engine/prerequisites.js.map +1 -1
- package/dist/lib/agent.d.ts +18 -0
- package/dist/lib/agent.js +211 -30
- package/dist/lib/agent.js.map +1 -1
- package/dist/lib/config.d.ts +25 -2
- package/dist/lib/config.js +80 -7
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/eval-checks.d.ts +91 -0
- package/dist/lib/eval-checks.js +254 -0
- package/dist/lib/eval-checks.js.map +1 -0
- package/dist/lib/eval-runner.d.ts +29 -0
- package/dist/lib/eval-runner.js +439 -0
- package/dist/lib/eval-runner.js.map +1 -0
- package/dist/lib/eval.d.ts +170 -0
- package/dist/lib/eval.js +507 -0
- package/dist/lib/eval.js.map +1 -0
- package/dist/lib/learning.js +2 -2
- package/dist/lib/learning.js.map +1 -1
- package/dist/lib/pipeline.d.ts +44 -0
- package/dist/lib/pipeline.js +607 -138
- package/dist/lib/pipeline.js.map +1 -1
- package/dist/lib/prompts.d.ts +19 -0
- package/dist/lib/prompts.js +56 -5
- package/dist/lib/prompts.js.map +1 -1
- package/dist/lib/score.d.ts +80 -0
- package/dist/lib/score.js +172 -0
- package/dist/lib/score.js.map +1 -0
- package/dist/lib/session.d.ts +2 -1
- package/dist/lib/session.js +70 -19
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/traces.d.ts +173 -0
- package/dist/lib/traces.js +272 -0
- package/dist/lib/traces.js.map +1 -0
- package/dist/lib/verify.d.ts +7 -1
- package/dist/lib/verify.js +109 -157
- package/dist/lib/verify.js.map +1 -1
- package/dist/lib/worktree.d.ts +1 -0
- package/dist/lib/worktree.js +9 -1
- package/dist/lib/worktree.js.map +1 -1
- package/package.json +1 -1
- package/templates/agents/implementer.md +1 -1
- package/templates/agents/reviewer.md +1 -1
- package/dist/engine/config.d.ts +0 -71
- package/dist/engine/config.js +0 -73
- package/dist/engine/config.js.map +0 -1
package/dist/lib/verify.js
CHANGED
|
@@ -1,43 +1,70 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Live Verification —
|
|
2
|
+
* Live Verification — use playwright-cli to test the app like a real user.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* 3. Navigating, clicking, typing, taking screenshots
|
|
9
|
-
* 4. Reporting PASS or FAIL
|
|
4
|
+
* The agent handles everything: starting the dev server, figuring out the URL
|
|
5
|
+
* from the output, testing with playwright-cli, and shutting down.
|
|
6
|
+
*
|
|
7
|
+
* Verification is skipped for non-UI changes (config, docs, tests, etc.).
|
|
10
8
|
*/
|
|
11
9
|
import { existsSync, readFileSync, mkdirSync } from 'node:fs';
|
|
12
10
|
import { join } from 'node:path';
|
|
13
11
|
import { exec } from './shell.js';
|
|
14
12
|
import { log } from './logger.js';
|
|
15
13
|
import { spawnAgent } from './agent.js';
|
|
16
|
-
/**
|
|
17
|
-
const
|
|
14
|
+
/** File extensions that never need UI verification. */
|
|
15
|
+
const NON_UI_EXTENSIONS = new Set([
|
|
16
|
+
'.md', '.yaml', '.yml', '.json', '.toml', '.cfg', '.ini', '.env',
|
|
17
|
+
'.txt', '.csv', '.lock', '.gitignore', '.dockerignore',
|
|
18
|
+
'.test.ts', '.test.tsx', '.test.js', '.test.jsx', '.spec.ts', '.spec.tsx',
|
|
19
|
+
]);
|
|
20
|
+
/**
|
|
21
|
+
* Check if a diff only touches non-UI files.
|
|
22
|
+
*/
|
|
23
|
+
export function isNonUiChange(diffStat) {
|
|
24
|
+
if (!diffStat.trim())
|
|
25
|
+
return true;
|
|
26
|
+
const lines = diffStat.trim().split('\n');
|
|
27
|
+
// Last line is summary like " 5 files changed, 100 insertions(+), 20 deletions(-)"
|
|
28
|
+
const fileLines = lines.slice(0, -1);
|
|
29
|
+
for (const line of fileLines) {
|
|
30
|
+
const filePath = line.trim().split(/\s+\|/)[0]?.trim();
|
|
31
|
+
if (!filePath)
|
|
32
|
+
continue;
|
|
33
|
+
// Check if file has a non-UI extension
|
|
34
|
+
const isNonUi = [...NON_UI_EXTENSIONS].some(ext => filePath.endsWith(ext));
|
|
35
|
+
if (!isNonUi)
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
18
40
|
/**
|
|
19
41
|
* Run live verification using playwright-cli.
|
|
20
|
-
*
|
|
42
|
+
* The agent starts the dev server, tests the app, and reports results.
|
|
21
43
|
*/
|
|
22
44
|
export async function runVerify(options) {
|
|
23
|
-
const { worktree, logFile, issueNum, title, body, config, sessionDir } = options;
|
|
45
|
+
const { worktree, logFile, issueNum, title, body, config, sessionDir, verifyInstructions } = options;
|
|
24
46
|
if (config.skipVerify) {
|
|
25
47
|
log.info('Verification skipped (skipVerify=true)');
|
|
26
|
-
return { passed: true, output: 'Verification skipped' };
|
|
48
|
+
return { passed: true, skipped: true, output: 'Verification skipped' };
|
|
27
49
|
}
|
|
28
50
|
if (config.dryRun) {
|
|
29
51
|
log.dry('Would run live verification');
|
|
30
|
-
return { passed: true, output: 'Verification skipped (dry run)' };
|
|
52
|
+
return { passed: true, skipped: true, output: 'Verification skipped (dry run)' };
|
|
31
53
|
}
|
|
32
|
-
log.step(`Running live verification for issue #${issueNum}`);
|
|
33
54
|
// Check if playwright-cli is available
|
|
34
55
|
const whichResult = exec('which playwright-cli');
|
|
35
56
|
if (whichResult.exitCode !== 0) {
|
|
36
|
-
log.warn('playwright-cli not installed
|
|
37
|
-
|
|
38
|
-
|
|
57
|
+
log.warn('playwright-cli not installed — skipping verification');
|
|
58
|
+
return { passed: true, skipped: true, output: 'Verification skipped (playwright-cli not installed)' };
|
|
59
|
+
}
|
|
60
|
+
// Check if the diff only touches non-UI files
|
|
61
|
+
const diffStat = exec(`git diff --stat "origin/${config.baseBranch}...HEAD"`, { cwd: worktree });
|
|
62
|
+
if (isNonUiChange(diffStat.stdout)) {
|
|
63
|
+
log.info('Changes are non-UI (config, docs, tests) — skipping verification');
|
|
64
|
+
return { passed: true, skipped: true, output: 'Verification skipped (non-UI changes only)' };
|
|
39
65
|
}
|
|
40
|
-
|
|
66
|
+
log.step(`Running live verification for issue #${issueNum}`);
|
|
67
|
+
// Detect dev command
|
|
41
68
|
let devCmd = config.devCommand;
|
|
42
69
|
if (!devCmd) {
|
|
43
70
|
const pkgJsonPath = join(worktree, 'package.json');
|
|
@@ -54,57 +81,29 @@ export async function runVerify(options) {
|
|
|
54
81
|
}
|
|
55
82
|
if (!devCmd) {
|
|
56
83
|
log.info('No dev/start/preview command found, skipping verification');
|
|
57
|
-
return { passed: true, output: 'Verification skipped (no start command)' };
|
|
58
|
-
}
|
|
59
|
-
const port = config.port ?? 3000;
|
|
60
|
-
// Start the app in the background
|
|
61
|
-
log.info(`Starting app with '${devCmd}' on port ${port}...`);
|
|
62
|
-
const { spawn } = await import('node:child_process');
|
|
63
|
-
const appProcess = spawn('sh', ['-c', `PORT=${port} ${devCmd}`], {
|
|
64
|
-
cwd: worktree,
|
|
65
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
66
|
-
detached: true,
|
|
67
|
-
});
|
|
68
|
-
const appPid = appProcess.pid;
|
|
69
|
-
// Wait for app to be ready
|
|
70
|
-
let ready = false;
|
|
71
|
-
for (let i = 0; i < APP_READY_TIMEOUT_S; i++) {
|
|
72
|
-
const check = exec(`curl -s -o /dev/null http://localhost:${port}`);
|
|
73
|
-
if (check.exitCode === 0) {
|
|
74
|
-
ready = true;
|
|
75
|
-
break;
|
|
76
|
-
}
|
|
77
|
-
// Check if process is still alive
|
|
78
|
-
try {
|
|
79
|
-
process.kill(appPid, 0);
|
|
80
|
-
}
|
|
81
|
-
catch {
|
|
82
|
-
log.error('App process exited before becoming ready');
|
|
83
|
-
return { passed: false, output: 'App failed to start' };
|
|
84
|
-
}
|
|
85
|
-
await new Promise((r) => setTimeout(r, 1000));
|
|
86
|
-
}
|
|
87
|
-
if (!ready) {
|
|
88
|
-
log.error(`App did not become ready on port ${port} within ${APP_READY_TIMEOUT_S}s`);
|
|
89
|
-
killProcess(appPid);
|
|
90
|
-
return { passed: false, output: `App failed to start on port ${port}` };
|
|
91
|
-
}
|
|
92
|
-
log.success(`App is ready on port ${port}`);
|
|
93
|
-
// Load saved auth state if it exists
|
|
94
|
-
const authStateDir = join(process.cwd(), '.alpha-loop', 'auth');
|
|
95
|
-
if (existsSync(join(authStateDir, 'state.json'))) {
|
|
96
|
-
log.info('Loading saved auth state...');
|
|
97
|
-
exec(`playwright-cli state-load "${authStateDir}/state.json"`);
|
|
84
|
+
return { passed: true, skipped: true, output: 'Verification skipped (no start command)' };
|
|
98
85
|
}
|
|
99
86
|
// Save screenshots to session directory
|
|
100
87
|
const screenshotDir = join(sessionDir, 'screenshots', `issue-${issueNum}`);
|
|
101
88
|
mkdirSync(screenshotDir, { recursive: true });
|
|
102
|
-
// Get the diff to understand what changed
|
|
103
|
-
const diffStat = exec(`git diff --stat "origin/${config.baseBranch}...HEAD"`, { cwd: worktree });
|
|
104
89
|
// Get vision context
|
|
105
90
|
const visionFile = join(process.cwd(), '.alpha-loop', 'vision.md');
|
|
106
91
|
const visionContext = existsSync(visionFile) ? readFileSync(visionFile, 'utf-8') : '';
|
|
107
|
-
//
|
|
92
|
+
// Load saved auth state if it exists
|
|
93
|
+
const authStateDir = join(process.cwd(), '.alpha-loop', 'auth');
|
|
94
|
+
if (existsSync(join(authStateDir, 'state.json'))) {
|
|
95
|
+
log.info('Loading saved auth state...');
|
|
96
|
+
exec(`playwright-cli state-load "${authStateDir}/state.json"`);
|
|
97
|
+
}
|
|
98
|
+
// Build the verification prompt — use plan instructions if available, otherwise generic
|
|
99
|
+
const verifySteps = verifyInstructions
|
|
100
|
+
? `## Verification Steps (from plan)\n\n${verifyInstructions}`
|
|
101
|
+
: `## Your Task
|
|
102
|
+
|
|
103
|
+
1. Start the dev server: \`${devCmd}\`
|
|
104
|
+
2. Read the server output to find what URL/port it starts on
|
|
105
|
+
3. Use playwright-cli to open the app and test the feature
|
|
106
|
+
4. When done, kill the dev server process`;
|
|
108
107
|
const verifyPrompt = `You are a QA tester verifying that issue #${issueNum} was implemented correctly.
|
|
109
108
|
|
|
110
109
|
## Issue: ${title}
|
|
@@ -115,126 +114,79 @@ ${body}
|
|
|
115
114
|
${diffStat.stdout || 'No diff available'}
|
|
116
115
|
|
|
117
116
|
${visionContext ? `## Product Vision\n${visionContext}\n` : ''}
|
|
118
|
-
|
|
117
|
+
${verifySteps}
|
|
119
118
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
- \`playwright-cli
|
|
124
|
-
- \`playwright-cli
|
|
125
|
-
- \`playwright-cli snapshot\` — Get a snapshot of the current page with element refs
|
|
126
|
-
- \`playwright-cli click <ref>\` — Click an element (use ref from snapshot, e.g. \`e15\`)
|
|
127
|
-
- \`playwright-cli type <text>\` — Type text into the focused element
|
|
128
|
-
- \`playwright-cli screenshot --path <file>\` — Take a screenshot and save to file
|
|
119
|
+
### Playwright CLI Commands
|
|
120
|
+
- \`playwright-cli open <url>\` — Open the app
|
|
121
|
+
- \`playwright-cli snapshot\` — Get page structure with element refs
|
|
122
|
+
- \`playwright-cli click <ref>\` — Click an element
|
|
123
|
+
- \`playwright-cli type <text>\` — Type into focused element
|
|
129
124
|
- \`playwright-cli fill <ref> <text>\` — Fill a form field
|
|
130
|
-
- \`playwright-cli
|
|
131
|
-
- \`playwright-cli wait <selector>\` — Wait for an element to appear
|
|
125
|
+
- \`playwright-cli screenshot --path <file>\` — Take a screenshot
|
|
132
126
|
- \`playwright-cli console\` — Check browser console for errors
|
|
133
|
-
- \`playwright-cli network\` — Check network requests
|
|
127
|
+
- \`playwright-cli network\` — Check network requests
|
|
134
128
|
|
|
135
|
-
###
|
|
129
|
+
### Screenshots
|
|
130
|
+
Save to: ${screenshotDir}
|
|
136
131
|
|
|
137
|
-
|
|
138
|
-
2. Take a snapshot to see the page structure: \`playwright-cli snapshot\`
|
|
139
|
-
3. Navigate to the feature that was changed
|
|
140
|
-
4. Test the ACTUAL user flow described in the issue:
|
|
141
|
-
- Can you do what the issue says should work?
|
|
142
|
-
- Does the UI render correctly?
|
|
143
|
-
- Do form submissions work end-to-end?
|
|
144
|
-
- Check console for errors: \`playwright-cli console\`
|
|
145
|
-
- Check network for failed requests: \`playwright-cli network\`
|
|
146
|
-
5. Take screenshots at key states (save to the screenshot directory below)
|
|
147
|
-
6. Check for functional gaps:
|
|
148
|
-
- Is the backend wired to the frontend?
|
|
149
|
-
- Are there UI elements that don't respond?
|
|
150
|
-
- Does data persist after submission?
|
|
132
|
+
## Gate Result (REQUIRED)
|
|
151
133
|
|
|
152
|
-
|
|
153
|
-
${existsSync(authStateDir) ? 'Auth state is pre-loaded. If you need to log in, use the credentials from the environment or .env file.' : 'No auth state saved.'}
|
|
134
|
+
After testing, write a JSON file to: verify-issue-${issueNum}.json
|
|
154
135
|
|
|
155
|
-
|
|
136
|
+
The file must contain ONLY valid JSON with this exact schema:
|
|
156
137
|
|
|
157
|
-
|
|
138
|
+
{
|
|
139
|
+
"passed": true,
|
|
140
|
+
"summary": "One-line summary of verification outcome",
|
|
141
|
+
"findings": [
|
|
142
|
+
{
|
|
143
|
+
"severity": "critical",
|
|
144
|
+
"description": "What failed or didn't work",
|
|
145
|
+
"fixed": false,
|
|
146
|
+
"file": "path/to/affected/file.ts"
|
|
147
|
+
}
|
|
148
|
+
]
|
|
149
|
+
}
|
|
158
150
|
|
|
159
|
-
|
|
151
|
+
Rules:
|
|
152
|
+
- passed: true if the feature works as expected. false if there are failures.
|
|
153
|
+
- findings: list ALL checks performed, with severity and pass/fail status.
|
|
154
|
+
- If everything works, set passed=true with an empty findings array.
|
|
155
|
+
- If there are failures, set passed=false — the implementer will be sent back to fix them.
|
|
160
156
|
|
|
161
|
-
|
|
162
|
-
- (list each action you took with playwright-cli)
|
|
157
|
+
Also output a human-readable summary:
|
|
163
158
|
|
|
159
|
+
### Status: PASS or FAIL
|
|
160
|
+
### What Was Tested
|
|
164
161
|
### What Worked
|
|
165
|
-
- (list what functioned correctly)
|
|
166
|
-
|
|
167
162
|
### What Failed
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
### Screenshots
|
|
180
|
-
Save screenshots to this directory: ${screenshotDir}
|
|
181
|
-
Use descriptive filenames:
|
|
182
|
-
- \`playwright-cli screenshot --path "${screenshotDir}/01-initial-load.png"\`
|
|
183
|
-
- \`playwright-cli screenshot --path "${screenshotDir}/02-after-action.png"\`
|
|
184
|
-
- \`playwright-cli screenshot --path "${screenshotDir}/03-final-state.png"\`
|
|
185
|
-
|
|
186
|
-
IMPORTANT: Use playwright-cli commands to actually interact with the app.
|
|
187
|
-
Navigate, click, type, submit forms. Verify the feature works as a real user would use it.`;
|
|
188
|
-
log.info(`Verification agent: claude + playwright-cli | Testing live at http://localhost:${port}`);
|
|
189
|
-
// Run the verification agent with timeout and turn limit to prevent hangs
|
|
190
|
-
let agentResult;
|
|
191
|
-
try {
|
|
192
|
-
agentResult = await spawnAgent({
|
|
193
|
-
agent: 'claude',
|
|
194
|
-
model: config.model,
|
|
195
|
-
prompt: verifyPrompt,
|
|
196
|
-
cwd: worktree,
|
|
197
|
-
logFile,
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
finally {
|
|
201
|
-
// Always clean up the app process, even if the agent times out or errors
|
|
202
|
-
log.info('Shutting down app...');
|
|
203
|
-
killProcess(appPid);
|
|
204
|
-
// Close playwright-cli browser sessions
|
|
205
|
-
exec('playwright-cli close-all');
|
|
206
|
-
}
|
|
163
|
+
### Console/Network Errors`;
|
|
164
|
+
log.info(`Verification agent: ${config.agent} + playwright-cli`);
|
|
165
|
+
const agentResult = await spawnAgent({
|
|
166
|
+
agent: config.agent,
|
|
167
|
+
model: config.model,
|
|
168
|
+
prompt: verifyPrompt,
|
|
169
|
+
cwd: worktree,
|
|
170
|
+
logFile,
|
|
171
|
+
});
|
|
172
|
+
// Close any lingering playwright-cli browser sessions
|
|
173
|
+
exec('playwright-cli close-all');
|
|
207
174
|
const verifyOutput = agentResult.output;
|
|
208
|
-
// Check if verification passed based on agent output
|
|
209
175
|
if (/Status:.*FAIL/i.test(verifyOutput)) {
|
|
210
176
|
log.error('Live verification FAILED');
|
|
211
|
-
return { passed: false, output: verifyOutput };
|
|
177
|
+
return { passed: false, skipped: false, output: verifyOutput };
|
|
212
178
|
}
|
|
213
179
|
else if (/Status:.*PASS/i.test(verifyOutput)) {
|
|
214
180
|
log.success('Live verification PASSED');
|
|
215
|
-
return { passed: true, output: verifyOutput };
|
|
181
|
+
return { passed: true, skipped: false, output: verifyOutput };
|
|
216
182
|
}
|
|
217
183
|
else if (agentResult.exitCode === 0) {
|
|
218
184
|
log.success('Verification completed (agent exit 0)');
|
|
219
|
-
return { passed: true, output: verifyOutput };
|
|
185
|
+
return { passed: true, skipped: false, output: verifyOutput };
|
|
220
186
|
}
|
|
221
187
|
else {
|
|
222
188
|
log.warn(`Verification unclear (agent exit ${agentResult.exitCode})`);
|
|
223
|
-
return { passed: false, output: verifyOutput };
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
function killProcess(pid) {
|
|
227
|
-
try {
|
|
228
|
-
// Kill process group (negative pid)
|
|
229
|
-
process.kill(-pid, 'SIGTERM');
|
|
230
|
-
}
|
|
231
|
-
catch {
|
|
232
|
-
try {
|
|
233
|
-
process.kill(pid, 'SIGTERM');
|
|
234
|
-
}
|
|
235
|
-
catch {
|
|
236
|
-
// Process already dead
|
|
237
|
-
}
|
|
189
|
+
return { passed: false, skipped: false, output: verifyOutput };
|
|
238
190
|
}
|
|
239
191
|
}
|
|
240
192
|
//# sourceMappingURL=verify.js.map
|
package/dist/lib/verify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/lib/verify.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/lib/verify.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/worktree.d.ts
CHANGED
package/dist/lib/worktree.js
CHANGED
|
@@ -12,7 +12,7 @@ const ENV_FILES = ['.env', '.env.local', '.env.development', '.env.development.l
|
|
|
12
12
|
* branches from session branch so changes stack across issues.
|
|
13
13
|
*/
|
|
14
14
|
export async function setupWorktree(options) {
|
|
15
|
-
const { issueNum, projectDir, baseBranch, sessionBranch, autoMerge, skipInstall, dryRun } = options;
|
|
15
|
+
const { issueNum, projectDir, baseBranch, sessionBranch, autoMerge, skipInstall, setupCommand, dryRun } = options;
|
|
16
16
|
const branch = `agent/issue-${issueNum}`;
|
|
17
17
|
const worktreesDir = resolve(projectDir, '.worktrees');
|
|
18
18
|
mkdirSync(worktreesDir, { recursive: true });
|
|
@@ -85,6 +85,14 @@ export async function setupWorktree(options) {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
|
+
// Run custom setup command (e.g., Python venv, Ruby bundler, Go modules)
|
|
89
|
+
if (setupCommand) {
|
|
90
|
+
log.info(`Running setup command: ${setupCommand}`);
|
|
91
|
+
const setupResult = exec(setupCommand, { cwd: worktreePath });
|
|
92
|
+
if (setupResult.exitCode !== 0) {
|
|
93
|
+
log.warn(`Setup command failed (exit ${setupResult.exitCode}), continuing anyway...`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
88
96
|
log.info(`Worktree ready at ${worktreePath}`);
|
|
89
97
|
return { path: worktreePath, branch };
|
|
90
98
|
}
|
package/dist/lib/worktree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/lib/worktree.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACpI,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/lib/worktree.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: implementer
|
|
3
3
|
description: Implements GitHub issues by writing code, tests, and committing. The primary coding agent in the loop.
|
|
4
4
|
tools: Read, Write, Edit, Glob, Grep, Bash
|
|
5
|
-
|
|
5
|
+
|
|
6
6
|
skills: testing-patterns, test-robustness, implementation-planning, git-workflow, security-analysis
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: reviewer
|
|
3
3
|
description: Reviews code changes, fixes issues found, and produces a review summary. Runs after implementation.
|
|
4
4
|
tools: Read, Write, Edit, Glob, Grep, Bash
|
|
5
|
-
|
|
5
|
+
|
|
6
6
|
skills: code-review, security-analysis, testing-patterns, test-robustness, api-patterns, docs-sync
|
|
7
7
|
---
|
|
8
8
|
|
package/dist/engine/config.d.ts
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configuration Module
|
|
3
|
-
* ====================
|
|
4
|
-
*
|
|
5
|
-
* Loads and validates .alpha-loop.yaml with per-stage agent/model configuration.
|
|
6
|
-
* Uses Zod for schema validation with sensible defaults.
|
|
7
|
-
*/
|
|
8
|
-
import { z } from 'zod';
|
|
9
|
-
export declare const STAGE_NAMES: readonly ["implement", "fix", "review", "verify", "learn", "aggregate"];
|
|
10
|
-
export type StageName = (typeof STAGE_NAMES)[number];
|
|
11
|
-
export declare const DEFAULT_AGENT = "claude";
|
|
12
|
-
export declare const DEFAULT_MODEL = "opus";
|
|
13
|
-
export declare const AgentConfigSchema: z.ZodObject<{
|
|
14
|
-
agent: z.ZodDefault<z.ZodString>;
|
|
15
|
-
model: z.ZodOptional<z.ZodString>;
|
|
16
|
-
maxTurns: z.ZodOptional<z.ZodNumber>;
|
|
17
|
-
}, z.core.$strip>;
|
|
18
|
-
export type AgentConfig = z.infer<typeof AgentConfigSchema>;
|
|
19
|
-
export declare const ConfigSchema: z.ZodObject<{
|
|
20
|
-
repo: z.ZodString;
|
|
21
|
-
project: z.ZodOptional<z.ZodNumber>;
|
|
22
|
-
model: z.ZodDefault<z.ZodString>;
|
|
23
|
-
review_model: z.ZodOptional<z.ZodString>;
|
|
24
|
-
max_turns: z.ZodOptional<z.ZodNumber>;
|
|
25
|
-
label: z.ZodDefault<z.ZodString>;
|
|
26
|
-
base_branch: z.ZodDefault<z.ZodString>;
|
|
27
|
-
test_command: z.ZodDefault<z.ZodString>;
|
|
28
|
-
poll_interval: z.ZodDefault<z.ZodNumber>;
|
|
29
|
-
stages: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
30
|
-
implement: z.ZodOptional<z.ZodObject<{
|
|
31
|
-
agent: z.ZodDefault<z.ZodString>;
|
|
32
|
-
model: z.ZodOptional<z.ZodString>;
|
|
33
|
-
maxTurns: z.ZodOptional<z.ZodNumber>;
|
|
34
|
-
}, z.core.$strip>>;
|
|
35
|
-
fix: z.ZodOptional<z.ZodObject<{
|
|
36
|
-
agent: z.ZodDefault<z.ZodString>;
|
|
37
|
-
model: z.ZodOptional<z.ZodString>;
|
|
38
|
-
maxTurns: z.ZodOptional<z.ZodNumber>;
|
|
39
|
-
}, z.core.$strip>>;
|
|
40
|
-
review: z.ZodOptional<z.ZodObject<{
|
|
41
|
-
agent: z.ZodDefault<z.ZodString>;
|
|
42
|
-
model: z.ZodOptional<z.ZodString>;
|
|
43
|
-
maxTurns: z.ZodOptional<z.ZodNumber>;
|
|
44
|
-
}, z.core.$strip>>;
|
|
45
|
-
verify: z.ZodOptional<z.ZodObject<{
|
|
46
|
-
agent: z.ZodDefault<z.ZodString>;
|
|
47
|
-
model: z.ZodOptional<z.ZodString>;
|
|
48
|
-
maxTurns: z.ZodOptional<z.ZodNumber>;
|
|
49
|
-
}, z.core.$strip>>;
|
|
50
|
-
learn: z.ZodOptional<z.ZodObject<{
|
|
51
|
-
agent: z.ZodDefault<z.ZodString>;
|
|
52
|
-
model: z.ZodOptional<z.ZodString>;
|
|
53
|
-
maxTurns: z.ZodOptional<z.ZodNumber>;
|
|
54
|
-
}, z.core.$strip>>;
|
|
55
|
-
aggregate: z.ZodOptional<z.ZodObject<{
|
|
56
|
-
agent: z.ZodDefault<z.ZodString>;
|
|
57
|
-
model: z.ZodOptional<z.ZodString>;
|
|
58
|
-
maxTurns: z.ZodOptional<z.ZodNumber>;
|
|
59
|
-
}, z.core.$strip>>;
|
|
60
|
-
}, z.core.$strict>>>;
|
|
61
|
-
}, z.core.$strip>;
|
|
62
|
-
export type Config = z.infer<typeof ConfigSchema>;
|
|
63
|
-
export declare function loadConfig(cwd: string): Config;
|
|
64
|
-
/**
|
|
65
|
-
* Resolves the agent configuration for a given pipeline stage.
|
|
66
|
-
* Merges stage-specific config with global defaults:
|
|
67
|
-
* - agent: stage.agent → 'claude'
|
|
68
|
-
* - model: stage.model → config.model → 'opus'
|
|
69
|
-
* - maxTurns: stage.maxTurns → config.max_turns → undefined
|
|
70
|
-
*/
|
|
71
|
-
export declare function resolveStageConfig(config: Config, stage: StageName): Required<Pick<AgentConfig, 'agent' | 'model'>> & Pick<AgentConfig, 'maxTurns'>;
|
package/dist/engine/config.js
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configuration Module
|
|
3
|
-
* ====================
|
|
4
|
-
*
|
|
5
|
-
* Loads and validates .alpha-loop.yaml with per-stage agent/model configuration.
|
|
6
|
-
* Uses Zod for schema validation with sensible defaults.
|
|
7
|
-
*/
|
|
8
|
-
import { readFileSync } from 'node:fs';
|
|
9
|
-
import { resolve } from 'node:path';
|
|
10
|
-
import { z } from 'zod';
|
|
11
|
-
import { parse as parseYaml } from 'yaml';
|
|
12
|
-
// ============================================================================
|
|
13
|
-
// Constants
|
|
14
|
-
// ============================================================================
|
|
15
|
-
export const STAGE_NAMES = ['implement', 'fix', 'review', 'verify', 'learn', 'aggregate'];
|
|
16
|
-
export const DEFAULT_AGENT = 'claude';
|
|
17
|
-
export const DEFAULT_MODEL = 'opus';
|
|
18
|
-
// ============================================================================
|
|
19
|
-
// Schemas
|
|
20
|
-
// ============================================================================
|
|
21
|
-
export const AgentConfigSchema = z.object({
|
|
22
|
-
agent: z.string().default(DEFAULT_AGENT),
|
|
23
|
-
model: z.string().optional(),
|
|
24
|
-
maxTurns: z.number().optional(),
|
|
25
|
-
});
|
|
26
|
-
const StagesSchema = z.object({
|
|
27
|
-
implement: AgentConfigSchema.optional(),
|
|
28
|
-
fix: AgentConfigSchema.optional(),
|
|
29
|
-
review: AgentConfigSchema.optional(),
|
|
30
|
-
verify: AgentConfigSchema.optional(),
|
|
31
|
-
learn: AgentConfigSchema.optional(),
|
|
32
|
-
aggregate: AgentConfigSchema.optional(),
|
|
33
|
-
}).strict().optional().default({});
|
|
34
|
-
export const ConfigSchema = z.object({
|
|
35
|
-
repo: z.string(),
|
|
36
|
-
project: z.number().optional(),
|
|
37
|
-
model: z.string().default(DEFAULT_MODEL),
|
|
38
|
-
review_model: z.string().optional(),
|
|
39
|
-
max_turns: z.number().optional(),
|
|
40
|
-
label: z.string().default('ready'),
|
|
41
|
-
base_branch: z.string().default('master'),
|
|
42
|
-
test_command: z.string().default('pnpm test'),
|
|
43
|
-
poll_interval: z.number().default(60),
|
|
44
|
-
stages: StagesSchema,
|
|
45
|
-
});
|
|
46
|
-
// ============================================================================
|
|
47
|
-
// Config Loading
|
|
48
|
-
// ============================================================================
|
|
49
|
-
export function loadConfig(cwd) {
|
|
50
|
-
const configPath = resolve(cwd, '.alpha-loop.yaml');
|
|
51
|
-
const raw = readFileSync(configPath, 'utf-8');
|
|
52
|
-
const parsed = parseYaml(raw);
|
|
53
|
-
return ConfigSchema.parse(parsed);
|
|
54
|
-
}
|
|
55
|
-
// ============================================================================
|
|
56
|
-
// Stage Config Resolution
|
|
57
|
-
// ============================================================================
|
|
58
|
-
/**
|
|
59
|
-
* Resolves the agent configuration for a given pipeline stage.
|
|
60
|
-
* Merges stage-specific config with global defaults:
|
|
61
|
-
* - agent: stage.agent → 'claude'
|
|
62
|
-
* - model: stage.model → config.model → 'opus'
|
|
63
|
-
* - maxTurns: stage.maxTurns → config.max_turns → undefined
|
|
64
|
-
*/
|
|
65
|
-
export function resolveStageConfig(config, stage) {
|
|
66
|
-
const stageConfig = config.stages[stage];
|
|
67
|
-
return {
|
|
68
|
-
agent: stageConfig?.agent ?? DEFAULT_AGENT,
|
|
69
|
-
model: stageConfig?.model ?? config.model ?? DEFAULT_MODEL,
|
|
70
|
-
maxTurns: stageConfig?.maxTurns ?? config.max_turns,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
//# sourceMappingURL=config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/engine/config.ts"],"names":[],"mappings":"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"}
|