@rsaglobaltech/specgate 0.12.0 → 0.13.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/CHANGELOG.md +126 -0
- package/README.md +66 -58
- package/bin/specgate.ts +35 -0
- package/dist/bin/specgate.js +31 -0
- package/dist/bin/specgate.js.map +1 -1
- package/dist/packages/core/src/application/ArchiveChangeUseCase.js +22 -0
- package/dist/packages/core/src/application/ArchiveChangeUseCase.js.map +1 -1
- package/dist/packages/core/src/domain/DeltaFeature.js +39 -0
- package/dist/packages/core/src/domain/DeltaFeature.js.map +1 -0
- package/dist/packages/core/src/domain/DerivedMatrix.js +25 -19
- package/dist/packages/core/src/domain/DerivedMatrix.js.map +1 -1
- package/dist/packages/core/test/unit/delta-feature.test.js +74 -0
- package/dist/packages/core/test/unit/delta-feature.test.js.map +1 -0
- package/dist/packages/mcp-spec-driven/src/native-tools.js +256 -0
- package/dist/packages/mcp-spec-driven/src/native-tools.js.map +1 -0
- package/dist/packages/mcp-spec-driven/src/server.js +276 -0
- package/dist/packages/mcp-spec-driven/src/server.js.map +1 -0
- package/dist/packages/mcp-spec-driven/src/tools.js +667 -0
- package/dist/packages/mcp-spec-driven/src/tools.js.map +1 -0
- package/dist/scripts/agents/init.js +1 -1
- package/dist/scripts/agents/init.js.map +1 -1
- package/dist/scripts/alm/cli.js +4 -0
- package/dist/scripts/alm/cli.js.map +1 -1
- package/dist/scripts/change/instructions.js +5 -4
- package/dist/scripts/change/instructions.js.map +1 -1
- package/dist/scripts/cli/commands/config/CiInitCommand.js +47 -3
- package/dist/scripts/cli/commands/config/CiInitCommand.js.map +1 -1
- package/dist/scripts/cli/commands/harness/RunCommand.js +3 -2
- package/dist/scripts/cli/commands/harness/RunCommand.js.map +1 -1
- package/dist/scripts/cli/commands/mcp/McpInstallCommand.js +7 -1
- package/dist/scripts/cli/commands/mcp/McpInstallCommand.js.map +1 -1
- package/dist/scripts/cli/commands/mcp/index.js +52 -0
- package/dist/scripts/cli/commands/mcp/index.js.map +1 -1
- package/dist/scripts/cli/commands/pack/ExpandDomainPackCommand.js +38 -0
- package/dist/scripts/cli/commands/pack/ExpandDomainPackCommand.js.map +1 -1
- package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js +11 -3
- package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/DoneCommand.js +20 -6
- package/dist/scripts/cli/commands/spec/DoneCommand.js.map +1 -1
- package/dist/scripts/docs/nav.js +5 -0
- package/dist/scripts/docs/nav.js.map +1 -1
- package/dist/scripts/gen_mcp_tools.js +22 -9
- package/dist/scripts/gen_mcp_tools.js.map +1 -1
- package/dist/scripts/lib/derived-writes.js +21 -6
- package/dist/scripts/lib/derived-writes.js.map +1 -1
- package/dist/scripts/lib/surface.js +12 -9
- package/dist/scripts/lib/surface.js.map +1 -1
- package/package.json +12 -3
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.writeMessage = exports.readMessage = exports.handleMessage = exports.defaultServer = exports.McpServer = void 0;
|
|
38
|
+
/**
|
|
39
|
+
* MCP server for create-spec-driven-app projects.
|
|
40
|
+
*
|
|
41
|
+
* Implements the Model Context Protocol over stdio (JSON-RPC 2.0).
|
|
42
|
+
* Supported methods: initialize, tools/list, tools/call.
|
|
43
|
+
*
|
|
44
|
+
* This is a minimal hand-rolled implementation — no @modelcontextprotocol/sdk
|
|
45
|
+
* dependency — to keep the install footprint small. It implements the subset
|
|
46
|
+
* required by Claude Desktop, Cursor, Aider, and other MCP-aware clients.
|
|
47
|
+
*/
|
|
48
|
+
const tools_1 = require("./tools");
|
|
49
|
+
const fs = __importStar(require("node:fs"));
|
|
50
|
+
const path = __importStar(require("node:path"));
|
|
51
|
+
const PROTOCOL_VERSION = "2024-11-05";
|
|
52
|
+
/**
|
|
53
|
+
* This file is compiled into two layouts: the repository's root `dist/` for the
|
|
54
|
+
* test suite, and the package's own `dist/` for publishing. A fixed relative
|
|
55
|
+
* path to package.json resolves in one and not the other, so walk up for it.
|
|
56
|
+
*/
|
|
57
|
+
function packageVersion() {
|
|
58
|
+
let dir = __dirname;
|
|
59
|
+
for (let i = 0; i < 6; i++) {
|
|
60
|
+
const candidate = path.join(dir, "package.json");
|
|
61
|
+
if (fs.existsSync(candidate)) {
|
|
62
|
+
try {
|
|
63
|
+
const pkg = JSON.parse(fs.readFileSync(candidate, "utf8"));
|
|
64
|
+
// This package's own manifest, whatever it is called. Matching on an
|
|
65
|
+
// exact name is what made this announce 0.0.0 twice: once when a path
|
|
66
|
+
// assumption broke, and again when the CLI package became
|
|
67
|
+
// `@rsaglobaltech/specgate` and a hard-coded `"specgate"` stopped matching.
|
|
68
|
+
// The shape of the tree is the stable signal, not the spelling.
|
|
69
|
+
const sibling = path.join(dir, "packages", "mcp-spec-driven", "package.json");
|
|
70
|
+
if (fs.existsSync(sibling)) {
|
|
71
|
+
// Reached the repository root: the manifest is beside it, not above
|
|
72
|
+
// the compiled file, because the root build flattens into dist/.
|
|
73
|
+
return JSON.parse(fs.readFileSync(sibling, "utf8")).version;
|
|
74
|
+
}
|
|
75
|
+
// Shipped inside the CLI package and started by `specgate mcp serve`:
|
|
76
|
+
// the server is that package's version.
|
|
77
|
+
if (typeof pkg.name === "string" &&
|
|
78
|
+
(pkg.name.endsWith("/mcp-server") || pkg.name === "@rsaglobaltech/specgate")) {
|
|
79
|
+
return pkg.version;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Keep walking — a malformed manifest above us is not ours.
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const parent = path.dirname(dir);
|
|
87
|
+
if (parent === dir)
|
|
88
|
+
break;
|
|
89
|
+
dir = parent;
|
|
90
|
+
}
|
|
91
|
+
return "0.0.0";
|
|
92
|
+
}
|
|
93
|
+
const SERVER_INFO = {
|
|
94
|
+
name: "mcp-spec-driven",
|
|
95
|
+
version: packageVersion(),
|
|
96
|
+
};
|
|
97
|
+
// ── JSON-RPC framing over stdio ──────────────────────────────────────────────────
|
|
98
|
+
class McpServer {
|
|
99
|
+
buffer = "";
|
|
100
|
+
start() {
|
|
101
|
+
process.stdin.setEncoding("utf8");
|
|
102
|
+
process.stdin.on("data", (chunk) => {
|
|
103
|
+
const messages = this.readMessage(chunk);
|
|
104
|
+
for (const msg of messages) {
|
|
105
|
+
this.handleMessage(msg);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
process.stdin.on("end", () => {
|
|
109
|
+
this.stop();
|
|
110
|
+
});
|
|
111
|
+
// Log activation to stderr so clients see it (stdout is reserved for JSON-RPC)
|
|
112
|
+
process.stderr.write(`mcp-spec-driven ${SERVER_INFO.version} ready\n`);
|
|
113
|
+
}
|
|
114
|
+
stop() {
|
|
115
|
+
process.exit(0);
|
|
116
|
+
}
|
|
117
|
+
readMessage(chunk) {
|
|
118
|
+
this.buffer += chunk.toString();
|
|
119
|
+
const messages = [];
|
|
120
|
+
// Try Content-Length framing first (per LSP/MCP convention)
|
|
121
|
+
while (true) {
|
|
122
|
+
const headerEnd = this.buffer.indexOf("\r\n\r\n");
|
|
123
|
+
if (headerEnd === -1)
|
|
124
|
+
break;
|
|
125
|
+
const headers = this.buffer.slice(0, headerEnd);
|
|
126
|
+
const lengthMatch = headers.match(/Content-Length:\s*(\d+)/i);
|
|
127
|
+
if (!lengthMatch) {
|
|
128
|
+
// Bad header — drop until next \r\n\r\n
|
|
129
|
+
this.buffer = this.buffer.slice(headerEnd + 4);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const length = parseInt(lengthMatch[1], 10);
|
|
133
|
+
const messageStart = headerEnd + 4;
|
|
134
|
+
if (this.buffer.length < messageStart + length)
|
|
135
|
+
break;
|
|
136
|
+
const body = this.buffer.slice(messageStart, messageStart + length);
|
|
137
|
+
this.buffer = this.buffer.slice(messageStart + length);
|
|
138
|
+
try {
|
|
139
|
+
messages.push(JSON.parse(body));
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
const error = err;
|
|
143
|
+
this.writeError(null, -32700, `Parse error: ${error.message}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Also try newline-delimited JSON (used by some clients)
|
|
147
|
+
if (messages.length === 0 && this.buffer.includes("\n")) {
|
|
148
|
+
const lines = this.buffer.split("\n");
|
|
149
|
+
this.buffer = lines.pop() || "";
|
|
150
|
+
for (const line of lines) {
|
|
151
|
+
const trimmed = line.trim();
|
|
152
|
+
if (!trimmed)
|
|
153
|
+
continue;
|
|
154
|
+
try {
|
|
155
|
+
messages.push(JSON.parse(trimmed));
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// not JSON — ignore (probably a Content-Length header fragment)
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return messages;
|
|
163
|
+
}
|
|
164
|
+
writeMessage(message) {
|
|
165
|
+
const body = JSON.stringify(message);
|
|
166
|
+
const out = `Content-Length: ${Buffer.byteLength(body, "utf8")}\r\n\r\n${body}`;
|
|
167
|
+
process.stdout.write(out);
|
|
168
|
+
}
|
|
169
|
+
writeError(id, code, message, data) {
|
|
170
|
+
this.writeMessage({
|
|
171
|
+
jsonrpc: "2.0",
|
|
172
|
+
id,
|
|
173
|
+
error: { code, message, ...(data !== undefined ? { data } : {}) },
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
writeResult(id, result) {
|
|
177
|
+
this.writeMessage({ jsonrpc: "2.0", id, result });
|
|
178
|
+
}
|
|
179
|
+
// ── Method dispatch ──────────────────────────────────────────────────────────────────────
|
|
180
|
+
handleMessage(msg) {
|
|
181
|
+
if (msg.jsonrpc !== "2.0") {
|
|
182
|
+
this.writeError(msg.id || null, -32600, "Invalid request: missing jsonrpc=2.0");
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const { id = null, method, params } = msg;
|
|
186
|
+
try {
|
|
187
|
+
switch (method) {
|
|
188
|
+
case "initialize":
|
|
189
|
+
this.writeResult(id, {
|
|
190
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
191
|
+
serverInfo: SERVER_INFO,
|
|
192
|
+
capabilities: { tools: {} },
|
|
193
|
+
});
|
|
194
|
+
break;
|
|
195
|
+
case "initialized":
|
|
196
|
+
case "notifications/initialized":
|
|
197
|
+
// Notification — no response
|
|
198
|
+
break;
|
|
199
|
+
case "tools/list":
|
|
200
|
+
this.writeResult(id, {
|
|
201
|
+
tools: Object.entries(tools_1.TOOLS).map(([name, t]) => ({
|
|
202
|
+
name,
|
|
203
|
+
description: t.description,
|
|
204
|
+
inputSchema: t.inputSchema,
|
|
205
|
+
})),
|
|
206
|
+
});
|
|
207
|
+
break;
|
|
208
|
+
case "tools/call": {
|
|
209
|
+
const toolName = params && params.name;
|
|
210
|
+
const args = (params && params.arguments) || {};
|
|
211
|
+
// `csda_*` was the generated prefix until 0.12: an agent config
|
|
212
|
+
// that allow-lists a tool by that name keeps resolving. The old
|
|
213
|
+
// names are accepted here and never listed.
|
|
214
|
+
const tool = tools_1.TOOLS[toolName] ||
|
|
215
|
+
(typeof toolName === "string" && toolName.startsWith("csda_")
|
|
216
|
+
? tools_1.TOOLS[`specgate_${toolName.slice("csda_".length)}`]
|
|
217
|
+
: undefined);
|
|
218
|
+
if (!tool) {
|
|
219
|
+
this.writeError(id, -32601, `Unknown tool: ${toolName}`);
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
const result = tool.handler(args);
|
|
224
|
+
this.writeResult(id, {
|
|
225
|
+
content: [
|
|
226
|
+
{
|
|
227
|
+
type: "text",
|
|
228
|
+
text: JSON.stringify(result, null, 2),
|
|
229
|
+
},
|
|
230
|
+
],
|
|
231
|
+
isError: false,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
const error = err;
|
|
236
|
+
this.writeResult(id, {
|
|
237
|
+
content: [{ type: "text", text: `Error: ${error.message}` }],
|
|
238
|
+
isError: true,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
case "ping":
|
|
244
|
+
this.writeResult(id, {});
|
|
245
|
+
break;
|
|
246
|
+
case "shutdown":
|
|
247
|
+
this.writeResult(id, null);
|
|
248
|
+
this.stop();
|
|
249
|
+
break;
|
|
250
|
+
default:
|
|
251
|
+
if (id !== undefined && id !== null) {
|
|
252
|
+
this.writeError(id, -32601, `Method not found: ${method}`);
|
|
253
|
+
}
|
|
254
|
+
// else: notification — ignore unknown notifications
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
const error = err;
|
|
259
|
+
this.writeError(id, -32603, `Internal error: ${error.message}`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
exports.McpServer = McpServer;
|
|
264
|
+
if (require.main === module) {
|
|
265
|
+
const server = new McpServer();
|
|
266
|
+
server.start();
|
|
267
|
+
}
|
|
268
|
+
// Export a default instance for tests to bind to
|
|
269
|
+
exports.defaultServer = new McpServer();
|
|
270
|
+
const handleMessage = (msg) => exports.defaultServer.handleMessage(msg);
|
|
271
|
+
exports.handleMessage = handleMessage;
|
|
272
|
+
const readMessage = (chunk) => exports.defaultServer.readMessage(chunk);
|
|
273
|
+
exports.readMessage = readMessage;
|
|
274
|
+
const writeMessage = (msg) => exports.defaultServer.writeMessage(msg);
|
|
275
|
+
exports.writeMessage = writeMessage;
|
|
276
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../packages/mcp-spec-driven/src/server.ts"],"names":[],"mappings":"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"}
|