stack-scribe-mcp 0.1.0 → 0.1.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhD,eAAO,MAAM,gBAAgB,mPAe3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAI1D,eAAO,MAAM,cAAc;;;;;;;;;EAGzB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,eAAO,MAAM,gBAAgB,yCAAuC,CAAC;AAErE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,qBAAqB,4CAA0C,CAAC;AAE7E,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;EAKvB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAIxD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASrB,CAAC;AAEH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAI9C,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;EAMrB,CAAC;AAEH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAI9C,eAAO,MAAM,WAAW;;;IAGtB,oEAAoE;;;IAGpE,2CAA2C;;;;;;;;;;;;;;;;;EAG3C,CAAC;AAEH,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAIhD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAZxB,oEAAoE;;;QAGpE,2CAA2C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAe3C,CAAC;AAEH,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC"}
package/dist/schema.js ADDED
@@ -0,0 +1,70 @@
1
+ import { z } from "zod";
2
+ import { normalizeNodeTypeInput } from "./node-type-resolution.js";
3
+ import { NodeTypeSchema } from "./node-types.js";
4
+ export { NodeTypeSchema };
5
+ // ── Group style ───────────────────────────────────────────────────────────────
6
+ export const GroupStyleSchema = z.enum([
7
+ "account",
8
+ "auto-scaling-group",
9
+ "cloud",
10
+ "cloud-logo",
11
+ "corporate-data-center",
12
+ "ec2-instance-contents",
13
+ "iot-greengrass-deployment",
14
+ "private-subnet",
15
+ "public-subnet",
16
+ "region",
17
+ "server-contents",
18
+ "spot-fleet",
19
+ "vpc",
20
+ "custom",
21
+ ]);
22
+ // ── Position ──────────────────────────────────────────────────────────────────
23
+ export const PositionSchema = z.object({
24
+ x: z.number(),
25
+ y: z.number(),
26
+ });
27
+ export const LayoutModeSchema = z.enum(["auto", "manual", "hybrid"]);
28
+ export const LayoutDirectionSchema = z.enum(["LEFT", "RIGHT", "UP", "DOWN"]);
29
+ export const LayoutSchema = z.object({
30
+ mode: LayoutModeSchema.optional(),
31
+ direction: LayoutDirectionSchema.optional(),
32
+ nodeSpacing: z.number().nonnegative().optional(),
33
+ layerSpacing: z.number().nonnegative().optional(),
34
+ });
35
+ // ── Node ──────────────────────────────────────────────────────────────────────
36
+ export const NodeSchema = z.object({
37
+ id: z.string().min(1),
38
+ type: z.preprocess((value) => (typeof value === "string" ? normalizeNodeTypeInput(value) : value), NodeTypeSchema),
39
+ label: z.string().optional(),
40
+ description: z.string().optional(),
41
+ position: PositionSchema.optional(),
42
+ });
43
+ // ── Edge ──────────────────────────────────────────────────────────────────────
44
+ export const EdgeSchema = z.object({
45
+ from: z.string().min(1),
46
+ to: z.string().min(1),
47
+ label: z.string().optional(),
48
+ description: z.string().optional(),
49
+ direction: z.enum(["one-way", "two-way"]).optional(),
50
+ });
51
+ // ── Group ─────────────────────────────────────────────────────────────────────
52
+ export const GroupSchema = z.object({
53
+ id: z.string().min(1),
54
+ label: z.string(),
55
+ /** Node IDs and/or nested group IDs contained within this group. */
56
+ children: z.array(z.string().min(1)),
57
+ style: GroupStyleSchema.optional(),
58
+ /** Only applies when style is "custom". */
59
+ color: z.string().optional(),
60
+ borderColor: z.string().optional(),
61
+ });
62
+ // ── Diagram ───────────────────────────────────────────────────────────────────
63
+ export const DiagramSchema = z.object({
64
+ title: z.string().optional(),
65
+ nodes: z.array(NodeSchema),
66
+ edges: z.array(EdgeSchema),
67
+ groups: z.array(GroupSchema).optional(),
68
+ layout: LayoutSchema.optional(),
69
+ });
70
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface ValidationError {
2
+ path: string;
3
+ message: string;
4
+ }
5
+ export interface ValidationResult {
6
+ valid: boolean;
7
+ errors: ValidationError[];
8
+ }
9
+ export interface ValidateOptions {
10
+ /** Include orphan-node warnings in the result errors array. Default: true. */
11
+ warnOrphans?: boolean;
12
+ }
13
+ export declare function validate(input: unknown, options?: ValidateOptions): ValidationResult;
14
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAmID,MAAM,WAAW,eAAe;IAC9B,8EAA8E;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,QAAQ,CACtB,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,eAAoB,GAC5B,gBAAgB,CAmBlB"}
@@ -0,0 +1,132 @@
1
+ import { DiagramSchema } from "./schema.js";
2
+ // ── Helpers ───────────────────────────────────────────────────────────────────
3
+ function zodToErrors(error) {
4
+ return error.issues.map((issue) => ({
5
+ path: issue.path.join(".") || "(root)",
6
+ message: issue.message,
7
+ }));
8
+ }
9
+ // ── Semantic checks ───────────────────────────────────────────────────────────
10
+ function semanticErrors(diagram) {
11
+ const errors = [];
12
+ const nodeIds = new Set(diagram.nodes.map((n) => n.id));
13
+ const groupIds = new Set((diagram.groups ?? []).map((g) => g.id));
14
+ const allIds = new Set([...nodeIds, ...groupIds]);
15
+ // Duplicate IDs
16
+ const seen = new Set();
17
+ for (const node of diagram.nodes) {
18
+ if (seen.has(node.id)) {
19
+ errors.push({ path: `nodes`, message: `Duplicate id "${node.id}"` });
20
+ }
21
+ seen.add(node.id);
22
+ }
23
+ for (const group of diagram.groups ?? []) {
24
+ if (seen.has(group.id)) {
25
+ errors.push({
26
+ path: `groups`,
27
+ message: `Duplicate id "${group.id}" (conflicts with a node or group id)`,
28
+ });
29
+ }
30
+ seen.add(group.id);
31
+ }
32
+ // Edge references
33
+ diagram.edges.forEach((edge, i) => {
34
+ if (!nodeIds.has(edge.from)) {
35
+ errors.push({
36
+ path: `edges[${i}].from`,
37
+ message: `Node "${edge.from}" does not exist`,
38
+ });
39
+ }
40
+ if (!nodeIds.has(edge.to)) {
41
+ errors.push({
42
+ path: `edges[${i}].to`,
43
+ message: `Node "${edge.to}" does not exist`,
44
+ });
45
+ }
46
+ });
47
+ // Group children references
48
+ for (const group of diagram.groups ?? []) {
49
+ group.children.forEach((childId, i) => {
50
+ if (!allIds.has(childId)) {
51
+ errors.push({
52
+ path: `groups[id=${group.id}].children[${i}]`,
53
+ message: `"${childId}" does not exist as a node or group id`,
54
+ });
55
+ }
56
+ });
57
+ }
58
+ // Circular group nesting
59
+ const childrenOf = new Map();
60
+ for (const group of diagram.groups ?? []) {
61
+ childrenOf.set(group.id, group.children.filter((c) => groupIds.has(c)));
62
+ }
63
+ function hasCycle(groupId, visited) {
64
+ if (visited.has(groupId))
65
+ return true;
66
+ visited.add(groupId);
67
+ for (const child of childrenOf.get(groupId) ?? []) {
68
+ if (hasCycle(child, new Set(visited)))
69
+ return true;
70
+ }
71
+ return false;
72
+ }
73
+ for (const group of diagram.groups ?? []) {
74
+ if (hasCycle(group.id, new Set())) {
75
+ errors.push({
76
+ path: `groups[id=${group.id}]`,
77
+ message: `Circular group nesting detected`,
78
+ });
79
+ }
80
+ }
81
+ // Manual layout requires explicit positions for every node.
82
+ if (diagram.layout?.mode === "manual") {
83
+ for (const node of diagram.nodes) {
84
+ if (!node.position) {
85
+ errors.push({
86
+ path: `nodes[id=${node.id}].position`,
87
+ message: `Manual layout mode requires all nodes to define position`,
88
+ });
89
+ }
90
+ }
91
+ }
92
+ return errors;
93
+ }
94
+ // ── Orphan warnings ───────────────────────────────────────────────────────────
95
+ function orphanWarnings(diagram) {
96
+ const warnings = [];
97
+ const referenced = new Set();
98
+ for (const edge of diagram.edges) {
99
+ referenced.add(edge.from);
100
+ referenced.add(edge.to);
101
+ }
102
+ for (const group of diagram.groups ?? []) {
103
+ for (const child of group.children)
104
+ referenced.add(child);
105
+ }
106
+ for (const node of diagram.nodes) {
107
+ if (!referenced.has(node.id)) {
108
+ warnings.push({
109
+ path: `nodes[id=${node.id}]`,
110
+ message: `Node "${node.id}" is not referenced by any edge or group (orphan)`,
111
+ });
112
+ }
113
+ }
114
+ return warnings;
115
+ }
116
+ export function validate(input, options = {}) {
117
+ const { warnOrphans = true } = options;
118
+ // Pass 1: structural (zod)
119
+ const parsed = DiagramSchema.safeParse(input);
120
+ if (!parsed.success) {
121
+ return { valid: false, errors: zodToErrors(parsed.error) };
122
+ }
123
+ // Pass 2: semantic
124
+ const errors = semanticErrors(parsed.data);
125
+ if (errors.length > 0) {
126
+ return { valid: false, errors };
127
+ }
128
+ // Orphan warnings (non-blocking)
129
+ const warnings = warnOrphans ? orphanWarnings(parsed.data) : [];
130
+ return { valid: true, errors: warnings };
131
+ }
132
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,22 +1,24 @@
1
1
  {
2
2
  "name": "stack-scribe-mcp",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "MCP server that compiles structured Diagram JSON into AWS architecture SVGs",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "exports": {
8
8
  ".": "./dist/index.js"
9
9
  },
10
+ "bin": {
11
+ "stack-scribe": "./dist/index.js"
12
+ },
10
13
  "files": [
11
14
  "dist",
12
15
  "icons"
13
16
  ],
14
17
  "scripts": {
15
- "build": "tsup",
16
- "dev": "tsup --watch",
18
+ "build": "tsc && npm run copyIcons",
17
19
  "test": "vitest run",
18
20
  "test:watch": "vitest",
19
- "copyIcons": "tsx scripts/copy-icons.ts"
21
+ "copyIcons": "tsx scripts/copy-icons.mjs"
20
22
  },
21
23
  "dependencies": {
22
24
  "@modelcontextprotocol/sdk": "^1.27.1",