@specforge/mcp 2.6.0 → 3.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.
Files changed (240) hide show
  1. package/README.md +73 -0
  2. package/bin/{specforge-mcp → specforge} +0 -5
  3. package/dist/ai-provider/circuit-breaker.d.ts +63 -0
  4. package/dist/ai-provider/circuit-breaker.d.ts.map +1 -0
  5. package/dist/ai-provider/circuit-breaker.js +160 -0
  6. package/dist/ai-provider/circuit-breaker.js.map +1 -0
  7. package/dist/ai-provider/cli-version.d.ts +50 -0
  8. package/dist/ai-provider/cli-version.d.ts.map +1 -0
  9. package/dist/ai-provider/cli-version.js +141 -0
  10. package/dist/ai-provider/cli-version.js.map +1 -0
  11. package/dist/ai-provider/config-loader.d.ts +45 -0
  12. package/dist/ai-provider/config-loader.d.ts.map +1 -0
  13. package/dist/ai-provider/config-loader.js +106 -0
  14. package/dist/ai-provider/config-loader.js.map +1 -0
  15. package/dist/ai-provider/errors.d.ts +48 -0
  16. package/dist/ai-provider/errors.d.ts.map +1 -0
  17. package/dist/ai-provider/errors.js +102 -0
  18. package/dist/ai-provider/errors.js.map +1 -0
  19. package/dist/ai-provider/events.d.ts +73 -0
  20. package/dist/ai-provider/events.d.ts.map +1 -0
  21. package/dist/ai-provider/events.js +75 -0
  22. package/dist/ai-provider/events.js.map +1 -0
  23. package/dist/ai-provider/factory.d.ts +31 -0
  24. package/dist/ai-provider/factory.d.ts.map +1 -0
  25. package/dist/ai-provider/factory.js +100 -0
  26. package/dist/ai-provider/factory.js.map +1 -0
  27. package/dist/ai-provider/index.d.ts +24 -0
  28. package/dist/ai-provider/index.d.ts.map +1 -0
  29. package/dist/ai-provider/index.js +46 -0
  30. package/dist/ai-provider/index.js.map +1 -0
  31. package/dist/ai-provider/instance-coordinator.d.ts +54 -0
  32. package/dist/ai-provider/instance-coordinator.d.ts.map +1 -0
  33. package/dist/ai-provider/instance-coordinator.js +199 -0
  34. package/dist/ai-provider/instance-coordinator.js.map +1 -0
  35. package/dist/ai-provider/jsonl-parser.d.ts +43 -0
  36. package/dist/ai-provider/jsonl-parser.d.ts.map +1 -0
  37. package/dist/ai-provider/jsonl-parser.js +107 -0
  38. package/dist/ai-provider/jsonl-parser.js.map +1 -0
  39. package/dist/ai-provider/lifecycle.d.ts +50 -0
  40. package/dist/ai-provider/lifecycle.d.ts.map +1 -0
  41. package/dist/ai-provider/lifecycle.js +145 -0
  42. package/dist/ai-provider/lifecycle.js.map +1 -0
  43. package/dist/ai-provider/logger.d.ts +69 -0
  44. package/dist/ai-provider/logger.d.ts.map +1 -0
  45. package/dist/ai-provider/logger.js +161 -0
  46. package/dist/ai-provider/logger.js.map +1 -0
  47. package/dist/ai-provider/metrics.d.ts +91 -0
  48. package/dist/ai-provider/metrics.d.ts.map +1 -0
  49. package/dist/ai-provider/metrics.js +187 -0
  50. package/dist/ai-provider/metrics.js.map +1 -0
  51. package/dist/ai-provider/process-manager.d.ts +97 -0
  52. package/dist/ai-provider/process-manager.d.ts.map +1 -0
  53. package/dist/ai-provider/process-manager.js +477 -0
  54. package/dist/ai-provider/process-manager.js.map +1 -0
  55. package/dist/ai-provider/providers/claude-code.d.ts +64 -0
  56. package/dist/ai-provider/providers/claude-code.d.ts.map +1 -0
  57. package/dist/ai-provider/providers/claude-code.js +205 -0
  58. package/dist/ai-provider/providers/claude-code.js.map +1 -0
  59. package/dist/ai-provider/retry-executor.d.ts +52 -0
  60. package/dist/ai-provider/retry-executor.d.ts.map +1 -0
  61. package/dist/ai-provider/retry-executor.js +138 -0
  62. package/dist/ai-provider/retry-executor.js.map +1 -0
  63. package/dist/ai-provider/safe-args.d.ts +58 -0
  64. package/dist/ai-provider/safe-args.d.ts.map +1 -0
  65. package/dist/ai-provider/safe-args.js +176 -0
  66. package/dist/ai-provider/safe-args.js.map +1 -0
  67. package/dist/ai-provider/semaphore.d.ts +50 -0
  68. package/dist/ai-provider/semaphore.d.ts.map +1 -0
  69. package/dist/ai-provider/semaphore.js +97 -0
  70. package/dist/ai-provider/semaphore.js.map +1 -0
  71. package/dist/ai-provider/tracer.d.ts +67 -0
  72. package/dist/ai-provider/tracer.d.ts.map +1 -0
  73. package/dist/ai-provider/tracer.js +209 -0
  74. package/dist/ai-provider/tracer.js.map +1 -0
  75. package/dist/ai-provider/types.d.ts +181 -0
  76. package/dist/ai-provider/types.d.ts.map +1 -0
  77. package/dist/ai-provider/types.js +8 -0
  78. package/dist/ai-provider/types.js.map +1 -0
  79. package/dist/autopilot/agents/agent-runner.d.ts +109 -0
  80. package/dist/autopilot/agents/agent-runner.d.ts.map +1 -0
  81. package/dist/autopilot/agents/agent-runner.js +731 -0
  82. package/dist/autopilot/agents/agent-runner.js.map +1 -0
  83. package/dist/autopilot/agents/agent-selector.d.ts +59 -0
  84. package/dist/autopilot/agents/agent-selector.d.ts.map +1 -0
  85. package/dist/autopilot/agents/agent-selector.js +234 -0
  86. package/dist/autopilot/agents/agent-selector.js.map +1 -0
  87. package/dist/autopilot/agents/model-selector.d.ts +49 -0
  88. package/dist/autopilot/agents/model-selector.d.ts.map +1 -0
  89. package/dist/autopilot/agents/model-selector.js +62 -0
  90. package/dist/autopilot/agents/model-selector.js.map +1 -0
  91. package/dist/autopilot/agents/profiles/builtin.d.ts +55 -0
  92. package/dist/autopilot/agents/profiles/builtin.d.ts.map +1 -0
  93. package/dist/autopilot/agents/profiles/builtin.js +323 -0
  94. package/dist/autopilot/agents/profiles/builtin.js.map +1 -0
  95. package/dist/autopilot/agents/profiles/types.d.ts +98 -0
  96. package/dist/autopilot/agents/profiles/types.d.ts.map +1 -0
  97. package/dist/autopilot/agents/profiles/types.js +17 -0
  98. package/dist/autopilot/agents/profiles/types.js.map +1 -0
  99. package/dist/autopilot/api/autopilot-api-client.d.ts +217 -0
  100. package/dist/autopilot/api/autopilot-api-client.d.ts.map +1 -0
  101. package/dist/autopilot/api/autopilot-api-client.js +402 -0
  102. package/dist/autopilot/api/autopilot-api-client.js.map +1 -0
  103. package/dist/autopilot/cli/abort.d.ts +20 -0
  104. package/dist/autopilot/cli/abort.d.ts.map +1 -0
  105. package/dist/autopilot/cli/abort.js +201 -0
  106. package/dist/autopilot/cli/abort.js.map +1 -0
  107. package/dist/autopilot/cli/display.d.ts +63 -0
  108. package/dist/autopilot/cli/display.d.ts.map +1 -0
  109. package/dist/autopilot/cli/display.js +260 -0
  110. package/dist/autopilot/cli/display.js.map +1 -0
  111. package/dist/autopilot/cli/index.d.ts +24 -0
  112. package/dist/autopilot/cli/index.d.ts.map +1 -0
  113. package/dist/autopilot/cli/index.js +79 -0
  114. package/dist/autopilot/cli/index.js.map +1 -0
  115. package/dist/autopilot/cli/pause.d.ts +18 -0
  116. package/dist/autopilot/cli/pause.d.ts.map +1 -0
  117. package/dist/autopilot/cli/pause.js +110 -0
  118. package/dist/autopilot/cli/pause.js.map +1 -0
  119. package/dist/autopilot/cli/resume.d.ts +22 -0
  120. package/dist/autopilot/cli/resume.d.ts.map +1 -0
  121. package/dist/autopilot/cli/resume.js +172 -0
  122. package/dist/autopilot/cli/resume.js.map +1 -0
  123. package/dist/autopilot/cli/run.d.ts +25 -0
  124. package/dist/autopilot/cli/run.d.ts.map +1 -0
  125. package/dist/autopilot/cli/run.js +220 -0
  126. package/dist/autopilot/cli/run.js.map +1 -0
  127. package/dist/autopilot/cli/status.d.ts +20 -0
  128. package/dist/autopilot/cli/status.d.ts.map +1 -0
  129. package/dist/autopilot/cli/status.js +217 -0
  130. package/dist/autopilot/cli/status.js.map +1 -0
  131. package/dist/autopilot/config.d.ts +45 -0
  132. package/dist/autopilot/config.d.ts.map +1 -0
  133. package/dist/autopilot/config.js +269 -0
  134. package/dist/autopilot/config.js.map +1 -0
  135. package/dist/autopilot/core/dependency-resolver.d.ts +108 -0
  136. package/dist/autopilot/core/dependency-resolver.d.ts.map +1 -0
  137. package/dist/autopilot/core/dependency-resolver.js +394 -0
  138. package/dist/autopilot/core/dependency-resolver.js.map +1 -0
  139. package/dist/autopilot/core/dispatcher.d.ts +215 -0
  140. package/dist/autopilot/core/dispatcher.d.ts.map +1 -0
  141. package/dist/autopilot/core/dispatcher.js +594 -0
  142. package/dist/autopilot/core/dispatcher.js.map +1 -0
  143. package/dist/autopilot/core/failure-handler.d.ts +145 -0
  144. package/dist/autopilot/core/failure-handler.d.ts.map +1 -0
  145. package/dist/autopilot/core/failure-handler.js +308 -0
  146. package/dist/autopilot/core/failure-handler.js.map +1 -0
  147. package/dist/autopilot/core/rate-limit-handler.d.ts +108 -0
  148. package/dist/autopilot/core/rate-limit-handler.d.ts.map +1 -0
  149. package/dist/autopilot/core/rate-limit-handler.js +195 -0
  150. package/dist/autopilot/core/rate-limit-handler.js.map +1 -0
  151. package/dist/autopilot/core/state-manager.d.ts +160 -0
  152. package/dist/autopilot/core/state-manager.d.ts.map +1 -0
  153. package/dist/autopilot/core/state-manager.js +393 -0
  154. package/dist/autopilot/core/state-manager.js.map +1 -0
  155. package/dist/autopilot/core/timeout-manager.d.ts +95 -0
  156. package/dist/autopilot/core/timeout-manager.d.ts.map +1 -0
  157. package/dist/autopilot/core/timeout-manager.js +188 -0
  158. package/dist/autopilot/core/timeout-manager.js.map +1 -0
  159. package/dist/autopilot/git/branch-manager.d.ts +117 -0
  160. package/dist/autopilot/git/branch-manager.d.ts.map +1 -0
  161. package/dist/autopilot/git/branch-manager.js +238 -0
  162. package/dist/autopilot/git/branch-manager.js.map +1 -0
  163. package/dist/autopilot/git/index.d.ts +9 -0
  164. package/dist/autopilot/git/index.d.ts.map +1 -0
  165. package/dist/autopilot/git/index.js +9 -0
  166. package/dist/autopilot/git/index.js.map +1 -0
  167. package/dist/autopilot/git/merge-manager.d.ts +118 -0
  168. package/dist/autopilot/git/merge-manager.d.ts.map +1 -0
  169. package/dist/autopilot/git/merge-manager.js +304 -0
  170. package/dist/autopilot/git/merge-manager.js.map +1 -0
  171. package/dist/autopilot/git/worktree-manager.d.ts +128 -0
  172. package/dist/autopilot/git/worktree-manager.d.ts.map +1 -0
  173. package/dist/autopilot/git/worktree-manager.js +298 -0
  174. package/dist/autopilot/git/worktree-manager.js.map +1 -0
  175. package/dist/autopilot/index.d.ts +30 -0
  176. package/dist/autopilot/index.d.ts.map +1 -0
  177. package/dist/autopilot/index.js +55 -0
  178. package/dist/autopilot/index.js.map +1 -0
  179. package/dist/autopilot/sync/index.d.ts +7 -0
  180. package/dist/autopilot/sync/index.d.ts.map +1 -0
  181. package/dist/autopilot/sync/index.js +7 -0
  182. package/dist/autopilot/sync/index.js.map +1 -0
  183. package/dist/autopilot/sync/sync-manager.d.ts +168 -0
  184. package/dist/autopilot/sync/sync-manager.d.ts.map +1 -0
  185. package/dist/autopilot/sync/sync-manager.js +303 -0
  186. package/dist/autopilot/sync/sync-manager.js.map +1 -0
  187. package/dist/autopilot/types.d.ts +454 -0
  188. package/dist/autopilot/types.d.ts.map +1 -0
  189. package/dist/autopilot/types.js +26 -0
  190. package/dist/autopilot/types.js.map +1 -0
  191. package/dist/autopilot/utils/audit-logger.d.ts +176 -0
  192. package/dist/autopilot/utils/audit-logger.d.ts.map +1 -0
  193. package/dist/autopilot/utils/audit-logger.js +308 -0
  194. package/dist/autopilot/utils/audit-logger.js.map +1 -0
  195. package/dist/autopilot/utils/cost-tracker.d.ts +162 -0
  196. package/dist/autopilot/utils/cost-tracker.d.ts.map +1 -0
  197. package/dist/autopilot/utils/cost-tracker.js +269 -0
  198. package/dist/autopilot/utils/cost-tracker.js.map +1 -0
  199. package/dist/autopilot/utils/index.d.ts +9 -0
  200. package/dist/autopilot/utils/index.d.ts.map +1 -0
  201. package/dist/autopilot/utils/index.js +9 -0
  202. package/dist/autopilot/utils/index.js.map +1 -0
  203. package/dist/autopilot/utils/progress-reporter.d.ts +132 -0
  204. package/dist/autopilot/utils/progress-reporter.d.ts.map +1 -0
  205. package/dist/autopilot/utils/progress-reporter.js +290 -0
  206. package/dist/autopilot/utils/progress-reporter.js.map +1 -0
  207. package/dist/autopilot/worker/worker-pool.d.ts +179 -0
  208. package/dist/autopilot/worker/worker-pool.d.ts.map +1 -0
  209. package/dist/autopilot/worker/worker-pool.js +331 -0
  210. package/dist/autopilot/worker/worker-pool.js.map +1 -0
  211. package/dist/autopilot/worker/worker-session.d.ts +171 -0
  212. package/dist/autopilot/worker/worker-session.d.ts.map +1 -0
  213. package/dist/autopilot/worker/worker-session.js +295 -0
  214. package/dist/autopilot/worker/worker-session.js.map +1 -0
  215. package/dist/cli/commands/debug/call.d.ts.map +1 -1
  216. package/dist/cli/commands/debug/call.js +5 -1
  217. package/dist/cli/commands/debug/call.js.map +1 -1
  218. package/dist/cli/index.d.ts +1 -1
  219. package/dist/cli/index.d.ts.map +1 -1
  220. package/dist/cli/index.js +4 -1
  221. package/dist/cli/index.js.map +1 -1
  222. package/dist/index.js +0 -1
  223. package/dist/index.js.map +1 -1
  224. package/dist/tools/core/epic.js +1 -1
  225. package/dist/tools/core/epic.js.map +1 -1
  226. package/dist/tools/core/lookup.d.ts.map +1 -1
  227. package/dist/tools/core/lookup.js +3 -2
  228. package/dist/tools/core/lookup.js.map +1 -1
  229. package/dist/tools/core/specification.js +1 -1
  230. package/dist/tools/core/specification.js.map +1 -1
  231. package/dist/tools/core/ticket.d.ts.map +1 -1
  232. package/dist/tools/core/ticket.js +4 -6
  233. package/dist/tools/core/ticket.js.map +1 -1
  234. package/dist/tools/index.d.ts.map +1 -1
  235. package/dist/tools/index.js +60 -0
  236. package/dist/tools/index.js.map +1 -1
  237. package/dist/validation/index.d.ts.map +1 -1
  238. package/dist/validation/index.js +4 -1
  239. package/dist/validation/index.js.map +1 -1
  240. package/package.json +8 -4
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Autopilot Status Command
3
+ *
4
+ * Shows current autopilot session status.
5
+ */
6
+ import ora from 'ora';
7
+ import * as fs from 'fs/promises';
8
+ import * as path from 'path';
9
+ import { withErrorHandler } from '../../cli/middleware/error-handler.js';
10
+ import { STATE_FILE_NAME } from '../core/state-manager.js';
11
+ import { renderDashboard, renderCompactStatus, c, formatDuration, formatCost } from './display.js';
12
+ /**
13
+ * Load state from file
14
+ */
15
+ async function loadState(workingDirectory) {
16
+ const statePath = path.join(workingDirectory, '.specforge', STATE_FILE_NAME);
17
+ try {
18
+ const content = await fs.readFile(statePath, 'utf-8');
19
+ return JSON.parse(content);
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ /**
26
+ * List all runs from logs
27
+ */
28
+ async function listRuns(workingDirectory) {
29
+ const logsDir = path.join(workingDirectory, '.specforge', 'logs');
30
+ try {
31
+ const files = await fs.readdir(logsDir);
32
+ const runs = [];
33
+ for (const file of files) {
34
+ if (file.startsWith('autopilot-') && file.endsWith('.jsonl')) {
35
+ const runId = file.replace('autopilot-', '').replace('.jsonl', '');
36
+ try {
37
+ const content = await fs.readFile(path.join(logsDir, file), 'utf-8');
38
+ const lines = content.trim().split('\n');
39
+ if (lines.length > 0) {
40
+ const firstEntry = JSON.parse(lines[0]);
41
+ const lastEntry = JSON.parse(lines[lines.length - 1]);
42
+ runs.push({
43
+ runId,
44
+ startedAt: new Date(firstEntry.timestamp),
45
+ status: lastEntry.type.includes('completed') ? 'completed'
46
+ : lastEntry.type.includes('failed') ? 'failed'
47
+ : 'unknown',
48
+ });
49
+ }
50
+ }
51
+ catch {
52
+ // Skip invalid files
53
+ }
54
+ }
55
+ }
56
+ return runs.sort((a, b) => b.startedAt.getTime() - a.startedAt.getTime());
57
+ }
58
+ catch {
59
+ return [];
60
+ }
61
+ }
62
+ /**
63
+ * Display no active session message
64
+ */
65
+ function displayNoSession(runs) {
66
+ console.log('');
67
+ console.log(c.bold('Autopilot Status'));
68
+ console.log('');
69
+ console.log(c.dim('No active autopilot session.'));
70
+ console.log('');
71
+ if (runs.length > 0) {
72
+ console.log(c.bold('Recent Runs:'));
73
+ console.log('');
74
+ for (const run of runs.slice(0, 5)) {
75
+ const statusColor = run.status === 'completed' ? c.green
76
+ : run.status === 'failed' ? c.red
77
+ : c.dim;
78
+ console.log(` ${run.runId.substring(0, 8)} ` +
79
+ `${statusColor(run.status.padEnd(10))} ` +
80
+ `${run.startedAt.toISOString().substring(0, 16)}`);
81
+ }
82
+ if (runs.length > 5) {
83
+ console.log(c.dim(` ... and ${runs.length - 5} more`));
84
+ }
85
+ console.log('');
86
+ console.log(c.dim('Use `specforge autopilot resume <run-id>` to resume a previous run.'));
87
+ }
88
+ else {
89
+ console.log(c.dim('Use `specforge autopilot run` to start a new session.'));
90
+ }
91
+ console.log('');
92
+ }
93
+ /**
94
+ * Watch mode - continuously refresh status
95
+ */
96
+ async function watchStatus(workingDirectory, verbose) {
97
+ const refreshInterval = 2000; // 2 seconds
98
+ console.log(c.dim('Watch mode - press Ctrl+C to exit'));
99
+ console.log('');
100
+ const refresh = async () => {
101
+ const state = await loadState(workingDirectory);
102
+ if (process.stdout.isTTY) {
103
+ process.stdout.write('\x1b[2J\x1b[H'); // Clear screen
104
+ }
105
+ if (state) {
106
+ if (verbose) {
107
+ console.log(renderDashboard(state));
108
+ }
109
+ else {
110
+ console.log(renderCompactStatus(state));
111
+ }
112
+ }
113
+ else {
114
+ console.log(c.dim('No active session'));
115
+ }
116
+ };
117
+ await refresh();
118
+ const timer = setInterval(refresh, refreshInterval);
119
+ process.on('SIGINT', () => {
120
+ clearInterval(timer);
121
+ console.log('');
122
+ process.exit(0);
123
+ });
124
+ // Keep running
125
+ await new Promise(() => { });
126
+ }
127
+ /**
128
+ * Status command action
129
+ */
130
+ async function statusAction(options) {
131
+ const workingDirectory = process.cwd();
132
+ // Watch mode
133
+ if (options.watch) {
134
+ await watchStatus(workingDirectory, options.verbose ?? false);
135
+ return;
136
+ }
137
+ const spinner = ora({
138
+ text: 'Checking autopilot status...',
139
+ color: 'cyan',
140
+ }).start();
141
+ try {
142
+ // Load current state
143
+ const state = await loadState(workingDirectory);
144
+ spinner.stop();
145
+ // JSON output
146
+ if (options.json) {
147
+ if (state) {
148
+ console.log(JSON.stringify(state, null, 2));
149
+ }
150
+ else {
151
+ console.log(JSON.stringify({ active: false, runs: await listRuns(workingDirectory) }, null, 2));
152
+ }
153
+ return;
154
+ }
155
+ // No active session
156
+ if (!state) {
157
+ const runs = await listRuns(workingDirectory);
158
+ displayNoSession(runs);
159
+ return;
160
+ }
161
+ // Display current status
162
+ if (options.verbose) {
163
+ console.log(renderDashboard(state));
164
+ }
165
+ else {
166
+ console.log('');
167
+ console.log(c.bold('Autopilot Status'));
168
+ console.log('');
169
+ console.log(renderCompactStatus(state));
170
+ console.log('');
171
+ // Quick summary
172
+ console.log(`Workers: ${state.workers.length} configured`);
173
+ console.log(`Completed: ${c.green(state.completedTickets.length.toString())}`);
174
+ console.log(`Failed: ${c.red(state.failedTickets.length.toString())}`);
175
+ console.log(`Cost: ${c.yellow(formatCost(state.totalCostUsd))}`);
176
+ if (state.startedAt) {
177
+ const elapsed = formatDuration(Date.now() - new Date(state.startedAt).getTime());
178
+ console.log(`Elapsed: ${elapsed}`);
179
+ }
180
+ console.log('');
181
+ console.log(c.dim('Use --verbose for full dashboard, --watch for live updates'));
182
+ console.log('');
183
+ }
184
+ }
185
+ catch (error) {
186
+ spinner.fail('Failed to get status');
187
+ throw error;
188
+ }
189
+ }
190
+ /**
191
+ * Register status command
192
+ */
193
+ export function registerStatusCommand(program) {
194
+ program
195
+ .command('status')
196
+ .description('Show autopilot session status')
197
+ .option('-w, --watch', 'Watch mode with live updates')
198
+ .option('-v, --verbose', 'Show detailed dashboard')
199
+ .option('--json', 'Output as JSON')
200
+ .option('-r, --run-id <id>', 'Show status for specific run')
201
+ .addHelpText('after', `
202
+ Examples:
203
+ $ specforge autopilot status # Show current status
204
+ $ specforge autopilot status --verbose # Show detailed dashboard
205
+ $ specforge autopilot status --watch # Live updates (2s refresh)
206
+ $ specforge autopilot status --json # Output as JSON
207
+
208
+ Output:
209
+ - Current status (running, paused, completed, failed)
210
+ - Progress (completed/total tickets)
211
+ - Worker status and current tasks
212
+ - Cost and time elapsed
213
+ - Failed tickets summary
214
+ `)
215
+ .action(withErrorHandler(statusAction));
216
+ }
217
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/autopilot/cli/status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAY,MAAM,uCAAuC,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAanG;;GAEG;AACH,KAAK,UAAU,SAAS,CAAC,gBAAwB;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;IAE7E,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,QAAQ,CACrB,gBAAwB;IAExB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAElE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,IAAI,GAA8D,EAAE,CAAC;QAE3E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAEnE,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;oBACrE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAEzC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACrB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;wBACxC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;wBAEtD,IAAI,CAAC,IAAI,CAAC;4BACR,KAAK;4BACL,SAAS,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;4BACzC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW;gCACxD,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ;oCAC5C,CAAC,CAAC,SAAS;yBAChB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,qBAAqB;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAA+D;IACvF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACnC,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;gBACtD,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;oBAC/B,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAEZ,OAAO,CAAC,GAAG,CACT,KAAK,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI;gBAClC,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI;gBACzC,GAAG,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAClD,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC,CAAC;IAC5F,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,gBAAwB,EAAE,OAAgB;IACnE,MAAM,eAAe,GAAG,IAAI,CAAC,CAAC,YAAY;IAE1C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAEhD,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe;QACxD,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,EAAE,CAAC;IAEhB,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAEpD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,eAAe;IACf,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CAAC,OAAsB;IAChD,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAEvC,aAAa;IACb,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,WAAW,CAAC,gBAAgB,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC;QAClB,IAAI,EAAE,8BAA8B;QACpC,KAAK,EAAE,MAAM;KACd,CAAC,CAAC,KAAK,EAAE,CAAC;IAEX,IAAI,CAAC;QACH,qBAAqB;QACrB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAEhD,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,cAAc;QACd,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAClG,CAAC;YACD,OAAO;QACT,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,CAAC;YAC9C,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QAED,yBAAyB;QACzB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,gBAAgB;YAChB,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YAChF,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;YAEvE,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBACjF,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;YACxC,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,aAAa,EAAE,8BAA8B,CAAC;SACrD,MAAM,CAAC,eAAe,EAAE,yBAAyB,CAAC;SAClD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,mBAAmB,EAAE,8BAA8B,CAAC;SAC3D,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;CAazB,CAAC;SACG,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Autopilot Configuration Loader
3
+ *
4
+ * Loads autopilot configuration from .specforge.json
5
+ */
6
+ import type { AutopilotConfig, BranchStrategy } from './types.js';
7
+ /**
8
+ * Load autopilot configuration
9
+ */
10
+ export declare function loadAutopilotConfig(startDir?: string): {
11
+ config: AutopilotConfig;
12
+ configPath: string | null;
13
+ };
14
+ /**
15
+ * Get configuration with CLI overrides
16
+ */
17
+ export declare function resolveAutopilotConfig(options?: {
18
+ parallel?: number;
19
+ maxCost?: number;
20
+ branchStrategy?: BranchStrategy;
21
+ autoCommit?: boolean;
22
+ autoPush?: boolean;
23
+ timeout?: number;
24
+ startDir?: string;
25
+ }): AutopilotConfig;
26
+ /**
27
+ * Validate autopilot configuration
28
+ */
29
+ export declare function validateAutopilotConfig(config: AutopilotConfig): string[];
30
+ /**
31
+ * Get config file path
32
+ */
33
+ export declare function getConfigFilePath(startDir?: string): string | null;
34
+ /**
35
+ * Check if autopilot is configured
36
+ */
37
+ export declare function hasAutopilotConfig(startDir?: string): boolean;
38
+ /**
39
+ * Merge partial config with defaults
40
+ */
41
+ export declare function mergeWithDefaults(partial: Partial<AutopilotConfig> | {
42
+ config: AutopilotConfig;
43
+ configPath: string | null;
44
+ }): AutopilotConfig;
45
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/autopilot/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,eAAe,EAA6B,cAAc,EAAgB,MAAM,YAAY,CAAC;AAiK3G;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,CAAC,EAAE,MAAM,GAChB;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAsExD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,eAAe,CAYlB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,EAAE,CAoBzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAElE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAQ7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACzF,eAAe,CAYjB"}
@@ -0,0 +1,269 @@
1
+ /**
2
+ * Autopilot Configuration Loader
3
+ *
4
+ * Loads autopilot configuration from .specforge.json
5
+ */
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ import { DEFAULT_AUTOPILOT_CONFIG } from './types.js';
9
+ /**
10
+ * Configuration file name
11
+ */
12
+ const CONFIG_FILE = '.specforge.json';
13
+ /**
14
+ * Find config file by searching up the directory tree
15
+ */
16
+ function findConfigFile(startDir = process.cwd()) {
17
+ let currentDir = startDir;
18
+ while (currentDir !== path.dirname(currentDir)) {
19
+ const configPath = path.join(currentDir, CONFIG_FILE);
20
+ if (fs.existsSync(configPath)) {
21
+ return configPath;
22
+ }
23
+ currentDir = path.dirname(currentDir);
24
+ }
25
+ return null;
26
+ }
27
+ /**
28
+ * Load raw configuration from file
29
+ */
30
+ function loadRawConfig(configPath) {
31
+ try {
32
+ const content = fs.readFileSync(configPath, 'utf-8');
33
+ const parsed = JSON.parse(content);
34
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
35
+ console.warn(`Warning: ${configPath} is not a valid config object`);
36
+ return null;
37
+ }
38
+ return parsed;
39
+ }
40
+ catch (error) {
41
+ if (error instanceof SyntaxError) {
42
+ console.warn(`Warning: Failed to parse ${configPath} - invalid JSON`);
43
+ }
44
+ else {
45
+ console.warn(`Warning: Failed to read ${configPath}`);
46
+ }
47
+ return null;
48
+ }
49
+ }
50
+ /**
51
+ * Validate and parse AI Provider config
52
+ */
53
+ function parseAIProviderConfig(raw) {
54
+ const defaults = DEFAULT_AUTOPILOT_CONFIG.aiProvider;
55
+ if (!raw || typeof raw !== 'object') {
56
+ return defaults;
57
+ }
58
+ return {
59
+ mode: 'claude_code', // Always claude_code for autopilot
60
+ maxParallelProcesses: typeof raw.maxParallelProcesses === 'number'
61
+ ? Math.min(Math.max(1, raw.maxParallelProcesses), 20)
62
+ : defaults.maxParallelProcesses,
63
+ requestTimeoutSeconds: typeof raw.requestTimeoutSeconds === 'number'
64
+ ? Math.min(Math.max(30, raw.requestTimeoutSeconds), 3600)
65
+ : defaults.requestTimeoutSeconds,
66
+ maxRetries: typeof raw.maxRetries === 'number'
67
+ ? Math.min(Math.max(0, raw.maxRetries), 10)
68
+ : defaults.maxRetries,
69
+ };
70
+ }
71
+ /**
72
+ * Validate branch strategy
73
+ */
74
+ function parseBranchStrategy(value) {
75
+ if (value === 'per-epic' || value === 'per-ticket' || value === 'single') {
76
+ return value;
77
+ }
78
+ return DEFAULT_AUTOPILOT_CONFIG.branchStrategy;
79
+ }
80
+ /**
81
+ * Parse agent profile
82
+ */
83
+ function parseAgentProfile(raw) {
84
+ if (!raw || typeof raw !== 'object') {
85
+ return null;
86
+ }
87
+ const profile = raw;
88
+ if (typeof profile.id !== 'string' || typeof profile.name !== 'string') {
89
+ return null;
90
+ }
91
+ // Parse tagMatchers as ProfileTagMatcher
92
+ let tagMatchers = undefined;
93
+ if (profile.tagMatchers && typeof profile.tagMatchers === 'object' && !Array.isArray(profile.tagMatchers)) {
94
+ const tm = profile.tagMatchers;
95
+ tagMatchers = {
96
+ required: Array.isArray(tm.required)
97
+ ? tm.required.filter((t) => typeof t === 'string')
98
+ : undefined,
99
+ anyOf: Array.isArray(tm.anyOf)
100
+ ? tm.anyOf.filter((t) => typeof t === 'string')
101
+ : undefined,
102
+ exclude: Array.isArray(tm.exclude)
103
+ ? tm.exclude.filter((t) => typeof t === 'string')
104
+ : undefined,
105
+ };
106
+ }
107
+ // Parse validationCommands as ValidationCommand[]
108
+ let validationCommands = undefined;
109
+ if (Array.isArray(profile.validationCommands)) {
110
+ validationCommands = profile.validationCommands
111
+ .filter((c) => c && typeof c === 'object')
112
+ .map(c => ({
113
+ name: typeof c.name === 'string' ? c.name : 'Validation',
114
+ command: typeof c.command === 'string' ? c.command : '',
115
+ required: typeof c.required === 'boolean' ? c.required : true,
116
+ timeoutMs: typeof c.timeoutMs === 'number' ? c.timeoutMs : undefined,
117
+ cwd: typeof c.cwd === 'string' ? c.cwd : undefined,
118
+ }))
119
+ .filter(c => c.command.length > 0);
120
+ }
121
+ return {
122
+ id: profile.id,
123
+ name: profile.name,
124
+ description: typeof profile.description === 'string' ? profile.description : '',
125
+ fileMatchers: Array.isArray(profile.fileMatchers)
126
+ ? profile.fileMatchers
127
+ .filter((m) => m && typeof m === 'object' && Array.isArray(m.patterns))
128
+ .map(m => {
129
+ const excludeArr = m.exclude;
130
+ return {
131
+ patterns: m.patterns.filter((p) => typeof p === 'string'),
132
+ exclude: Array.isArray(excludeArr)
133
+ ? excludeArr.filter((p) => typeof p === 'string')
134
+ : undefined,
135
+ };
136
+ })
137
+ : [],
138
+ tagMatchers,
139
+ model: typeof profile.model === 'string' ? profile.model : undefined,
140
+ systemPromptAdditions: typeof profile.systemPromptAdditions === 'string'
141
+ ? profile.systemPromptAdditions
142
+ : undefined,
143
+ validationCommands,
144
+ timeoutMs: typeof profile.timeoutMs === 'number' ? profile.timeoutMs : undefined,
145
+ priority: typeof profile.priority === 'number' ? profile.priority : undefined,
146
+ };
147
+ }
148
+ /**
149
+ * Load autopilot configuration
150
+ */
151
+ export function loadAutopilotConfig(startDir) {
152
+ const configPath = findConfigFile(startDir);
153
+ if (!configPath) {
154
+ return { config: DEFAULT_AUTOPILOT_CONFIG, configPath: null };
155
+ }
156
+ const rawConfig = loadRawConfig(configPath);
157
+ if (!rawConfig) {
158
+ return { config: DEFAULT_AUTOPILOT_CONFIG, configPath };
159
+ }
160
+ const autopilotSection = rawConfig.autopilot;
161
+ if (!autopilotSection || typeof autopilotSection !== 'object') {
162
+ return { config: DEFAULT_AUTOPILOT_CONFIG, configPath };
163
+ }
164
+ const config = {
165
+ maxParallelWorkers: typeof autopilotSection.maxParallelWorkers === 'number'
166
+ ? Math.min(Math.max(1, autopilotSection.maxParallelWorkers), 10)
167
+ : DEFAULT_AUTOPILOT_CONFIG.maxParallelWorkers,
168
+ maxTotalCostUsd: typeof autopilotSection.maxTotalCostUsd === 'number'
169
+ ? Math.max(0, autopilotSection.maxTotalCostUsd)
170
+ : DEFAULT_AUTOPILOT_CONFIG.maxTotalCostUsd,
171
+ branchStrategy: parseBranchStrategy(autopilotSection.branchStrategy),
172
+ autoCommit: typeof autopilotSection.autoCommit === 'boolean'
173
+ ? autopilotSection.autoCommit
174
+ : DEFAULT_AUTOPILOT_CONFIG.autoCommit,
175
+ autoPush: typeof autopilotSection.autoPush === 'boolean'
176
+ ? autopilotSection.autoPush
177
+ : DEFAULT_AUTOPILOT_CONFIG.autoPush,
178
+ aiProvider: parseAIProviderConfig(autopilotSection.aiProvider),
179
+ ticketTimeoutMs: typeof autopilotSection.ticketTimeoutMs === 'number'
180
+ ? Math.min(Math.max(60000, autopilotSection.ticketTimeoutMs), 3600000)
181
+ : DEFAULT_AUTOPILOT_CONFIG.ticketTimeoutMs,
182
+ maxTicketRetries: typeof autopilotSection.maxTicketRetries === 'number'
183
+ ? Math.min(Math.max(0, autopilotSection.maxTicketRetries), 5)
184
+ : DEFAULT_AUTOPILOT_CONFIG.maxTicketRetries,
185
+ warnAtTimeoutPercent: typeof autopilotSection.warnAtTimeoutPercent === 'number'
186
+ ? Math.min(Math.max(50, autopilotSection.warnAtTimeoutPercent), 95)
187
+ : DEFAULT_AUTOPILOT_CONFIG.warnAtTimeoutPercent,
188
+ syncIntervalMs: typeof autopilotSection.syncIntervalMs === 'number'
189
+ ? Math.min(Math.max(5000, autopilotSection.syncIntervalMs), 300000)
190
+ : DEFAULT_AUTOPILOT_CONFIG.syncIntervalMs,
191
+ logPath: typeof autopilotSection.logPath === 'string'
192
+ ? autopilotSection.logPath
193
+ : DEFAULT_AUTOPILOT_CONFIG.logPath,
194
+ agentProfiles: Array.isArray(autopilotSection.agentProfiles)
195
+ ? autopilotSection.agentProfiles
196
+ .map(parseAgentProfile)
197
+ .filter((p) => p !== null)
198
+ : DEFAULT_AUTOPILOT_CONFIG.agentProfiles,
199
+ };
200
+ return { config, configPath };
201
+ }
202
+ /**
203
+ * Get configuration with CLI overrides
204
+ */
205
+ export function resolveAutopilotConfig(options) {
206
+ const { config } = loadAutopilotConfig(options?.startDir);
207
+ return {
208
+ ...config,
209
+ maxParallelWorkers: options?.parallel ?? config.maxParallelWorkers,
210
+ maxTotalCostUsd: options?.maxCost ?? config.maxTotalCostUsd,
211
+ branchStrategy: options?.branchStrategy ?? config.branchStrategy,
212
+ autoCommit: options?.autoCommit ?? config.autoCommit,
213
+ autoPush: options?.autoPush ?? config.autoPush,
214
+ ticketTimeoutMs: options?.timeout ? options.timeout * 1000 : config.ticketTimeoutMs,
215
+ };
216
+ }
217
+ /**
218
+ * Validate autopilot configuration
219
+ */
220
+ export function validateAutopilotConfig(config) {
221
+ const errors = [];
222
+ if (config.maxParallelWorkers < 1 || config.maxParallelWorkers > 10) {
223
+ errors.push('maxParallelWorkers must be between 1 and 10');
224
+ }
225
+ if (config.maxTotalCostUsd < 0) {
226
+ errors.push('maxTotalCostUsd must be non-negative');
227
+ }
228
+ if (config.ticketTimeoutMs < 60000 || config.ticketTimeoutMs > 3600000) {
229
+ errors.push('ticketTimeoutMs must be between 1 minute and 1 hour');
230
+ }
231
+ if (config.aiProvider.maxParallelProcesses < 1 || config.aiProvider.maxParallelProcesses > 20) {
232
+ errors.push('aiProvider.maxParallelProcesses must be between 1 and 20');
233
+ }
234
+ return errors;
235
+ }
236
+ /**
237
+ * Get config file path
238
+ */
239
+ export function getConfigFilePath(startDir) {
240
+ return findConfigFile(startDir);
241
+ }
242
+ /**
243
+ * Check if autopilot is configured
244
+ */
245
+ export function hasAutopilotConfig(startDir) {
246
+ const configPath = findConfigFile(startDir);
247
+ if (!configPath)
248
+ return false;
249
+ const rawConfig = loadRawConfig(configPath);
250
+ if (!rawConfig)
251
+ return false;
252
+ return 'autopilot' in rawConfig;
253
+ }
254
+ /**
255
+ * Merge partial config with defaults
256
+ */
257
+ export function mergeWithDefaults(partial) {
258
+ // Handle both direct config and wrapped config
259
+ const config = 'config' in partial ? partial.config : partial;
260
+ return {
261
+ ...DEFAULT_AUTOPILOT_CONFIG,
262
+ ...config,
263
+ aiProvider: {
264
+ ...DEFAULT_AUTOPILOT_CONFIG.aiProvider,
265
+ ...(config.aiProvider || {}),
266
+ },
267
+ };
268
+ }
269
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/autopilot/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Dependency Resolver
3
+ *
4
+ * Builds ticket DAG, finds ready tickets, and manages dependency blocking.
5
+ */
6
+ import type { TicketStatus } from '../../types/index.js';
7
+ import type { QueuedTicket, DependencyNode } from '../types.js';
8
+ import type { AutopilotApiClient } from '../api/autopilot-api-client.js';
9
+ /**
10
+ * Dependency graph for tickets
11
+ */
12
+ export declare class DependencyResolver {
13
+ private apiClient;
14
+ private nodes;
15
+ private epicTickets;
16
+ constructor(apiClient: AutopilotApiClient);
17
+ /**
18
+ * Build dependency graph for all tickets in specification
19
+ */
20
+ buildGraph(specificationId: string): Promise<void>;
21
+ /**
22
+ * Update ready states based on current dependency status
23
+ */
24
+ updateReadyStates(): void;
25
+ /**
26
+ * Check if a node is ready (all dependencies satisfied)
27
+ */
28
+ private isNodeReady;
29
+ /**
30
+ * Get all ready tickets
31
+ */
32
+ getReadyTickets(): string[];
33
+ /**
34
+ * Get ready tickets for a specific epic
35
+ */
36
+ getReadyTicketsForEpic(epicId: string): string[];
37
+ /**
38
+ * Mark ticket as completed and update dependents
39
+ */
40
+ markCompleted(ticketId: string): string[];
41
+ /**
42
+ * Mark ticket as failed and cascade to dependents
43
+ */
44
+ markFailed(ticketId: string): string[];
45
+ /**
46
+ * Mark ticket as in progress
47
+ */
48
+ markInProgress(ticketId: string): void;
49
+ /**
50
+ * Update ticket status
51
+ */
52
+ updateStatus(ticketId: string, status: TicketStatus): void;
53
+ /**
54
+ * Get node by ticket ID
55
+ */
56
+ getNode(ticketId: string): DependencyNode | undefined;
57
+ /**
58
+ * Get all tickets for an epic
59
+ */
60
+ getEpicTickets(epicId: string): string[];
61
+ /**
62
+ * Check if epic is complete (all tickets done or skipped)
63
+ */
64
+ isEpicComplete(epicId: string): boolean;
65
+ /**
66
+ * Get epic progress
67
+ */
68
+ getEpicProgress(epicId: string): {
69
+ total: number;
70
+ completed: number;
71
+ failed: number;
72
+ inProgress: number;
73
+ ready: number;
74
+ blocked: number;
75
+ };
76
+ /**
77
+ * Get tickets blocked by a specific ticket
78
+ */
79
+ getBlockedBy(ticketId: string): string[];
80
+ /**
81
+ * Build priority queue of ready tickets
82
+ */
83
+ buildQueue(epicId?: string): QueuedTicket[];
84
+ /**
85
+ * Detect circular dependencies
86
+ */
87
+ detectCircularDependencies(): string[][];
88
+ /**
89
+ * Get topological order for tickets
90
+ */
91
+ getTopologicalOrder(epicId?: string): string[];
92
+ /**
93
+ * Get statistics about the graph
94
+ */
95
+ getStats(): {
96
+ totalTickets: number;
97
+ readyTickets: number;
98
+ completedTickets: number;
99
+ blockedTickets: number;
100
+ inProgressTickets: number;
101
+ epicCount: number;
102
+ };
103
+ }
104
+ /**
105
+ * Create a dependency resolver
106
+ */
107
+ export declare function createDependencyResolver(apiClient: AutopilotApiClient): DependencyResolver;
108
+ //# sourceMappingURL=dependency-resolver.d.ts.map