daedalus-cli 3.67.1 → 3.68.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/AGENTS.md +2 -1
- package/CHANGELOG.md +7 -0
- package/README.md +2 -0
- package/dist/commands/agents.d.ts +2 -1
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +3 -1
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/index.js +1 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/marathon.d.ts +3 -0
- package/dist/commands/marathon.d.ts.map +1 -0
- package/dist/commands/marathon.js +96 -0
- package/dist/commands/marathon.js.map +1 -0
- package/dist/commands/marathon.test.d.ts +2 -0
- package/dist/commands/marathon.test.d.ts.map +1 -0
- package/dist/commands/marathon.test.js +85 -0
- package/dist/commands/marathon.test.js.map +1 -0
- package/dist/marathon/engine.d.ts +29 -0
- package/dist/marathon/engine.d.ts.map +1 -0
- package/dist/marathon/engine.js +212 -0
- package/dist/marathon/engine.js.map +1 -0
- package/dist/marathon/engine.test.d.ts +2 -0
- package/dist/marathon/engine.test.d.ts.map +1 -0
- package/dist/marathon/engine.test.js +80 -0
- package/dist/marathon/engine.test.js.map +1 -0
- package/dist/marathon/evaluator.d.ts +16 -0
- package/dist/marathon/evaluator.d.ts.map +1 -0
- package/dist/marathon/evaluator.js +153 -0
- package/dist/marathon/evaluator.js.map +1 -0
- package/dist/marathon/evaluator.test.d.ts +2 -0
- package/dist/marathon/evaluator.test.d.ts.map +1 -0
- package/dist/marathon/evaluator.test.js +86 -0
- package/dist/marathon/evaluator.test.js.map +1 -0
- package/dist/marathon/git-checkpoint.d.ts +11 -0
- package/dist/marathon/git-checkpoint.d.ts.map +1 -0
- package/dist/marathon/git-checkpoint.js +119 -0
- package/dist/marathon/git-checkpoint.js.map +1 -0
- package/dist/marathon/git-checkpoint.test.d.ts +2 -0
- package/dist/marathon/git-checkpoint.test.d.ts.map +1 -0
- package/dist/marathon/git-checkpoint.test.js +72 -0
- package/dist/marathon/git-checkpoint.test.js.map +1 -0
- package/dist/marathon/planner.d.ts +10 -0
- package/dist/marathon/planner.d.ts.map +1 -0
- package/dist/marathon/planner.js +109 -0
- package/dist/marathon/planner.js.map +1 -0
- package/dist/marathon/planner.test.d.ts +2 -0
- package/dist/marathon/planner.test.d.ts.map +1 -0
- package/dist/marathon/planner.test.js +58 -0
- package/dist/marathon/planner.test.js.map +1 -0
- package/dist/marathon/state.d.ts +12 -0
- package/dist/marathon/state.d.ts.map +1 -0
- package/dist/marathon/state.js +146 -0
- package/dist/marathon/state.js.map +1 -0
- package/dist/marathon/state.test.d.ts +2 -0
- package/dist/marathon/state.test.d.ts.map +1 -0
- package/dist/marathon/state.test.js +83 -0
- package/dist/marathon/state.test.js.map +1 -0
- package/dist/marathon/types.d.ts +54 -0
- package/dist/marathon/types.d.ts.map +1 -0
- package/dist/marathon/types.js +2 -0
- package/dist/marathon/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import os from 'os';
|
|
5
|
+
import { initMarathonRun, loadMarathonRun, updateMilestoneStatus, advanceToNextMilestone, renderRoadmapMarkdown, } from './state.js';
|
|
6
|
+
function createSampleMilestones() {
|
|
7
|
+
return [
|
|
8
|
+
{
|
|
9
|
+
id: 'm-1',
|
|
10
|
+
title: 'Database Setup',
|
|
11
|
+
description: 'Setup SQLite models and migrations',
|
|
12
|
+
targetFiles: ['src/db.ts'],
|
|
13
|
+
acceptanceCriteria: ['Table exists', 'Migration passes'],
|
|
14
|
+
status: 'pending',
|
|
15
|
+
attempts: 0,
|
|
16
|
+
maxAttempts: 3,
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
id: 'm-2',
|
|
20
|
+
title: 'REST API',
|
|
21
|
+
description: 'Implement API routes',
|
|
22
|
+
targetFiles: ['src/api.ts'],
|
|
23
|
+
acceptanceCriteria: ['GET /items returns 200'],
|
|
24
|
+
status: 'pending',
|
|
25
|
+
attempts: 0,
|
|
26
|
+
maxAttempts: 3,
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
describe('Marathon State Management', () => {
|
|
31
|
+
let tmpDir;
|
|
32
|
+
beforeEach(() => {
|
|
33
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'daedalus-marathon-test-'));
|
|
34
|
+
});
|
|
35
|
+
afterEach(() => {
|
|
36
|
+
try {
|
|
37
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Cleanup best effort
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
it('initializes and saves a new marathon run', () => {
|
|
44
|
+
const run = initMarathonRun(tmpDir, 'Build RSS Reader CLI', 'main', createSampleMilestones());
|
|
45
|
+
expect(run.macroGoal).toBe('Build RSS Reader CLI');
|
|
46
|
+
expect(run.milestones.length).toBe(2);
|
|
47
|
+
expect(run.status).toBe('planning');
|
|
48
|
+
const loaded = loadMarathonRun(tmpDir);
|
|
49
|
+
expect(loaded).not.toBeNull();
|
|
50
|
+
expect(loaded?.id).toBe(run.id);
|
|
51
|
+
});
|
|
52
|
+
it('updates milestone status and records timestamps', () => {
|
|
53
|
+
const run = initMarathonRun(tmpDir, 'Test Task', 'main', createSampleMilestones());
|
|
54
|
+
updateMilestoneStatus(run, 'm-1', 'in_progress');
|
|
55
|
+
expect(run.milestones[0].status).toBe('in_progress');
|
|
56
|
+
expect(run.milestones[0].startedAt).toBeDefined();
|
|
57
|
+
updateMilestoneStatus(run, 'm-1', 'passed', { gitTag: 'daedalus-checkpoint/m-1' });
|
|
58
|
+
expect(run.milestones[0].status).toBe('passed');
|
|
59
|
+
expect(run.milestones[0].gitTag).toBe('daedalus-checkpoint/m-1');
|
|
60
|
+
expect(run.milestones[0].completedAt).toBeDefined();
|
|
61
|
+
});
|
|
62
|
+
it('advances to next milestone and completes run on last milestone', () => {
|
|
63
|
+
const run = initMarathonRun(tmpDir, 'Test Task', 'main', createSampleMilestones());
|
|
64
|
+
expect(run.activeMilestoneIndex).toBe(0);
|
|
65
|
+
const advanced = advanceToNextMilestone(run);
|
|
66
|
+
expect(advanced).toBe(true);
|
|
67
|
+
expect(run.activeMilestoneIndex).toBe(1);
|
|
68
|
+
const finished = advanceToNextMilestone(run);
|
|
69
|
+
expect(finished).toBe(false);
|
|
70
|
+
expect(run.status).toBe('completed');
|
|
71
|
+
expect(run.completedAt).toBeDefined();
|
|
72
|
+
});
|
|
73
|
+
it('renders and writes roadmap markdown file', () => {
|
|
74
|
+
const run = initMarathonRun(tmpDir, 'Build RSS Reader CLI', 'main', createSampleMilestones());
|
|
75
|
+
const md = renderRoadmapMarkdown(run);
|
|
76
|
+
expect(md).toContain('# Marathon Roadmap: Build RSS Reader CLI');
|
|
77
|
+
expect(md).toContain('### [ ] M-1: Database Setup');
|
|
78
|
+
expect(md).toContain('### [ ] M-2: REST API');
|
|
79
|
+
const roadmapFile = path.join(tmpDir, 'MARATHON_ROADMAP.md');
|
|
80
|
+
expect(fs.existsSync(roadmapFile)).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=state.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.test.js","sourceRoot":"","sources":["../../src/marathon/state.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export type MarathonStatus = 'planning' | 'running' | 'paused' | 'evaluating' | 'completed' | 'aborted' | 'failed';
|
|
2
|
+
export type MilestoneStatus = 'pending' | 'in_progress' | 'verifying' | 'passed' | 'failed' | 'rolled_back';
|
|
3
|
+
export interface MilestoneCriterionResult {
|
|
4
|
+
criterion: string;
|
|
5
|
+
satisfied: boolean;
|
|
6
|
+
note?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface MarathonEvaluationReport {
|
|
9
|
+
passed: boolean;
|
|
10
|
+
score: number;
|
|
11
|
+
summary: string;
|
|
12
|
+
regressions: string[];
|
|
13
|
+
criteriaResults: MilestoneCriterionResult[];
|
|
14
|
+
repairRecommendations: string[];
|
|
15
|
+
evaluatedAt: string;
|
|
16
|
+
}
|
|
17
|
+
export interface MarathonMilestone {
|
|
18
|
+
id: string;
|
|
19
|
+
title: string;
|
|
20
|
+
description: string;
|
|
21
|
+
targetFiles: string[];
|
|
22
|
+
acceptanceCriteria: string[];
|
|
23
|
+
verifyCommand?: string;
|
|
24
|
+
status: MilestoneStatus;
|
|
25
|
+
gitTag?: string;
|
|
26
|
+
gitCommit?: string;
|
|
27
|
+
attempts: number;
|
|
28
|
+
maxAttempts: number;
|
|
29
|
+
antiPatternIds?: string[];
|
|
30
|
+
evalReport?: MarathonEvaluationReport;
|
|
31
|
+
startedAt?: string;
|
|
32
|
+
completedAt?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface MarathonMetrics {
|
|
35
|
+
totalIterations: number;
|
|
36
|
+
totalRollbacks: number;
|
|
37
|
+
totalEvaluations: number;
|
|
38
|
+
totalTokensUsed?: number;
|
|
39
|
+
}
|
|
40
|
+
export interface MarathonRun {
|
|
41
|
+
id: string;
|
|
42
|
+
macroGoal: string;
|
|
43
|
+
baseBranch: string;
|
|
44
|
+
marathonBranch: string;
|
|
45
|
+
status: MarathonStatus;
|
|
46
|
+
createdAt: string;
|
|
47
|
+
updatedAt: string;
|
|
48
|
+
completedAt?: string;
|
|
49
|
+
activeMilestoneIndex: number;
|
|
50
|
+
milestones: MarathonMilestone[];
|
|
51
|
+
roadmapPath: string;
|
|
52
|
+
metrics: MarathonMetrics;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/marathon/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GACtB,UAAU,GACV,SAAS,GACT,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,SAAS,GACT,QAAQ,CAAC;AAEb,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,aAAa,GACb,WAAW,GACX,QAAQ,GACR,QAAQ,GACR,aAAa,CAAC;AAElB,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,wBAAwB,EAAE,CAAC;IAC5C,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,wBAAwB,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,eAAe,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/marathon/types.ts"],"names":[],"mappings":""}
|