@bradtaylorsf/alpha-loop 1.0.0 → 1.1.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 +34 -4
- package/dist/cli.js +25 -5
- package/dist/cli.js.map +1 -1
- package/dist/commands/history.js +196 -93
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.js +163 -107
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/resume.d.ts +8 -0
- package/dist/commands/resume.js +391 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/review.d.ts +8 -0
- package/dist/commands/review.js +549 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.js +2 -2
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/scan.d.ts +5 -0
- package/dist/commands/scan.js +129 -0
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/sync.d.ts +27 -3
- package/dist/commands/sync.js +222 -44
- package/dist/commands/sync.js.map +1 -1
- package/dist/lib/agent.d.ts +4 -0
- package/dist/lib/agent.js +43 -11
- package/dist/lib/agent.js.map +1 -1
- package/dist/lib/config.d.ts +1 -0
- package/dist/lib/config.js +2 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/github.d.ts +5 -0
- package/dist/lib/github.js +22 -2
- package/dist/lib/github.js.map +1 -1
- package/dist/lib/pipeline.js +19 -11
- package/dist/lib/pipeline.js.map +1 -1
- package/dist/lib/session.js +25 -5
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/templates.d.ts +16 -0
- package/dist/lib/templates.js +59 -0
- package/dist/lib/templates.js.map +1 -0
- package/dist/lib/verify.js +18 -13
- package/dist/lib/verify.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/init.js
CHANGED
|
@@ -1,48 +1,25 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Init Command — full project onboarding for alpha-loop.
|
|
3
|
+
*
|
|
4
|
+
* Steps:
|
|
5
|
+
* 1. Create config (.alpha-loop.yaml)
|
|
6
|
+
* 2. Set up .gitignore
|
|
7
|
+
* 3. Detect and migrate legacy layout (skills/ at root, .claude/agents/)
|
|
8
|
+
* 4. Seed .alpha-loop/templates/ from distribution (fills gaps only)
|
|
9
|
+
* 5. Install playwright-cli skills (if available)
|
|
10
|
+
* 6. Run vision (interactive, if TTY)
|
|
11
|
+
* 7. Run scan (generates context + instructions)
|
|
12
|
+
* 8. Sync templates to configured harnesses
|
|
13
|
+
* 9. Install GitHub issue template
|
|
14
|
+
* 10. Commit generated files
|
|
15
|
+
*/
|
|
16
|
+
import { existsSync, writeFileSync, readFileSync, readdirSync, copyFileSync, mkdirSync } from 'node:fs';
|
|
2
17
|
import { join } from 'node:path';
|
|
3
|
-
import { detectRepo } from '../lib/config.js';
|
|
18
|
+
import { detectRepo, loadConfig } from '../lib/config.js';
|
|
4
19
|
import { exec } from '../lib/shell.js';
|
|
5
20
|
import { log } from '../lib/logger.js';
|
|
6
|
-
import { syncAgentAssets } from './sync.js';
|
|
7
|
-
|
|
8
|
-
* Find the templates directory shipped with alpha-loop.
|
|
9
|
-
* Works whether running from src/ (tsx) or dist/ (compiled) or as an npm package.
|
|
10
|
-
*/
|
|
11
|
-
function findTemplatesDir() {
|
|
12
|
-
// Walk up from this file's location to find the alpha-loop package root.
|
|
13
|
-
// src/commands/init.ts -> src/ -> package root (has templates/)
|
|
14
|
-
// dist/commands/init.js -> dist/ -> package root (has templates/)
|
|
15
|
-
const scriptDir = typeof __dirname !== 'undefined' ? __dirname : '';
|
|
16
|
-
const candidates = [];
|
|
17
|
-
// Walk up from script location
|
|
18
|
-
if (scriptDir) {
|
|
19
|
-
let dir = scriptDir;
|
|
20
|
-
for (let i = 0; i < 5; i++) {
|
|
21
|
-
candidates.push(join(dir, 'templates'));
|
|
22
|
-
const parent = join(dir, '..');
|
|
23
|
-
if (parent === dir)
|
|
24
|
-
break;
|
|
25
|
-
dir = parent;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
// Also check relative to the entry script (process.argv[1])
|
|
29
|
-
// e.g., npx tsx /path/to/alpha-loop/src/cli.ts → /path/to/alpha-loop/templates
|
|
30
|
-
if (process.argv[1]) {
|
|
31
|
-
let dir = join(process.argv[1], '..');
|
|
32
|
-
for (let i = 0; i < 5; i++) {
|
|
33
|
-
candidates.push(join(dir, 'templates'));
|
|
34
|
-
const parent = join(dir, '..');
|
|
35
|
-
if (parent === dir)
|
|
36
|
-
break;
|
|
37
|
-
dir = parent;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
for (const c of candidates) {
|
|
41
|
-
if (existsSync(c))
|
|
42
|
-
return c;
|
|
43
|
-
}
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
21
|
+
import { syncAgentAssets, migrateToTemplates } from './sync.js';
|
|
22
|
+
import { findDistributionTemplatesDir } from '../lib/templates.js';
|
|
46
23
|
const CONFIG_FILE = '.alpha-loop.yaml';
|
|
47
24
|
const ISSUE_TEMPLATE = `name: Agent-Ready Task
|
|
48
25
|
description: A well-structured task for the automated agent loop to implement
|
|
@@ -115,6 +92,7 @@ body:
|
|
|
115
92
|
function configTemplate(repo) {
|
|
116
93
|
return `# Alpha Loop configuration
|
|
117
94
|
repo: ${repo}
|
|
95
|
+
project: 0 # GitHub Project number (find it in your project URL)
|
|
118
96
|
model: opus
|
|
119
97
|
review_model: opus
|
|
120
98
|
label: ready
|
|
@@ -124,22 +102,57 @@ dev_command: pnpm dev
|
|
|
124
102
|
port: 3000
|
|
125
103
|
auto_merge: true
|
|
126
104
|
|
|
105
|
+
# Coding harnesses to sync skills/agents to
|
|
106
|
+
harnesses:
|
|
107
|
+
- claude-code
|
|
108
|
+
- codex
|
|
109
|
+
|
|
127
110
|
# Safety limits (0 = unlimited)
|
|
128
111
|
max_issues: 20
|
|
129
112
|
max_session_duration: 7200 # 2 hours in seconds
|
|
130
113
|
`;
|
|
131
114
|
}
|
|
132
|
-
/**
|
|
133
|
-
* Copy a directory recursively using the shell (simple and reliable).
|
|
134
|
-
*/
|
|
135
115
|
function copyDir(src, dest) {
|
|
136
116
|
mkdirSync(dest, { recursive: true });
|
|
137
117
|
exec(`cp -R "${src}/"* "${dest}/" 2>/dev/null || true`);
|
|
138
118
|
}
|
|
139
|
-
|
|
140
|
-
|
|
119
|
+
const GITIGNORE_ENTRIES = [
|
|
120
|
+
'# Alpha-loop ephemeral data (not shared)',
|
|
121
|
+
'.alpha-loop/sessions/',
|
|
122
|
+
'.alpha-loop/auth/',
|
|
123
|
+
'.alpha-loop/templates/*.bak',
|
|
124
|
+
'.worktrees/',
|
|
125
|
+
];
|
|
126
|
+
function ensureGitignore() {
|
|
127
|
+
const gitignorePath = '.gitignore';
|
|
128
|
+
let content = existsSync(gitignorePath) ? readFileSync(gitignorePath, 'utf-8') : '';
|
|
129
|
+
let changed = false;
|
|
130
|
+
// Remove old entry that ignored learnings (they should be tracked now)
|
|
131
|
+
if (content.includes('.alpha-loop/learnings/')) {
|
|
132
|
+
content = content
|
|
133
|
+
.split('\n')
|
|
134
|
+
.filter((line) => line.trim() !== '.alpha-loop/learnings/')
|
|
135
|
+
.join('\n');
|
|
136
|
+
changed = true;
|
|
137
|
+
log.info('Removed .alpha-loop/learnings/ from .gitignore (learnings are now tracked)');
|
|
138
|
+
}
|
|
139
|
+
const missing = GITIGNORE_ENTRIES.filter((entry) => !content.includes(entry));
|
|
140
|
+
if (missing.length > 0) {
|
|
141
|
+
const suffix = (content.endsWith('\n') || content === '') ? '' : '\n';
|
|
142
|
+
content += suffix + missing.join('\n') + '\n';
|
|
143
|
+
changed = true;
|
|
144
|
+
}
|
|
145
|
+
if (changed) {
|
|
146
|
+
writeFileSync(gitignorePath, content);
|
|
147
|
+
log.success('Updated .gitignore for alpha-loop');
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
export async function initCommand() {
|
|
151
|
+
const projectDir = process.cwd();
|
|
152
|
+
// --- Step 1: Create config ---
|
|
153
|
+
log.step('Step 1: Configuration');
|
|
141
154
|
if (existsSync(CONFIG_FILE)) {
|
|
142
|
-
log.info(`${CONFIG_FILE} already exists — skipping
|
|
155
|
+
log.info(`${CONFIG_FILE} already exists — skipping`);
|
|
143
156
|
}
|
|
144
157
|
else {
|
|
145
158
|
let repo = detectRepo();
|
|
@@ -153,22 +166,70 @@ export function initCommand() {
|
|
|
153
166
|
writeFileSync(CONFIG_FILE, configTemplate(repo));
|
|
154
167
|
log.success(`Created ${CONFIG_FILE}`);
|
|
155
168
|
}
|
|
156
|
-
//
|
|
157
|
-
|
|
169
|
+
// --- Step 2: Set up .gitignore ---
|
|
170
|
+
log.step('Step 2: Git ignore');
|
|
171
|
+
ensureGitignore();
|
|
172
|
+
// --- Step 3: Detect and migrate legacy layout (before seeding, to preserve user skills) ---
|
|
173
|
+
log.step('Step 3: Legacy migration');
|
|
174
|
+
migrateToTemplates(projectDir);
|
|
175
|
+
// --- Step 4: Seed .alpha-loop/templates/ from distribution (only fills gaps) ---
|
|
176
|
+
log.step('Step 4: Seed templates');
|
|
177
|
+
const distTemplatesDir = findDistributionTemplatesDir();
|
|
178
|
+
const projectTemplatesDir = join(projectDir, '.alpha-loop', 'templates');
|
|
179
|
+
if (distTemplatesDir) {
|
|
180
|
+
// Seed skills
|
|
181
|
+
const distSkills = join(distTemplatesDir, 'skills');
|
|
182
|
+
const projectSkills = join(projectTemplatesDir, 'skills');
|
|
183
|
+
if (existsSync(distSkills)) {
|
|
184
|
+
const skillNames = readdirSync(distSkills, { withFileTypes: true })
|
|
185
|
+
.filter((d) => d.isDirectory()).map((d) => d.name);
|
|
186
|
+
let installed = 0;
|
|
187
|
+
for (const name of skillNames) {
|
|
188
|
+
const dest = join(projectSkills, name);
|
|
189
|
+
if (!existsSync(dest)) {
|
|
190
|
+
copyDir(join(distSkills, name), dest);
|
|
191
|
+
installed++;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (installed > 0) {
|
|
195
|
+
log.success(`Seeded ${installed} skill(s) to .alpha-loop/templates/skills/`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Seed agents
|
|
199
|
+
const distAgents = join(distTemplatesDir, 'agents');
|
|
200
|
+
const projectAgents = join(projectTemplatesDir, 'agents');
|
|
201
|
+
if (existsSync(distAgents)) {
|
|
202
|
+
mkdirSync(projectAgents, { recursive: true });
|
|
203
|
+
const agentFiles = readdirSync(distAgents).filter((f) => f.endsWith('.md'));
|
|
204
|
+
let installed = 0;
|
|
205
|
+
for (const file of agentFiles) {
|
|
206
|
+
const dest = join(projectAgents, file);
|
|
207
|
+
if (!existsSync(dest)) {
|
|
208
|
+
copyFileSync(join(distAgents, file), dest);
|
|
209
|
+
installed++;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (installed > 0) {
|
|
213
|
+
log.success(`Seeded ${installed} agent(s) to .alpha-loop/templates/agents/`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
log.warn('Distribution templates not found — skipping seed');
|
|
219
|
+
}
|
|
220
|
+
// --- Step 5: Install playwright-cli skills ---
|
|
221
|
+
log.step('Step 5: Playwright CLI');
|
|
158
222
|
const which = exec('which playwright-cli');
|
|
159
223
|
if (which.exitCode === 0) {
|
|
160
|
-
log.info('Installing playwright-cli skills...');
|
|
161
224
|
const result = exec('playwright-cli install --skills');
|
|
162
225
|
if (result.exitCode === 0) {
|
|
163
226
|
log.success('Playwright CLI skills installed');
|
|
164
|
-
//
|
|
165
|
-
// Copy to skills/ (source of truth) so our sync propagates to .agents/skills/ too.
|
|
227
|
+
// Copy to templates source of truth
|
|
166
228
|
const installed = join('.claude', 'skills', 'playwright-cli');
|
|
167
|
-
const
|
|
168
|
-
if (existsSync(installed) && !existsSync(
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
log.info('Copied playwright-cli skill to skills/ (source of truth)');
|
|
229
|
+
const dest = join(projectTemplatesDir, 'skills', 'playwright-cli');
|
|
230
|
+
if (existsSync(installed) && !existsSync(dest)) {
|
|
231
|
+
copyDir(installed, dest);
|
|
232
|
+
log.info('Copied playwright-cli skill to .alpha-loop/templates/skills/');
|
|
172
233
|
}
|
|
173
234
|
}
|
|
174
235
|
else {
|
|
@@ -176,66 +237,61 @@ export function initCommand() {
|
|
|
176
237
|
}
|
|
177
238
|
}
|
|
178
239
|
else {
|
|
179
|
-
log.info('playwright-cli not found — skipping
|
|
180
|
-
}
|
|
181
|
-
//
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
const skillNames = exec(`ls "${templateSkills}"`).stdout.trim().split('\n').filter(Boolean);
|
|
189
|
-
let installed = 0;
|
|
190
|
-
for (const name of skillNames) {
|
|
191
|
-
const dest = join('skills', name);
|
|
192
|
-
if (!existsSync(dest)) {
|
|
193
|
-
mkdirSync('skills', { recursive: true });
|
|
194
|
-
copyDir(join(templateSkills, name), dest);
|
|
195
|
-
installed++;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
if (installed > 0) {
|
|
199
|
-
log.success(`Installed ${installed} base skill(s): ${skillNames.filter(n => !existsSync(join('skills', n)) || installed > 0).join(', ')}`);
|
|
200
|
-
}
|
|
240
|
+
log.info('playwright-cli not found — skipping. Install with: npm install -g @playwright/cli@latest');
|
|
241
|
+
}
|
|
242
|
+
// --- Step 6: Vision (interactive) ---
|
|
243
|
+
if (process.stdin.isTTY) {
|
|
244
|
+
const { hasVision } = await import('../lib/vision.js');
|
|
245
|
+
if (!hasVision()) {
|
|
246
|
+
log.step('Step 6: Project vision');
|
|
247
|
+
const { visionCommand } = await import('./vision.js');
|
|
248
|
+
await visionCommand();
|
|
201
249
|
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
const templateAgents = join(templatesDir, 'agents');
|
|
205
|
-
if (existsSync(templateAgents)) {
|
|
206
|
-
const agentFiles = exec(`ls "${templateAgents}"`).stdout.trim().split('\n').filter(Boolean);
|
|
207
|
-
for (const file of agentFiles) {
|
|
208
|
-
// .claude/agents/ for Claude
|
|
209
|
-
const claudeDest = join('.claude', 'agents', file);
|
|
210
|
-
if (!existsSync(claudeDest)) {
|
|
211
|
-
mkdirSync(join('.claude', 'agents'), { recursive: true });
|
|
212
|
-
exec(`cp "${join(templateAgents, file)}" "${claudeDest}"`);
|
|
213
|
-
}
|
|
214
|
-
// .codex/agents/ for Codex (TOML format would be different, but .md works as fallback)
|
|
215
|
-
const codexDest = join('.codex', 'agents', file);
|
|
216
|
-
if (!existsSync(codexDest)) {
|
|
217
|
-
mkdirSync(join('.codex', 'agents'), { recursive: true });
|
|
218
|
-
exec(`cp "${join(templateAgents, file)}" "${codexDest}"`);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
log.success(`Installed agent definitions: ${agentFiles.join(', ')}`);
|
|
250
|
+
else {
|
|
251
|
+
log.step('Step 6: Project vision (already exists)');
|
|
222
252
|
}
|
|
223
253
|
}
|
|
224
254
|
else {
|
|
225
|
-
log.
|
|
255
|
+
log.step('Step 6: Project vision (skipped — non-interactive)');
|
|
226
256
|
}
|
|
227
|
-
//
|
|
257
|
+
// --- Step 7: Scan (context + instructions) ---
|
|
258
|
+
log.step('Step 7: Scan codebase');
|
|
259
|
+
const { scanCommand } = await import('./scan.js');
|
|
260
|
+
scanCommand();
|
|
261
|
+
// --- Step 8: Sync to harnesses ---
|
|
262
|
+
log.step('Step 8: Sync to harnesses');
|
|
263
|
+
const config = loadConfig();
|
|
264
|
+
const harnesses = config.harnesses.length > 0 ? config.harnesses : ['claude-code', 'codex'];
|
|
265
|
+
const syncResult = syncAgentAssets(harnesses);
|
|
266
|
+
if (syncResult.synced) {
|
|
267
|
+
log.success(`Synced templates to ${harnesses.join(', ')}`);
|
|
268
|
+
}
|
|
269
|
+
// --- Step 9: GitHub issue template ---
|
|
270
|
+
log.step('Step 9: Issue template');
|
|
228
271
|
const templateDir = join('.github', 'ISSUE_TEMPLATE');
|
|
229
272
|
const templateFile = join(templateDir, 'agent-ready.yml');
|
|
230
273
|
if (!existsSync(templateFile)) {
|
|
231
274
|
mkdirSync(templateDir, { recursive: true });
|
|
232
275
|
writeFileSync(templateFile, ISSUE_TEMPLATE);
|
|
233
|
-
log.success('Created GitHub issue template
|
|
276
|
+
log.success('Created GitHub issue template');
|
|
234
277
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
278
|
+
else {
|
|
279
|
+
log.info('Issue template already exists');
|
|
280
|
+
}
|
|
281
|
+
// --- Step 10: Commit ---
|
|
282
|
+
log.step('Step 10: Commit generated files');
|
|
283
|
+
const statusResult = exec('git status --porcelain .alpha-loop/ .claude/ .agents/ .codex/ CLAUDE.md AGENTS.md .gitignore .github/');
|
|
284
|
+
if (statusResult.stdout.trim()) {
|
|
285
|
+
exec('git add .alpha-loop/ .claude/ .agents/ .codex/ CLAUDE.md AGENTS.md .gitignore .github/ 2>/dev/null || true');
|
|
286
|
+
const diffCheck = exec('git diff --cached --quiet');
|
|
287
|
+
if (diffCheck.exitCode !== 0) {
|
|
288
|
+
exec('git commit -m "chore: initialize alpha-loop (skills, agents, context, instructions)"');
|
|
289
|
+
log.success('Committed generated files');
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
log.info('No new files to commit');
|
|
239
294
|
}
|
|
295
|
+
log.success('Alpha-loop initialization complete!');
|
|
240
296
|
}
|
|
241
297
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|