@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.
- package/README.md +73 -0
- package/bin/{specforge-mcp → specforge} +0 -5
- package/dist/ai-provider/circuit-breaker.d.ts +63 -0
- package/dist/ai-provider/circuit-breaker.d.ts.map +1 -0
- package/dist/ai-provider/circuit-breaker.js +160 -0
- package/dist/ai-provider/circuit-breaker.js.map +1 -0
- package/dist/ai-provider/cli-version.d.ts +50 -0
- package/dist/ai-provider/cli-version.d.ts.map +1 -0
- package/dist/ai-provider/cli-version.js +141 -0
- package/dist/ai-provider/cli-version.js.map +1 -0
- package/dist/ai-provider/config-loader.d.ts +45 -0
- package/dist/ai-provider/config-loader.d.ts.map +1 -0
- package/dist/ai-provider/config-loader.js +106 -0
- package/dist/ai-provider/config-loader.js.map +1 -0
- package/dist/ai-provider/errors.d.ts +48 -0
- package/dist/ai-provider/errors.d.ts.map +1 -0
- package/dist/ai-provider/errors.js +102 -0
- package/dist/ai-provider/errors.js.map +1 -0
- package/dist/ai-provider/events.d.ts +73 -0
- package/dist/ai-provider/events.d.ts.map +1 -0
- package/dist/ai-provider/events.js +75 -0
- package/dist/ai-provider/events.js.map +1 -0
- package/dist/ai-provider/factory.d.ts +31 -0
- package/dist/ai-provider/factory.d.ts.map +1 -0
- package/dist/ai-provider/factory.js +100 -0
- package/dist/ai-provider/factory.js.map +1 -0
- package/dist/ai-provider/index.d.ts +24 -0
- package/dist/ai-provider/index.d.ts.map +1 -0
- package/dist/ai-provider/index.js +46 -0
- package/dist/ai-provider/index.js.map +1 -0
- package/dist/ai-provider/instance-coordinator.d.ts +54 -0
- package/dist/ai-provider/instance-coordinator.d.ts.map +1 -0
- package/dist/ai-provider/instance-coordinator.js +199 -0
- package/dist/ai-provider/instance-coordinator.js.map +1 -0
- package/dist/ai-provider/jsonl-parser.d.ts +43 -0
- package/dist/ai-provider/jsonl-parser.d.ts.map +1 -0
- package/dist/ai-provider/jsonl-parser.js +107 -0
- package/dist/ai-provider/jsonl-parser.js.map +1 -0
- package/dist/ai-provider/lifecycle.d.ts +50 -0
- package/dist/ai-provider/lifecycle.d.ts.map +1 -0
- package/dist/ai-provider/lifecycle.js +145 -0
- package/dist/ai-provider/lifecycle.js.map +1 -0
- package/dist/ai-provider/logger.d.ts +69 -0
- package/dist/ai-provider/logger.d.ts.map +1 -0
- package/dist/ai-provider/logger.js +161 -0
- package/dist/ai-provider/logger.js.map +1 -0
- package/dist/ai-provider/metrics.d.ts +91 -0
- package/dist/ai-provider/metrics.d.ts.map +1 -0
- package/dist/ai-provider/metrics.js +187 -0
- package/dist/ai-provider/metrics.js.map +1 -0
- package/dist/ai-provider/process-manager.d.ts +97 -0
- package/dist/ai-provider/process-manager.d.ts.map +1 -0
- package/dist/ai-provider/process-manager.js +477 -0
- package/dist/ai-provider/process-manager.js.map +1 -0
- package/dist/ai-provider/providers/claude-code.d.ts +64 -0
- package/dist/ai-provider/providers/claude-code.d.ts.map +1 -0
- package/dist/ai-provider/providers/claude-code.js +205 -0
- package/dist/ai-provider/providers/claude-code.js.map +1 -0
- package/dist/ai-provider/retry-executor.d.ts +52 -0
- package/dist/ai-provider/retry-executor.d.ts.map +1 -0
- package/dist/ai-provider/retry-executor.js +138 -0
- package/dist/ai-provider/retry-executor.js.map +1 -0
- package/dist/ai-provider/safe-args.d.ts +58 -0
- package/dist/ai-provider/safe-args.d.ts.map +1 -0
- package/dist/ai-provider/safe-args.js +176 -0
- package/dist/ai-provider/safe-args.js.map +1 -0
- package/dist/ai-provider/semaphore.d.ts +50 -0
- package/dist/ai-provider/semaphore.d.ts.map +1 -0
- package/dist/ai-provider/semaphore.js +97 -0
- package/dist/ai-provider/semaphore.js.map +1 -0
- package/dist/ai-provider/tracer.d.ts +67 -0
- package/dist/ai-provider/tracer.d.ts.map +1 -0
- package/dist/ai-provider/tracer.js +209 -0
- package/dist/ai-provider/tracer.js.map +1 -0
- package/dist/ai-provider/types.d.ts +181 -0
- package/dist/ai-provider/types.d.ts.map +1 -0
- package/dist/ai-provider/types.js +8 -0
- package/dist/ai-provider/types.js.map +1 -0
- package/dist/autopilot/agents/agent-runner.d.ts +109 -0
- package/dist/autopilot/agents/agent-runner.d.ts.map +1 -0
- package/dist/autopilot/agents/agent-runner.js +731 -0
- package/dist/autopilot/agents/agent-runner.js.map +1 -0
- package/dist/autopilot/agents/agent-selector.d.ts +59 -0
- package/dist/autopilot/agents/agent-selector.d.ts.map +1 -0
- package/dist/autopilot/agents/agent-selector.js +234 -0
- package/dist/autopilot/agents/agent-selector.js.map +1 -0
- package/dist/autopilot/agents/model-selector.d.ts +49 -0
- package/dist/autopilot/agents/model-selector.d.ts.map +1 -0
- package/dist/autopilot/agents/model-selector.js +62 -0
- package/dist/autopilot/agents/model-selector.js.map +1 -0
- package/dist/autopilot/agents/profiles/builtin.d.ts +55 -0
- package/dist/autopilot/agents/profiles/builtin.d.ts.map +1 -0
- package/dist/autopilot/agents/profiles/builtin.js +323 -0
- package/dist/autopilot/agents/profiles/builtin.js.map +1 -0
- package/dist/autopilot/agents/profiles/types.d.ts +98 -0
- package/dist/autopilot/agents/profiles/types.d.ts.map +1 -0
- package/dist/autopilot/agents/profiles/types.js +17 -0
- package/dist/autopilot/agents/profiles/types.js.map +1 -0
- package/dist/autopilot/api/autopilot-api-client.d.ts +217 -0
- package/dist/autopilot/api/autopilot-api-client.d.ts.map +1 -0
- package/dist/autopilot/api/autopilot-api-client.js +402 -0
- package/dist/autopilot/api/autopilot-api-client.js.map +1 -0
- package/dist/autopilot/cli/abort.d.ts +20 -0
- package/dist/autopilot/cli/abort.d.ts.map +1 -0
- package/dist/autopilot/cli/abort.js +201 -0
- package/dist/autopilot/cli/abort.js.map +1 -0
- package/dist/autopilot/cli/display.d.ts +63 -0
- package/dist/autopilot/cli/display.d.ts.map +1 -0
- package/dist/autopilot/cli/display.js +260 -0
- package/dist/autopilot/cli/display.js.map +1 -0
- package/dist/autopilot/cli/index.d.ts +24 -0
- package/dist/autopilot/cli/index.d.ts.map +1 -0
- package/dist/autopilot/cli/index.js +79 -0
- package/dist/autopilot/cli/index.js.map +1 -0
- package/dist/autopilot/cli/pause.d.ts +18 -0
- package/dist/autopilot/cli/pause.d.ts.map +1 -0
- package/dist/autopilot/cli/pause.js +110 -0
- package/dist/autopilot/cli/pause.js.map +1 -0
- package/dist/autopilot/cli/resume.d.ts +22 -0
- package/dist/autopilot/cli/resume.d.ts.map +1 -0
- package/dist/autopilot/cli/resume.js +172 -0
- package/dist/autopilot/cli/resume.js.map +1 -0
- package/dist/autopilot/cli/run.d.ts +25 -0
- package/dist/autopilot/cli/run.d.ts.map +1 -0
- package/dist/autopilot/cli/run.js +220 -0
- package/dist/autopilot/cli/run.js.map +1 -0
- package/dist/autopilot/cli/status.d.ts +20 -0
- package/dist/autopilot/cli/status.d.ts.map +1 -0
- package/dist/autopilot/cli/status.js +217 -0
- package/dist/autopilot/cli/status.js.map +1 -0
- package/dist/autopilot/config.d.ts +45 -0
- package/dist/autopilot/config.d.ts.map +1 -0
- package/dist/autopilot/config.js +269 -0
- package/dist/autopilot/config.js.map +1 -0
- package/dist/autopilot/core/dependency-resolver.d.ts +108 -0
- package/dist/autopilot/core/dependency-resolver.d.ts.map +1 -0
- package/dist/autopilot/core/dependency-resolver.js +394 -0
- package/dist/autopilot/core/dependency-resolver.js.map +1 -0
- package/dist/autopilot/core/dispatcher.d.ts +215 -0
- package/dist/autopilot/core/dispatcher.d.ts.map +1 -0
- package/dist/autopilot/core/dispatcher.js +594 -0
- package/dist/autopilot/core/dispatcher.js.map +1 -0
- package/dist/autopilot/core/failure-handler.d.ts +145 -0
- package/dist/autopilot/core/failure-handler.d.ts.map +1 -0
- package/dist/autopilot/core/failure-handler.js +308 -0
- package/dist/autopilot/core/failure-handler.js.map +1 -0
- package/dist/autopilot/core/rate-limit-handler.d.ts +108 -0
- package/dist/autopilot/core/rate-limit-handler.d.ts.map +1 -0
- package/dist/autopilot/core/rate-limit-handler.js +195 -0
- package/dist/autopilot/core/rate-limit-handler.js.map +1 -0
- package/dist/autopilot/core/state-manager.d.ts +160 -0
- package/dist/autopilot/core/state-manager.d.ts.map +1 -0
- package/dist/autopilot/core/state-manager.js +393 -0
- package/dist/autopilot/core/state-manager.js.map +1 -0
- package/dist/autopilot/core/timeout-manager.d.ts +95 -0
- package/dist/autopilot/core/timeout-manager.d.ts.map +1 -0
- package/dist/autopilot/core/timeout-manager.js +188 -0
- package/dist/autopilot/core/timeout-manager.js.map +1 -0
- package/dist/autopilot/git/branch-manager.d.ts +117 -0
- package/dist/autopilot/git/branch-manager.d.ts.map +1 -0
- package/dist/autopilot/git/branch-manager.js +238 -0
- package/dist/autopilot/git/branch-manager.js.map +1 -0
- package/dist/autopilot/git/index.d.ts +9 -0
- package/dist/autopilot/git/index.d.ts.map +1 -0
- package/dist/autopilot/git/index.js +9 -0
- package/dist/autopilot/git/index.js.map +1 -0
- package/dist/autopilot/git/merge-manager.d.ts +118 -0
- package/dist/autopilot/git/merge-manager.d.ts.map +1 -0
- package/dist/autopilot/git/merge-manager.js +304 -0
- package/dist/autopilot/git/merge-manager.js.map +1 -0
- package/dist/autopilot/git/worktree-manager.d.ts +128 -0
- package/dist/autopilot/git/worktree-manager.d.ts.map +1 -0
- package/dist/autopilot/git/worktree-manager.js +298 -0
- package/dist/autopilot/git/worktree-manager.js.map +1 -0
- package/dist/autopilot/index.d.ts +30 -0
- package/dist/autopilot/index.d.ts.map +1 -0
- package/dist/autopilot/index.js +55 -0
- package/dist/autopilot/index.js.map +1 -0
- package/dist/autopilot/sync/index.d.ts +7 -0
- package/dist/autopilot/sync/index.d.ts.map +1 -0
- package/dist/autopilot/sync/index.js +7 -0
- package/dist/autopilot/sync/index.js.map +1 -0
- package/dist/autopilot/sync/sync-manager.d.ts +168 -0
- package/dist/autopilot/sync/sync-manager.d.ts.map +1 -0
- package/dist/autopilot/sync/sync-manager.js +303 -0
- package/dist/autopilot/sync/sync-manager.js.map +1 -0
- package/dist/autopilot/types.d.ts +454 -0
- package/dist/autopilot/types.d.ts.map +1 -0
- package/dist/autopilot/types.js +26 -0
- package/dist/autopilot/types.js.map +1 -0
- package/dist/autopilot/utils/audit-logger.d.ts +176 -0
- package/dist/autopilot/utils/audit-logger.d.ts.map +1 -0
- package/dist/autopilot/utils/audit-logger.js +308 -0
- package/dist/autopilot/utils/audit-logger.js.map +1 -0
- package/dist/autopilot/utils/cost-tracker.d.ts +162 -0
- package/dist/autopilot/utils/cost-tracker.d.ts.map +1 -0
- package/dist/autopilot/utils/cost-tracker.js +269 -0
- package/dist/autopilot/utils/cost-tracker.js.map +1 -0
- package/dist/autopilot/utils/index.d.ts +9 -0
- package/dist/autopilot/utils/index.d.ts.map +1 -0
- package/dist/autopilot/utils/index.js +9 -0
- package/dist/autopilot/utils/index.js.map +1 -0
- package/dist/autopilot/utils/progress-reporter.d.ts +132 -0
- package/dist/autopilot/utils/progress-reporter.d.ts.map +1 -0
- package/dist/autopilot/utils/progress-reporter.js +290 -0
- package/dist/autopilot/utils/progress-reporter.js.map +1 -0
- package/dist/autopilot/worker/worker-pool.d.ts +179 -0
- package/dist/autopilot/worker/worker-pool.d.ts.map +1 -0
- package/dist/autopilot/worker/worker-pool.js +331 -0
- package/dist/autopilot/worker/worker-pool.js.map +1 -0
- package/dist/autopilot/worker/worker-session.d.ts +171 -0
- package/dist/autopilot/worker/worker-session.d.ts.map +1 -0
- package/dist/autopilot/worker/worker-session.js +295 -0
- package/dist/autopilot/worker/worker-session.js.map +1 -0
- package/dist/cli/commands/debug/call.d.ts.map +1 -1
- package/dist/cli/commands/debug/call.js +5 -1
- package/dist/cli/commands/debug/call.js.map +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +4 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/core/epic.js +1 -1
- package/dist/tools/core/epic.js.map +1 -1
- package/dist/tools/core/lookup.d.ts.map +1 -1
- package/dist/tools/core/lookup.js +3 -2
- package/dist/tools/core/lookup.js.map +1 -1
- package/dist/tools/core/specification.js +1 -1
- package/dist/tools/core/specification.js.map +1 -1
- package/dist/tools/core/ticket.d.ts.map +1 -1
- package/dist/tools/core/ticket.js +4 -6
- package/dist/tools/core/ticket.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +60 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +4 -1
- package/dist/validation/index.js.map +1 -1
- 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
|