ridgeline 0.1.5

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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +137 -0
  3. package/dist/__tests__/cli.test.d.ts +1 -0
  4. package/dist/__tests__/cli.test.js +151 -0
  5. package/dist/__tests__/cli.test.js.map +1 -0
  6. package/dist/__tests__/git.test.d.ts +1 -0
  7. package/dist/__tests__/git.test.js +152 -0
  8. package/dist/__tests__/git.test.js.map +1 -0
  9. package/dist/__tests__/logging.test.d.ts +1 -0
  10. package/dist/__tests__/logging.test.js +119 -0
  11. package/dist/__tests__/logging.test.js.map +1 -0
  12. package/dist/agents/agents/builder.md +99 -0
  13. package/dist/agents/agents/planner.md +87 -0
  14. package/dist/agents/agents/reviewer.md +146 -0
  15. package/dist/agents/builder.md +99 -0
  16. package/dist/agents/planner.md +87 -0
  17. package/dist/agents/reviewer.md +146 -0
  18. package/dist/cli.d.ts +5 -0
  19. package/dist/cli.js +252 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/commands/__tests__/dryRun.test.d.ts +1 -0
  22. package/dist/commands/__tests__/dryRun.test.js +105 -0
  23. package/dist/commands/__tests__/dryRun.test.js.map +1 -0
  24. package/dist/commands/__tests__/init.test.d.ts +1 -0
  25. package/dist/commands/__tests__/init.test.js +99 -0
  26. package/dist/commands/__tests__/init.test.js.map +1 -0
  27. package/dist/commands/__tests__/plan.test.d.ts +1 -0
  28. package/dist/commands/__tests__/plan.test.js +125 -0
  29. package/dist/commands/__tests__/plan.test.js.map +1 -0
  30. package/dist/commands/__tests__/resume.test.d.ts +1 -0
  31. package/dist/commands/__tests__/resume.test.js +141 -0
  32. package/dist/commands/__tests__/resume.test.js.map +1 -0
  33. package/dist/commands/__tests__/run.test.d.ts +1 -0
  34. package/dist/commands/__tests__/run.test.js +157 -0
  35. package/dist/commands/__tests__/run.test.js.map +1 -0
  36. package/dist/commands/dryRun.d.ts +2 -0
  37. package/dist/commands/dryRun.js +81 -0
  38. package/dist/commands/dryRun.js.map +1 -0
  39. package/dist/commands/init.d.ts +1 -0
  40. package/dist/commands/init.js +119 -0
  41. package/dist/commands/init.js.map +1 -0
  42. package/dist/commands/plan.d.ts +2 -0
  43. package/dist/commands/plan.js +78 -0
  44. package/dist/commands/plan.js.map +1 -0
  45. package/dist/commands/resume.d.ts +2 -0
  46. package/dist/commands/resume.js +25 -0
  47. package/dist/commands/resume.js.map +1 -0
  48. package/dist/commands/run.d.ts +2 -0
  49. package/dist/commands/run.js +80 -0
  50. package/dist/commands/run.js.map +1 -0
  51. package/dist/git.d.ts +9 -0
  52. package/dist/git.js +75 -0
  53. package/dist/git.js.map +1 -0
  54. package/dist/logging.d.ts +13 -0
  55. package/dist/logging.js +66 -0
  56. package/dist/logging.js.map +1 -0
  57. package/dist/runner/__tests__/claudeInvoker.test.d.ts +1 -0
  58. package/dist/runner/__tests__/claudeInvoker.test.js +138 -0
  59. package/dist/runner/__tests__/claudeInvoker.test.js.map +1 -0
  60. package/dist/runner/__tests__/phaseRunner.test.d.ts +1 -0
  61. package/dist/runner/__tests__/phaseRunner.test.js +225 -0
  62. package/dist/runner/__tests__/phaseRunner.test.js.map +1 -0
  63. package/dist/runner/__tests__/planInvoker.test.d.ts +1 -0
  64. package/dist/runner/__tests__/planInvoker.test.js +101 -0
  65. package/dist/runner/__tests__/planInvoker.test.js.map +1 -0
  66. package/dist/runner/__tests__/reviewerInvoker.test.d.ts +1 -0
  67. package/dist/runner/__tests__/reviewerInvoker.test.js +90 -0
  68. package/dist/runner/__tests__/reviewerInvoker.test.js.map +1 -0
  69. package/dist/runner/buildInvoker.d.ts +2 -0
  70. package/dist/runner/buildInvoker.js +110 -0
  71. package/dist/runner/buildInvoker.js.map +1 -0
  72. package/dist/runner/claudeInvoker.d.ts +11 -0
  73. package/dist/runner/claudeInvoker.js +135 -0
  74. package/dist/runner/claudeInvoker.js.map +1 -0
  75. package/dist/runner/phaseRunner.d.ts +2 -0
  76. package/dist/runner/phaseRunner.js +145 -0
  77. package/dist/runner/phaseRunner.js.map +1 -0
  78. package/dist/runner/planInvoker.d.ts +6 -0
  79. package/dist/runner/planInvoker.js +117 -0
  80. package/dist/runner/planInvoker.js.map +1 -0
  81. package/dist/runner/reviewerInvoker.d.ts +10 -0
  82. package/dist/runner/reviewerInvoker.js +144 -0
  83. package/dist/runner/reviewerInvoker.js.map +1 -0
  84. package/dist/state/__tests__/budget.test.d.ts +1 -0
  85. package/dist/state/__tests__/budget.test.js +130 -0
  86. package/dist/state/__tests__/budget.test.js.map +1 -0
  87. package/dist/state/__tests__/handoff.test.d.ts +1 -0
  88. package/dist/state/__tests__/handoff.test.js +70 -0
  89. package/dist/state/__tests__/handoff.test.js.map +1 -0
  90. package/dist/state/__tests__/snapshot.test.d.ts +1 -0
  91. package/dist/state/__tests__/snapshot.test.js +105 -0
  92. package/dist/state/__tests__/snapshot.test.js.map +1 -0
  93. package/dist/state/__tests__/stateManager.test.d.ts +1 -0
  94. package/dist/state/__tests__/stateManager.test.js +166 -0
  95. package/dist/state/__tests__/stateManager.test.js.map +1 -0
  96. package/dist/state/budget.d.ts +5 -0
  97. package/dist/state/budget.js +72 -0
  98. package/dist/state/budget.js.map +1 -0
  99. package/dist/state/handoff.d.ts +2 -0
  100. package/dist/state/handoff.js +54 -0
  101. package/dist/state/handoff.js.map +1 -0
  102. package/dist/state/snapshot.d.ts +1 -0
  103. package/dist/state/snapshot.js +154 -0
  104. package/dist/state/snapshot.js.map +1 -0
  105. package/dist/state/stateManager.d.ts +6 -0
  106. package/dist/state/stateManager.js +94 -0
  107. package/dist/state/stateManager.js.map +1 -0
  108. package/dist/types.d.ts +87 -0
  109. package/dist/types.js +3 -0
  110. package/dist/types.js.map +1 -0
  111. package/package.json +34 -0
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const vitest_1 = require("vitest");
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ const setup_1 = require("../../../test/setup");
40
+ vitest_1.vi.mock("../../logging", () => ({
41
+ logInfo: vitest_1.vi.fn(),
42
+ logError: vitest_1.vi.fn(),
43
+ logTrajectory: vitest_1.vi.fn(),
44
+ makeTrajectoryEntry: vitest_1.vi.fn(() => ({
45
+ timestamp: "2024-01-01T00:00:00.000Z",
46
+ type: "plan_start",
47
+ phaseId: null,
48
+ duration: null,
49
+ tokens: null,
50
+ costUsd: null,
51
+ summary: "",
52
+ })),
53
+ }));
54
+ vitest_1.vi.mock("../../state/stateManager", () => ({
55
+ loadState: vitest_1.vi.fn(),
56
+ saveState: vitest_1.vi.fn(),
57
+ initState: vitest_1.vi.fn(),
58
+ getNextIncompletePhase: vitest_1.vi.fn(),
59
+ }));
60
+ vitest_1.vi.mock("../../runner/planInvoker", () => ({
61
+ scanPhases: vitest_1.vi.fn(() => []),
62
+ }));
63
+ vitest_1.vi.mock("../run", () => ({
64
+ runBuild: vitest_1.vi.fn(),
65
+ }));
66
+ const resume_1 = require("../resume");
67
+ const stateManager_1 = require("../../state/stateManager");
68
+ const planInvoker_1 = require("../../runner/planInvoker");
69
+ const run_1 = require("../run");
70
+ (0, vitest_1.describe)("commands/resume", () => {
71
+ let tmpDir;
72
+ let config;
73
+ let origExit;
74
+ (0, vitest_1.beforeEach)(() => {
75
+ vitest_1.vi.clearAllMocks();
76
+ tmpDir = (0, setup_1.makeTempDir)();
77
+ config = {
78
+ buildName: "test",
79
+ buildDir: tmpDir,
80
+ constraintsPath: path.join(tmpDir, "constraints.md"),
81
+ tastePath: null,
82
+ snapshotPath: path.join(tmpDir, "snapshot.md"),
83
+ handoffPath: path.join(tmpDir, "handoff.md"),
84
+ phasesDir: path.join(tmpDir, "phases"),
85
+ model: "opus",
86
+ maxRetries: 2,
87
+ timeoutMinutes: 30,
88
+ verbose: false,
89
+ checkCommand: null,
90
+ maxBudgetUsd: null,
91
+ };
92
+ origExit = process.exit;
93
+ process.exit = vitest_1.vi.fn(() => { throw new Error("process.exit"); });
94
+ });
95
+ (0, vitest_1.afterEach)(() => {
96
+ process.exit = origExit;
97
+ fs.rmSync(tmpDir, { recursive: true, force: true });
98
+ });
99
+ (0, vitest_1.it)("exits when no state found", async () => {
100
+ vitest_1.vi.mocked(stateManager_1.loadState).mockReturnValue(null);
101
+ try {
102
+ await (0, resume_1.runResume)(config);
103
+ }
104
+ catch {
105
+ // process.exit throws
106
+ }
107
+ (0, vitest_1.expect)(process.exit).toHaveBeenCalledWith(1);
108
+ });
109
+ (0, vitest_1.it)("exits when no phase files found", async () => {
110
+ vitest_1.vi.mocked(stateManager_1.loadState).mockReturnValue({
111
+ buildName: "test",
112
+ startedAt: "2024-01-01T00:00:00.000Z",
113
+ phases: [{ id: "01-scaffold", status: "complete", checkpointTag: "", completionTag: "tag", retries: 0, duration: null, completedAt: null, failedAt: null }],
114
+ });
115
+ vitest_1.vi.mocked(planInvoker_1.scanPhases).mockReturnValue([]);
116
+ try {
117
+ await (0, resume_1.runResume)(config);
118
+ }
119
+ catch {
120
+ // process.exit throws
121
+ }
122
+ (0, vitest_1.expect)(process.exit).toHaveBeenCalledWith(1);
123
+ });
124
+ (0, vitest_1.it)("delegates to runBuild when state and phases exist", async () => {
125
+ vitest_1.vi.mocked(stateManager_1.loadState).mockReturnValue({
126
+ buildName: "test",
127
+ startedAt: "2024-01-01T00:00:00.000Z",
128
+ phases: [
129
+ { id: "01-scaffold", status: "complete", checkpointTag: "", completionTag: "tag", retries: 0, duration: null, completedAt: null, failedAt: null },
130
+ { id: "02-api", status: "pending", checkpointTag: "", completionTag: null, retries: 0, duration: null, completedAt: null, failedAt: null },
131
+ ],
132
+ });
133
+ vitest_1.vi.mocked(planInvoker_1.scanPhases).mockReturnValue([
134
+ { id: "01-scaffold", index: 1, slug: "scaffold", filename: "01-scaffold.md", filepath: "/p/01.md" },
135
+ { id: "02-api", index: 2, slug: "api", filename: "02-api.md", filepath: "/p/02.md" },
136
+ ]);
137
+ await (0, resume_1.runResume)(config);
138
+ (0, vitest_1.expect)(run_1.runBuild).toHaveBeenCalledWith(config);
139
+ });
140
+ });
141
+ //# sourceMappingURL=resume.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/resume.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const vitest_1 = require("vitest");
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ const setup_1 = require("../../../test/setup");
40
+ vitest_1.vi.mock("../../logging", () => ({
41
+ logInfo: vitest_1.vi.fn(),
42
+ logError: vitest_1.vi.fn(),
43
+ logTrajectory: vitest_1.vi.fn(),
44
+ makeTrajectoryEntry: vitest_1.vi.fn(() => ({
45
+ timestamp: "2024-01-01T00:00:00.000Z",
46
+ type: "plan_start",
47
+ phaseId: null,
48
+ duration: null,
49
+ tokens: null,
50
+ costUsd: null,
51
+ summary: "",
52
+ })),
53
+ }));
54
+ vitest_1.vi.mock("../../runner/planInvoker", () => ({
55
+ scanPhases: vitest_1.vi.fn(() => []),
56
+ }));
57
+ vitest_1.vi.mock("../../runner/phaseRunner", () => ({
58
+ runPhase: vitest_1.vi.fn(),
59
+ }));
60
+ vitest_1.vi.mock("../../state/stateManager", () => ({
61
+ loadState: vitest_1.vi.fn(() => null),
62
+ saveState: vitest_1.vi.fn(),
63
+ initState: vitest_1.vi.fn((name, phases) => ({
64
+ buildName: name,
65
+ startedAt: "2024-01-01T00:00:00.000Z",
66
+ phases: phases.map((p) => ({
67
+ id: p.id,
68
+ status: "pending",
69
+ checkpointTag: `ridgeline/checkpoint/${name}/${p.id}`,
70
+ completionTag: null,
71
+ retries: 0,
72
+ duration: null,
73
+ completedAt: null,
74
+ failedAt: null,
75
+ })),
76
+ })),
77
+ getNextIncompletePhase: vitest_1.vi.fn(),
78
+ }));
79
+ vitest_1.vi.mock("../../state/budget", () => ({
80
+ getTotalCost: vitest_1.vi.fn(() => 0),
81
+ }));
82
+ vitest_1.vi.mock("../plan", () => ({
83
+ runPlan: vitest_1.vi.fn(),
84
+ }));
85
+ const run_1 = require("../run");
86
+ const planInvoker_1 = require("../../runner/planInvoker");
87
+ const phaseRunner_1 = require("../../runner/phaseRunner");
88
+ const stateManager_1 = require("../../state/stateManager");
89
+ (0, vitest_1.describe)("commands/run", () => {
90
+ let tmpDir;
91
+ let config;
92
+ let origExit;
93
+ (0, vitest_1.beforeEach)(() => {
94
+ vitest_1.vi.clearAllMocks();
95
+ vitest_1.vi.spyOn(console, "log").mockImplementation(() => { });
96
+ tmpDir = (0, setup_1.makeTempDir)();
97
+ config = {
98
+ buildName: "test",
99
+ buildDir: tmpDir,
100
+ constraintsPath: path.join(tmpDir, "constraints.md"),
101
+ tastePath: null,
102
+ snapshotPath: path.join(tmpDir, "snapshot.md"),
103
+ handoffPath: path.join(tmpDir, "handoff.md"),
104
+ phasesDir: path.join(tmpDir, "phases"),
105
+ model: "opus",
106
+ maxRetries: 2,
107
+ timeoutMinutes: 30,
108
+ verbose: false,
109
+ checkCommand: null,
110
+ maxBudgetUsd: null,
111
+ };
112
+ // Mock process.exit to throw instead of exiting
113
+ origExit = process.exit;
114
+ process.exit = vitest_1.vi.fn(() => { throw new Error("process.exit"); });
115
+ });
116
+ (0, vitest_1.afterEach)(() => {
117
+ process.exit = origExit;
118
+ fs.rmSync(tmpDir, { recursive: true, force: true });
119
+ });
120
+ (0, vitest_1.it)("throws when no phases and planner generates none", async () => {
121
+ vitest_1.vi.mocked(planInvoker_1.scanPhases).mockReturnValue([]);
122
+ await (0, vitest_1.expect)((0, run_1.runBuild)(config)).rejects.toThrow("No phases generated");
123
+ });
124
+ (0, vitest_1.it)("runs phases sequentially until all complete", async () => {
125
+ const phases = [
126
+ { id: "01-scaffold", index: 1, slug: "scaffold", filename: "01-scaffold.md", filepath: "/p/01-scaffold.md" },
127
+ { id: "02-api", index: 2, slug: "api", filename: "02-api.md", filepath: "/p/02-api.md" },
128
+ ];
129
+ vitest_1.vi.mocked(planInvoker_1.scanPhases).mockReturnValue(phases);
130
+ vitest_1.vi.mocked(phaseRunner_1.runPhase).mockResolvedValue("passed");
131
+ // Simulate getNextIncompletePhase returning each phase then null
132
+ vitest_1.vi.mocked(stateManager_1.getNextIncompletePhase)
133
+ .mockReturnValueOnce({ id: "01-scaffold", status: "pending", checkpointTag: "", completionTag: null, retries: 0, duration: null, completedAt: null, failedAt: null })
134
+ .mockReturnValueOnce({ id: "02-api", status: "pending", checkpointTag: "", completionTag: null, retries: 0, duration: null, completedAt: null, failedAt: null })
135
+ .mockReturnValueOnce(null);
136
+ await (0, run_1.runBuild)(config);
137
+ (0, vitest_1.expect)(phaseRunner_1.runPhase).toHaveBeenCalledTimes(2);
138
+ });
139
+ (0, vitest_1.it)("halts on first phase failure", async () => {
140
+ const phases = [
141
+ { id: "01-scaffold", index: 1, slug: "scaffold", filename: "01-scaffold.md", filepath: "/p/01-scaffold.md" },
142
+ { id: "02-api", index: 2, slug: "api", filename: "02-api.md", filepath: "/p/02-api.md" },
143
+ ];
144
+ vitest_1.vi.mocked(planInvoker_1.scanPhases).mockReturnValue(phases);
145
+ vitest_1.vi.mocked(phaseRunner_1.runPhase).mockResolvedValue("failed");
146
+ vitest_1.vi.mocked(stateManager_1.getNextIncompletePhase)
147
+ .mockReturnValueOnce({ id: "01-scaffold", status: "pending", checkpointTag: "", completionTag: null, retries: 0, duration: null, completedAt: null, failedAt: null });
148
+ try {
149
+ await (0, run_1.runBuild)(config);
150
+ }
151
+ catch {
152
+ // process.exit throws
153
+ }
154
+ (0, vitest_1.expect)(phaseRunner_1.runPhase).toHaveBeenCalledTimes(1);
155
+ });
156
+ });
157
+ //# sourceMappingURL=run.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/run.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { RidgelineConfig } from "../types";
2
+ export declare const runDryRun: (config: RidgelineConfig) => Promise<void>;
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runDryRun = void 0;
37
+ const fs = __importStar(require("node:fs"));
38
+ const logging_1 = require("../logging");
39
+ const planInvoker_1 = require("../runner/planInvoker");
40
+ const plan_1 = require("./plan");
41
+ const runDryRun = async (config) => {
42
+ let phases = (0, planInvoker_1.scanPhases)(config.phasesDir);
43
+ if (phases.length === 0) {
44
+ (0, logging_1.logInfo)("No phases found. Running planner first...\n");
45
+ await (0, plan_1.runPlan)(config);
46
+ phases = (0, planInvoker_1.scanPhases)(config.phasesDir);
47
+ }
48
+ if (phases.length === 0) {
49
+ throw new Error("No phases generated");
50
+ }
51
+ console.log(`\n${"=".repeat(60)}`);
52
+ console.log(` Build: ${config.buildName}`);
53
+ console.log(` Phases: ${phases.length}`);
54
+ console.log(` Model: ${config.model}`);
55
+ console.log(` Max retries: ${config.maxRetries}`);
56
+ console.log(`${"=".repeat(60)}\n`);
57
+ for (const phase of phases) {
58
+ const content = fs.readFileSync(phase.filepath, "utf-8");
59
+ // Parse phase title
60
+ const titleMatch = content.match(/^#\s+(.+)/m);
61
+ const title = titleMatch ? titleMatch[1] : phase.id;
62
+ // Parse goal section
63
+ const goalMatch = content.match(/## Goal\s*\n([\s\S]*?)(?=\n## |\n$)/);
64
+ const goal = goalMatch ? goalMatch[1].trim() : "";
65
+ // Parse acceptance criteria
66
+ const criteriaMatch = content.match(/## Acceptance Criteria\s*\n([\s\S]*?)(?=\n## |\n$)/);
67
+ const criteria = criteriaMatch ? criteriaMatch[1].trim() : "";
68
+ console.log(`--- ${title} ---`);
69
+ if (goal) {
70
+ console.log(`\nGoal: ${goal.split("\n")[0]}`);
71
+ }
72
+ if (criteria) {
73
+ console.log(`\nAcceptance Criteria:`);
74
+ console.log(criteria);
75
+ }
76
+ console.log("");
77
+ }
78
+ (0, logging_1.logInfo)(`Review the phases above. To execute: ridgeline run ${config.buildName}`);
79
+ };
80
+ exports.runDryRun = runDryRun;
81
+ //# sourceMappingURL=dryRun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dryRun.js","sourceRoot":"","sources":["../../src/commands/dryRun.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA6B;AAE7B,wCAAoC;AACpC,uDAAkD;AAClD,iCAAgC;AAEzB,MAAM,SAAS,GAAG,KAAK,EAAE,MAAuB,EAAiB,EAAE;IACxE,IAAI,MAAM,GAAG,IAAA,wBAAU,EAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAEzC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,IAAA,iBAAO,EAAC,6CAA6C,CAAC,CAAA;QACtD,MAAM,IAAA,cAAO,EAAC,MAAM,CAAC,CAAA;QACrB,MAAM,GAAG,IAAA,wBAAU,EAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACvC,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACxC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IAClC,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;IAC3C,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;IACzC,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;IACvC,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;IAClD,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;IAElC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAExD,oBAAoB;QACpB,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAA;QAEnD,qBAAqB;QACrB,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAA;QACtE,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAEjD,4BAA4B;QAC5B,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAA;QACzF,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAE7D,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,MAAM,CAAC,CAAA;QAC/B,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC/C,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;YACrC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACvB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACjB,CAAC;IAED,IAAA,iBAAO,EAAC,sDAAsD,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;AACnF,CAAC,CAAA;AA/CY,QAAA,SAAS,aA+CrB"}
@@ -0,0 +1 @@
1
+ export declare const runInit: (buildName: string) => Promise<void>;
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runInit = void 0;
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ const node_child_process_1 = require("node:child_process");
40
+ const logging_1 = require("../logging");
41
+ const INIT_SYSTEM_PROMPT = `You are a project setup assistant for Ridgeline, a build harness for long-horizon software execution.
42
+
43
+ Your job is to help the user create the input files for a new build. Walk them through interactively.
44
+
45
+ ## Step 1: spec.md
46
+ Ask the user to describe their feature or project in a few sentences. Then expand it into a structured spec with:
47
+ - A clear title
48
+ - An overview paragraph
49
+ - Features described as outcomes (what the system does), not implementation steps
50
+ - Any constraints or requirements the user mentions
51
+
52
+ Write the result to spec.md in the build directory. Let the user review and suggest edits.
53
+
54
+ ## Step 2: constraints.md
55
+ Ask about their technical setup:
56
+ - Language and runtime (e.g., TypeScript/Node.js, Python, Go, Rust)
57
+ - Framework (e.g., Express, Next.js, FastAPI, none)
58
+ - Directory conventions
59
+ - Naming conventions (camelCase, snake_case, etc.)
60
+ - API style (REST, GraphQL, etc.)
61
+ - Database (if any)
62
+ - Key dependencies
63
+ - A check command that verifies the project builds and tests pass (e.g., "npm run build && npm test")
64
+
65
+ Structure the output as a markdown file with clear sections. Include a "## Check Command" section with the command in a fenced code block.
66
+
67
+ Write to constraints.md in the build directory.
68
+
69
+ ## Step 3: taste.md (optional)
70
+ Ask if they have coding style preferences: commit message format, test patterns, comment style, etc.
71
+ If yes, write to taste.md. If no, skip.
72
+
73
+ Be conversational but efficient. Don't over-explain. Write files using the Write tool.`;
74
+ const runInit = async (buildName) => {
75
+ const ridgelineDir = path.join(process.cwd(), ".ridgeline");
76
+ const buildDir = path.join(ridgelineDir, "builds", buildName);
77
+ const phasesDir = path.join(buildDir, "phases");
78
+ // Create directory structure
79
+ fs.mkdirSync(phasesDir, { recursive: true });
80
+ (0, logging_1.logInfo)(`Created build directory: ${buildDir}`);
81
+ // Check for existing project-level files
82
+ const projectConstraints = path.join(ridgelineDir, "constraints.md");
83
+ const projectTaste = path.join(ridgelineDir, "taste.md");
84
+ let contextHint = "";
85
+ if (fs.existsSync(projectConstraints)) {
86
+ contextHint += `\nNote: Project-level constraints.md exists at ${projectConstraints}. Ask if the user wants to reuse it or create a build-specific override.\n`;
87
+ }
88
+ if (fs.existsSync(projectTaste)) {
89
+ contextHint += `\nNote: Project-level taste.md exists at ${projectTaste}. Ask if the user wants to reuse it or create a build-specific override.\n`;
90
+ }
91
+ const systemPrompt = INIT_SYSTEM_PROMPT + contextHint +
92
+ `\n\nWrite all files to: ${buildDir}/`;
93
+ (0, logging_1.logInfo)("Starting interactive setup session...");
94
+ (0, logging_1.logInfo)("(This requires the claude CLI with an active subscription)\n");
95
+ const proc = (0, node_child_process_1.spawn)("claude", [
96
+ "--system-prompt", systemPrompt,
97
+ "--allowedTools", "Write,Read",
98
+ ], {
99
+ cwd: process.cwd(),
100
+ stdio: "inherit",
101
+ });
102
+ return new Promise((resolve, reject) => {
103
+ proc.on("close", (code) => {
104
+ if (code === 0) {
105
+ (0, logging_1.logInfo)(`\nInit complete. Build files at: ${buildDir}`);
106
+ (0, logging_1.logInfo)(`Next: ridgeline plan ${buildName}`);
107
+ resolve();
108
+ }
109
+ else {
110
+ reject(new Error(`Init session exited with code ${code}`));
111
+ }
112
+ });
113
+ proc.on("error", (err) => {
114
+ reject(new Error(`Failed to start claude CLI: ${err.message}`));
115
+ });
116
+ });
117
+ };
118
+ exports.runInit = runInit;
119
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA6B;AAC7B,gDAAiC;AACjC,2DAA0C;AAC1C,wCAAoC;AAEpC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uFAgC4D,CAAA;AAEhF,MAAM,OAAO,GAAG,KAAK,EAAE,SAAiB,EAAiB,EAAE;IAChE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAA;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAE/C,6BAA6B;IAC7B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5C,IAAA,iBAAO,EAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAA;IAE/C,yCAAyC;IACzC,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAA;IACpE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;IAExD,IAAI,WAAW,GAAG,EAAE,CAAA;IACpB,IAAI,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACtC,WAAW,IAAI,kDAAkD,kBAAkB,4EAA4E,CAAA;IACjK,CAAC;IACD,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,WAAW,IAAI,4CAA4C,YAAY,4EAA4E,CAAA;IACrJ,CAAC;IAED,MAAM,YAAY,GAAG,kBAAkB,GAAG,WAAW;QACnD,2BAA2B,QAAQ,GAAG,CAAA;IAExC,IAAA,iBAAO,EAAC,uCAAuC,CAAC,CAAA;IAChD,IAAA,iBAAO,EAAC,8DAA8D,CAAC,CAAA;IAEvE,MAAM,IAAI,GAAG,IAAA,0BAAK,EAAC,QAAQ,EAAE;QAC3B,iBAAiB,EAAE,YAAY;QAC/B,gBAAgB,EAAE,YAAY;KAC/B,EAAE;QACD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,KAAK,EAAE,SAAS;KACjB,CAAC,CAAA;IAEF,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,IAAA,iBAAO,EAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAA;gBACvD,IAAA,iBAAO,EAAC,wBAAwB,SAAS,EAAE,CAAC,CAAA;gBAC5C,OAAO,EAAE,CAAA;YACX,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC,CAAA;YAC5D,CAAC;QACH,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QACjE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAjDY,QAAA,OAAO,WAiDnB"}
@@ -0,0 +1,2 @@
1
+ import { RidgelineConfig } from "../types";
2
+ export declare const runPlan: (config: RidgelineConfig) => Promise<void>;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runPlan = void 0;
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ const logging_1 = require("../logging");
40
+ const budget_1 = require("../state/budget");
41
+ const snapshot_1 = require("../state/snapshot");
42
+ const planInvoker_1 = require("../runner/planInvoker");
43
+ const runPlan = async (config) => {
44
+ const specPath = path.join(config.buildDir, "spec.md");
45
+ if (!fs.existsSync(specPath)) {
46
+ throw new Error(`spec.md not found at ${specPath}. Run 'ridgeline init ${config.buildName}' first.`);
47
+ }
48
+ if (!fs.existsSync(config.constraintsPath)) {
49
+ throw new Error(`constraints.md not found at ${config.constraintsPath}`);
50
+ }
51
+ // Create phases directory
52
+ fs.mkdirSync(config.phasesDir, { recursive: true });
53
+ // Generate snapshot
54
+ (0, logging_1.logInfo)("Generating codebase snapshot...");
55
+ (0, snapshot_1.generateSnapshot)(process.cwd(), config.buildDir);
56
+ // Run planner
57
+ (0, logging_1.logInfo)("Running planner...");
58
+ (0, logging_1.logTrajectory)(config.buildDir, (0, logging_1.makeTrajectoryEntry)("plan_start", null, "Planning started"));
59
+ const { result, phases } = await (0, planInvoker_1.invokePlanner)(config);
60
+ (0, logging_1.logTrajectory)(config.buildDir, (0, logging_1.makeTrajectoryEntry)("plan_complete", null, `Generated ${phases.length} phases`, {
61
+ duration: result.durationMs,
62
+ tokens: { input: result.usage.inputTokens, output: result.usage.outputTokens },
63
+ costUsd: result.costUsd,
64
+ }));
65
+ (0, budget_1.recordCost)(config.buildDir, "plan", "planner", 0, result);
66
+ // Print summary
67
+ (0, logging_1.logInfo)(`\nPlan complete: ${phases.length} phases generated\n`);
68
+ for (const phase of phases) {
69
+ const content = fs.readFileSync(phase.filepath, "utf-8");
70
+ const titleMatch = content.match(/^#\s+(.+)/m);
71
+ const title = titleMatch ? titleMatch[1] : phase.id;
72
+ (0, logging_1.logInfo)(` ${phase.id}: ${title}`);
73
+ }
74
+ (0, logging_1.logInfo)(`\nCost: $${result.costUsd.toFixed(2)}`);
75
+ (0, logging_1.logInfo)(`\nNext: ridgeline dry-run ${config.buildName}`);
76
+ };
77
+ exports.runPlan = runPlan;
78
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA6B;AAC7B,gDAAiC;AAEjC,wCAAwE;AACxE,4CAA4C;AAC5C,gDAAoD;AACpD,uDAAqD;AAE9C,MAAM,OAAO,GAAG,KAAK,EAAE,MAAuB,EAAiB,EAAE;IACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,yBAAyB,MAAM,CAAC,SAAS,UAAU,CAAC,CAAA;IACtG,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,CAAC,eAAe,EAAE,CAAC,CAAA;IAC1E,CAAC;IAED,0BAA0B;IAC1B,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAEnD,oBAAoB;IACpB,IAAA,iBAAO,EAAC,iCAAiC,CAAC,CAAA;IAC1C,IAAA,2BAAgB,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IAEhD,cAAc;IACd,IAAA,iBAAO,EAAC,oBAAoB,CAAC,CAAA;IAC7B,IAAA,uBAAa,EAAC,MAAM,CAAC,QAAQ,EAAE,IAAA,6BAAmB,EAAC,YAAY,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAE3F,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,2BAAa,EAAC,MAAM,CAAC,CAAA;IAEtD,IAAA,uBAAa,EAAC,MAAM,CAAC,QAAQ,EAAE,IAAA,6BAAmB,EAChD,eAAe,EAAE,IAAI,EAAE,aAAa,MAAM,CAAC,MAAM,SAAS,EAC1D;QACE,QAAQ,EAAE,MAAM,CAAC,UAAU;QAC3B,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE;QAC9E,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CACF,CAAC,CAAA;IAEF,IAAA,mBAAU,EAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;IAEzD,gBAAgB;IAChB,IAAA,iBAAO,EAAC,oBAAoB,MAAM,CAAC,MAAM,qBAAqB,CAAC,CAAA;IAC/D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACxD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAA;QACnD,IAAA,iBAAO,EAAC,KAAK,KAAK,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC,CAAA;IACpC,CAAC;IACD,IAAA,iBAAO,EAAC,YAAY,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAChD,IAAA,iBAAO,EAAC,6BAA6B,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;AAC1D,CAAC,CAAA;AA3CY,QAAA,OAAO,WA2CnB"}
@@ -0,0 +1,2 @@
1
+ import { RidgelineConfig } from "../types";
2
+ export declare const runResume: (config: RidgelineConfig) => Promise<void>;