@specforge/mcp 2.5.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +118 -45
- 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/blocked.js +6 -6
- package/dist/cli/commands/blocked.js.map +1 -1
- package/dist/cli/commands/blueprints.js +1 -1
- package/dist/cli/commands/blueprints.js.map +1 -1
- package/dist/cli/commands/configure.js +6 -6
- package/dist/cli/commands/configure.js.map +1 -1
- package/dist/cli/commands/debug/call.js +3 -3
- package/dist/cli/commands/debug/call.js.map +1 -1
- package/dist/cli/commands/debug/register.js +11 -11
- package/dist/cli/commands/debug/test.js +1 -1
- package/dist/cli/commands/debug/test.js.map +1 -1
- package/dist/cli/commands/debug/tools.js +1 -1
- package/dist/cli/commands/debug/tools.js.map +1 -1
- package/dist/cli/commands/docs/content/api.js +3 -3
- package/dist/cli/commands/docs/content/examples.js +12 -12
- package/dist/cli/commands/docs/content/workflow.js +2 -2
- package/dist/cli/commands/docs/display.js +4 -4
- package/dist/cli/commands/docs/display.js.map +1 -1
- package/dist/cli/commands/docs/docs.js +3 -3
- package/dist/cli/commands/docs/docs.js.map +1 -1
- package/dist/cli/commands/docs/tool-docs.js +2 -2
- package/dist/cli/commands/docs/tool-docs.js.map +1 -1
- package/dist/cli/commands/doctor.js +2 -2
- package/dist/cli/commands/doctor.types.d.ts +7 -7
- package/dist/cli/commands/doctor.types.js +7 -7
- package/dist/cli/commands/doctor.types.js.map +1 -1
- package/dist/cli/commands/feedback.js +5 -5
- package/dist/cli/commands/init.js +8 -8
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/invitations.js +5 -5
- package/dist/cli/commands/invitations.js.map +1 -1
- package/dist/cli/commands/login.js +6 -6
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/members.js +9 -9
- package/dist/cli/commands/members.js.map +1 -1
- package/dist/cli/commands/next.js +10 -10
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/projects.js +6 -6
- package/dist/cli/commands/projects.js.map +1 -1
- package/dist/cli/commands/review/review.js +8 -8
- package/dist/cli/commands/review/review.js.map +1 -1
- package/dist/cli/commands/scaffold/scaffold.js +2 -2
- package/dist/cli/commands/scaffold/scaffold.js.map +1 -1
- package/dist/cli/commands/session/display.js +1 -1
- package/dist/cli/commands/session/display.js.map +1 -1
- package/dist/cli/commands/session/end.js +6 -6
- package/dist/cli/commands/session/end.js.map +1 -1
- package/dist/cli/commands/session/register.js +12 -12
- package/dist/cli/commands/session/start.js +6 -6
- package/dist/cli/commands/session/start.js.map +1 -1
- package/dist/cli/commands/session/status.js +1 -1
- package/dist/cli/commands/session/status.js.map +1 -1
- package/dist/cli/commands/specs.js +9 -9
- package/dist/cli/commands/specs.js.map +1 -1
- package/dist/cli/commands/status.js +11 -11
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/switch.js +10 -10
- package/dist/cli/commands/switch.js.map +1 -1
- package/dist/cli/commands/ticket/command.js +5 -5
- package/dist/cli/commands/ticket/command.js.map +1 -1
- package/dist/cli/commands/ticket/register.js +4 -4
- package/dist/cli/commands/ticket/resolver.js +1 -1
- package/dist/cli/commands/ticket/resolver.js.map +1 -1
- package/dist/cli/commands/tickets.js +11 -11
- package/dist/cli/commands/tickets.js.map +1 -1
- package/dist/cli/config/loader.d.ts +1 -1
- package/dist/cli/config/loader.js +1 -1
- package/dist/cli/config/types.d.ts +2 -2
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +10 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/middleware/auth-guard.js +1 -1
- package/dist/cli/middleware/auth-guard.js.map +1 -1
- package/dist/cli/middleware/error-handler.js +1 -1
- package/dist/cli/middleware/error-handler.js.map +1 -1
- package/dist/cli/ui/dashboard.js +1 -1
- package/dist/cli/ui/dashboard.js.map +1 -1
- package/dist/cli/ui/output.d.ts +2 -2
- package/dist/cli/ui/output.js +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/core/workflow-guide.js +1 -1
- package/dist/tools/core/workflow-guide.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 +18 -13
- /package/bin/{specforge-mcp → specforge} +0 -0
|
@@ -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
|