@bradtaylorsf/alpha-loop 1.0.0 → 1.0.1
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 +36 -3
- 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.js +75 -34
- 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 +521 -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/sync.d.ts +25 -3
- package/dist/commands/sync.js +191 -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/verify.js +18 -13
- package/dist/lib/verify.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -52,7 +52,7 @@ alpha-loop run --milestone "v1.0"
|
|
|
52
52
|
|
|
53
53
|
Alpha Loop implements a 12-step pipeline for each issue:
|
|
54
54
|
|
|
55
|
-
1. **Status Update** — Labels issue `in-progress`, updates project board
|
|
55
|
+
1. **Status Update** — Labels issue `in-progress`, assigns to you, updates project board
|
|
56
56
|
2. **Worktree** — Creates an isolated git worktree so work doesn't conflict with other issues
|
|
57
57
|
3. **Plan** — Agent analyzes the issue and enriches it with implementation details
|
|
58
58
|
4. **Implement** — Agent writes the code, guided by project vision, context, and learnings from previous issues
|
|
@@ -97,6 +97,28 @@ Each completed issue produces a learning file in `.alpha-loop/learnings/` with:
|
|
|
97
97
|
|
|
98
98
|
These learnings are automatically fed into future implementation prompts, so the agent gets smarter over time.
|
|
99
99
|
|
|
100
|
+
### Self-Improvement (`alpha-loop review`)
|
|
101
|
+
|
|
102
|
+
Run `alpha-loop review` to trigger the self-improvement loop. It reads all accumulated learnings, computes metrics (success rate, avg retries, common failures), gathers current agent/skill definitions, and asks Claude to propose targeted improvements:
|
|
103
|
+
|
|
104
|
+
- **Agent prompts** — bake in recurring patterns, eliminate anti-patterns
|
|
105
|
+
- **Skill definitions** — add/update skills based on what consistently works or fails
|
|
106
|
+
- **Testing environment** — fix Playwright config, port conflicts, auth state, data seeding issues
|
|
107
|
+
- **Harness configuration** — tune timeouts, retries, and defaults
|
|
108
|
+
|
|
109
|
+
Without `--apply`, proposals are saved to `learnings/proposed-updates/` for review. With `--apply`, changes are written and a draft PR is created.
|
|
110
|
+
|
|
111
|
+
### Crash Recovery (`alpha-loop resume`)
|
|
112
|
+
|
|
113
|
+
If the loop hangs or crashes mid-session, work can be stranded on local branches with no PR. Run `alpha-loop resume` to recover:
|
|
114
|
+
|
|
115
|
+
1. Scans for local `agent/issue-*` branches with commits but no open PR
|
|
116
|
+
2. Pushes each branch to origin
|
|
117
|
+
3. Runs code review
|
|
118
|
+
4. Creates PRs and updates issue status
|
|
119
|
+
|
|
120
|
+
Use `--issue <N>` to resume a specific issue.
|
|
121
|
+
|
|
100
122
|
### Screenshots
|
|
101
123
|
|
|
102
124
|
During live verification, the agent takes screenshots at key states and saves them to `.alpha-loop/sessions/<name>/screenshots/issue-<N>/`. These are kept locally (not committed to git) for debugging.
|
|
@@ -115,7 +137,11 @@ During live verification, the agent takes screenshots at key states and saves th
|
|
|
115
137
|
| `alpha-loop history <name>` | View a specific session |
|
|
116
138
|
| `alpha-loop history <name> --qa` | Show QA checklist for session |
|
|
117
139
|
| `alpha-loop history --clean` | Remove old session data |
|
|
118
|
-
| `alpha-loop sync` | Sync
|
|
140
|
+
| `alpha-loop sync` | Sync templates to configured harnesses (Claude, Codex, Cursor, etc.) |
|
|
141
|
+
| `alpha-loop resume` | Resume stranded work — push branches, review, open PRs |
|
|
142
|
+
| `alpha-loop resume --issue <N>` | Resume a specific issue |
|
|
143
|
+
| `alpha-loop review` | Analyze learnings and propose self-improvements |
|
|
144
|
+
| `alpha-loop review --apply` | Apply proposed improvements and create a draft PR |
|
|
119
145
|
|
|
120
146
|
### Run Options
|
|
121
147
|
|
|
@@ -140,6 +166,7 @@ Running `alpha-loop init` creates a `.alpha-loop.yaml` file:
|
|
|
140
166
|
```yaml
|
|
141
167
|
# Alpha Loop configuration
|
|
142
168
|
repo: owner/repo-name
|
|
169
|
+
project: 0 # GitHub Project number (find it in your project URL)
|
|
143
170
|
model: opus
|
|
144
171
|
review_model: opus
|
|
145
172
|
label: ready
|
|
@@ -159,6 +186,7 @@ max_session_duration: 7200 # 2 hours in seconds
|
|
|
159
186
|
| Key | Default | Description |
|
|
160
187
|
|-----|---------|-------------|
|
|
161
188
|
| `repo` | (auto-detected) | GitHub repo in `owner/name` format |
|
|
189
|
+
| `project` | `0` | GitHub Project number (from URL: `users/<owner>/projects/<N>`) |
|
|
162
190
|
| `model` | `opus` | AI model for implementation and verification |
|
|
163
191
|
| `review_model` | `opus` | AI model for code review and learning extraction |
|
|
164
192
|
| `label` | `ready` | GitHub label that marks issues as ready for the loop |
|
|
@@ -180,6 +208,7 @@ max_session_duration: 7200 # 2 hours in seconds
|
|
|
180
208
|
| `skip_install` | `false` | Skip `pnpm install` in worktrees |
|
|
181
209
|
| `skip_preflight` | `false` | Skip pre-flight test validation |
|
|
182
210
|
| `auto_cleanup` | `true` | Auto-remove worktrees after processing |
|
|
211
|
+
| `harnesses` | `['claude-code', 'codex']` | Coding harnesses to sync skills/agents to |
|
|
183
212
|
|
|
184
213
|
### Environment Variables
|
|
185
214
|
|
|
@@ -188,6 +217,7 @@ All config options can be set via environment variables (uppercase, same names):
|
|
|
188
217
|
| Variable | Config Key |
|
|
189
218
|
|----------|------------|
|
|
190
219
|
| `REPO` | `repo` |
|
|
220
|
+
| `PROJECT` | `project` |
|
|
191
221
|
| `MODEL` | `model` |
|
|
192
222
|
| `REVIEW_MODEL` | `review_model` |
|
|
193
223
|
| `MAX_TEST_RETRIES` | `max_test_retries` |
|
|
@@ -261,8 +291,8 @@ What needs to be done.
|
|
|
261
291
|
|-----------|-------------|---------|
|
|
262
292
|
| `.alpha-loop/vision.md` | Yes | Project vision document |
|
|
263
293
|
| `.alpha-loop/context.md` | Yes | Auto-generated project context |
|
|
264
|
-
| `.alpha-loop/learnings/` | Yes | Learning files
|
|
265
|
-
| `.alpha-loop/sessions/` | No (gitignored) |
|
|
294
|
+
| `.alpha-loop/learnings/` | Yes | Learning files, session manifests, and session summaries (shared with team) |
|
|
295
|
+
| `.alpha-loop/sessions/` | No (gitignored) | Local session logs, results JSON, screenshots |
|
|
266
296
|
| `.alpha-loop/auth/` | No (gitignored) | Saved browser auth state for verification |
|
|
267
297
|
| `.worktrees/` | No (gitignored) | Temporary git worktrees during processing |
|
|
268
298
|
|
package/dist/cli.js
CHANGED
|
@@ -5,11 +5,13 @@ import { historyCommand } from './commands/history.js';
|
|
|
5
5
|
import { scanCommand } from './commands/scan.js';
|
|
6
6
|
import { visionCommand } from './commands/vision.js';
|
|
7
7
|
import { authCommand } from './commands/auth.js';
|
|
8
|
-
import { syncCommand } from './commands/sync.js';
|
|
8
|
+
import { syncCommand, migrateToTemplates, syncAgentAssets } from './commands/sync.js';
|
|
9
|
+
import { loadConfig } from './lib/config.js';
|
|
10
|
+
import { log } from './lib/logger.js';
|
|
9
11
|
program
|
|
10
12
|
.name('alpha-loop')
|
|
11
13
|
.description('Agent-agnostic automated development loop')
|
|
12
|
-
.version('1.0.
|
|
14
|
+
.version('1.0.1');
|
|
13
15
|
program
|
|
14
16
|
.command('init')
|
|
15
17
|
.description('Create .alpha-loop.yaml config template')
|
|
@@ -50,8 +52,39 @@ program
|
|
|
50
52
|
.action(authCommand);
|
|
51
53
|
program
|
|
52
54
|
.command('sync')
|
|
53
|
-
.description('Sync
|
|
55
|
+
.description('Sync .alpha-loop/templates/ to all configured harnesses')
|
|
54
56
|
.option('--check', 'Check for drift without syncing (exits non-zero if drift found)')
|
|
55
57
|
.action(syncCommand);
|
|
58
|
+
program
|
|
59
|
+
.command('migrate')
|
|
60
|
+
.description('Migrate legacy skills/, AGENTS.md, .claude/agents/ into .alpha-loop/templates/')
|
|
61
|
+
.action(() => {
|
|
62
|
+
migrateToTemplates();
|
|
63
|
+
const config = loadConfig();
|
|
64
|
+
if (config.harnesses.length > 0) {
|
|
65
|
+
const result = syncAgentAssets(config.harnesses);
|
|
66
|
+
if (result.synced) {
|
|
67
|
+
log.success('Synced templates to configured harnesses');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
program
|
|
72
|
+
.command('resume')
|
|
73
|
+
.description('Resume stranded work — push branches, run review, open PRs')
|
|
74
|
+
.option('--issue <num>', 'Only resume a specific issue number')
|
|
75
|
+
.option('--session <name>', 'Resume from a specific session directory')
|
|
76
|
+
.action(async (options) => {
|
|
77
|
+
const { resumeCommand } = await import('./commands/resume.js');
|
|
78
|
+
await resumeCommand(options);
|
|
79
|
+
});
|
|
80
|
+
program
|
|
81
|
+
.command('review')
|
|
82
|
+
.description('Analyze accumulated learnings and propose self-improvements to agents, skills, and config')
|
|
83
|
+
.option('--apply', 'Apply proposed changes and open a draft PR')
|
|
84
|
+
.option('--session <name>', 'Only analyze learnings from a specific session')
|
|
85
|
+
.action(async (options) => {
|
|
86
|
+
const { reviewCommand } = await import('./commands/review.js');
|
|
87
|
+
await reviewCommand(options);
|
|
88
|
+
});
|
|
56
89
|
program.parse();
|
|
57
90
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/history.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as fs from 'node:fs';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
|
-
import YAML from 'yaml';
|
|
4
3
|
import { log } from '../lib/logger.js';
|
|
5
4
|
function formatDuration(seconds) {
|
|
6
5
|
if (!seconds || seconds <= 0)
|
|
@@ -12,119 +11,225 @@ function formatDuration(seconds) {
|
|
|
12
11
|
}
|
|
13
12
|
return `${secs}s`;
|
|
14
13
|
}
|
|
15
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Load all result-*.json files from a session directory.
|
|
16
|
+
*/
|
|
17
|
+
function loadResults(sessionDir) {
|
|
18
|
+
const results = [];
|
|
16
19
|
try {
|
|
17
|
-
const
|
|
18
|
-
|
|
20
|
+
const files = fs.readdirSync(sessionDir)
|
|
21
|
+
.filter((f) => f.startsWith('result-') && f.endsWith('.json'))
|
|
22
|
+
.sort();
|
|
23
|
+
for (const file of files) {
|
|
24
|
+
try {
|
|
25
|
+
const content = fs.readFileSync(path.join(sessionDir, file), 'utf-8');
|
|
26
|
+
results.push(JSON.parse(content));
|
|
27
|
+
}
|
|
28
|
+
catch { /* skip invalid */ }
|
|
29
|
+
}
|
|
19
30
|
}
|
|
20
|
-
catch {
|
|
21
|
-
|
|
31
|
+
catch { /* directory not readable */ }
|
|
32
|
+
return results;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Find all session directories under .alpha-loop/sessions/.
|
|
36
|
+
* Handles nested structure: sessions/session/<timestamp>/
|
|
37
|
+
*/
|
|
38
|
+
function findSessionDirs(sessionsRoot) {
|
|
39
|
+
if (!fs.existsSync(sessionsRoot))
|
|
40
|
+
return [];
|
|
41
|
+
const sessions = [];
|
|
42
|
+
for (const group of fs.readdirSync(sessionsRoot, { withFileTypes: true })) {
|
|
43
|
+
if (!group.isDirectory())
|
|
44
|
+
continue;
|
|
45
|
+
const groupDir = path.join(sessionsRoot, group.name);
|
|
46
|
+
for (const entry of fs.readdirSync(groupDir, { withFileTypes: true })) {
|
|
47
|
+
if (!entry.isDirectory())
|
|
48
|
+
continue;
|
|
49
|
+
sessions.push({
|
|
50
|
+
dir: path.join(groupDir, entry.name),
|
|
51
|
+
name: `${group.name}/${entry.name}`,
|
|
52
|
+
timestamp: entry.name,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
22
55
|
}
|
|
56
|
+
// Sort newest first
|
|
57
|
+
sessions.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
|
58
|
+
return sessions;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Load session manifests from the learnings directory (checked into git, shared with team).
|
|
62
|
+
* These are created during session finalization.
|
|
63
|
+
*/
|
|
64
|
+
function loadManifests() {
|
|
65
|
+
const learningsDir = path.join(process.cwd(), '.alpha-loop', 'learnings');
|
|
66
|
+
const manifests = new Map();
|
|
67
|
+
if (!fs.existsSync(learningsDir))
|
|
68
|
+
return manifests;
|
|
69
|
+
for (const file of fs.readdirSync(learningsDir)) {
|
|
70
|
+
if (!file.startsWith('session-') || !file.endsWith('.json'))
|
|
71
|
+
continue;
|
|
72
|
+
try {
|
|
73
|
+
const content = fs.readFileSync(path.join(learningsDir, file), 'utf-8');
|
|
74
|
+
const manifest = JSON.parse(content);
|
|
75
|
+
if (manifest.name) {
|
|
76
|
+
manifests.set(manifest.name, manifest);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch { /* skip invalid */ }
|
|
80
|
+
}
|
|
81
|
+
return manifests;
|
|
23
82
|
}
|
|
24
83
|
export function historyList(sessionsDir) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
84
|
+
const localSessions = findSessionDirs(sessionsDir);
|
|
85
|
+
const manifests = loadManifests();
|
|
86
|
+
// Build a unified list: local sessions + manifests not covered by local data
|
|
87
|
+
const seenNames = new Set(localSessions.map((s) => s.name));
|
|
88
|
+
const entries = [];
|
|
89
|
+
// Add local sessions
|
|
90
|
+
for (const session of localSessions) {
|
|
91
|
+
entries.push({
|
|
92
|
+
name: session.name,
|
|
93
|
+
timestamp: session.timestamp,
|
|
94
|
+
results: loadResults(session.dir),
|
|
95
|
+
source: 'local',
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
// Add manifests that don't have local session directories
|
|
99
|
+
for (const [name, manifest] of manifests) {
|
|
100
|
+
if (seenNames.has(name))
|
|
101
|
+
continue;
|
|
102
|
+
// Extract timestamp from name (e.g., "session/20260401-004637" -> "20260401-004637")
|
|
103
|
+
const ts = name.split('/').pop() ?? name;
|
|
104
|
+
entries.push({
|
|
105
|
+
name,
|
|
106
|
+
timestamp: ts,
|
|
107
|
+
results: manifest.results,
|
|
108
|
+
source: 'manifest',
|
|
109
|
+
});
|
|
28
110
|
}
|
|
29
|
-
|
|
30
|
-
|
|
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);
|
|
111
|
+
// Sort newest first
|
|
112
|
+
entries.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
|
38
113
|
if (entries.length === 0) {
|
|
39
114
|
console.log('No sessions found.');
|
|
40
115
|
return;
|
|
41
116
|
}
|
|
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
117
|
console.log('Sessions:');
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
const
|
|
55
|
-
const
|
|
56
|
-
|
|
118
|
+
console.log('');
|
|
119
|
+
for (const entry of entries) {
|
|
120
|
+
const issueCount = entry.results.length;
|
|
121
|
+
const successCount = entry.results.filter((r) => r.status === 'success').length;
|
|
122
|
+
const failedCount = issueCount - successCount;
|
|
123
|
+
const totalDuration = entry.results.reduce((sum, r) => sum + r.duration, 0);
|
|
124
|
+
const durStr = formatDuration(totalDuration);
|
|
125
|
+
// Parse date from timestamp (YYYYMMDD-HHMMSS)
|
|
126
|
+
const ts = entry.timestamp;
|
|
127
|
+
const date = ts.length >= 8
|
|
128
|
+
? `${ts.slice(0, 4)}-${ts.slice(4, 6)}-${ts.slice(6, 8)}`
|
|
129
|
+
: ts;
|
|
57
130
|
const issueWord = issueCount === 1 ? 'issue' : 'issues';
|
|
58
131
|
let statusParts = '';
|
|
59
132
|
if (successCount > 0)
|
|
60
133
|
statusParts += `${successCount} \u2713`;
|
|
61
134
|
if (failedCount > 0)
|
|
62
135
|
statusParts += ` ${failedCount} \u2717`;
|
|
63
|
-
|
|
136
|
+
if (issueCount === 0)
|
|
137
|
+
statusParts = '(empty)';
|
|
138
|
+
console.log(` ${entry.name.padEnd(30)} ${date} ${String(issueCount).padStart(2)} ${issueWord.padEnd(7)} ${statusParts.padEnd(10)} ${durStr}`);
|
|
64
139
|
}
|
|
65
140
|
}
|
|
66
141
|
export function historyDetail(sessionsDir, sessionName) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
142
|
+
let results = [];
|
|
143
|
+
let sessionDir;
|
|
144
|
+
// Try local session directories first
|
|
145
|
+
const localDir = path.join(sessionsDir, sessionName);
|
|
146
|
+
if (fs.existsSync(localDir)) {
|
|
147
|
+
sessionDir = localDir;
|
|
148
|
+
results = loadResults(localDir);
|
|
72
149
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
150
|
+
else {
|
|
151
|
+
const all = findSessionDirs(sessionsDir);
|
|
152
|
+
const match = all.find((s) => s.name === sessionName || s.timestamp === sessionName);
|
|
153
|
+
if (match) {
|
|
154
|
+
sessionDir = match.dir;
|
|
155
|
+
results = loadResults(match.dir);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Fall back to manifest from learnings (checked-in data from teammates)
|
|
159
|
+
if (results.length === 0) {
|
|
160
|
+
const manifests = loadManifests();
|
|
161
|
+
const manifest = manifests.get(sessionName)
|
|
162
|
+
?? [...manifests.values()].find((m) => m.name.endsWith(sessionName));
|
|
163
|
+
if (manifest) {
|
|
164
|
+
results = manifest.results;
|
|
165
|
+
sessionName = manifest.name;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (results.length === 0) {
|
|
169
|
+
log.error(`Session not found: ${sessionName}`);
|
|
76
170
|
process.exitCode = 1;
|
|
77
171
|
return;
|
|
78
172
|
}
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
console.log(`
|
|
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}`);
|
|
173
|
+
const totalDuration = results.reduce((sum, r) => sum + r.duration, 0);
|
|
174
|
+
const successCount = results.filter((r) => r.status === 'success').length;
|
|
175
|
+
console.log(`Session: ${sessionName}`);
|
|
176
|
+
console.log(`Issues: ${results.length} (${successCount} succeeded, ${results.length - successCount} failed)`);
|
|
177
|
+
console.log(`Duration: ${formatDuration(totalDuration)}`);
|
|
90
178
|
console.log('');
|
|
91
179
|
console.log('Issues:');
|
|
92
|
-
for (const
|
|
93
|
-
|
|
180
|
+
for (const result of results) {
|
|
181
|
+
const symbol = result.status === 'success' ? '\u2713' : '\u2717';
|
|
94
182
|
let statusText;
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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;
|
|
183
|
+
if (result.status === 'success' && result.prUrl) {
|
|
184
|
+
const prNum = result.prUrl.match(/(\d+)$/)?.[1] ?? '';
|
|
185
|
+
statusText = `PR #${prNum}`;
|
|
114
186
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
if (issue.error) {
|
|
118
|
-
line += ` \u2014 ${issue.error}`;
|
|
187
|
+
else if (result.status === 'success') {
|
|
188
|
+
statusText = 'SUCCESS';
|
|
119
189
|
}
|
|
120
|
-
|
|
190
|
+
else {
|
|
191
|
+
statusText = 'FAILED';
|
|
192
|
+
}
|
|
193
|
+
const durStr = formatDuration(result.duration);
|
|
194
|
+
const tests = result.testsPassing ? 'tests \u2713' : 'tests \u2717';
|
|
195
|
+
const verify = result.verifyPassing ? 'verify \u2713' : 'verify \u2717';
|
|
196
|
+
console.log(` ${symbol} #${String(result.issueNum).padEnd(4)} ${result.title}`);
|
|
197
|
+
console.log(` ${statusText.padEnd(12)} ${durStr.padEnd(10)} ${tests} ${verify}`);
|
|
121
198
|
}
|
|
122
199
|
console.log('');
|
|
123
|
-
|
|
124
|
-
|
|
200
|
+
// Show paths to useful files (only available for local sessions)
|
|
201
|
+
if (sessionDir) {
|
|
202
|
+
const logsDir = path.join(sessionDir, 'logs');
|
|
203
|
+
if (fs.existsSync(logsDir)) {
|
|
204
|
+
console.log(`Logs: ${path.relative(process.cwd(), logsDir)}/`);
|
|
205
|
+
}
|
|
206
|
+
const screenshotsDir = path.join(sessionDir, 'screenshots');
|
|
207
|
+
if (fs.existsSync(screenshotsDir)) {
|
|
208
|
+
console.log(`Screenshots: ${path.relative(process.cwd(), screenshotsDir)}/`);
|
|
209
|
+
}
|
|
210
|
+
const qaPath = path.join(sessionDir, 'qa-checklist.md');
|
|
211
|
+
if (fs.existsSync(qaPath)) {
|
|
212
|
+
console.log(`QA Checklist: ${path.relative(process.cwd(), qaPath)}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Check for session summary in learnings
|
|
216
|
+
const learningsDir = path.join(process.cwd(), '.alpha-loop', 'learnings');
|
|
217
|
+
const summaryName = `session-summary-${sessionName.replace(/\//g, '-')}.md`;
|
|
218
|
+
const summaryPath = path.join(learningsDir, summaryName);
|
|
219
|
+
if (fs.existsSync(summaryPath)) {
|
|
220
|
+
console.log(`Summary: ${path.relative(process.cwd(), summaryPath)}`);
|
|
221
|
+
}
|
|
125
222
|
}
|
|
126
223
|
export function historyQa(sessionsDir, sessionName) {
|
|
127
|
-
|
|
224
|
+
// Try exact path, then search
|
|
225
|
+
let qaPath = path.join(sessionsDir, sessionName, 'qa-checklist.md');
|
|
226
|
+
if (!fs.existsSync(qaPath)) {
|
|
227
|
+
const all = findSessionDirs(sessionsDir);
|
|
228
|
+
const match = all.find((s) => s.name === sessionName || s.timestamp === sessionName);
|
|
229
|
+
if (match) {
|
|
230
|
+
qaPath = path.join(match.dir, 'qa-checklist.md');
|
|
231
|
+
}
|
|
232
|
+
}
|
|
128
233
|
if (!fs.existsSync(qaPath)) {
|
|
129
234
|
log.error(`QA checklist not found for session: ${sessionName}`);
|
|
130
235
|
process.exitCode = 1;
|
|
@@ -133,28 +238,26 @@ export function historyQa(sessionsDir, sessionName) {
|
|
|
133
238
|
console.log(fs.readFileSync(qaPath, 'utf-8'));
|
|
134
239
|
}
|
|
135
240
|
export function historyClean(sessionsDir) {
|
|
136
|
-
|
|
241
|
+
const sessions = findSessionDirs(sessionsDir);
|
|
242
|
+
if (sessions.length === 0) {
|
|
137
243
|
console.log('No sessions found.');
|
|
138
244
|
return;
|
|
139
245
|
}
|
|
140
246
|
const RETENTION_DAYS = 30;
|
|
141
247
|
const cutoff = Date.now() - RETENTION_DAYS * 24 * 60 * 60 * 1000;
|
|
142
248
|
let removed = 0;
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
if (!fs.existsSync(yamlPath))
|
|
148
|
-
continue;
|
|
149
|
-
const session = loadSession(yamlPath);
|
|
150
|
-
if (!session?.started)
|
|
249
|
+
for (const session of sessions) {
|
|
250
|
+
// Parse date from timestamp YYYYMMDD-HHMMSS
|
|
251
|
+
const ts = session.timestamp;
|
|
252
|
+
if (ts.length < 8)
|
|
151
253
|
continue;
|
|
152
|
-
const
|
|
254
|
+
const dateStr = `${ts.slice(0, 4)}-${ts.slice(4, 6)}-${ts.slice(6, 8)}`;
|
|
255
|
+
const sessionDate = new Date(dateStr).getTime();
|
|
153
256
|
if (isNaN(sessionDate))
|
|
154
257
|
continue;
|
|
155
258
|
if (sessionDate < cutoff) {
|
|
156
|
-
fs.rmSync(
|
|
157
|
-
console.log(`Removed: ${session.name
|
|
259
|
+
fs.rmSync(session.dir, { recursive: true });
|
|
260
|
+
console.log(`Removed: ${session.name}`);
|
|
158
261
|
removed++;
|
|
159
262
|
}
|
|
160
263
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAUvC,SAAS,cAAc,CAAC,OAA2B;IACjD,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,OAAO,GAAG,EAAE,CAAC;IAC1B,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACb,OAAO,GAAG,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;IACtD,CAAC;IACD,OAAO,GAAG,IAAI,GAAG,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,UAAkB;IACrC,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC;aACrC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aAC7D,IAAI,EAAE,CAAC;QACV,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBACtE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,4BAA4B,CAAC,CAAC;IACxC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,YAAoB;IAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,CAAC;IAE5C,MAAM,QAAQ,GAA4D,EAAE,CAAC;IAE7E,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC1E,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAErD,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACtE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAAE,SAAS;YACnC,QAAQ,CAAC,IAAI,CAAC;gBACZ,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC;gBACpC,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE;gBACnC,SAAS,EAAE,KAAK,CAAC,IAAI;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAChE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa;IACpB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;IACrD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,SAAS,CAAC;IAEnD,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACtE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAoB,CAAC;YACxD,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAClB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,WAAmB;IAC7C,MAAM,aAAa,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAElC,6EAA6E;IAC7E,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAG5D,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,qBAAqB;IACrB,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC;YACjC,MAAM,EAAE,OAAO;SAChB,CAAC,CAAC;IACL,CAAC;IAED,0DAA0D;IAC1D,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;QACzC,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAClC,qFAAqF;QACrF,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC;YACX,IAAI;YACJ,SAAS,EAAE,EAAE;YACb,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,MAAM,EAAE,UAAU;SACnB,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;IACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAE/D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACxC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QAChF,MAAM,WAAW,GAAG,UAAU,GAAG,YAAY,CAAC;QAC9C,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;QAE7C,8CAA8C;QAC9C,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;QAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,IAAI,CAAC;YACzB,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACzD,CAAC,CAAC,EAAE,CAAC;QAEP,MAAM,SAAS,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QACxD,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,YAAY,GAAG,CAAC;YAAE,WAAW,IAAI,GAAG,YAAY,SAAS,CAAC;QAC9D,IAAI,WAAW,GAAG,CAAC;YAAE,WAAW,IAAI,IAAI,WAAW,SAAS,CAAC;QAC7D,IAAI,UAAU,KAAK,CAAC;YAAE,WAAW,GAAG,SAAS,CAAC;QAE9C,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,KAAK,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CACnI,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,WAAmB;IACpE,IAAI,OAAO,GAAqB,EAAE,CAAC;IACnC,IAAI,UAA8B,CAAC;IAEnC,sCAAsC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACrD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,UAAU,GAAG,QAAQ,CAAC;QACtB,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC;QACrF,IAAI,KAAK,EAAE,CAAC;YACV,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC;YACvB,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC;eACtC,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;QACvE,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YAC3B,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,KAAK,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAE1E,OAAO,CAAC,GAAG,CAAC,aAAa,WAAW,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,MAAM,KAAK,YAAY,eAAe,OAAO,CAAC,MAAM,GAAG,YAAY,UAAU,CAAC,CAAC;IAChH,OAAO,CAAC,GAAG,CAAC,aAAa,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QACjE,IAAI,UAAkB,CAAC;QAEvB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtD,UAAU,GAAG,OAAO,KAAK,EAAE,CAAC;QAC9B,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACvC,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,QAAQ,CAAC;QACxB,CAAC;QAED,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC;QACpE,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC;QAExE,OAAO,CAAC,GAAG,CACT,KAAK,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CACpE,CAAC;QACF,OAAO,CAAC,GAAG,CACT,cAAc,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,KAAK,MAAM,EAAE,CAC/E,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,iEAAiE;IACjE,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QACxD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;IAC1E,MAAM,WAAW,GAAG,mBAAmB,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC;IAC5E,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACzD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,WAAmB,EAAE,WAAmB;IAChE,8BAA8B;IAC9B,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;IACpE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC;QACrF,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,KAAK,CAAC,uCAAuC,WAAW,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC9C,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAE9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,MAAM,cAAc,GAAG,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACjE,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,4CAA4C;QAC5C,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;QAC7B,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC5B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACxE,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;QAChD,IAAI,KAAK,CAAC,WAAW,CAAC;YAAE,SAAS;QAEjC,IAAI,WAAW,GAAG,MAAM,EAAE,CAAC;YACzB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACxC,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,cAAc,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAA2B,EAC3B,OAA0C;IAE1C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IAExE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,YAAY,CAAC,WAAW,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YACf,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,OAAO;IACT,CAAC;IAED,WAAW,CAAC,WAAW,CAAC,CAAC;AAC3B,CAAC"}
|