@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
package/README.md
CHANGED
|
@@ -42,7 +42,7 @@ Add to `~/.config/claude/claude_desktop_config.json` (Linux/macOS) or `%APPDATA%
|
|
|
42
42
|
{
|
|
43
43
|
"mcpServers": {
|
|
44
44
|
"specforge": {
|
|
45
|
-
"command": "specforge
|
|
45
|
+
"command": "specforge",
|
|
46
46
|
"env": {
|
|
47
47
|
"SPECFORGE_API_KEY": "sf_live_your_api_key_here",
|
|
48
48
|
"SPECFORGE_API_URL": "https://your-api-gateway-url.amazonaws.com/prod"
|
|
@@ -60,7 +60,7 @@ Add to `~/.claude/settings.json`:
|
|
|
60
60
|
{
|
|
61
61
|
"mcpServers": {
|
|
62
62
|
"specforge": {
|
|
63
|
-
"command": "specforge
|
|
63
|
+
"command": "specforge",
|
|
64
64
|
"env": {
|
|
65
65
|
"SPECFORGE_API_KEY": "sf_live_your_api_key_here",
|
|
66
66
|
"SPECFORGE_API_URL": "https://your-api-gateway-url.amazonaws.com/prod"
|
|
@@ -75,7 +75,7 @@ Or set environment variables in your shell and run:
|
|
|
75
75
|
```bash
|
|
76
76
|
export SPECFORGE_API_KEY="sf_live_your_api_key_here"
|
|
77
77
|
export SPECFORGE_API_URL="https://your-api-gateway-url.amazonaws.com/prod"
|
|
78
|
-
specforge
|
|
78
|
+
specforge
|
|
79
79
|
```
|
|
80
80
|
|
|
81
81
|
### Cursor
|
|
@@ -107,7 +107,7 @@ Add to your VS Code `settings.json`:
|
|
|
107
107
|
"mcp": {
|
|
108
108
|
"servers": {
|
|
109
109
|
"specforge": {
|
|
110
|
-
"command": "specforge
|
|
110
|
+
"command": "specforge",
|
|
111
111
|
"env": {
|
|
112
112
|
"SPECFORGE_API_KEY": "sf_live_your_api_key_here",
|
|
113
113
|
"SPECFORGE_API_URL": "https://your-api-gateway-url.amazonaws.com/prod"
|
|
@@ -127,7 +127,7 @@ Create a config file at `~/.config/gh-copilot/mcp.json`:
|
|
|
127
127
|
{
|
|
128
128
|
"servers": {
|
|
129
129
|
"specforge": {
|
|
130
|
-
"command": "specforge
|
|
130
|
+
"command": "specforge",
|
|
131
131
|
"env": {
|
|
132
132
|
"SPECFORGE_API_KEY": "sf_live_your_api_key_here",
|
|
133
133
|
"SPECFORGE_API_URL": "https://your-api-gateway-url.amazonaws.com/prod"
|
|
@@ -146,7 +146,7 @@ export SPECFORGE_API_KEY="sf_live_your_api_key_here"
|
|
|
146
146
|
export SPECFORGE_API_URL="https://your-api-gateway-url.amazonaws.com/prod"
|
|
147
147
|
|
|
148
148
|
# Then configure your Codex CLI to use the MCP server
|
|
149
|
-
codex --mcp-server specforge
|
|
149
|
+
codex --mcp-server specforge
|
|
150
150
|
```
|
|
151
151
|
|
|
152
152
|
### ChatGPT Desktop
|
|
@@ -157,7 +157,7 @@ Add to ChatGPT Desktop's MCP configuration:
|
|
|
157
157
|
{
|
|
158
158
|
"mcpServers": {
|
|
159
159
|
"specforge": {
|
|
160
|
-
"command": "specforge
|
|
160
|
+
"command": "specforge",
|
|
161
161
|
"env": {
|
|
162
162
|
"SPECFORGE_API_KEY": "sf_live_your_api_key_here",
|
|
163
163
|
"SPECFORGE_API_URL": "https://your-api-gateway-url.amazonaws.com/prod"
|
|
@@ -176,7 +176,7 @@ Add to Windsurf's settings:
|
|
|
176
176
|
"mcp": {
|
|
177
177
|
"servers": {
|
|
178
178
|
"specforge": {
|
|
179
|
-
"command": "specforge
|
|
179
|
+
"command": "specforge",
|
|
180
180
|
"env": {
|
|
181
181
|
"SPECFORGE_API_KEY": "sf_live_your_api_key_here",
|
|
182
182
|
"SPECFORGE_API_URL": "https://your-api-gateway-url.amazonaws.com/prod"
|
|
@@ -193,7 +193,7 @@ For any MCP-compatible client, the server uses stdio transport:
|
|
|
193
193
|
|
|
194
194
|
```bash
|
|
195
195
|
# Start the server with environment variables
|
|
196
|
-
SPECFORGE_API_KEY="sf_live_xxx" SPECFORGE_API_URL="https://xxx" specforge
|
|
196
|
+
SPECFORGE_API_KEY="sf_live_xxx" SPECFORGE_API_URL="https://xxx" specforge
|
|
197
197
|
```
|
|
198
198
|
|
|
199
199
|
The server communicates via JSON-RPC over stdin/stdout.
|
|
@@ -251,6 +251,22 @@ The SpecForge MCP server provides the following tool categories:
|
|
|
251
251
|
- `get_ticket_commits` - Get commits for a ticket
|
|
252
252
|
- `get_ticket_prs` - Get PRs for a ticket
|
|
253
253
|
|
|
254
|
+
### Blueprint Management
|
|
255
|
+
- `blueprint` - Manage specification blueprints (diagrams, mockups, ADRs)
|
|
256
|
+
- Operations: `create`, `get`, `update`, `list`, `delete`, `link`, `unlink`, `get_for_ticket`
|
|
257
|
+
- Categories: flowchart, architecture, state, sequence, erd, mockup, adr, component, deployment, api
|
|
258
|
+
- See [Blueprint Documentation](/docs/mcp/tools/blueprint.md)
|
|
259
|
+
|
|
260
|
+
### Project Sharing
|
|
261
|
+
- `list_project_members` - List all members of a project
|
|
262
|
+
- `invite_to_project` - Invite a user by email
|
|
263
|
+
- `remove_project_member` - Remove a member from project
|
|
264
|
+
- `update_member_role` - Change a member's role (owner, editor, viewer)
|
|
265
|
+
- `list_invitations` - List pending invitations
|
|
266
|
+
- `accept_project_invitation` - Accept an invitation
|
|
267
|
+
- `decline_project_invitation` - Decline an invitation
|
|
268
|
+
- See [Project Sharing Documentation](/docs/mcp/collaboration/)
|
|
269
|
+
|
|
254
270
|
## CLI Commands
|
|
255
271
|
|
|
256
272
|
The SpecForge MCP package includes a CLI for project configuration and management.
|
|
@@ -278,13 +294,18 @@ The SpecForge MCP package includes a CLI for project configuration and managemen
|
|
|
278
294
|
| `tools` | List available MCP tools |
|
|
279
295
|
| `test` | Test API connection |
|
|
280
296
|
| `whoami` | Show current user/config |
|
|
297
|
+
| `autopilot run` | Start autonomous implementation |
|
|
298
|
+
| `autopilot status` | Show autopilot session status |
|
|
299
|
+
| `autopilot pause` | Pause active session |
|
|
300
|
+
| `autopilot resume` | Resume paused session |
|
|
301
|
+
| `autopilot abort` | Stop and cleanup session |
|
|
281
302
|
|
|
282
303
|
### Setup Commands
|
|
283
304
|
|
|
284
305
|
#### login
|
|
285
306
|
|
|
286
307
|
```bash
|
|
287
|
-
specforge
|
|
308
|
+
specforge login [--api-key <key>] [--force]
|
|
288
309
|
```
|
|
289
310
|
|
|
290
311
|
Authenticate with the SpecForge API.
|
|
@@ -296,15 +317,15 @@ Authenticate with the SpecForge API.
|
|
|
296
317
|
|
|
297
318
|
Examples:
|
|
298
319
|
```bash
|
|
299
|
-
specforge
|
|
300
|
-
specforge
|
|
301
|
-
specforge
|
|
320
|
+
specforge login # Interactive login
|
|
321
|
+
specforge login --api-key sf_live_xxx # Non-interactive
|
|
322
|
+
specforge login --force # Re-authenticate
|
|
302
323
|
```
|
|
303
324
|
|
|
304
325
|
#### init
|
|
305
326
|
|
|
306
327
|
```bash
|
|
307
|
-
specforge
|
|
328
|
+
specforge init [--project <id>] [--spec <id>] [--format <format>] [--force]
|
|
308
329
|
```
|
|
309
330
|
|
|
310
331
|
Initialize SpecForge in the current directory.
|
|
@@ -322,15 +343,15 @@ Creates:
|
|
|
322
343
|
|
|
323
344
|
Examples:
|
|
324
345
|
```bash
|
|
325
|
-
specforge
|
|
326
|
-
specforge
|
|
327
|
-
specforge
|
|
346
|
+
specforge init # Interactive setup
|
|
347
|
+
specforge init --project proj_abc # Set project
|
|
348
|
+
specforge init --project proj_abc --spec spec_xyz --format toon
|
|
328
349
|
```
|
|
329
350
|
|
|
330
351
|
#### configure
|
|
331
352
|
|
|
332
353
|
```bash
|
|
333
|
-
specforge
|
|
354
|
+
specforge configure [--format <format>] [--project <id>]
|
|
334
355
|
```
|
|
335
356
|
|
|
336
357
|
Configure default preferences.
|
|
@@ -338,7 +359,7 @@ Configure default preferences.
|
|
|
338
359
|
#### doctor
|
|
339
360
|
|
|
340
361
|
```bash
|
|
341
|
-
specforge
|
|
362
|
+
specforge doctor [--json]
|
|
342
363
|
```
|
|
343
364
|
|
|
344
365
|
Diagnose configuration and connection issues.
|
|
@@ -358,7 +379,7 @@ Check categories:
|
|
|
358
379
|
#### switch
|
|
359
380
|
|
|
360
381
|
```bash
|
|
361
|
-
specforge
|
|
382
|
+
specforge switch [--project <id>] [--spec <id>]
|
|
362
383
|
```
|
|
363
384
|
|
|
364
385
|
Switch between projects or specifications.
|
|
@@ -366,7 +387,7 @@ Switch between projects or specifications.
|
|
|
366
387
|
#### projects
|
|
367
388
|
|
|
368
389
|
```bash
|
|
369
|
-
specforge
|
|
390
|
+
specforge projects [--json] [--toon]
|
|
370
391
|
```
|
|
371
392
|
|
|
372
393
|
List all accessible projects.
|
|
@@ -374,7 +395,7 @@ List all accessible projects.
|
|
|
374
395
|
#### specs
|
|
375
396
|
|
|
376
397
|
```bash
|
|
377
|
-
specforge
|
|
398
|
+
specforge specs [--project <id>] [--status <status>] [--json]
|
|
378
399
|
```
|
|
379
400
|
|
|
380
401
|
List specifications for the current or specified project.
|
|
@@ -384,7 +405,7 @@ List specifications for the current or specified project.
|
|
|
384
405
|
#### status
|
|
385
406
|
|
|
386
407
|
```bash
|
|
387
|
-
specforge
|
|
408
|
+
specforge status [--spec <id>] [--json]
|
|
388
409
|
```
|
|
389
410
|
|
|
390
411
|
Show current specification status with progress metrics.
|
|
@@ -392,7 +413,7 @@ Show current specification status with progress metrics.
|
|
|
392
413
|
#### tickets
|
|
393
414
|
|
|
394
415
|
```bash
|
|
395
|
-
specforge
|
|
416
|
+
specforge tickets [--epic <id>] [--status <status>] [--limit <n>] [--json]
|
|
396
417
|
```
|
|
397
418
|
|
|
398
419
|
List tickets for the current specification.
|
|
@@ -400,7 +421,7 @@ List tickets for the current specification.
|
|
|
400
421
|
#### ticket
|
|
401
422
|
|
|
402
423
|
```bash
|
|
403
|
-
specforge
|
|
424
|
+
specforge ticket <id> [--json] [--context]
|
|
404
425
|
```
|
|
405
426
|
|
|
406
427
|
Show full details for a specific ticket.
|
|
@@ -413,7 +434,7 @@ Show full details for a specific ticket.
|
|
|
413
434
|
#### next
|
|
414
435
|
|
|
415
436
|
```bash
|
|
416
|
-
specforge
|
|
437
|
+
specforge next [--spec <id>] [--count <n>] [--json]
|
|
417
438
|
```
|
|
418
439
|
|
|
419
440
|
Get the next actionable tickets (dependencies satisfied).
|
|
@@ -421,7 +442,7 @@ Get the next actionable tickets (dependencies satisfied).
|
|
|
421
442
|
#### blocked
|
|
422
443
|
|
|
423
444
|
```bash
|
|
424
|
-
specforge
|
|
445
|
+
specforge blocked [--spec <id>] [--json]
|
|
425
446
|
```
|
|
426
447
|
|
|
427
448
|
List blocked tickets with blocking reasons.
|
|
@@ -431,7 +452,7 @@ List blocked tickets with blocking reasons.
|
|
|
431
452
|
#### session
|
|
432
453
|
|
|
433
454
|
```bash
|
|
434
|
-
specforge
|
|
455
|
+
specforge session [--json]
|
|
435
456
|
```
|
|
436
457
|
|
|
437
458
|
Show current implementation session status.
|
|
@@ -439,7 +460,7 @@ Show current implementation session status.
|
|
|
439
460
|
#### session start
|
|
440
461
|
|
|
441
462
|
```bash
|
|
442
|
-
specforge
|
|
463
|
+
specforge session start [specId] [--mode <mode>] [--max-tickets <n>] [--stop-on-failure] [--force]
|
|
443
464
|
```
|
|
444
465
|
|
|
445
466
|
Start a new implementation session.
|
|
@@ -455,7 +476,7 @@ Start a new implementation session.
|
|
|
455
476
|
#### session end
|
|
456
477
|
|
|
457
478
|
```bash
|
|
458
|
-
specforge
|
|
479
|
+
specforge session end [--status <status>] [--summary <text>]
|
|
459
480
|
```
|
|
460
481
|
|
|
461
482
|
End the current implementation session.
|
|
@@ -470,22 +491,22 @@ End the current implementation session.
|
|
|
470
491
|
#### call
|
|
471
492
|
|
|
472
493
|
```bash
|
|
473
|
-
specforge
|
|
494
|
+
specforge call <tool> [--args <json>] [--format <format>] [--raw]
|
|
474
495
|
```
|
|
475
496
|
|
|
476
497
|
Directly call an MCP tool with JSON arguments.
|
|
477
498
|
|
|
478
499
|
Examples:
|
|
479
500
|
```bash
|
|
480
|
-
specforge
|
|
481
|
-
specforge
|
|
482
|
-
specforge
|
|
501
|
+
specforge call list_projects
|
|
502
|
+
specforge call get_ticket --args='{"ticketId":"abc123"}'
|
|
503
|
+
specforge call list_tickets --format toon
|
|
483
504
|
```
|
|
484
505
|
|
|
485
506
|
#### tools
|
|
486
507
|
|
|
487
508
|
```bash
|
|
488
|
-
specforge
|
|
509
|
+
specforge tools [--category <category>] [--search <query>] [--json]
|
|
489
510
|
```
|
|
490
511
|
|
|
491
512
|
List available MCP tools with optional filtering.
|
|
@@ -493,7 +514,7 @@ List available MCP tools with optional filtering.
|
|
|
493
514
|
#### test
|
|
494
515
|
|
|
495
516
|
```bash
|
|
496
|
-
specforge
|
|
517
|
+
specforge test
|
|
497
518
|
```
|
|
498
519
|
|
|
499
520
|
Test API connection and authentication. Shows response time and user info.
|
|
@@ -501,11 +522,63 @@ Test API connection and authentication. Shows response time and user info.
|
|
|
501
522
|
#### whoami
|
|
502
523
|
|
|
503
524
|
```bash
|
|
504
|
-
specforge
|
|
525
|
+
specforge whoami [--json]
|
|
505
526
|
```
|
|
506
527
|
|
|
507
528
|
Show current user information and configuration settings.
|
|
508
529
|
|
|
530
|
+
### Autopilot Commands
|
|
531
|
+
|
|
532
|
+
Autopilot enables autonomous ticket implementation using Claude Code. See [full documentation](/docs/mcp/autopilot/).
|
|
533
|
+
|
|
534
|
+
#### autopilot run
|
|
535
|
+
|
|
536
|
+
```bash
|
|
537
|
+
specforge autopilot run [options]
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
Start autonomous ticket implementation.
|
|
541
|
+
|
|
542
|
+
| Option | Description |
|
|
543
|
+
|--------|-------------|
|
|
544
|
+
| `-s, --spec <id>` | Specification ID |
|
|
545
|
+
| `-e, --epic <id>` | Only implement tickets from this epic |
|
|
546
|
+
| `-p, --parallel <n>` | Number of parallel workers (1-10) |
|
|
547
|
+
| `-c, --max-cost <usd>` | Maximum cost in USD |
|
|
548
|
+
| `-n, --dry-run` | Show plan without executing |
|
|
549
|
+
| `-w, --watch` | Watch mode with live dashboard |
|
|
550
|
+
| `-r, --resume <id>` | Resume a previous run |
|
|
551
|
+
|
|
552
|
+
Examples:
|
|
553
|
+
```bash
|
|
554
|
+
specforge autopilot run --dry-run # Preview
|
|
555
|
+
specforge autopilot run --parallel 2 # Run with 2 workers
|
|
556
|
+
specforge autopilot run --max-cost 10 # Limit to $10
|
|
557
|
+
specforge autopilot run --watch # Live dashboard
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
#### autopilot status
|
|
561
|
+
|
|
562
|
+
```bash
|
|
563
|
+
specforge autopilot status [options]
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
Show current autopilot session status.
|
|
567
|
+
|
|
568
|
+
| Option | Description |
|
|
569
|
+
|--------|-------------|
|
|
570
|
+
| `-w, --watch` | Live updates (2s refresh) |
|
|
571
|
+
| `-v, --verbose` | Show detailed dashboard |
|
|
572
|
+
| `--json` | Output as JSON |
|
|
573
|
+
|
|
574
|
+
#### autopilot pause / resume / abort
|
|
575
|
+
|
|
576
|
+
```bash
|
|
577
|
+
specforge autopilot pause # Pause gracefully
|
|
578
|
+
specforge autopilot resume # Resume latest session
|
|
579
|
+
specforge autopilot abort --force # Stop and cleanup
|
|
580
|
+
```
|
|
581
|
+
|
|
509
582
|
### Configuration Files
|
|
510
583
|
|
|
511
584
|
| File | Location | Purpose |
|
|
@@ -548,19 +621,19 @@ Non-interactive usage for scripts:
|
|
|
548
621
|
```bash
|
|
549
622
|
# Authenticate via environment or flag
|
|
550
623
|
export SPECFORGE_API_KEY="sf_live_xxx"
|
|
551
|
-
specforge
|
|
624
|
+
specforge login --api-key $SPECFORGE_API_KEY
|
|
552
625
|
|
|
553
626
|
# Initialize non-interactively
|
|
554
|
-
specforge
|
|
627
|
+
specforge init --project $PROJECT_ID --spec $SPEC_ID --format json --force
|
|
555
628
|
|
|
556
629
|
# Check health (exits 1 on failure)
|
|
557
|
-
specforge
|
|
630
|
+
specforge doctor --json
|
|
558
631
|
|
|
559
632
|
# Get tickets as JSON for processing
|
|
560
|
-
specforge
|
|
633
|
+
specforge tickets --json | jq '.[]'
|
|
561
634
|
|
|
562
635
|
# Get next actionable ticket ID
|
|
563
|
-
specforge
|
|
636
|
+
specforge next --json | jq -r '.tickets[0].id'
|
|
564
637
|
```
|
|
565
638
|
|
|
566
639
|
### Global Options
|
|
@@ -607,7 +680,7 @@ If you're experiencing connection issues:
|
|
|
607
680
|
|
|
608
681
|
```bash
|
|
609
682
|
export SPECFORGE_DEBUG=true
|
|
610
|
-
specforge
|
|
683
|
+
specforge
|
|
611
684
|
```
|
|
612
685
|
|
|
613
686
|
### Debug Mode
|
|
@@ -632,11 +705,11 @@ This will output detailed logs to stderr, including:
|
|
|
632
705
|
|
|
633
706
|
### Permission Denied
|
|
634
707
|
|
|
635
|
-
If you get "permission denied" when running `specforge
|
|
708
|
+
If you get "permission denied" when running `specforge`:
|
|
636
709
|
|
|
637
710
|
```bash
|
|
638
711
|
# On macOS/Linux
|
|
639
|
-
chmod +x $(which specforge
|
|
712
|
+
chmod +x $(which specforge)
|
|
640
713
|
|
|
641
714
|
# Or run with node directly
|
|
642
715
|
node $(npm root -g)/@specforge/mcp/dist/index.js
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit Breaker Pattern
|
|
3
|
+
*
|
|
4
|
+
* Prevents cascading failures by opening the circuit after too many failures.
|
|
5
|
+
* States: closed (normal) -> open (failing) -> half-open (testing) -> closed
|
|
6
|
+
*/
|
|
7
|
+
import type { CircuitState, CircuitBreakerConfig } from './types.js';
|
|
8
|
+
export declare class CircuitBreaker {
|
|
9
|
+
private config;
|
|
10
|
+
private state;
|
|
11
|
+
private failures;
|
|
12
|
+
private successes;
|
|
13
|
+
private lastFailureTime;
|
|
14
|
+
private halfOpenAttempts;
|
|
15
|
+
constructor(config: CircuitBreakerConfig);
|
|
16
|
+
/**
|
|
17
|
+
* Check if a request can proceed.
|
|
18
|
+
*/
|
|
19
|
+
canRequest(): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Record a successful request.
|
|
22
|
+
*/
|
|
23
|
+
recordSuccess(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Record a failed request.
|
|
26
|
+
*/
|
|
27
|
+
recordFailure(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Get current circuit state.
|
|
30
|
+
*/
|
|
31
|
+
getState(): CircuitState;
|
|
32
|
+
/**
|
|
33
|
+
* Get circuit breaker statistics.
|
|
34
|
+
*/
|
|
35
|
+
getStats(): {
|
|
36
|
+
state: CircuitState;
|
|
37
|
+
failures: number;
|
|
38
|
+
successes: number;
|
|
39
|
+
lastFailureTime: number | null;
|
|
40
|
+
halfOpenAttempts: number;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Force reset the circuit breaker to closed state.
|
|
44
|
+
*/
|
|
45
|
+
forceReset(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Update state based on recovery time.
|
|
48
|
+
*/
|
|
49
|
+
private updateState;
|
|
50
|
+
/**
|
|
51
|
+
* Transition to a new state with event emission.
|
|
52
|
+
*/
|
|
53
|
+
private transitionTo;
|
|
54
|
+
/**
|
|
55
|
+
* Reset internal counters.
|
|
56
|
+
*/
|
|
57
|
+
private reset;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Create a circuit breaker with default configuration.
|
|
61
|
+
*/
|
|
62
|
+
export declare function createCircuitBreaker(config?: Partial<CircuitBreakerConfig>): CircuitBreaker;
|
|
63
|
+
//# sourceMappingURL=circuit-breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../src/ai-provider/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAMrE,qBAAa,cAAc;IAOb,OAAO,CAAC,MAAM;IAN1B,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,gBAAgB,CAAa;gBAEjB,MAAM,EAAE,oBAAoB;IAEhD;;OAEG;IACH,UAAU,IAAI,OAAO;IAarB;;OAEG;IACH,aAAa,IAAI,IAAI;IAkBrB;;OAEG;IACH,aAAa,IAAI,IAAI;IAsBrB;;OAEG;IACH,QAAQ,IAAI,YAAY;IAKxB;;OAEG;IACH,QAAQ,IAAI;QACV,KAAK,EAAE,YAAY,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;QAC/B,gBAAgB,EAAE,MAAM,CAAC;KAC1B;IAUD;;OAEG;IACH,UAAU,IAAI,IAAI;IAMlB;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACH,OAAO,CAAC,YAAY;IA4BpB;;OAEG;IACH,OAAO,CAAC,KAAK;CAId;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GACrC,cAAc,CAMhB"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit Breaker Pattern
|
|
3
|
+
*
|
|
4
|
+
* Prevents cascading failures by opening the circuit after too many failures.
|
|
5
|
+
* States: closed (normal) -> open (failing) -> half-open (testing) -> closed
|
|
6
|
+
*/
|
|
7
|
+
import { aiProviderEvents } from './events.js';
|
|
8
|
+
import { createLogger } from './logger.js';
|
|
9
|
+
const logger = createLogger('CircuitBreaker');
|
|
10
|
+
export class CircuitBreaker {
|
|
11
|
+
config;
|
|
12
|
+
state = 'closed';
|
|
13
|
+
failures = 0;
|
|
14
|
+
successes = 0;
|
|
15
|
+
lastFailureTime = 0;
|
|
16
|
+
halfOpenAttempts = 0;
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.config = config;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Check if a request can proceed.
|
|
22
|
+
*/
|
|
23
|
+
canRequest() {
|
|
24
|
+
this.updateState();
|
|
25
|
+
switch (this.state) {
|
|
26
|
+
case 'closed':
|
|
27
|
+
return true;
|
|
28
|
+
case 'open':
|
|
29
|
+
return false;
|
|
30
|
+
case 'half-open':
|
|
31
|
+
return this.halfOpenAttempts < this.config.halfOpenRequests;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Record a successful request.
|
|
36
|
+
*/
|
|
37
|
+
recordSuccess() {
|
|
38
|
+
// Update state first (open -> half-open if recovery time elapsed)
|
|
39
|
+
this.updateState();
|
|
40
|
+
this.successes++;
|
|
41
|
+
if (this.state === 'half-open') {
|
|
42
|
+
this.halfOpenAttempts++;
|
|
43
|
+
if (this.halfOpenAttempts >= this.config.halfOpenRequests) {
|
|
44
|
+
// Recovery successful - close the circuit
|
|
45
|
+
this.transitionTo('closed');
|
|
46
|
+
this.reset();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else if (this.state === 'closed') {
|
|
50
|
+
// Reset failure count on success in closed state
|
|
51
|
+
this.failures = 0;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Record a failed request.
|
|
56
|
+
*/
|
|
57
|
+
recordFailure() {
|
|
58
|
+
// Update state first (open -> half-open if recovery time elapsed)
|
|
59
|
+
this.updateState();
|
|
60
|
+
this.failures++;
|
|
61
|
+
this.lastFailureTime = Date.now();
|
|
62
|
+
if (this.state === 'half-open') {
|
|
63
|
+
// Failed during recovery - reopen the circuit
|
|
64
|
+
this.transitionTo('open');
|
|
65
|
+
this.halfOpenAttempts = 0;
|
|
66
|
+
}
|
|
67
|
+
else if (this.failures >= this.config.failureThreshold) {
|
|
68
|
+
// Too many failures - open the circuit
|
|
69
|
+
this.transitionTo('open');
|
|
70
|
+
}
|
|
71
|
+
logger.warn('Failure recorded', {
|
|
72
|
+
failures: this.failures,
|
|
73
|
+
threshold: this.config.failureThreshold,
|
|
74
|
+
state: this.state,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get current circuit state.
|
|
79
|
+
*/
|
|
80
|
+
getState() {
|
|
81
|
+
this.updateState();
|
|
82
|
+
return this.state;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get circuit breaker statistics.
|
|
86
|
+
*/
|
|
87
|
+
getStats() {
|
|
88
|
+
return {
|
|
89
|
+
state: this.getState(),
|
|
90
|
+
failures: this.failures,
|
|
91
|
+
successes: this.successes,
|
|
92
|
+
lastFailureTime: this.lastFailureTime || null,
|
|
93
|
+
halfOpenAttempts: this.halfOpenAttempts,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Force reset the circuit breaker to closed state.
|
|
98
|
+
*/
|
|
99
|
+
forceReset() {
|
|
100
|
+
this.reset();
|
|
101
|
+
this.transitionTo('closed');
|
|
102
|
+
logger.info('Circuit breaker force reset');
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Update state based on recovery time.
|
|
106
|
+
*/
|
|
107
|
+
updateState() {
|
|
108
|
+
if (this.state === 'open') {
|
|
109
|
+
const elapsed = Date.now() - this.lastFailureTime;
|
|
110
|
+
if (elapsed >= this.config.recoveryTimeMs) {
|
|
111
|
+
this.transitionTo('half-open');
|
|
112
|
+
this.halfOpenAttempts = 0;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Transition to a new state with event emission.
|
|
118
|
+
*/
|
|
119
|
+
transitionTo(newState) {
|
|
120
|
+
const previousState = this.state;
|
|
121
|
+
if (previousState === newState) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
this.state = newState;
|
|
125
|
+
logger.info('Circuit breaker state change', {
|
|
126
|
+
previousState,
|
|
127
|
+
newState,
|
|
128
|
+
});
|
|
129
|
+
const payload = { previousState, newState };
|
|
130
|
+
switch (newState) {
|
|
131
|
+
case 'open':
|
|
132
|
+
aiProviderEvents.emit('circuit_breaker:opened', payload);
|
|
133
|
+
break;
|
|
134
|
+
case 'half-open':
|
|
135
|
+
aiProviderEvents.emit('circuit_breaker:half_open', payload);
|
|
136
|
+
break;
|
|
137
|
+
case 'closed':
|
|
138
|
+
aiProviderEvents.emit('circuit_breaker:closed', payload);
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Reset internal counters.
|
|
144
|
+
*/
|
|
145
|
+
reset() {
|
|
146
|
+
this.failures = 0;
|
|
147
|
+
this.halfOpenAttempts = 0;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Create a circuit breaker with default configuration.
|
|
152
|
+
*/
|
|
153
|
+
export function createCircuitBreaker(config) {
|
|
154
|
+
return new CircuitBreaker({
|
|
155
|
+
failureThreshold: config?.failureThreshold ?? 5,
|
|
156
|
+
recoveryTimeMs: config?.recoveryTimeMs ?? 30000,
|
|
157
|
+
halfOpenRequests: config?.halfOpenRequests ?? 2,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/ai-provider/circuit-breaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Version Detection
|
|
3
|
+
*
|
|
4
|
+
* Detects Claude CLI version and feature support.
|
|
5
|
+
*/
|
|
6
|
+
import type { CLIVersionInfo } from './types.js';
|
|
7
|
+
export declare class CLIVersionDetector {
|
|
8
|
+
private cachedVersion?;
|
|
9
|
+
/**
|
|
10
|
+
* Detect CLI version and capabilities.
|
|
11
|
+
*/
|
|
12
|
+
detect(): Promise<CLIVersionInfo>;
|
|
13
|
+
/**
|
|
14
|
+
* Check if CLI is installed.
|
|
15
|
+
*/
|
|
16
|
+
isInstalled(): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Get cached version info (throws if not detected yet).
|
|
19
|
+
*/
|
|
20
|
+
getCachedVersion(): CLIVersionInfo | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Clear cached version.
|
|
23
|
+
*/
|
|
24
|
+
clearCache(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Build appropriate arguments based on version capabilities.
|
|
27
|
+
*/
|
|
28
|
+
buildArgs(options: {
|
|
29
|
+
prompt: string;
|
|
30
|
+
outputFormat?: string;
|
|
31
|
+
}): string[];
|
|
32
|
+
/**
|
|
33
|
+
* Compare two semver versions.
|
|
34
|
+
* Returns: -1 if a < b, 0 if a == b, 1 if a > b
|
|
35
|
+
*/
|
|
36
|
+
private compareVersions;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get or create the CLI version detector.
|
|
40
|
+
*/
|
|
41
|
+
export declare function getCLIVersionDetector(): CLIVersionDetector;
|
|
42
|
+
/**
|
|
43
|
+
* Detect CLI version (convenience function).
|
|
44
|
+
*/
|
|
45
|
+
export declare function detectCLIVersion(): Promise<CLIVersionInfo>;
|
|
46
|
+
/**
|
|
47
|
+
* Check if CLI is installed (convenience function).
|
|
48
|
+
*/
|
|
49
|
+
export declare function isCLIInstalled(): Promise<boolean>;
|
|
50
|
+
//# sourceMappingURL=cli-version.d.ts.map
|