@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.
Files changed (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +294 -0
  3. package/agents/implementer.md +30 -0
  4. package/agents/reviewer.md +29 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +57 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/auth.d.ts +1 -0
  9. package/dist/commands/auth.js +89 -0
  10. package/dist/commands/auth.js.map +1 -0
  11. package/dist/commands/history.d.ts +8 -0
  12. package/dist/commands/history.js +185 -0
  13. package/dist/commands/history.js.map +1 -0
  14. package/dist/commands/init.d.ts +1 -0
  15. package/dist/commands/init.js +241 -0
  16. package/dist/commands/init.js.map +1 -0
  17. package/dist/commands/run.d.ts +15 -0
  18. package/dist/commands/run.js +321 -0
  19. package/dist/commands/run.js.map +1 -0
  20. package/dist/commands/scan.d.ts +1 -0
  21. package/dist/commands/scan.js +50 -0
  22. package/dist/commands/scan.js.map +1 -0
  23. package/dist/commands/sync.d.ts +20 -0
  24. package/dist/commands/sync.js +149 -0
  25. package/dist/commands/sync.js.map +1 -0
  26. package/dist/commands/vision.d.ts +1 -0
  27. package/dist/commands/vision.js +194 -0
  28. package/dist/commands/vision.js.map +1 -0
  29. package/dist/engine/agents.d.ts +41 -0
  30. package/dist/engine/agents.js +90 -0
  31. package/dist/engine/agents.js.map +1 -0
  32. package/dist/engine/config.d.ts +71 -0
  33. package/dist/engine/config.js +73 -0
  34. package/dist/engine/config.js.map +1 -0
  35. package/dist/engine/prerequisites.d.ts +34 -0
  36. package/dist/engine/prerequisites.js +90 -0
  37. package/dist/engine/prerequisites.js.map +1 -0
  38. package/dist/lib/agent.d.ts +25 -0
  39. package/dist/lib/agent.js +97 -0
  40. package/dist/lib/agent.js.map +1 -0
  41. package/dist/lib/config.d.ts +35 -0
  42. package/dist/lib/config.js +179 -0
  43. package/dist/lib/config.js.map +1 -0
  44. package/dist/lib/context.d.ts +17 -0
  45. package/dist/lib/context.js +96 -0
  46. package/dist/lib/context.js.map +1 -0
  47. package/dist/lib/github.d.ts +61 -0
  48. package/dist/lib/github.js +313 -0
  49. package/dist/lib/github.js.map +1 -0
  50. package/dist/lib/learning.d.ts +43 -0
  51. package/dist/lib/learning.js +207 -0
  52. package/dist/lib/learning.js.map +1 -0
  53. package/dist/lib/logger.d.ts +9 -0
  54. package/dist/lib/logger.js +28 -0
  55. package/dist/lib/logger.js.map +1 -0
  56. package/dist/lib/pipeline.d.ts +18 -0
  57. package/dist/lib/pipeline.js +456 -0
  58. package/dist/lib/pipeline.js.map +1 -0
  59. package/dist/lib/preflight.d.ts +33 -0
  60. package/dist/lib/preflight.js +123 -0
  61. package/dist/lib/preflight.js.map +1 -0
  62. package/dist/lib/prerequisites.d.ts +12 -0
  63. package/dist/lib/prerequisites.js +54 -0
  64. package/dist/lib/prerequisites.js.map +1 -0
  65. package/dist/lib/prompts.d.ts +44 -0
  66. package/dist/lib/prompts.js +102 -0
  67. package/dist/lib/prompts.js.map +1 -0
  68. package/dist/lib/session.d.ts +28 -0
  69. package/dist/lib/session.js +173 -0
  70. package/dist/lib/session.js.map +1 -0
  71. package/dist/lib/shell.d.ts +32 -0
  72. package/dist/lib/shell.js +95 -0
  73. package/dist/lib/shell.js.map +1 -0
  74. package/dist/lib/testing.d.ts +10 -0
  75. package/dist/lib/testing.js +51 -0
  76. package/dist/lib/testing.js.map +1 -0
  77. package/dist/lib/verify.d.ts +18 -0
  78. package/dist/lib/verify.js +235 -0
  79. package/dist/lib/verify.js.map +1 -0
  80. package/dist/lib/vision.d.ts +9 -0
  81. package/dist/lib/vision.js +21 -0
  82. package/dist/lib/vision.js.map +1 -0
  83. package/dist/lib/worktree.d.ts +29 -0
  84. package/dist/lib/worktree.js +153 -0
  85. package/dist/lib/worktree.js.map +1 -0
  86. package/package.json +63 -0
  87. package/templates/agents/implementer.md +34 -0
  88. package/templates/agents/reviewer.md +48 -0
  89. package/templates/skills/code-review/SKILL.md +58 -0
  90. package/templates/skills/git-workflow/SKILL.md +53 -0
  91. package/templates/skills/implementation-planning/SKILL.md +64 -0
  92. package/templates/skills/security-analysis/SKILL.md +560 -0
  93. package/templates/skills/security-analysis/scripts/security-scanner.sh +227 -0
  94. package/templates/skills/test-robustness/SKILL.md +897 -0
  95. 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>;