@hoangsonw/forge 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +47 -1
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/mcp-server/server.d.ts +30 -0
- package/dist/mcp-server/server.d.ts.map +1 -0
- package/dist/mcp-server/server.js +258 -0
- package/dist/mcp-server/server.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -767,6 +767,23 @@ forge mcp status
|
|
|
767
767
|
Both `stdio` and HTTP-stream transports supported. OAuth 2.0 + PKCE or
|
|
768
768
|
API key auth. Tokens stored in the OS keychain.
|
|
769
769
|
|
|
770
|
+
### Forge as an MCP server
|
|
771
|
+
|
|
772
|
+
Forge can also run *as* an MCP server, not just consume them. Drop this into your Claude Desktop / Cursor / Continue config and the calling agent gets `forge_status`, `forge_plan`, `forge_get_task`, `forge_list_tasks` (read-only by default) plus `forge_run` and `forge_cancel_task` when started with `--allow-execute`:
|
|
773
|
+
|
|
774
|
+
```json
|
|
775
|
+
{
|
|
776
|
+
"mcpServers": {
|
|
777
|
+
"forge": {
|
|
778
|
+
"command": "forge",
|
|
779
|
+
"args": ["mcp", "serve"]
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
Full reference, security model, and per-client setup: [`docs/MCP-SERVER.md`](docs/MCP-SERVER.md).
|
|
786
|
+
|
|
770
787
|
---
|
|
771
788
|
|
|
772
789
|
## Run in a container (Docker or Podman)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,UAAU,SAEtB,CAAC"}
|
package/dist/cli/commands/mcp.js
CHANGED
|
@@ -5,6 +5,39 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @author Son Nguyen <hoangson091104@gmail.com>
|
|
7
7
|
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
8
41
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
42
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
43
|
};
|
|
@@ -19,7 +52,20 @@ const client_1 = require("../../mcp/client");
|
|
|
19
52
|
const http_transport_1 = require("../../mcp/http-transport");
|
|
20
53
|
const oauth_1 = require("../../mcp/oauth");
|
|
21
54
|
const keychain_1 = require("../../keychain");
|
|
22
|
-
exports.mcpCommand = new commander_1.Command('mcp').description('MCP connection management.');
|
|
55
|
+
exports.mcpCommand = new commander_1.Command('mcp').description('MCP connection management. Also `forge mcp serve` to expose Forge itself as an MCP server.');
|
|
56
|
+
exports.mcpCommand
|
|
57
|
+
.command('serve')
|
|
58
|
+
.description('Run Forge as an MCP server on stdio. Other agents (Claude Desktop, Cursor, Continue, …) can register this and call forge_plan / forge_run / forge_get_task / forge_list_tasks / forge_status. Read-only by default; pass --allow-execute or set FORGE_MCP_ALLOW_EXECUTE=true to enable forge_run and forge_cancel_task.')
|
|
59
|
+
.option('--allow-execute', 'enable execution tools (forge_run, forge_cancel_task)', false)
|
|
60
|
+
.option('--cwd <path>', 'default working directory for tool calls')
|
|
61
|
+
.action(async (opts) => {
|
|
62
|
+
(0, bootstrap_1.bootstrap)();
|
|
63
|
+
const { runForgeMcpServerOnStdio } = await Promise.resolve().then(() => __importStar(require('../../mcp-server/server')));
|
|
64
|
+
await runForgeMcpServerOnStdio({
|
|
65
|
+
allowExecute: opts.allowExecute,
|
|
66
|
+
defaultCwd: opts.cwd,
|
|
67
|
+
});
|
|
68
|
+
});
|
|
23
69
|
exports.mcpCommand
|
|
24
70
|
.command('list')
|
|
25
71
|
.description('List MCP connections.')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":";AAAA;;;;;GAKG
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forge as an MCP server. Exposes the runtime as MCP tools so other
|
|
3
|
+
* agents (Claude Desktop, Cursor, Continue, etc.) can plan and run
|
|
4
|
+
* Forge tasks through their own chat surfaces.
|
|
5
|
+
*
|
|
6
|
+
* Two trust tiers:
|
|
7
|
+
* - read-only (default): forge_status, forge_plan, forge_get_task,
|
|
8
|
+
* forge_list_tasks. Never writes a file.
|
|
9
|
+
* - execute (opt-in via FORGE_MCP_ALLOW_EXECUTE=true or --allow-execute):
|
|
10
|
+
* adds forge_run and forge_cancel_task. These can edit the project.
|
|
11
|
+
*
|
|
12
|
+
* Tools are exposed as `forge_*` namespaced functions because the MCP
|
|
13
|
+
* client typically flattens every connected server's tools into one list.
|
|
14
|
+
*
|
|
15
|
+
* @author Son Nguyen <hoangson091104@gmail.com>
|
|
16
|
+
*/
|
|
17
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
18
|
+
export interface McpServerOptions {
|
|
19
|
+
/** Enable execution tools (forge_run, forge_cancel_task). */
|
|
20
|
+
allowExecute?: boolean;
|
|
21
|
+
/** Default cwd if a tool call doesn't specify one. */
|
|
22
|
+
defaultCwd?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare const createForgeMcpServer: (opts?: McpServerOptions) => McpServer;
|
|
25
|
+
/**
|
|
26
|
+
* Bootstraps the MCP server on stdio. Returns a promise that resolves
|
|
27
|
+
* when the transport is closed by the peer.
|
|
28
|
+
*/
|
|
29
|
+
export declare const runForgeMcpServerOnStdio: (opts?: McpServerOptions) => Promise<void>;
|
|
30
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp-server/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyBpE,MAAM,WAAW,gBAAgB;IAC/B,6DAA6D;IAC7D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,oBAAoB,GAAI,OAAM,gBAAqB,KAAG,SAgNlE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GAAU,OAAM,gBAAqB,KAAG,OAAO,CAAC,IAAI,CAQxF,CAAC"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Forge as an MCP server. Exposes the runtime as MCP tools so other
|
|
4
|
+
* agents (Claude Desktop, Cursor, Continue, etc.) can plan and run
|
|
5
|
+
* Forge tasks through their own chat surfaces.
|
|
6
|
+
*
|
|
7
|
+
* Two trust tiers:
|
|
8
|
+
* - read-only (default): forge_status, forge_plan, forge_get_task,
|
|
9
|
+
* forge_list_tasks. Never writes a file.
|
|
10
|
+
* - execute (opt-in via FORGE_MCP_ALLOW_EXECUTE=true or --allow-execute):
|
|
11
|
+
* adds forge_run and forge_cancel_task. These can edit the project.
|
|
12
|
+
*
|
|
13
|
+
* Tools are exposed as `forge_*` namespaced functions because the MCP
|
|
14
|
+
* client typically flattens every connected server's tools into one list.
|
|
15
|
+
*
|
|
16
|
+
* @author Son Nguyen <hoangson091104@gmail.com>
|
|
17
|
+
*/
|
|
18
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
21
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
22
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
23
|
+
}
|
|
24
|
+
Object.defineProperty(o, k2, desc);
|
|
25
|
+
}) : (function(o, m, k, k2) {
|
|
26
|
+
if (k2 === undefined) k2 = k;
|
|
27
|
+
o[k2] = m[k];
|
|
28
|
+
}));
|
|
29
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
30
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
31
|
+
}) : function(o, v) {
|
|
32
|
+
o["default"] = v;
|
|
33
|
+
});
|
|
34
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
35
|
+
var ownKeys = function(o) {
|
|
36
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
37
|
+
var ar = [];
|
|
38
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
39
|
+
return ar;
|
|
40
|
+
};
|
|
41
|
+
return ownKeys(o);
|
|
42
|
+
};
|
|
43
|
+
return function (mod) {
|
|
44
|
+
if (mod && mod.__esModule) return mod;
|
|
45
|
+
var result = {};
|
|
46
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
47
|
+
__setModuleDefault(result, mod);
|
|
48
|
+
return result;
|
|
49
|
+
};
|
|
50
|
+
})();
|
|
51
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
+
exports.runForgeMcpServerOnStdio = exports.createForgeMcpServer = void 0;
|
|
53
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
54
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
55
|
+
const v3_1 = require("zod/v3");
|
|
56
|
+
const orchestrator_1 = require("../core/orchestrator");
|
|
57
|
+
const loader_1 = require("../config/loader");
|
|
58
|
+
const index_db_1 = require("../persistence/index-db");
|
|
59
|
+
const tasks_1 = require("../persistence/tasks");
|
|
60
|
+
const tasks_2 = require("../persistence/tasks");
|
|
61
|
+
const provider_1 = require("../models/provider");
|
|
62
|
+
const loader_2 = require("../config/loader");
|
|
63
|
+
const logger_1 = require("../logging/logger");
|
|
64
|
+
const fs = __importStar(require("fs"));
|
|
65
|
+
const path = __importStar(require("path"));
|
|
66
|
+
const PKG_VERSION = (() => {
|
|
67
|
+
try {
|
|
68
|
+
return JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'package.json'), 'utf8'))
|
|
69
|
+
.version;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return 'unknown';
|
|
73
|
+
}
|
|
74
|
+
})();
|
|
75
|
+
const createForgeMcpServer = (opts = {}) => {
|
|
76
|
+
const allowExecute = opts.allowExecute ?? process.env.FORGE_MCP_ALLOW_EXECUTE === 'true';
|
|
77
|
+
const defaultCwd = opts.defaultCwd ?? process.cwd();
|
|
78
|
+
const server = new mcp_js_1.McpServer({
|
|
79
|
+
name: 'forge',
|
|
80
|
+
version: PKG_VERSION,
|
|
81
|
+
});
|
|
82
|
+
const text = (s) => ({ content: [{ type: 'text', text: s }] });
|
|
83
|
+
const json = (v) => text(typeof v === 'string' ? v : JSON.stringify(v, null, 2));
|
|
84
|
+
const err = (msg) => ({
|
|
85
|
+
isError: true,
|
|
86
|
+
content: [{ type: 'text', text: `forge: ${msg}` }],
|
|
87
|
+
});
|
|
88
|
+
// ---------------- Read-only tools (always enabled) ----------------
|
|
89
|
+
server.registerTool('forge_status', {
|
|
90
|
+
description: 'Get the Forge runtime status: version, default provider, default mode, available providers, and current working directory. No side effects.',
|
|
91
|
+
inputSchema: {},
|
|
92
|
+
}, async () => {
|
|
93
|
+
const cfg = (0, loader_1.loadGlobalConfig)();
|
|
94
|
+
const providers = await Promise.all((0, provider_1.listProviders)().map(async (p) => ({
|
|
95
|
+
name: p.name,
|
|
96
|
+
available: await p.isAvailable().catch(() => false),
|
|
97
|
+
})));
|
|
98
|
+
return json({
|
|
99
|
+
version: PKG_VERSION,
|
|
100
|
+
provider: cfg.provider,
|
|
101
|
+
defaultMode: cfg.defaultMode,
|
|
102
|
+
cwd: defaultCwd,
|
|
103
|
+
providers,
|
|
104
|
+
allowExecute,
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
server.registerTool('forge_plan', {
|
|
108
|
+
description: 'Generate a plan for a task without executing it. Read-only — no files are modified. Returns the plan JSON (steps, dependencies, risk classification).',
|
|
109
|
+
inputSchema: {
|
|
110
|
+
task: v3_1.z.string().min(1).describe('Plain-language description of what Forge should plan.'),
|
|
111
|
+
cwd: v3_1.z.string().optional().describe('Working directory. Defaults to the server cwd.'),
|
|
112
|
+
},
|
|
113
|
+
}, async ({ task, cwd }) => {
|
|
114
|
+
try {
|
|
115
|
+
const result = await (0, orchestrator_1.orchestrateRun)({
|
|
116
|
+
input: task,
|
|
117
|
+
mode: 'plan',
|
|
118
|
+
planOnly: true,
|
|
119
|
+
autoApprove: true,
|
|
120
|
+
cwd: cwd ?? defaultCwd,
|
|
121
|
+
});
|
|
122
|
+
return json({
|
|
123
|
+
taskId: result.task.id,
|
|
124
|
+
plan: result.task.plan ?? null,
|
|
125
|
+
summary: result.result?.summary ?? '',
|
|
126
|
+
status: result.task.status,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
catch (e) {
|
|
130
|
+
logger_1.log.warn('forge_plan failed', { err: String(e) });
|
|
131
|
+
return err(`plan failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
server.registerTool('forge_get_task', {
|
|
135
|
+
description: 'Look up a task by ID. Resolves the project automatically via the global index. Returns full task JSON: prompt, plan, status, result, files changed.',
|
|
136
|
+
inputSchema: {
|
|
137
|
+
taskId: v3_1.z.string().min(1).describe('The task ID, e.g. task_22ce1f014275.'),
|
|
138
|
+
},
|
|
139
|
+
}, async ({ taskId }) => {
|
|
140
|
+
const indexed = (0, index_db_1.getTask)(taskId);
|
|
141
|
+
if (!indexed)
|
|
142
|
+
return err(`task not found: ${taskId}`);
|
|
143
|
+
const proj = (0, index_db_1.listProjects)().find((p) => p.id === indexed.project_id);
|
|
144
|
+
const candidates = [proj?.path, (0, loader_2.findProjectRoot)(defaultCwd) ?? null, defaultCwd].filter((x) => Boolean(x));
|
|
145
|
+
for (const root of candidates) {
|
|
146
|
+
const t = (0, tasks_1.loadTask)(root, taskId);
|
|
147
|
+
if (t)
|
|
148
|
+
return json(t);
|
|
149
|
+
}
|
|
150
|
+
return err(`task index entry exists but file not found in ${candidates.join(', ')}`);
|
|
151
|
+
});
|
|
152
|
+
server.registerTool('forge_list_tasks', {
|
|
153
|
+
description: 'List recent tasks across all projects, newest first. Optional filter by status (running, completed, failed, …) and project id.',
|
|
154
|
+
inputSchema: {
|
|
155
|
+
limit: v3_1.z.number().int().min(1).max(200).optional().default(20),
|
|
156
|
+
status: v3_1.z.string().optional(),
|
|
157
|
+
projectId: v3_1.z.string().optional(),
|
|
158
|
+
},
|
|
159
|
+
}, async ({ limit, status, projectId }) => {
|
|
160
|
+
let rows = (0, index_db_1.listTasks)(projectId, limit ?? 20);
|
|
161
|
+
if (status)
|
|
162
|
+
rows = rows.filter((r) => r.status === status);
|
|
163
|
+
return json(rows.map((r) => ({
|
|
164
|
+
id: r.id,
|
|
165
|
+
title: r.title,
|
|
166
|
+
status: r.status,
|
|
167
|
+
mode: r.mode,
|
|
168
|
+
updated_at: r.updated_at,
|
|
169
|
+
attempts: r.attempts,
|
|
170
|
+
project_id: r.project_id,
|
|
171
|
+
})));
|
|
172
|
+
});
|
|
173
|
+
// ---------------- Execute tools (opt-in) ----------------
|
|
174
|
+
if (allowExecute) {
|
|
175
|
+
server.registerTool('forge_run', {
|
|
176
|
+
description: 'Run a task end-to-end: classify → plan → execute → verify. Will modify files. Permission prompts are auto-approved because MCP cannot show interactive UI.',
|
|
177
|
+
inputSchema: {
|
|
178
|
+
task: v3_1.z.string().min(1).describe('Plain-language task description.'),
|
|
179
|
+
cwd: v3_1.z.string().optional(),
|
|
180
|
+
mode: v3_1.z
|
|
181
|
+
.enum(['balanced', 'risky'])
|
|
182
|
+
.optional()
|
|
183
|
+
.describe('Execution mode. Defaults to balanced.'),
|
|
184
|
+
},
|
|
185
|
+
}, async ({ task, cwd, mode }) => {
|
|
186
|
+
try {
|
|
187
|
+
const result = await (0, orchestrator_1.orchestrateRun)({
|
|
188
|
+
input: task,
|
|
189
|
+
mode: (mode ?? 'balanced'),
|
|
190
|
+
autoApprove: true,
|
|
191
|
+
cwd: cwd ?? defaultCwd,
|
|
192
|
+
flags: {
|
|
193
|
+
skipRoutine: true,
|
|
194
|
+
allowFiles: true,
|
|
195
|
+
allowShell: true,
|
|
196
|
+
nonInteractive: true,
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
return json({
|
|
200
|
+
taskId: result.task.id,
|
|
201
|
+
status: result.task.status,
|
|
202
|
+
success: result.result?.success !== false,
|
|
203
|
+
summary: result.result?.summary ?? '',
|
|
204
|
+
filesChanged: result.result?.filesChanged ?? [],
|
|
205
|
+
durationMs: result.result?.durationMs ?? 0,
|
|
206
|
+
costUsd: result.result?.costUsd ?? 0,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
catch (e) {
|
|
210
|
+
logger_1.log.warn('forge_run failed', { err: String(e) });
|
|
211
|
+
return err(`run failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
server.registerTool('forge_cancel_task', {
|
|
215
|
+
description: 'Cancel a running or pending task. Idempotent — already-terminal tasks are returned as-is.',
|
|
216
|
+
inputSchema: {
|
|
217
|
+
taskId: v3_1.z.string().min(1),
|
|
218
|
+
},
|
|
219
|
+
}, async ({ taskId }) => {
|
|
220
|
+
const indexed = (0, index_db_1.getTask)(taskId);
|
|
221
|
+
if (!indexed)
|
|
222
|
+
return err(`task not found: ${taskId}`);
|
|
223
|
+
const proj = (0, index_db_1.listProjects)().find((p) => p.id === indexed.project_id);
|
|
224
|
+
if (!proj)
|
|
225
|
+
return err(`project not found for task ${taskId}`);
|
|
226
|
+
// Already-terminal tasks return their current state — idempotent.
|
|
227
|
+
if (indexed.status === 'completed' ||
|
|
228
|
+
indexed.status === 'cancelled' ||
|
|
229
|
+
indexed.status === 'failed') {
|
|
230
|
+
return json({ taskId, status: indexed.status, alreadyTerminal: true });
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
const updated = (0, tasks_2.transitionTask)(proj.path, taskId, 'cancelled');
|
|
234
|
+
return json({ taskId, status: updated.status });
|
|
235
|
+
}
|
|
236
|
+
catch (e) {
|
|
237
|
+
return err(`cancel failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
return server;
|
|
242
|
+
};
|
|
243
|
+
exports.createForgeMcpServer = createForgeMcpServer;
|
|
244
|
+
/**
|
|
245
|
+
* Bootstraps the MCP server on stdio. Returns a promise that resolves
|
|
246
|
+
* when the transport is closed by the peer.
|
|
247
|
+
*/
|
|
248
|
+
const runForgeMcpServerOnStdio = async (opts = {}) => {
|
|
249
|
+
const server = (0, exports.createForgeMcpServer)(opts);
|
|
250
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
251
|
+
await server.connect(transport);
|
|
252
|
+
// Keep the process alive until the transport closes.
|
|
253
|
+
await new Promise((resolve) => {
|
|
254
|
+
transport.onclose = () => resolve();
|
|
255
|
+
});
|
|
256
|
+
};
|
|
257
|
+
exports.runForgeMcpServerOnStdio = runForgeMcpServerOnStdio;
|
|
258
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp-server/server.ts"],"names":[],"mappings":"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"}
|