@bradtaylorsf/alpha-loop 1.0.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/LICENSE +21 -0
- package/README.md +294 -0
- package/agents/implementer.md +30 -0
- package/agents/reviewer.md +29 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +57 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/auth.d.ts +1 -0
- package/dist/commands/auth.js +89 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/history.d.ts +8 -0
- package/dist/commands/history.js +185 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +241 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/run.d.ts +15 -0
- package/dist/commands/run.js +321 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/scan.d.ts +1 -0
- package/dist/commands/scan.js +50 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/sync.d.ts +20 -0
- package/dist/commands/sync.js +149 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/vision.d.ts +1 -0
- package/dist/commands/vision.js +194 -0
- package/dist/commands/vision.js.map +1 -0
- package/dist/engine/agents.d.ts +41 -0
- package/dist/engine/agents.js +90 -0
- package/dist/engine/agents.js.map +1 -0
- package/dist/engine/config.d.ts +71 -0
- package/dist/engine/config.js +73 -0
- package/dist/engine/config.js.map +1 -0
- package/dist/engine/prerequisites.d.ts +34 -0
- package/dist/engine/prerequisites.js +90 -0
- package/dist/engine/prerequisites.js.map +1 -0
- package/dist/lib/agent.d.ts +25 -0
- package/dist/lib/agent.js +97 -0
- package/dist/lib/agent.js.map +1 -0
- package/dist/lib/config.d.ts +35 -0
- package/dist/lib/config.js +179 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/context.d.ts +17 -0
- package/dist/lib/context.js +96 -0
- package/dist/lib/context.js.map +1 -0
- package/dist/lib/github.d.ts +61 -0
- package/dist/lib/github.js +313 -0
- package/dist/lib/github.js.map +1 -0
- package/dist/lib/learning.d.ts +43 -0
- package/dist/lib/learning.js +207 -0
- package/dist/lib/learning.js.map +1 -0
- package/dist/lib/logger.d.ts +9 -0
- package/dist/lib/logger.js +28 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/pipeline.d.ts +18 -0
- package/dist/lib/pipeline.js +456 -0
- package/dist/lib/pipeline.js.map +1 -0
- package/dist/lib/preflight.d.ts +33 -0
- package/dist/lib/preflight.js +123 -0
- package/dist/lib/preflight.js.map +1 -0
- package/dist/lib/prerequisites.d.ts +12 -0
- package/dist/lib/prerequisites.js +54 -0
- package/dist/lib/prerequisites.js.map +1 -0
- package/dist/lib/prompts.d.ts +44 -0
- package/dist/lib/prompts.js +102 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/session.d.ts +28 -0
- package/dist/lib/session.js +173 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/shell.d.ts +32 -0
- package/dist/lib/shell.js +95 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/testing.d.ts +10 -0
- package/dist/lib/testing.js +51 -0
- package/dist/lib/testing.js.map +1 -0
- package/dist/lib/verify.d.ts +18 -0
- package/dist/lib/verify.js +235 -0
- package/dist/lib/verify.js.map +1 -0
- package/dist/lib/vision.d.ts +9 -0
- package/dist/lib/vision.js +21 -0
- package/dist/lib/vision.js.map +1 -0
- package/dist/lib/worktree.d.ts +29 -0
- package/dist/lib/worktree.js +153 -0
- package/dist/lib/worktree.js.map +1 -0
- package/package.json +63 -0
- package/templates/agents/implementer.md +34 -0
- package/templates/agents/reviewer.md +48 -0
- package/templates/skills/code-review/SKILL.md +58 -0
- package/templates/skills/git-workflow/SKILL.md +53 -0
- package/templates/skills/implementation-planning/SKILL.md +64 -0
- package/templates/skills/security-analysis/SKILL.md +560 -0
- package/templates/skills/security-analysis/scripts/security-scanner.sh +227 -0
- package/templates/skills/test-robustness/SKILL.md +897 -0
- package/templates/skills/testing-patterns/SKILL.md +75 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import YAML from 'yaml';
|
|
4
|
+
import { log } from '../lib/logger.js';
|
|
5
|
+
function formatDuration(seconds) {
|
|
6
|
+
if (!seconds || seconds <= 0)
|
|
7
|
+
return '';
|
|
8
|
+
const mins = Math.floor(seconds / 60);
|
|
9
|
+
const secs = seconds % 60;
|
|
10
|
+
if (mins > 0) {
|
|
11
|
+
return `${mins}m ${String(secs).padStart(2, '0')}s`;
|
|
12
|
+
}
|
|
13
|
+
return `${secs}s`;
|
|
14
|
+
}
|
|
15
|
+
function loadSession(yamlPath) {
|
|
16
|
+
try {
|
|
17
|
+
const raw = fs.readFileSync(yamlPath, 'utf-8');
|
|
18
|
+
return YAML.parse(raw);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function historyList(sessionsDir) {
|
|
25
|
+
if (!fs.existsSync(sessionsDir)) {
|
|
26
|
+
console.log('No sessions found.');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const entries = fs.readdirSync(sessionsDir, { withFileTypes: true })
|
|
30
|
+
.filter((d) => d.isDirectory())
|
|
31
|
+
.map((d) => {
|
|
32
|
+
const yamlPath = path.join(sessionsDir, d.name, 'session.yaml');
|
|
33
|
+
if (!fs.existsSync(yamlPath))
|
|
34
|
+
return null;
|
|
35
|
+
return { dir: d.name, session: loadSession(yamlPath) };
|
|
36
|
+
})
|
|
37
|
+
.filter((e) => e !== null && e.session !== null);
|
|
38
|
+
if (entries.length === 0) {
|
|
39
|
+
console.log('No sessions found.');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// Sort by date descending
|
|
43
|
+
entries.sort((a, b) => {
|
|
44
|
+
const da = a.session.started ?? '';
|
|
45
|
+
const db = b.session.started ?? '';
|
|
46
|
+
return db.localeCompare(da);
|
|
47
|
+
});
|
|
48
|
+
console.log('Sessions:');
|
|
49
|
+
for (const { session } of entries) {
|
|
50
|
+
const name = session.name ?? 'unknown';
|
|
51
|
+
const date = (session.started ?? '????-??-??').slice(0, 10);
|
|
52
|
+
const issues = session.issues ?? [];
|
|
53
|
+
const issueCount = issues.length;
|
|
54
|
+
const successCount = issues.filter((i) => i.status === 'success').length;
|
|
55
|
+
const failedCount = issues.filter((i) => i.status === 'failed').length;
|
|
56
|
+
const durStr = formatDuration(session.duration);
|
|
57
|
+
const issueWord = issueCount === 1 ? 'issue' : 'issues';
|
|
58
|
+
let statusParts = '';
|
|
59
|
+
if (successCount > 0)
|
|
60
|
+
statusParts += `${successCount} \u2713`;
|
|
61
|
+
if (failedCount > 0)
|
|
62
|
+
statusParts += ` ${failedCount} \u2717`;
|
|
63
|
+
console.log(` ${name.padEnd(30)} ${date} ${issueCount} ${issueWord.padEnd(7)} ${statusParts.padEnd(10)} ${durStr}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export function historyDetail(sessionsDir, sessionName) {
|
|
67
|
+
const yamlPath = path.join(sessionsDir, sessionName, 'session.yaml');
|
|
68
|
+
if (!fs.existsSync(yamlPath)) {
|
|
69
|
+
log.error(`Session not found: ${sessionName}`);
|
|
70
|
+
process.exitCode = 1;
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const session = loadSession(yamlPath);
|
|
74
|
+
if (!session) {
|
|
75
|
+
log.error(`Could not parse session: ${sessionName}`);
|
|
76
|
+
process.exitCode = 1;
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const dateDisplay = session.started
|
|
80
|
+
? `${session.started.slice(0, 10)} ${session.started.slice(11, 16)}`
|
|
81
|
+
: '????-??-??';
|
|
82
|
+
const durStr = formatDuration(session.duration);
|
|
83
|
+
console.log(`Session: ${session.name ?? sessionName}`);
|
|
84
|
+
console.log(`Date: ${dateDisplay}`);
|
|
85
|
+
if (session.repo)
|
|
86
|
+
console.log(`Repo: ${session.repo}`);
|
|
87
|
+
if (session.model)
|
|
88
|
+
console.log(`Model: ${session.model}`);
|
|
89
|
+
console.log(`Duration: ${durStr}`);
|
|
90
|
+
console.log('');
|
|
91
|
+
console.log('Issues:');
|
|
92
|
+
for (const issue of session.issues ?? []) {
|
|
93
|
+
let symbol;
|
|
94
|
+
let statusText;
|
|
95
|
+
switch (issue.status) {
|
|
96
|
+
case 'success':
|
|
97
|
+
symbol = '\u2713';
|
|
98
|
+
if (issue.pr_url) {
|
|
99
|
+
const prNum = issue.pr_url.match(/(\d+)$/)?.[1] ?? '';
|
|
100
|
+
statusText = `PR #${prNum}`;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
statusText = 'SUCCESS';
|
|
104
|
+
}
|
|
105
|
+
break;
|
|
106
|
+
case 'failed':
|
|
107
|
+
symbol = '\u2717';
|
|
108
|
+
statusText = 'FAILED';
|
|
109
|
+
break;
|
|
110
|
+
default:
|
|
111
|
+
symbol = '\u2298';
|
|
112
|
+
statusText = 'SKIPPED';
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
const issueDur = formatDuration(issue.duration);
|
|
116
|
+
let line = ` ${symbol} #${String(issue.number).padEnd(4)} ${statusText.padEnd(9)} (${issueDur})`;
|
|
117
|
+
if (issue.error) {
|
|
118
|
+
line += ` \u2014 ${issue.error}`;
|
|
119
|
+
}
|
|
120
|
+
console.log(line);
|
|
121
|
+
}
|
|
122
|
+
console.log('');
|
|
123
|
+
console.log(`QA Checklist: .alpha-loop/sessions/${sessionName}/qa-checklist.md`);
|
|
124
|
+
console.log(`Logs: .alpha-loop/sessions/${sessionName}/logs/`);
|
|
125
|
+
}
|
|
126
|
+
export function historyQa(sessionsDir, sessionName) {
|
|
127
|
+
const qaPath = path.join(sessionsDir, sessionName, 'qa-checklist.md');
|
|
128
|
+
if (!fs.existsSync(qaPath)) {
|
|
129
|
+
log.error(`QA checklist not found for session: ${sessionName}`);
|
|
130
|
+
process.exitCode = 1;
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
console.log(fs.readFileSync(qaPath, 'utf-8'));
|
|
134
|
+
}
|
|
135
|
+
export function historyClean(sessionsDir) {
|
|
136
|
+
if (!fs.existsSync(sessionsDir)) {
|
|
137
|
+
console.log('No sessions found.');
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const RETENTION_DAYS = 30;
|
|
141
|
+
const cutoff = Date.now() - RETENTION_DAYS * 24 * 60 * 60 * 1000;
|
|
142
|
+
let removed = 0;
|
|
143
|
+
const entries = fs.readdirSync(sessionsDir, { withFileTypes: true })
|
|
144
|
+
.filter((d) => d.isDirectory());
|
|
145
|
+
for (const entry of entries) {
|
|
146
|
+
const yamlPath = path.join(sessionsDir, entry.name, 'session.yaml');
|
|
147
|
+
if (!fs.existsSync(yamlPath))
|
|
148
|
+
continue;
|
|
149
|
+
const session = loadSession(yamlPath);
|
|
150
|
+
if (!session?.started)
|
|
151
|
+
continue;
|
|
152
|
+
const sessionDate = new Date(session.started).getTime();
|
|
153
|
+
if (isNaN(sessionDate))
|
|
154
|
+
continue;
|
|
155
|
+
if (sessionDate < cutoff) {
|
|
156
|
+
fs.rmSync(path.join(sessionsDir, entry.name), { recursive: true });
|
|
157
|
+
console.log(`Removed: ${session.name ?? entry.name}`);
|
|
158
|
+
removed++;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (removed === 0) {
|
|
162
|
+
console.log('No sessions older than 30 days found.');
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
console.log(`Removed ${removed} session(s).`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
export function historyCommand(session, options) {
|
|
169
|
+
const sessionsDir = path.join(process.cwd(), '.alpha-loop', 'sessions');
|
|
170
|
+
if (options.clean) {
|
|
171
|
+
historyClean(sessionsDir);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (session) {
|
|
175
|
+
if (options.qa) {
|
|
176
|
+
historyQa(sessionsDir, session);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
historyDetail(sessionsDir, session);
|
|
180
|
+
}
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
historyList(sessionsDir);
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function initCommand(): void;
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { existsSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { detectRepo } from '../lib/config.js';
|
|
4
|
+
import { exec } from '../lib/shell.js';
|
|
5
|
+
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
|
+
}
|
|
46
|
+
const CONFIG_FILE = '.alpha-loop.yaml';
|
|
47
|
+
const ISSUE_TEMPLATE = `name: Agent-Ready Task
|
|
48
|
+
description: A well-structured task for the automated agent loop to implement
|
|
49
|
+
title: ""
|
|
50
|
+
labels: ["ready"]
|
|
51
|
+
body:
|
|
52
|
+
- type: markdown
|
|
53
|
+
attributes:
|
|
54
|
+
value: |
|
|
55
|
+
This template creates issues that the automated agent loop can pick up and implement.
|
|
56
|
+
Be specific -- the agent will use these fields to plan, implement, and verify.
|
|
57
|
+
|
|
58
|
+
- type: textarea
|
|
59
|
+
id: description
|
|
60
|
+
attributes:
|
|
61
|
+
label: Description
|
|
62
|
+
description: Clear description of what needs to be done
|
|
63
|
+
placeholder: Describe the change, feature, or fix...
|
|
64
|
+
validations:
|
|
65
|
+
required: true
|
|
66
|
+
|
|
67
|
+
- type: textarea
|
|
68
|
+
id: acceptance-criteria
|
|
69
|
+
attributes:
|
|
70
|
+
label: Acceptance Criteria
|
|
71
|
+
description: Specific, testable criteria that define "done"
|
|
72
|
+
placeholder: |
|
|
73
|
+
- [ ] Criterion 1
|
|
74
|
+
- [ ] Criterion 2
|
|
75
|
+
- [ ] Criterion 3
|
|
76
|
+
validations:
|
|
77
|
+
required: true
|
|
78
|
+
|
|
79
|
+
- type: textarea
|
|
80
|
+
id: test-requirements
|
|
81
|
+
attributes:
|
|
82
|
+
label: Test Requirements
|
|
83
|
+
description: What tests should be written or updated?
|
|
84
|
+
placeholder: |
|
|
85
|
+
- Unit tests for...
|
|
86
|
+
- E2E test for...
|
|
87
|
+
|
|
88
|
+
- type: textarea
|
|
89
|
+
id: affected-files
|
|
90
|
+
attributes:
|
|
91
|
+
label: Affected Files/Areas
|
|
92
|
+
description: Known files or areas of the codebase that will be touched
|
|
93
|
+
placeholder: |
|
|
94
|
+
- src/...
|
|
95
|
+
- tests/...
|
|
96
|
+
|
|
97
|
+
- type: dropdown
|
|
98
|
+
id: complexity
|
|
99
|
+
attributes:
|
|
100
|
+
label: Complexity
|
|
101
|
+
options:
|
|
102
|
+
- trivial (< 30 min)
|
|
103
|
+
- small (1-2 hours)
|
|
104
|
+
- medium (half day)
|
|
105
|
+
- large (full day)
|
|
106
|
+
validations:
|
|
107
|
+
required: true
|
|
108
|
+
|
|
109
|
+
- type: textarea
|
|
110
|
+
id: context
|
|
111
|
+
attributes:
|
|
112
|
+
label: Additional Context
|
|
113
|
+
description: Any background, constraints, or references the agent should know
|
|
114
|
+
`;
|
|
115
|
+
function configTemplate(repo) {
|
|
116
|
+
return `# Alpha Loop configuration
|
|
117
|
+
repo: ${repo}
|
|
118
|
+
model: opus
|
|
119
|
+
review_model: opus
|
|
120
|
+
label: ready
|
|
121
|
+
base_branch: main
|
|
122
|
+
test_command: pnpm test
|
|
123
|
+
dev_command: pnpm dev
|
|
124
|
+
port: 3000
|
|
125
|
+
auto_merge: true
|
|
126
|
+
|
|
127
|
+
# Safety limits (0 = unlimited)
|
|
128
|
+
max_issues: 20
|
|
129
|
+
max_session_duration: 7200 # 2 hours in seconds
|
|
130
|
+
`;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Copy a directory recursively using the shell (simple and reliable).
|
|
134
|
+
*/
|
|
135
|
+
function copyDir(src, dest) {
|
|
136
|
+
mkdirSync(dest, { recursive: true });
|
|
137
|
+
exec(`cp -R "${src}/"* "${dest}/" 2>/dev/null || true`);
|
|
138
|
+
}
|
|
139
|
+
export function initCommand() {
|
|
140
|
+
// Create config if it doesn't exist
|
|
141
|
+
if (existsSync(CONFIG_FILE)) {
|
|
142
|
+
log.info(`${CONFIG_FILE} already exists — skipping config creation`);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
let repo = detectRepo();
|
|
146
|
+
if (repo) {
|
|
147
|
+
log.success(`Auto-detected repo: ${repo}`);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
repo = 'owner/repo';
|
|
151
|
+
log.warn('Could not auto-detect repo from git remote. Using placeholder.');
|
|
152
|
+
}
|
|
153
|
+
writeFileSync(CONFIG_FILE, configTemplate(repo));
|
|
154
|
+
log.success(`Created ${CONFIG_FILE}`);
|
|
155
|
+
}
|
|
156
|
+
// Everything below is idempotent — safe to re-run
|
|
157
|
+
// Install playwright-cli skills if playwright-cli is available
|
|
158
|
+
const which = exec('which playwright-cli');
|
|
159
|
+
if (which.exitCode === 0) {
|
|
160
|
+
log.info('Installing playwright-cli skills...');
|
|
161
|
+
const result = exec('playwright-cli install --skills');
|
|
162
|
+
if (result.exitCode === 0) {
|
|
163
|
+
log.success('Playwright CLI skills installed');
|
|
164
|
+
// playwright-cli installs to .claude/skills/ only.
|
|
165
|
+
// Copy to skills/ (source of truth) so our sync propagates to .agents/skills/ too.
|
|
166
|
+
const installed = join('.claude', 'skills', 'playwright-cli');
|
|
167
|
+
const sourceOfTruth = join('skills', 'playwright-cli');
|
|
168
|
+
if (existsSync(installed) && !existsSync(sourceOfTruth)) {
|
|
169
|
+
mkdirSync('skills', { recursive: true });
|
|
170
|
+
copyDir(installed, sourceOfTruth);
|
|
171
|
+
log.info('Copied playwright-cli skill to skills/ (source of truth)');
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
log.warn('Could not install playwright-cli skills');
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
log.info('playwright-cli not found — skipping skill install. Install with: npm install -g @playwright/cli@latest');
|
|
180
|
+
}
|
|
181
|
+
// Install base skills and agents from alpha-loop's templates
|
|
182
|
+
// These are the universal skills every project needs for the loop to work well
|
|
183
|
+
const templatesDir = findTemplatesDir();
|
|
184
|
+
if (templatesDir) {
|
|
185
|
+
// Install skills to skills/ (source of truth)
|
|
186
|
+
const templateSkills = join(templatesDir, 'skills');
|
|
187
|
+
if (existsSync(templateSkills)) {
|
|
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
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Install agents to agents/ (will be synced by AGENTS.md convention)
|
|
203
|
+
// Also install directly to .claude/agents/ and .codex/agents/ for immediate use
|
|
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(', ')}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
log.warn('Templates directory not found — skipping base skills/agents install');
|
|
226
|
+
}
|
|
227
|
+
// Install GitHub issue template for structured agent-ready issues
|
|
228
|
+
const templateDir = join('.github', 'ISSUE_TEMPLATE');
|
|
229
|
+
const templateFile = join(templateDir, 'agent-ready.yml');
|
|
230
|
+
if (!existsSync(templateFile)) {
|
|
231
|
+
mkdirSync(templateDir, { recursive: true });
|
|
232
|
+
writeFileSync(templateFile, ISSUE_TEMPLATE);
|
|
233
|
+
log.success('Created GitHub issue template: .github/ISSUE_TEMPLATE/agent-ready.yml');
|
|
234
|
+
}
|
|
235
|
+
// Sync agent assets so skills land in both .claude/skills/ and .agents/skills/
|
|
236
|
+
const syncResult = syncAgentAssets();
|
|
237
|
+
if (syncResult.synced) {
|
|
238
|
+
log.success('Agent assets synced across .claude/ and .agents/');
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type RunOptions = {
|
|
2
|
+
dryRun?: boolean;
|
|
3
|
+
model?: string;
|
|
4
|
+
milestone?: string;
|
|
5
|
+
skipTests?: boolean;
|
|
6
|
+
skipReview?: boolean;
|
|
7
|
+
skipLearn?: boolean;
|
|
8
|
+
autoMerge?: boolean;
|
|
9
|
+
mergeTo?: string;
|
|
10
|
+
verbose?: boolean;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Run the main loop: poll for issues, process them, finalize session.
|
|
14
|
+
*/
|
|
15
|
+
export declare function runCommand(options: RunOptions): Promise<void>;
|