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.
Files changed (62) hide show
  1. package/AGENTS.md +2 -1
  2. package/CHANGELOG.md +7 -0
  3. package/README.md +2 -0
  4. package/dist/commands/agents.d.ts +2 -1
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +3 -1
  7. package/dist/commands/agents.js.map +1 -1
  8. package/dist/commands/index.js +1 -1
  9. package/dist/commands/index.js.map +1 -1
  10. package/dist/commands/marathon.d.ts +3 -0
  11. package/dist/commands/marathon.d.ts.map +1 -0
  12. package/dist/commands/marathon.js +96 -0
  13. package/dist/commands/marathon.js.map +1 -0
  14. package/dist/commands/marathon.test.d.ts +2 -0
  15. package/dist/commands/marathon.test.d.ts.map +1 -0
  16. package/dist/commands/marathon.test.js +85 -0
  17. package/dist/commands/marathon.test.js.map +1 -0
  18. package/dist/marathon/engine.d.ts +29 -0
  19. package/dist/marathon/engine.d.ts.map +1 -0
  20. package/dist/marathon/engine.js +212 -0
  21. package/dist/marathon/engine.js.map +1 -0
  22. package/dist/marathon/engine.test.d.ts +2 -0
  23. package/dist/marathon/engine.test.d.ts.map +1 -0
  24. package/dist/marathon/engine.test.js +80 -0
  25. package/dist/marathon/engine.test.js.map +1 -0
  26. package/dist/marathon/evaluator.d.ts +16 -0
  27. package/dist/marathon/evaluator.d.ts.map +1 -0
  28. package/dist/marathon/evaluator.js +153 -0
  29. package/dist/marathon/evaluator.js.map +1 -0
  30. package/dist/marathon/evaluator.test.d.ts +2 -0
  31. package/dist/marathon/evaluator.test.d.ts.map +1 -0
  32. package/dist/marathon/evaluator.test.js +86 -0
  33. package/dist/marathon/evaluator.test.js.map +1 -0
  34. package/dist/marathon/git-checkpoint.d.ts +11 -0
  35. package/dist/marathon/git-checkpoint.d.ts.map +1 -0
  36. package/dist/marathon/git-checkpoint.js +119 -0
  37. package/dist/marathon/git-checkpoint.js.map +1 -0
  38. package/dist/marathon/git-checkpoint.test.d.ts +2 -0
  39. package/dist/marathon/git-checkpoint.test.d.ts.map +1 -0
  40. package/dist/marathon/git-checkpoint.test.js +72 -0
  41. package/dist/marathon/git-checkpoint.test.js.map +1 -0
  42. package/dist/marathon/planner.d.ts +10 -0
  43. package/dist/marathon/planner.d.ts.map +1 -0
  44. package/dist/marathon/planner.js +109 -0
  45. package/dist/marathon/planner.js.map +1 -0
  46. package/dist/marathon/planner.test.d.ts +2 -0
  47. package/dist/marathon/planner.test.d.ts.map +1 -0
  48. package/dist/marathon/planner.test.js +58 -0
  49. package/dist/marathon/planner.test.js.map +1 -0
  50. package/dist/marathon/state.d.ts +12 -0
  51. package/dist/marathon/state.d.ts.map +1 -0
  52. package/dist/marathon/state.js +146 -0
  53. package/dist/marathon/state.js.map +1 -0
  54. package/dist/marathon/state.test.d.ts +2 -0
  55. package/dist/marathon/state.test.d.ts.map +1 -0
  56. package/dist/marathon/state.test.js +83 -0
  57. package/dist/marathon/state.test.js.map +1 -0
  58. package/dist/marathon/types.d.ts +54 -0
  59. package/dist/marathon/types.d.ts.map +1 -0
  60. package/dist/marathon/types.js +2 -0
  61. package/dist/marathon/types.js.map +1 -0
  62. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/marathon/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "daedalus-cli",
3
- "version": "3.67.1",
3
+ "version": "3.68.0",
4
4
  "description": "Local-first AI coding CLI with embedded model router, multi-agent orchestration, and codebase indexing",
5
5
  "type": "module",
6
6
  "bin": {