@specforge/mcp 2.6.0 → 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 +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/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,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autopilot CLI Display Utilities
|
|
3
|
+
*
|
|
4
|
+
* Status tables, progress bars, and rate limit banners.
|
|
5
|
+
*/
|
|
6
|
+
import type { AutopilotState, AutopilotStatus, WorkerSession } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Color helpers
|
|
9
|
+
*/
|
|
10
|
+
export declare const c: {
|
|
11
|
+
bold: (text: string) => string;
|
|
12
|
+
dim: (text: string) => string;
|
|
13
|
+
red: (text: string) => string;
|
|
14
|
+
green: (text: string) => string;
|
|
15
|
+
yellow: (text: string) => string;
|
|
16
|
+
blue: (text: string) => string;
|
|
17
|
+
cyan: (text: string) => string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Format cost
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatCost(cost: number): string;
|
|
23
|
+
/**
|
|
24
|
+
* Format duration
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatDuration(ms: number): string;
|
|
27
|
+
/**
|
|
28
|
+
* Render progress bar
|
|
29
|
+
*/
|
|
30
|
+
export declare function renderProgressBar(completed: number, total: number, width?: number): string;
|
|
31
|
+
/**
|
|
32
|
+
* Get status display
|
|
33
|
+
*/
|
|
34
|
+
export declare function getStatusDisplay(status: AutopilotStatus): string;
|
|
35
|
+
/**
|
|
36
|
+
* Get worker status display
|
|
37
|
+
*/
|
|
38
|
+
export declare function getWorkerStatusDisplay(status: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* Render workers table
|
|
41
|
+
*/
|
|
42
|
+
export declare function renderWorkersTable(workers: WorkerSession[]): string;
|
|
43
|
+
/**
|
|
44
|
+
* Render status summary
|
|
45
|
+
*/
|
|
46
|
+
export declare function renderStatusSummary(state: AutopilotState): string;
|
|
47
|
+
/**
|
|
48
|
+
* Render rate limit banner
|
|
49
|
+
*/
|
|
50
|
+
export declare function renderRateLimitBanner(retryAfterMs?: number): string;
|
|
51
|
+
/**
|
|
52
|
+
* Render cost limit banner
|
|
53
|
+
*/
|
|
54
|
+
export declare function renderCostLimitBanner(currentCost: number, maxCost: number): string;
|
|
55
|
+
/**
|
|
56
|
+
* Render full dashboard
|
|
57
|
+
*/
|
|
58
|
+
export declare function renderDashboard(state: AutopilotState): string;
|
|
59
|
+
/**
|
|
60
|
+
* Render compact status line
|
|
61
|
+
*/
|
|
62
|
+
export declare function renderCompactStatus(state: AutopilotState): string;
|
|
63
|
+
//# sourceMappingURL=display.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../../src/autopilot/cli/display.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA6BlF;;GAEG;AACH,eAAO,MAAM,CAAC;iBACC,MAAM;gBACP,MAAM;gBACN,MAAM;kBACJ,MAAM;mBACL,MAAM;iBACR,MAAM;iBACN,MAAM;CACpB,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAYjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAW,GACjB,MAAM,CAWR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAchE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CAuCnE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAwDjE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAmBnE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAclF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAkC7D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAUjE"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autopilot CLI Display Utilities
|
|
3
|
+
*
|
|
4
|
+
* Status tables, progress bars, and rate limit banners.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* ANSI color codes
|
|
8
|
+
*/
|
|
9
|
+
const colors = {
|
|
10
|
+
reset: '\x1b[0m',
|
|
11
|
+
bold: '\x1b[1m',
|
|
12
|
+
dim: '\x1b[2m',
|
|
13
|
+
red: '\x1b[31m',
|
|
14
|
+
green: '\x1b[32m',
|
|
15
|
+
yellow: '\x1b[33m',
|
|
16
|
+
blue: '\x1b[34m',
|
|
17
|
+
cyan: '\x1b[36m',
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Check if colors are supported
|
|
21
|
+
*/
|
|
22
|
+
const useColors = process.stdout.isTTY && !process.env.NO_COLOR;
|
|
23
|
+
/**
|
|
24
|
+
* Apply color if supported
|
|
25
|
+
*/
|
|
26
|
+
function color(text, code) {
|
|
27
|
+
if (!useColors)
|
|
28
|
+
return text;
|
|
29
|
+
return `${code}${text}${colors.reset}`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Color helpers
|
|
33
|
+
*/
|
|
34
|
+
export const c = {
|
|
35
|
+
bold: (text) => color(text, colors.bold),
|
|
36
|
+
dim: (text) => color(text, colors.dim),
|
|
37
|
+
red: (text) => color(text, colors.red),
|
|
38
|
+
green: (text) => color(text, colors.green),
|
|
39
|
+
yellow: (text) => color(text, colors.yellow),
|
|
40
|
+
blue: (text) => color(text, colors.blue),
|
|
41
|
+
cyan: (text) => color(text, colors.cyan),
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Format cost
|
|
45
|
+
*/
|
|
46
|
+
export function formatCost(cost) {
|
|
47
|
+
return `$${cost.toFixed(4)}`;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Format duration
|
|
51
|
+
*/
|
|
52
|
+
export function formatDuration(ms) {
|
|
53
|
+
const seconds = Math.floor(ms / 1000);
|
|
54
|
+
const minutes = Math.floor(seconds / 60);
|
|
55
|
+
const hours = Math.floor(minutes / 60);
|
|
56
|
+
if (hours > 0) {
|
|
57
|
+
return `${hours}h ${minutes % 60}m`;
|
|
58
|
+
}
|
|
59
|
+
if (minutes > 0) {
|
|
60
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
61
|
+
}
|
|
62
|
+
return `${seconds}s`;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Render progress bar
|
|
66
|
+
*/
|
|
67
|
+
export function renderProgressBar(completed, total, width = 30) {
|
|
68
|
+
if (total === 0)
|
|
69
|
+
return `[${'░'.repeat(width)}] 0%`;
|
|
70
|
+
const percentage = completed / total;
|
|
71
|
+
const filled = Math.round(percentage * width);
|
|
72
|
+
const empty = width - filled;
|
|
73
|
+
const bar = '█'.repeat(filled) + '░'.repeat(empty);
|
|
74
|
+
const percentText = `${Math.round(percentage * 100)}%`;
|
|
75
|
+
return `[${bar}] ${percentText}`;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get status display
|
|
79
|
+
*/
|
|
80
|
+
export function getStatusDisplay(status) {
|
|
81
|
+
const displays = {
|
|
82
|
+
idle: { symbol: '○', color: c.dim },
|
|
83
|
+
running: { symbol: '●', color: c.green },
|
|
84
|
+
paused: { symbol: '◐', color: c.yellow },
|
|
85
|
+
completed: { symbol: '✓', color: c.green },
|
|
86
|
+
failed: { symbol: '✗', color: c.red },
|
|
87
|
+
aborted: { symbol: '⊘', color: c.red },
|
|
88
|
+
rate_limited: { symbol: '⏸', color: c.yellow },
|
|
89
|
+
cost_limit_reached: { symbol: '$', color: c.red },
|
|
90
|
+
};
|
|
91
|
+
const display = displays[status] || displays.idle;
|
|
92
|
+
return `${display.symbol} ${display.color(status.toUpperCase())}`;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get worker status display
|
|
96
|
+
*/
|
|
97
|
+
export function getWorkerStatusDisplay(status) {
|
|
98
|
+
const displays = {
|
|
99
|
+
idle: { symbol: '○', color: c.dim },
|
|
100
|
+
implementing: { symbol: '●', color: c.blue },
|
|
101
|
+
validating: { symbol: '◑', color: c.cyan },
|
|
102
|
+
committing: { symbol: '◒', color: c.green },
|
|
103
|
+
paused: { symbol: '◐', color: c.yellow },
|
|
104
|
+
};
|
|
105
|
+
const display = displays[status] || displays.idle;
|
|
106
|
+
return `${display.symbol} ${display.color(status)}`;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Render workers table
|
|
110
|
+
*/
|
|
111
|
+
export function renderWorkersTable(workers) {
|
|
112
|
+
const lines = [];
|
|
113
|
+
lines.push(c.bold('Workers'));
|
|
114
|
+
lines.push('─'.repeat(70));
|
|
115
|
+
lines.push('ID'.padEnd(6) +
|
|
116
|
+
'Status'.padEnd(16) +
|
|
117
|
+
'Ticket'.padEnd(20) +
|
|
118
|
+
'Elapsed'.padEnd(10) +
|
|
119
|
+
'Done'.padEnd(8) +
|
|
120
|
+
'Cost');
|
|
121
|
+
lines.push('─'.repeat(70));
|
|
122
|
+
for (const worker of workers) {
|
|
123
|
+
const elapsed = worker.ticketStartedAt
|
|
124
|
+
? formatDuration(Date.now() - new Date(worker.ticketStartedAt).getTime())
|
|
125
|
+
: '-';
|
|
126
|
+
const ticket = worker.currentTicketId
|
|
127
|
+
? worker.currentTicketId.substring(0, 18)
|
|
128
|
+
: '-';
|
|
129
|
+
const done = `${c.green(worker.completedCount.toString())}/${c.red(worker.failedCount.toString())}`;
|
|
130
|
+
lines.push(`#${worker.workerId}`.padEnd(6) +
|
|
131
|
+
getWorkerStatusDisplay(worker.status).padEnd(24) + // Extra padding for ANSI
|
|
132
|
+
ticket.padEnd(20) +
|
|
133
|
+
elapsed.padEnd(10) +
|
|
134
|
+
done.padEnd(16) + // Extra padding for ANSI
|
|
135
|
+
formatCost(worker.costUsd));
|
|
136
|
+
}
|
|
137
|
+
lines.push('─'.repeat(70));
|
|
138
|
+
return lines.join('\n');
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Render status summary
|
|
142
|
+
*/
|
|
143
|
+
export function renderStatusSummary(state) {
|
|
144
|
+
const lines = [];
|
|
145
|
+
const total = state.totalTickets || 0;
|
|
146
|
+
const completed = state.completedTickets.length;
|
|
147
|
+
const failed = state.failedTickets.length;
|
|
148
|
+
const inProgress = state.workers.filter(w => w.status !== 'idle' && w.status !== 'paused').length;
|
|
149
|
+
const pending = Math.max(0, total - completed - failed - inProgress);
|
|
150
|
+
lines.push('');
|
|
151
|
+
lines.push(c.bold('═══ SpecForge Autopilot ═══'));
|
|
152
|
+
lines.push('');
|
|
153
|
+
// Status
|
|
154
|
+
lines.push(`Status: ${getStatusDisplay(state.status)}`);
|
|
155
|
+
if (state.currentEpic) {
|
|
156
|
+
lines.push(`Epic: ${state.currentEpic}`);
|
|
157
|
+
}
|
|
158
|
+
lines.push(`Run ID: ${c.dim(state.runId)}`);
|
|
159
|
+
lines.push('');
|
|
160
|
+
// Progress bar
|
|
161
|
+
lines.push(`Progress: ${renderProgressBar(completed, total)}`);
|
|
162
|
+
lines.push('');
|
|
163
|
+
// Counts
|
|
164
|
+
lines.push(`Tickets: ${c.green(`✓ ${completed}`)} completed | ` +
|
|
165
|
+
`${c.red(`✗ ${failed}`)} failed | ` +
|
|
166
|
+
`${c.blue(`● ${inProgress}`)} in progress | ` +
|
|
167
|
+
`${c.dim(`○ ${pending}`)} pending`);
|
|
168
|
+
// Cost and time
|
|
169
|
+
const elapsed = state.startedAt
|
|
170
|
+
? formatDuration(Date.now() - new Date(state.startedAt).getTime())
|
|
171
|
+
: '-';
|
|
172
|
+
lines.push(`Cost: ${c.yellow(formatCost(state.totalCostUsd))} | ` +
|
|
173
|
+
`Elapsed: ${elapsed}`);
|
|
174
|
+
// Tokens
|
|
175
|
+
if (state.totalTokens) {
|
|
176
|
+
lines.push(`Tokens: ${state.totalTokens.inputTokens.toLocaleString()} in | ` +
|
|
177
|
+
`${state.totalTokens.outputTokens.toLocaleString()} out`);
|
|
178
|
+
}
|
|
179
|
+
lines.push('');
|
|
180
|
+
return lines.join('\n');
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Render rate limit banner
|
|
184
|
+
*/
|
|
185
|
+
export function renderRateLimitBanner(retryAfterMs) {
|
|
186
|
+
const lines = [];
|
|
187
|
+
lines.push('');
|
|
188
|
+
lines.push(c.yellow('╔════════════════════════════════════════════════════════════════════╗'));
|
|
189
|
+
lines.push(c.yellow('║') + ' RATE LIMITED ' + c.yellow('║'));
|
|
190
|
+
lines.push(c.yellow('╟────────────────────────────────────────────────────────────────────╢'));
|
|
191
|
+
if (retryAfterMs) {
|
|
192
|
+
const retryIn = formatDuration(retryAfterMs);
|
|
193
|
+
lines.push(c.yellow('║') + ` All workers are paused. Retry in: ${c.bold(retryIn)}`.padEnd(68) + c.yellow('║'));
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
lines.push(c.yellow('║') + ' All workers are paused. Waiting for rate limit to clear... ' + c.yellow('║'));
|
|
197
|
+
}
|
|
198
|
+
lines.push(c.yellow('╚════════════════════════════════════════════════════════════════════╝'));
|
|
199
|
+
lines.push('');
|
|
200
|
+
return lines.join('\n');
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Render cost limit banner
|
|
204
|
+
*/
|
|
205
|
+
export function renderCostLimitBanner(currentCost, maxCost) {
|
|
206
|
+
const lines = [];
|
|
207
|
+
lines.push('');
|
|
208
|
+
lines.push(c.red('╔════════════════════════════════════════════════════════════════════╗'));
|
|
209
|
+
lines.push(c.red('║') + ' COST LIMIT REACHED ' + c.red('║'));
|
|
210
|
+
lines.push(c.red('╟────────────────────────────────────────────────────────────────────╢'));
|
|
211
|
+
lines.push(c.red('║') + ` Current: ${formatCost(currentCost)} / Max: ${formatCost(maxCost)}`.padEnd(68) + c.red('║'));
|
|
212
|
+
lines.push(c.red('║') + ' Autopilot has been paused to prevent exceeding budget. ' + c.red('║'));
|
|
213
|
+
lines.push(c.red('║') + ' Use --max-cost to increase the limit, or resume to continue. ' + c.red('║'));
|
|
214
|
+
lines.push(c.red('╚════════════════════════════════════════════════════════════════════╝'));
|
|
215
|
+
lines.push('');
|
|
216
|
+
return lines.join('\n');
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Render full dashboard
|
|
220
|
+
*/
|
|
221
|
+
export function renderDashboard(state) {
|
|
222
|
+
const lines = [];
|
|
223
|
+
// Summary
|
|
224
|
+
lines.push(renderStatusSummary(state));
|
|
225
|
+
// Rate limit banner if applicable
|
|
226
|
+
if (state.status === 'rate_limited') {
|
|
227
|
+
lines.push(renderRateLimitBanner());
|
|
228
|
+
}
|
|
229
|
+
// Workers table
|
|
230
|
+
if (state.workers.length > 0) {
|
|
231
|
+
lines.push(renderWorkersTable(state.workers));
|
|
232
|
+
}
|
|
233
|
+
// Failed tickets summary
|
|
234
|
+
if (state.failedTickets.length > 0) {
|
|
235
|
+
lines.push('');
|
|
236
|
+
lines.push(c.bold('Failed Tickets'));
|
|
237
|
+
lines.push('─'.repeat(70));
|
|
238
|
+
for (const failed of state.failedTickets.slice(0, 5)) {
|
|
239
|
+
lines.push(` ${c.red('✗')} ${failed.ticketId}: ${failed.error.substring(0, 50)}...`);
|
|
240
|
+
}
|
|
241
|
+
if (state.failedTickets.length > 5) {
|
|
242
|
+
lines.push(c.dim(` ... and ${state.failedTickets.length - 5} more`));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
lines.push('');
|
|
246
|
+
return lines.join('\n');
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Render compact status line
|
|
250
|
+
*/
|
|
251
|
+
export function renderCompactStatus(state) {
|
|
252
|
+
const total = state.totalTickets || 0;
|
|
253
|
+
const completed = state.completedTickets.length;
|
|
254
|
+
const percentage = total > 0 ? Math.round((completed / total) * 100) : 0;
|
|
255
|
+
const elapsed = state.startedAt
|
|
256
|
+
? formatDuration(Date.now() - new Date(state.startedAt).getTime())
|
|
257
|
+
: '-';
|
|
258
|
+
return `[${state.status}] ${completed}/${total} (${percentage}%) | ${formatCost(state.totalCostUsd)} | ${elapsed}`;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../../src/autopilot/cli/display.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autopilot CLI Commands
|
|
3
|
+
*
|
|
4
|
+
* Registers all autopilot subcommands with Commander.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
/**
|
|
8
|
+
* Register autopilot commands with the main program
|
|
9
|
+
*
|
|
10
|
+
* Creates an 'autopilot' command group with subcommands:
|
|
11
|
+
* - run: Start autopilot session
|
|
12
|
+
* - status: Show session status
|
|
13
|
+
* - resume: Resume paused session
|
|
14
|
+
* - pause: Pause active session
|
|
15
|
+
* - abort: Abort and cleanup
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerAutopilotCommands(program: Command): void;
|
|
18
|
+
export { registerRunCommand } from './run.js';
|
|
19
|
+
export { registerStatusCommand } from './status.js';
|
|
20
|
+
export { registerResumeCommand } from './resume.js';
|
|
21
|
+
export { registerPauseCommand } from './pause.js';
|
|
22
|
+
export { registerAbortCommand } from './abort.js';
|
|
23
|
+
export * from './display.js';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/autopilot/cli/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkDhE;AAGD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGlD,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autopilot CLI Commands
|
|
3
|
+
*
|
|
4
|
+
* Registers all autopilot subcommands with Commander.
|
|
5
|
+
*/
|
|
6
|
+
import { registerRunCommand } from './run.js';
|
|
7
|
+
import { registerStatusCommand } from './status.js';
|
|
8
|
+
import { registerResumeCommand } from './resume.js';
|
|
9
|
+
import { registerPauseCommand } from './pause.js';
|
|
10
|
+
import { registerAbortCommand } from './abort.js';
|
|
11
|
+
/**
|
|
12
|
+
* Register autopilot commands with the main program
|
|
13
|
+
*
|
|
14
|
+
* Creates an 'autopilot' command group with subcommands:
|
|
15
|
+
* - run: Start autopilot session
|
|
16
|
+
* - status: Show session status
|
|
17
|
+
* - resume: Resume paused session
|
|
18
|
+
* - pause: Pause active session
|
|
19
|
+
* - abort: Abort and cleanup
|
|
20
|
+
*/
|
|
21
|
+
export function registerAutopilotCommands(program) {
|
|
22
|
+
const autopilotCommand = program
|
|
23
|
+
.command('autopilot')
|
|
24
|
+
.description('Autonomous ticket implementation engine')
|
|
25
|
+
.addHelpText('after', `
|
|
26
|
+
Overview:
|
|
27
|
+
Autopilot autonomously implements tickets using Claude Code CLI.
|
|
28
|
+
It manages parallel workers, handles rate limits, and tracks costs.
|
|
29
|
+
|
|
30
|
+
Commands:
|
|
31
|
+
run Start autopilot to implement tickets
|
|
32
|
+
status Show current session status
|
|
33
|
+
resume Resume a paused session
|
|
34
|
+
pause Pause the active session
|
|
35
|
+
abort Abort and cleanup resources
|
|
36
|
+
|
|
37
|
+
Quick Start:
|
|
38
|
+
$ specforge autopilot run # Start with current spec
|
|
39
|
+
$ specforge autopilot run --parallel 2 # Run with 2 workers
|
|
40
|
+
$ specforge autopilot run --max-cost 10 # Limit to $10
|
|
41
|
+
|
|
42
|
+
Configuration:
|
|
43
|
+
Configure autopilot in .specforge.json:
|
|
44
|
+
|
|
45
|
+
{
|
|
46
|
+
"autopilot": {
|
|
47
|
+
"maxParallelWorkers": 3,
|
|
48
|
+
"maxTotalCostUsd": 50,
|
|
49
|
+
"branchStrategy": "per-epic",
|
|
50
|
+
"autoCommit": true,
|
|
51
|
+
"autoPush": false,
|
|
52
|
+
"aiProvider": {
|
|
53
|
+
"mode": "claude_code",
|
|
54
|
+
"maxParallelProcesses": 5,
|
|
55
|
+
"requestTimeoutSeconds": 300,
|
|
56
|
+
"maxRetries": 3
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
Documentation:
|
|
62
|
+
https://docs.specforge.com/autopilot
|
|
63
|
+
`);
|
|
64
|
+
// Register subcommands
|
|
65
|
+
registerRunCommand(autopilotCommand);
|
|
66
|
+
registerStatusCommand(autopilotCommand);
|
|
67
|
+
registerResumeCommand(autopilotCommand);
|
|
68
|
+
registerPauseCommand(autopilotCommand);
|
|
69
|
+
registerAbortCommand(autopilotCommand);
|
|
70
|
+
}
|
|
71
|
+
// Re-export individual command registrations for flexibility
|
|
72
|
+
export { registerRunCommand } from './run.js';
|
|
73
|
+
export { registerStatusCommand } from './status.js';
|
|
74
|
+
export { registerResumeCommand } from './resume.js';
|
|
75
|
+
export { registerPauseCommand } from './pause.js';
|
|
76
|
+
export { registerAbortCommand } from './abort.js';
|
|
77
|
+
// Export display utilities
|
|
78
|
+
export * from './display.js';
|
|
79
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/autopilot/cli/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;;;;;GASG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,MAAM,gBAAgB,GAAG,OAAO;SAC7B,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,yCAAyC,CAAC;SACtD,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCzB,CAAC,CAAC;IAED,uBAAuB;IACvB,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IACrC,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IACxC,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IACxC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;IACvC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;AACzC,CAAC;AAED,6DAA6D;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,2BAA2B;AAC3B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autopilot Pause Command
|
|
3
|
+
*
|
|
4
|
+
* Pauses an active autopilot session.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
/**
|
|
8
|
+
* Pause command options
|
|
9
|
+
*/
|
|
10
|
+
export interface PauseOptions {
|
|
11
|
+
force?: boolean;
|
|
12
|
+
json?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Register pause command
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerPauseCommand(program: Command): void;
|
|
18
|
+
//# sourceMappingURL=pause.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pause.d.ts","sourceRoot":"","sources":["../../../src/autopilot/cli/pause.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA2FD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsB3D"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autopilot Pause Command
|
|
3
|
+
*
|
|
4
|
+
* Pauses an active autopilot session.
|
|
5
|
+
*/
|
|
6
|
+
import ora from 'ora';
|
|
7
|
+
import * as fs from 'fs/promises';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import { withErrorHandler, CliError } from '../../cli/middleware/error-handler.js';
|
|
10
|
+
import { STATE_FILE_NAME } from '../core/state-manager.js';
|
|
11
|
+
import { c, formatCost } from './display.js';
|
|
12
|
+
/**
|
|
13
|
+
* Load and update state
|
|
14
|
+
*/
|
|
15
|
+
async function pauseState(workingDirectory) {
|
|
16
|
+
const statePath = path.join(workingDirectory, '.specforge', STATE_FILE_NAME);
|
|
17
|
+
try {
|
|
18
|
+
const content = await fs.readFile(statePath, 'utf-8');
|
|
19
|
+
const state = JSON.parse(content);
|
|
20
|
+
// Update status to paused
|
|
21
|
+
if (state.status === 'running') {
|
|
22
|
+
state.status = 'paused';
|
|
23
|
+
state.pausedAt = new Date().toISOString();
|
|
24
|
+
// Save updated state
|
|
25
|
+
await fs.writeFile(statePath, JSON.stringify(state, null, 2));
|
|
26
|
+
}
|
|
27
|
+
return state;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Pause command action
|
|
35
|
+
*/
|
|
36
|
+
async function pauseAction(options) {
|
|
37
|
+
const workingDirectory = process.cwd();
|
|
38
|
+
const spinner = ora({
|
|
39
|
+
text: 'Pausing autopilot...',
|
|
40
|
+
color: 'cyan',
|
|
41
|
+
}).start();
|
|
42
|
+
try {
|
|
43
|
+
const state = await pauseState(workingDirectory);
|
|
44
|
+
if (!state) {
|
|
45
|
+
spinner.fail('No active autopilot session');
|
|
46
|
+
throw new CliError('No active session', 1, 'No autopilot session is currently running.');
|
|
47
|
+
}
|
|
48
|
+
if (state.status !== 'paused' && state.status !== 'running') {
|
|
49
|
+
spinner.fail(`Session is ${state.status}`);
|
|
50
|
+
throw new CliError('Cannot pause', 1, `Session is already ${state.status}. Cannot pause.`);
|
|
51
|
+
}
|
|
52
|
+
spinner.succeed('Autopilot paused');
|
|
53
|
+
if (options.json) {
|
|
54
|
+
console.log(JSON.stringify({
|
|
55
|
+
success: true,
|
|
56
|
+
runId: state.runId,
|
|
57
|
+
status: state.status,
|
|
58
|
+
completed: state.completedTickets.length,
|
|
59
|
+
failed: state.failedTickets.length,
|
|
60
|
+
cost: state.totalCostUsd,
|
|
61
|
+
}, null, 2));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.log('');
|
|
65
|
+
console.log(c.bold('Session Paused'));
|
|
66
|
+
console.log('');
|
|
67
|
+
console.log(`Run ID: ${c.dim(state.runId)}`);
|
|
68
|
+
console.log(`Completed: ${c.green(state.completedTickets.length.toString())} tickets`);
|
|
69
|
+
console.log(`Failed: ${c.red(state.failedTickets.length.toString())} tickets`);
|
|
70
|
+
console.log(`Cost: ${c.yellow(formatCost(state.totalCostUsd))}`);
|
|
71
|
+
console.log('');
|
|
72
|
+
console.log(c.dim('Use `specforge autopilot resume` to continue.'));
|
|
73
|
+
console.log(c.dim('Use `specforge autopilot abort` to cancel and cleanup.'));
|
|
74
|
+
console.log('');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
if (!(error instanceof CliError)) {
|
|
79
|
+
spinner.fail('Failed to pause');
|
|
80
|
+
}
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Register pause command
|
|
86
|
+
*/
|
|
87
|
+
export function registerPauseCommand(program) {
|
|
88
|
+
program
|
|
89
|
+
.command('pause')
|
|
90
|
+
.description('Pause the active autopilot session')
|
|
91
|
+
.option('-f, --force', 'Force pause (interrupt active workers)')
|
|
92
|
+
.option('--json', 'Output as JSON')
|
|
93
|
+
.addHelpText('after', `
|
|
94
|
+
Examples:
|
|
95
|
+
$ specforge autopilot pause # Pause gracefully
|
|
96
|
+
$ specforge autopilot pause --force # Force pause active workers
|
|
97
|
+
|
|
98
|
+
Behavior:
|
|
99
|
+
- Workers will complete their current task before pausing
|
|
100
|
+
- Use --force to interrupt workers immediately (may lose progress)
|
|
101
|
+
- State is saved to .specforge/autopilot-state.json
|
|
102
|
+
- Use 'specforge autopilot resume' to continue later
|
|
103
|
+
|
|
104
|
+
Note:
|
|
105
|
+
If you run this command while autopilot is running in another terminal,
|
|
106
|
+
it will signal that process to pause after the current task completes.
|
|
107
|
+
`)
|
|
108
|
+
.action(withErrorHandler(pauseAction));
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=pause.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pause.js","sourceRoot":"","sources":["../../../src/autopilot/cli/pause.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autopilot Resume Command
|
|
3
|
+
*
|
|
4
|
+
* Resumes a paused autopilot session.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
/**
|
|
8
|
+
* Resume command options
|
|
9
|
+
*/
|
|
10
|
+
export interface ResumeOptions {
|
|
11
|
+
runId?: string;
|
|
12
|
+
skipFailed?: boolean;
|
|
13
|
+
retryFailed?: boolean;
|
|
14
|
+
watch?: boolean;
|
|
15
|
+
verbose?: boolean;
|
|
16
|
+
json?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Register resume command
|
|
20
|
+
*/
|
|
21
|
+
export declare function registerResumeCommand(program: Command): void;
|
|
22
|
+
//# sourceMappingURL=resume.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../../src/autopilot/cli/resume.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAuKD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwB5D"}
|