@systemdox/mcp-server 0.1.29 → 0.1.30
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 +1 -1
- package/dist/cli.js +21 -21
- package/dist/http.js +21 -21
- package/dist/index.js +21 -21
- package/dist/lib/context-builder.d.ts +1 -1
- package/dist/lib/context-builder.js +8 -8
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -130,7 +130,7 @@ require an API key with `editor`+ role.
|
|
|
130
130
|
The aggregator. It ranks checks, specs and docs against the task, then
|
|
131
131
|
spends the token budget **fetching the bodies** of the highest-ranked specs and
|
|
132
132
|
docs (`/v1/specs/{id}`, `/v1/docs/{id}/content`) — concurrently, clipped to a
|
|
133
|
-
fair share of what's left. Every item carries the `
|
|
133
|
+
fair share of what's left. Every item carries the `draft_id` / `doc_id` needed to
|
|
134
134
|
fetch it in full, so nothing is a dead end: items whose body did not fit, or
|
|
135
135
|
whose fetch failed, still appear as a title + ID. Tech stack and project rules
|
|
136
136
|
are always included; the budget is spent on bodies, never on truncating the
|
package/dist/cli.js
CHANGED
|
@@ -394,15 +394,15 @@ function registerGetSpecs(server2, apiClient2) {
|
|
|
394
394
|
title: "Get Specs",
|
|
395
395
|
description: "Retrieve SystemDox specifications (proposal, requirements with RFC 2119 keywords, Given/When/Then scenarios). Get a specific spec by ID, filter by status, or search by keyword.",
|
|
396
396
|
inputSchema: {
|
|
397
|
-
|
|
397
|
+
draft_id: z2.string().optional().describe("Specific spec ID to retrieve with full content"),
|
|
398
398
|
status: z2.enum(["draft", "ready", "archived"]).optional().describe("Filter by status"),
|
|
399
399
|
search: z2.string().optional().describe("Keyword search across spec names")
|
|
400
400
|
}
|
|
401
401
|
},
|
|
402
|
-
async ({
|
|
403
|
-
if (
|
|
402
|
+
async ({ draft_id, status, search }) => {
|
|
403
|
+
if (draft_id) {
|
|
404
404
|
const spec = await apiClient2.get(
|
|
405
|
-
`/v1/specs/${
|
|
405
|
+
`/v1/specs/${draft_id}`
|
|
406
406
|
);
|
|
407
407
|
const sections = [`# ${spec.name}
|
|
408
408
|
|
|
@@ -451,7 +451,7 @@ ${spec.taskContent}`);
|
|
|
451
451
|
};
|
|
452
452
|
}
|
|
453
453
|
const text = filtered.map(
|
|
454
|
-
(s) => `- **${s.name}** (${s.
|
|
454
|
+
(s) => `- **${s.name}** (${s.draftId}) \u2014 ${s.status}, ${s.requirementCount} requirements` + (s.repoFullName ? `, repo: ${s.repoFullName}` : "")
|
|
455
455
|
).join("\n");
|
|
456
456
|
return {
|
|
457
457
|
content: [
|
|
@@ -1117,7 +1117,7 @@ ${g.fix}
|
|
|
1117
1117
|
}
|
|
1118
1118
|
function formatSpecHeadline(s) {
|
|
1119
1119
|
return `### ${s.name}
|
|
1120
|
-
\`
|
|
1120
|
+
\`draft_id: ${s.draftId}\` \xB7 ${s.status} \xB7 ${s.requirementCount} requirements`;
|
|
1121
1121
|
}
|
|
1122
1122
|
function formatDocHeadline(d) {
|
|
1123
1123
|
return `### ${d.title}
|
|
@@ -1149,9 +1149,9 @@ function formatRules(rules) {
|
|
|
1149
1149
|
|
|
1150
1150
|
${text.trim()}`;
|
|
1151
1151
|
}
|
|
1152
|
-
async function fetchSpecBody(api,
|
|
1152
|
+
async function fetchSpecBody(api, draftId) {
|
|
1153
1153
|
const spec = await api.get(
|
|
1154
|
-
`/v1/specs/${encodeURIComponent(
|
|
1154
|
+
`/v1/specs/${encodeURIComponent(draftId)}`
|
|
1155
1155
|
);
|
|
1156
1156
|
const parts = [];
|
|
1157
1157
|
if (spec.proposalContent) {
|
|
@@ -1245,16 +1245,16 @@ async function buildContext(api, { taskDescription, filePaths = [], maxTokens })
|
|
|
1245
1245
|
updatedAt: g.updatedAt
|
|
1246
1246
|
})),
|
|
1247
1247
|
...specs.filter((s) => s.status !== "archived").map((s) => {
|
|
1248
|
-
refs.set(key("spec", s.
|
|
1248
|
+
refs.set(key("spec", s.draftId), {
|
|
1249
1249
|
type: "spec",
|
|
1250
|
-
id: s.
|
|
1250
|
+
id: s.draftId,
|
|
1251
1251
|
title: s.name,
|
|
1252
|
-
listLine: `- **${s.name}** \u2014 \`
|
|
1253
|
-
fetchHint: `get_specs(
|
|
1252
|
+
listLine: `- **${s.name}** \u2014 \`draft_id: ${s.draftId}\` (${s.status}, ${s.requirementCount} requirements)`,
|
|
1253
|
+
fetchHint: `get_specs(draft_id="${s.draftId}")`
|
|
1254
1254
|
});
|
|
1255
1255
|
return {
|
|
1256
1256
|
type: "spec",
|
|
1257
|
-
id: s.
|
|
1257
|
+
id: s.draftId,
|
|
1258
1258
|
title: s.name,
|
|
1259
1259
|
content: formatSpecHeadline(s),
|
|
1260
1260
|
updatedAt: s.updatedAt
|
|
@@ -1620,7 +1620,7 @@ function registerUpdateSpec(server2, apiClient2) {
|
|
|
1620
1620
|
title: "Update Spec",
|
|
1621
1621
|
description: "Update an existing SystemDox spec's proposal, tasks, or requirements. Only draft specs can be modified \u2014 published specs must be versioned first.",
|
|
1622
1622
|
inputSchema: {
|
|
1623
|
-
|
|
1623
|
+
draft_id: z8.string().describe("ID of the spec to update"),
|
|
1624
1624
|
section: z8.enum(["proposal", "tasks", "requirements"]).describe("Which section to update"),
|
|
1625
1625
|
content: z8.string().describe(
|
|
1626
1626
|
"New markdown content for the section. For requirements, provide the full requirement content."
|
|
@@ -1633,8 +1633,8 @@ function registerUpdateSpec(server2, apiClient2) {
|
|
|
1633
1633
|
readOnlyHint: false
|
|
1634
1634
|
}
|
|
1635
1635
|
},
|
|
1636
|
-
async ({
|
|
1637
|
-
const spec = await apiClient2.get(`/v1/specs/${
|
|
1636
|
+
async ({ draft_id, section, content, requirement_name }) => {
|
|
1637
|
+
const spec = await apiClient2.get(`/v1/specs/${draft_id}`);
|
|
1638
1638
|
if (spec.status !== "draft") {
|
|
1639
1639
|
return {
|
|
1640
1640
|
content: [
|
|
@@ -1659,8 +1659,8 @@ function registerUpdateSpec(server2, apiClient2) {
|
|
|
1659
1659
|
};
|
|
1660
1660
|
body.requirements = [...existing, newReq];
|
|
1661
1661
|
}
|
|
1662
|
-
await apiClient2.put(`/v1/specs/${
|
|
1663
|
-
apiClient2.invalidateCache(`/v1/specs/${
|
|
1662
|
+
await apiClient2.put(`/v1/specs/${draft_id}`, body);
|
|
1663
|
+
apiClient2.invalidateCache(`/v1/specs/${draft_id}`);
|
|
1664
1664
|
apiClient2.invalidateCache("/v1/specs");
|
|
1665
1665
|
return {
|
|
1666
1666
|
content: [
|
|
@@ -1724,7 +1724,7 @@ ${decision}
|
|
|
1724
1724
|
## Consequences
|
|
1725
1725
|
|
|
1726
1726
|
${consequences}` + relatedSection;
|
|
1727
|
-
await apiClient2.put(`/v1/specs/${created.
|
|
1727
|
+
await apiClient2.put(`/v1/specs/${created.draftId}`, {
|
|
1728
1728
|
proposalContent: adrContent
|
|
1729
1729
|
});
|
|
1730
1730
|
apiClient2.invalidateCache("/v1/specs");
|
|
@@ -1732,7 +1732,7 @@ ${consequences}` + relatedSection;
|
|
|
1732
1732
|
content: [
|
|
1733
1733
|
{
|
|
1734
1734
|
type: "text",
|
|
1735
|
-
text: `Architecture decision recorded: **${adrTitle}** (spec id: ${created.
|
|
1735
|
+
text: `Architecture decision recorded: **${adrTitle}** (spec id: ${created.draftId})
|
|
1736
1736
|
|
|
1737
1737
|
Status: draft \u2014 review in SystemDox before publishing.`
|
|
1738
1738
|
}
|
|
@@ -2000,7 +2000,7 @@ var init_server = __esm({
|
|
|
2000
2000
|
init_create_project_rule();
|
|
2001
2001
|
init_get_prompt_templates();
|
|
2002
2002
|
init_create_prompt_template();
|
|
2003
|
-
SERVER_VERSION = true ? "0.1.
|
|
2003
|
+
SERVER_VERSION = true ? "0.1.30" : "0.0.0-dev";
|
|
2004
2004
|
}
|
|
2005
2005
|
});
|
|
2006
2006
|
|
package/dist/http.js
CHANGED
|
@@ -366,15 +366,15 @@ function registerGetSpecs(server, apiClient) {
|
|
|
366
366
|
title: "Get Specs",
|
|
367
367
|
description: "Retrieve SystemDox specifications (proposal, requirements with RFC 2119 keywords, Given/When/Then scenarios). Get a specific spec by ID, filter by status, or search by keyword.",
|
|
368
368
|
inputSchema: {
|
|
369
|
-
|
|
369
|
+
draft_id: z2.string().optional().describe("Specific spec ID to retrieve with full content"),
|
|
370
370
|
status: z2.enum(["draft", "ready", "archived"]).optional().describe("Filter by status"),
|
|
371
371
|
search: z2.string().optional().describe("Keyword search across spec names")
|
|
372
372
|
}
|
|
373
373
|
},
|
|
374
|
-
async ({
|
|
375
|
-
if (
|
|
374
|
+
async ({ draft_id, status, search }) => {
|
|
375
|
+
if (draft_id) {
|
|
376
376
|
const spec = await apiClient.get(
|
|
377
|
-
`/v1/specs/${
|
|
377
|
+
`/v1/specs/${draft_id}`
|
|
378
378
|
);
|
|
379
379
|
const sections = [`# ${spec.name}
|
|
380
380
|
|
|
@@ -423,7 +423,7 @@ ${spec.taskContent}`);
|
|
|
423
423
|
};
|
|
424
424
|
}
|
|
425
425
|
const text = filtered.map(
|
|
426
|
-
(s) => `- **${s.name}** (${s.
|
|
426
|
+
(s) => `- **${s.name}** (${s.draftId}) \u2014 ${s.status}, ${s.requirementCount} requirements` + (s.repoFullName ? `, repo: ${s.repoFullName}` : "")
|
|
427
427
|
).join("\n");
|
|
428
428
|
return {
|
|
429
429
|
content: [
|
|
@@ -1064,7 +1064,7 @@ ${g.fix}
|
|
|
1064
1064
|
}
|
|
1065
1065
|
function formatSpecHeadline(s) {
|
|
1066
1066
|
return `### ${s.name}
|
|
1067
|
-
\`
|
|
1067
|
+
\`draft_id: ${s.draftId}\` \xB7 ${s.status} \xB7 ${s.requirementCount} requirements`;
|
|
1068
1068
|
}
|
|
1069
1069
|
function formatDocHeadline(d) {
|
|
1070
1070
|
return `### ${d.title}
|
|
@@ -1096,9 +1096,9 @@ function formatRules(rules) {
|
|
|
1096
1096
|
|
|
1097
1097
|
${text.trim()}`;
|
|
1098
1098
|
}
|
|
1099
|
-
async function fetchSpecBody(api,
|
|
1099
|
+
async function fetchSpecBody(api, draftId) {
|
|
1100
1100
|
const spec = await api.get(
|
|
1101
|
-
`/v1/specs/${encodeURIComponent(
|
|
1101
|
+
`/v1/specs/${encodeURIComponent(draftId)}`
|
|
1102
1102
|
);
|
|
1103
1103
|
const parts = [];
|
|
1104
1104
|
if (spec.proposalContent) {
|
|
@@ -1214,16 +1214,16 @@ async function buildContext(api, { taskDescription, filePaths = [], maxTokens })
|
|
|
1214
1214
|
updatedAt: g.updatedAt
|
|
1215
1215
|
})),
|
|
1216
1216
|
...specs.filter((s) => s.status !== "archived").map((s) => {
|
|
1217
|
-
refs.set(key("spec", s.
|
|
1217
|
+
refs.set(key("spec", s.draftId), {
|
|
1218
1218
|
type: "spec",
|
|
1219
|
-
id: s.
|
|
1219
|
+
id: s.draftId,
|
|
1220
1220
|
title: s.name,
|
|
1221
|
-
listLine: `- **${s.name}** \u2014 \`
|
|
1222
|
-
fetchHint: `get_specs(
|
|
1221
|
+
listLine: `- **${s.name}** \u2014 \`draft_id: ${s.draftId}\` (${s.status}, ${s.requirementCount} requirements)`,
|
|
1222
|
+
fetchHint: `get_specs(draft_id="${s.draftId}")`
|
|
1223
1223
|
});
|
|
1224
1224
|
return {
|
|
1225
1225
|
type: "spec",
|
|
1226
|
-
id: s.
|
|
1226
|
+
id: s.draftId,
|
|
1227
1227
|
title: s.name,
|
|
1228
1228
|
content: formatSpecHeadline(s),
|
|
1229
1229
|
updatedAt: s.updatedAt
|
|
@@ -1537,7 +1537,7 @@ function registerUpdateSpec(server, apiClient) {
|
|
|
1537
1537
|
title: "Update Spec",
|
|
1538
1538
|
description: "Update an existing SystemDox spec's proposal, tasks, or requirements. Only draft specs can be modified \u2014 published specs must be versioned first.",
|
|
1539
1539
|
inputSchema: {
|
|
1540
|
-
|
|
1540
|
+
draft_id: z8.string().describe("ID of the spec to update"),
|
|
1541
1541
|
section: z8.enum(["proposal", "tasks", "requirements"]).describe("Which section to update"),
|
|
1542
1542
|
content: z8.string().describe(
|
|
1543
1543
|
"New markdown content for the section. For requirements, provide the full requirement content."
|
|
@@ -1550,8 +1550,8 @@ function registerUpdateSpec(server, apiClient) {
|
|
|
1550
1550
|
readOnlyHint: false
|
|
1551
1551
|
}
|
|
1552
1552
|
},
|
|
1553
|
-
async ({
|
|
1554
|
-
const spec = await apiClient.get(`/v1/specs/${
|
|
1553
|
+
async ({ draft_id, section, content, requirement_name }) => {
|
|
1554
|
+
const spec = await apiClient.get(`/v1/specs/${draft_id}`);
|
|
1555
1555
|
if (spec.status !== "draft") {
|
|
1556
1556
|
return {
|
|
1557
1557
|
content: [
|
|
@@ -1576,8 +1576,8 @@ function registerUpdateSpec(server, apiClient) {
|
|
|
1576
1576
|
};
|
|
1577
1577
|
body.requirements = [...existing, newReq];
|
|
1578
1578
|
}
|
|
1579
|
-
await apiClient.put(`/v1/specs/${
|
|
1580
|
-
apiClient.invalidateCache(`/v1/specs/${
|
|
1579
|
+
await apiClient.put(`/v1/specs/${draft_id}`, body);
|
|
1580
|
+
apiClient.invalidateCache(`/v1/specs/${draft_id}`);
|
|
1581
1581
|
apiClient.invalidateCache("/v1/specs");
|
|
1582
1582
|
return {
|
|
1583
1583
|
content: [
|
|
@@ -1636,7 +1636,7 @@ ${decision}
|
|
|
1636
1636
|
## Consequences
|
|
1637
1637
|
|
|
1638
1638
|
${consequences}` + relatedSection;
|
|
1639
|
-
await apiClient.put(`/v1/specs/${created.
|
|
1639
|
+
await apiClient.put(`/v1/specs/${created.draftId}`, {
|
|
1640
1640
|
proposalContent: adrContent
|
|
1641
1641
|
});
|
|
1642
1642
|
apiClient.invalidateCache("/v1/specs");
|
|
@@ -1644,7 +1644,7 @@ ${consequences}` + relatedSection;
|
|
|
1644
1644
|
content: [
|
|
1645
1645
|
{
|
|
1646
1646
|
type: "text",
|
|
1647
|
-
text: `Architecture decision recorded: **${adrTitle}** (spec id: ${created.
|
|
1647
|
+
text: `Architecture decision recorded: **${adrTitle}** (spec id: ${created.draftId})
|
|
1648
1648
|
|
|
1649
1649
|
Status: draft \u2014 review in SystemDox before publishing.`
|
|
1650
1650
|
}
|
|
@@ -1844,7 +1844,7 @@ function registerCreatePromptTemplate(server, apiClient) {
|
|
|
1844
1844
|
}
|
|
1845
1845
|
|
|
1846
1846
|
// src/server.ts
|
|
1847
|
-
var SERVER_VERSION = true ? "0.1.
|
|
1847
|
+
var SERVER_VERSION = true ? "0.1.30" : "0.0.0-dev";
|
|
1848
1848
|
function createServer(apiClient) {
|
|
1849
1849
|
const server = new McpServer({
|
|
1850
1850
|
name: "systemdox-mcp-server",
|
package/dist/index.js
CHANGED
|
@@ -348,15 +348,15 @@ function registerGetSpecs(server2, apiClient2) {
|
|
|
348
348
|
title: "Get Specs",
|
|
349
349
|
description: "Retrieve SystemDox specifications (proposal, requirements with RFC 2119 keywords, Given/When/Then scenarios). Get a specific spec by ID, filter by status, or search by keyword.",
|
|
350
350
|
inputSchema: {
|
|
351
|
-
|
|
351
|
+
draft_id: z2.string().optional().describe("Specific spec ID to retrieve with full content"),
|
|
352
352
|
status: z2.enum(["draft", "ready", "archived"]).optional().describe("Filter by status"),
|
|
353
353
|
search: z2.string().optional().describe("Keyword search across spec names")
|
|
354
354
|
}
|
|
355
355
|
},
|
|
356
|
-
async ({
|
|
357
|
-
if (
|
|
356
|
+
async ({ draft_id, status, search }) => {
|
|
357
|
+
if (draft_id) {
|
|
358
358
|
const spec = await apiClient2.get(
|
|
359
|
-
`/v1/specs/${
|
|
359
|
+
`/v1/specs/${draft_id}`
|
|
360
360
|
);
|
|
361
361
|
const sections = [`# ${spec.name}
|
|
362
362
|
|
|
@@ -405,7 +405,7 @@ ${spec.taskContent}`);
|
|
|
405
405
|
};
|
|
406
406
|
}
|
|
407
407
|
const text = filtered.map(
|
|
408
|
-
(s) => `- **${s.name}** (${s.
|
|
408
|
+
(s) => `- **${s.name}** (${s.draftId}) \u2014 ${s.status}, ${s.requirementCount} requirements` + (s.repoFullName ? `, repo: ${s.repoFullName}` : "")
|
|
409
409
|
).join("\n");
|
|
410
410
|
return {
|
|
411
411
|
content: [
|
|
@@ -1046,7 +1046,7 @@ ${g.fix}
|
|
|
1046
1046
|
}
|
|
1047
1047
|
function formatSpecHeadline(s) {
|
|
1048
1048
|
return `### ${s.name}
|
|
1049
|
-
\`
|
|
1049
|
+
\`draft_id: ${s.draftId}\` \xB7 ${s.status} \xB7 ${s.requirementCount} requirements`;
|
|
1050
1050
|
}
|
|
1051
1051
|
function formatDocHeadline(d) {
|
|
1052
1052
|
return `### ${d.title}
|
|
@@ -1078,9 +1078,9 @@ function formatRules(rules) {
|
|
|
1078
1078
|
|
|
1079
1079
|
${text.trim()}`;
|
|
1080
1080
|
}
|
|
1081
|
-
async function fetchSpecBody(api,
|
|
1081
|
+
async function fetchSpecBody(api, draftId) {
|
|
1082
1082
|
const spec = await api.get(
|
|
1083
|
-
`/v1/specs/${encodeURIComponent(
|
|
1083
|
+
`/v1/specs/${encodeURIComponent(draftId)}`
|
|
1084
1084
|
);
|
|
1085
1085
|
const parts = [];
|
|
1086
1086
|
if (spec.proposalContent) {
|
|
@@ -1196,16 +1196,16 @@ async function buildContext(api, { taskDescription, filePaths = [], maxTokens })
|
|
|
1196
1196
|
updatedAt: g.updatedAt
|
|
1197
1197
|
})),
|
|
1198
1198
|
...specs.filter((s) => s.status !== "archived").map((s) => {
|
|
1199
|
-
refs.set(key("spec", s.
|
|
1199
|
+
refs.set(key("spec", s.draftId), {
|
|
1200
1200
|
type: "spec",
|
|
1201
|
-
id: s.
|
|
1201
|
+
id: s.draftId,
|
|
1202
1202
|
title: s.name,
|
|
1203
|
-
listLine: `- **${s.name}** \u2014 \`
|
|
1204
|
-
fetchHint: `get_specs(
|
|
1203
|
+
listLine: `- **${s.name}** \u2014 \`draft_id: ${s.draftId}\` (${s.status}, ${s.requirementCount} requirements)`,
|
|
1204
|
+
fetchHint: `get_specs(draft_id="${s.draftId}")`
|
|
1205
1205
|
});
|
|
1206
1206
|
return {
|
|
1207
1207
|
type: "spec",
|
|
1208
|
-
id: s.
|
|
1208
|
+
id: s.draftId,
|
|
1209
1209
|
title: s.name,
|
|
1210
1210
|
content: formatSpecHeadline(s),
|
|
1211
1211
|
updatedAt: s.updatedAt
|
|
@@ -1519,7 +1519,7 @@ function registerUpdateSpec(server2, apiClient2) {
|
|
|
1519
1519
|
title: "Update Spec",
|
|
1520
1520
|
description: "Update an existing SystemDox spec's proposal, tasks, or requirements. Only draft specs can be modified \u2014 published specs must be versioned first.",
|
|
1521
1521
|
inputSchema: {
|
|
1522
|
-
|
|
1522
|
+
draft_id: z8.string().describe("ID of the spec to update"),
|
|
1523
1523
|
section: z8.enum(["proposal", "tasks", "requirements"]).describe("Which section to update"),
|
|
1524
1524
|
content: z8.string().describe(
|
|
1525
1525
|
"New markdown content for the section. For requirements, provide the full requirement content."
|
|
@@ -1532,8 +1532,8 @@ function registerUpdateSpec(server2, apiClient2) {
|
|
|
1532
1532
|
readOnlyHint: false
|
|
1533
1533
|
}
|
|
1534
1534
|
},
|
|
1535
|
-
async ({
|
|
1536
|
-
const spec = await apiClient2.get(`/v1/specs/${
|
|
1535
|
+
async ({ draft_id, section, content, requirement_name }) => {
|
|
1536
|
+
const spec = await apiClient2.get(`/v1/specs/${draft_id}`);
|
|
1537
1537
|
if (spec.status !== "draft") {
|
|
1538
1538
|
return {
|
|
1539
1539
|
content: [
|
|
@@ -1558,8 +1558,8 @@ function registerUpdateSpec(server2, apiClient2) {
|
|
|
1558
1558
|
};
|
|
1559
1559
|
body.requirements = [...existing, newReq];
|
|
1560
1560
|
}
|
|
1561
|
-
await apiClient2.put(`/v1/specs/${
|
|
1562
|
-
apiClient2.invalidateCache(`/v1/specs/${
|
|
1561
|
+
await apiClient2.put(`/v1/specs/${draft_id}`, body);
|
|
1562
|
+
apiClient2.invalidateCache(`/v1/specs/${draft_id}`);
|
|
1563
1563
|
apiClient2.invalidateCache("/v1/specs");
|
|
1564
1564
|
return {
|
|
1565
1565
|
content: [
|
|
@@ -1618,7 +1618,7 @@ ${decision}
|
|
|
1618
1618
|
## Consequences
|
|
1619
1619
|
|
|
1620
1620
|
${consequences}` + relatedSection;
|
|
1621
|
-
await apiClient2.put(`/v1/specs/${created.
|
|
1621
|
+
await apiClient2.put(`/v1/specs/${created.draftId}`, {
|
|
1622
1622
|
proposalContent: adrContent
|
|
1623
1623
|
});
|
|
1624
1624
|
apiClient2.invalidateCache("/v1/specs");
|
|
@@ -1626,7 +1626,7 @@ ${consequences}` + relatedSection;
|
|
|
1626
1626
|
content: [
|
|
1627
1627
|
{
|
|
1628
1628
|
type: "text",
|
|
1629
|
-
text: `Architecture decision recorded: **${adrTitle}** (spec id: ${created.
|
|
1629
|
+
text: `Architecture decision recorded: **${adrTitle}** (spec id: ${created.draftId})
|
|
1630
1630
|
|
|
1631
1631
|
Status: draft \u2014 review in SystemDox before publishing.`
|
|
1632
1632
|
}
|
|
@@ -1826,7 +1826,7 @@ function registerCreatePromptTemplate(server2, apiClient2) {
|
|
|
1826
1826
|
}
|
|
1827
1827
|
|
|
1828
1828
|
// src/server.ts
|
|
1829
|
-
var SERVER_VERSION = true ? "0.1.
|
|
1829
|
+
var SERVER_VERSION = true ? "0.1.30" : "0.0.0-dev";
|
|
1830
1830
|
function createServer(apiClient2) {
|
|
1831
1831
|
const server2 = new McpServer({
|
|
1832
1832
|
name: "systemdox-mcp-server",
|
|
@@ -279,7 +279,7 @@ ${g.fix}
|
|
|
279
279
|
}
|
|
280
280
|
function formatSpecHeadline(s) {
|
|
281
281
|
return `### ${s.name}
|
|
282
|
-
\`
|
|
282
|
+
\`draft_id: ${s.draftId}\` \xB7 ${s.status} \xB7 ${s.requirementCount} requirements`;
|
|
283
283
|
}
|
|
284
284
|
function formatDocHeadline(d) {
|
|
285
285
|
return `### ${d.title}
|
|
@@ -311,9 +311,9 @@ function formatRules(rules) {
|
|
|
311
311
|
|
|
312
312
|
${text.trim()}`;
|
|
313
313
|
}
|
|
314
|
-
async function fetchSpecBody(api,
|
|
314
|
+
async function fetchSpecBody(api, draftId) {
|
|
315
315
|
const spec = await api.get(
|
|
316
|
-
`/v1/specs/${encodeURIComponent(
|
|
316
|
+
`/v1/specs/${encodeURIComponent(draftId)}`
|
|
317
317
|
);
|
|
318
318
|
const parts = [];
|
|
319
319
|
if (spec.proposalContent) {
|
|
@@ -429,16 +429,16 @@ async function buildContext(api, { taskDescription, filePaths = [], maxTokens })
|
|
|
429
429
|
updatedAt: g.updatedAt
|
|
430
430
|
})),
|
|
431
431
|
...specs.filter((s) => s.status !== "archived").map((s) => {
|
|
432
|
-
refs.set(key("spec", s.
|
|
432
|
+
refs.set(key("spec", s.draftId), {
|
|
433
433
|
type: "spec",
|
|
434
|
-
id: s.
|
|
434
|
+
id: s.draftId,
|
|
435
435
|
title: s.name,
|
|
436
|
-
listLine: `- **${s.name}** \u2014 \`
|
|
437
|
-
fetchHint: `get_specs(
|
|
436
|
+
listLine: `- **${s.name}** \u2014 \`draft_id: ${s.draftId}\` (${s.status}, ${s.requirementCount} requirements)`,
|
|
437
|
+
fetchHint: `get_specs(draft_id="${s.draftId}")`
|
|
438
438
|
});
|
|
439
439
|
return {
|
|
440
440
|
type: "spec",
|
|
441
|
-
id: s.
|
|
441
|
+
id: s.draftId,
|
|
442
442
|
title: s.name,
|
|
443
443
|
content: formatSpecHeadline(s),
|
|
444
444
|
updatedAt: s.updatedAt
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@systemdox/mcp-server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.30",
|
|
4
4
|
"mcpName": "io.github.puglieseweb/systemdox",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Give AI coding agents your architecture context over MCP — checks, specs, ADRs, project rules, and docs from SystemDox, delivered at write time",
|