@documentation-robotics/cli 0.2.0 → 0.3.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 +36 -2
- package/dist/analysis/relationship-classifier.js +2 -9
- package/dist/analysis/relationship-classifier.js.map +2 -2
- package/dist/analyzers/call-graph-utils.js +2 -2
- package/dist/analyzers/call-graph-utils.js.map +2 -2
- package/dist/analyzers/cards/build.js +171 -0
- package/dist/analyzers/cards/build.js.map +7 -0
- package/dist/analyzers/cards/classify.js +42 -0
- package/dist/analyzers/cards/classify.js.map +7 -0
- package/dist/analyzers/cards/edge-index.js +44 -0
- package/dist/analyzers/cards/edge-index.js.map +7 -0
- package/dist/analyzers/cards/facts.js +46 -0
- package/dist/analyzers/cards/facts.js.map +7 -0
- package/dist/analyzers/cards/graph.js +42 -0
- package/dist/analyzers/cards/graph.js.map +7 -0
- package/dist/analyzers/cards/index.js +8 -0
- package/dist/analyzers/cards/index.js.map +7 -0
- package/dist/analyzers/cards/tier0.js +18 -0
- package/dist/analyzers/cards/tier0.js.map +7 -0
- package/dist/analyzers/cards/types.js +1 -0
- package/dist/analyzers/cards/types.js.map +7 -0
- package/dist/analyzers/cbm-analyzer.js +195 -171
- package/dist/analyzers/cbm-analyzer.js.map +2 -2
- package/dist/analyzers/cbm-responses.js +336 -0
- package/dist/analyzers/cbm-responses.js.map +7 -0
- package/dist/analyzers/edge-relationships.js +45 -0
- package/dist/analyzers/edge-relationships.js.map +7 -0
- package/dist/analyzers/mapping-loader.js +9 -0
- package/dist/analyzers/mapping-loader.js.map +2 -2
- package/dist/analyzers/tier0-rules.js +153 -0
- package/dist/analyzers/tier0-rules.js.map +7 -0
- package/dist/analyzers/types.js.map +1 -1
- package/dist/audit/relationships/ai/prompts.js +10 -10
- package/dist/audit/relationships/ai/prompts.js.map +2 -2
- package/dist/audit/relationships/analysis/layer-templates.js +52 -52
- package/dist/audit/relationships/analysis/layer-templates.js.map +1 -1
- package/dist/cli.js +12 -2
- package/dist/cli.js.map +2 -2
- package/dist/coding-agents/default-permissions.js +31 -1
- package/dist/coding-agents/default-permissions.js.map +2 -2
- package/dist/coding-agents/drbot-mcp.js +167 -0
- package/dist/coding-agents/drbot-mcp.js.map +7 -0
- package/dist/commands/add.js +3 -2
- package/dist/commands/add.js.map +2 -2
- package/dist/commands/analyzer.js +117 -14
- package/dist/commands/analyzer.js.map +2 -2
- package/dist/commands/changeset-verify.js +55 -0
- package/dist/commands/changeset-verify.js.map +7 -0
- package/dist/commands/changeset.js +43 -22
- package/dist/commands/changeset.js.map +2 -2
- package/dist/commands/delete.js +10 -4
- package/dist/commands/delete.js.map +2 -2
- package/dist/commands/farm.js +176 -60
- package/dist/commands/farm.js.map +2 -2
- package/dist/commands/mcp.js +19 -4
- package/dist/commands/mcp.js.map +2 -2
- package/dist/commands/relationship.js +207 -26
- package/dist/commands/relationship.js.map +2 -2
- package/dist/commands/update.js +42 -23
- package/dist/commands/update.js.map +2 -2
- package/dist/commands/upgrade.js +99 -11
- package/dist/commands/upgrade.js.map +3 -3
- package/dist/commands/version.js +1 -1
- package/dist/commands/visualize.js +4 -3
- package/dist/commands/visualize.js.map +2 -2
- package/dist/core/catalog-migration.js +33 -0
- package/dist/core/catalog-migration.js.map +7 -0
- package/dist/core/changeset-analysis.js +421 -0
- package/dist/core/changeset-analysis.js.map +7 -0
- package/dist/core/changeset-base-index.js +153 -0
- package/dist/core/changeset-base-index.js.map +7 -0
- package/dist/core/changeset-brief-delta.js +102 -0
- package/dist/core/changeset-brief-delta.js.map +7 -0
- package/dist/core/changeset-graph.js +281 -0
- package/dist/core/changeset-graph.js.map +7 -0
- package/dist/core/changeset-only-guard.js +32 -0
- package/dist/core/changeset-only-guard.js.map +7 -0
- package/dist/core/changeset-summary.js +68 -0
- package/dist/core/changeset-summary.js.map +7 -0
- package/dist/core/changeset-validator.js +66 -20
- package/dist/core/changeset-validator.js.map +2 -2
- package/dist/core/changeset-verify.js +518 -0
- package/dist/core/changeset-verify.js.map +7 -0
- package/dist/core/changeset.js +56 -9
- package/dist/core/changeset.js.map +2 -2
- package/dist/core/element-type-migration.js +145 -0
- package/dist/core/element-type-migration.js.map +7 -0
- package/dist/core/farm-manifest.js +12 -6
- package/dist/core/farm-manifest.js.map +2 -2
- package/dist/core/farm-sync-engine.js +1 -1
- package/dist/core/farm-sync-engine.js.map +2 -2
- package/dist/core/farm-sync-state.js +10 -2
- package/dist/core/farm-sync-state.js.map +2 -2
- package/dist/core/migration-registry.js +75 -46
- package/dist/core/migration-registry.js.map +2 -2
- package/dist/core/model-upgrade.js +102 -0
- package/dist/core/model-upgrade.js.map +7 -0
- package/dist/core/model.js +82 -30
- package/dist/core/model.js.map +2 -2
- package/dist/core/mutation-handler.js +71 -6
- package/dist/core/mutation-handler.js.map +2 -2
- package/dist/core/relationship-migration-table.js +6639 -0
- package/dist/core/relationship-migration-table.js.map +7 -0
- package/dist/core/relationship-migration.js +272 -0
- package/dist/core/relationship-migration.js.map +7 -0
- package/dist/core/relationship-prune.js +49 -0
- package/dist/core/relationship-prune.js.map +7 -0
- package/dist/core/relationship-staging.js +68 -0
- package/dist/core/relationship-staging.js.map +7 -0
- package/dist/core/relationships.js +26 -4
- package/dist/core/relationships.js.map +2 -2
- package/dist/core/report-data-model.js +7 -13
- package/dist/core/report-data-model.js.map +2 -2
- package/dist/core/staged-changeset-storage.js +64 -17
- package/dist/core/staged-changeset-storage.js.map +2 -2
- package/dist/core/staged-source-reference.js +28 -0
- package/dist/core/staged-source-reference.js.map +7 -0
- package/dist/core/staging-area.js +83 -18
- package/dist/core/staging-area.js.map +2 -2
- package/dist/core/virtual-projection.js +13 -5
- package/dist/core/virtual-projection.js.map +2 -2
- package/dist/export/archimate-exporter.js +1 -0
- package/dist/export/archimate-exporter.js.map +2 -2
- package/dist/generated/compiled-validators.js +2 -2
- package/dist/generated/compiled-validators.js.map +2 -2
- package/dist/generated/layer-registry.js +16 -16
- package/dist/generated/layer-registry.js.map +2 -2
- package/dist/generated/node-types.js +186 -168
- package/dist/generated/node-types.js.map +2 -2
- package/dist/generated/relationship-index.js +2236 -7790
- package/dist/generated/relationship-index.js.map +2 -2
- package/dist/integrations/claude_code/agents/dr-architect.md +16 -3
- package/dist/integrations/claude_code/agents/dr-extractor.md +1 -1
- package/dist/integrations/claude_code/commands/dr-analyzer.md +565 -0
- package/dist/integrations/claude_code/commands/dr-map.md +13 -0
- package/dist/integrations/claude_code/commands/dr-plan.md +40 -0
- package/dist/integrations/claude_code/commands/dr-relate.md +106 -96
- package/dist/integrations/claude_code/commands/dr-verify.md +45 -2
- package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +14 -0
- package/dist/integrations/claude_code/docs/MCP_SERVER.md +26 -2
- package/dist/integrations/claude_code/docs/QUICK_START.md +37 -8
- package/dist/integrations/claude_code/docs/README.md +48 -1
- package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +93 -72
- package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +163 -126
- package/dist/integrations/claude_code/skills/dr_03_product_layer/SKILL.md +161 -126
- package/dist/integrations/claude_code/skills/dr_04_security_layer/SKILL.md +153 -133
- package/dist/integrations/claude_code/skills/dr_05_application_layer/SKILL.md +129 -100
- package/dist/integrations/claude_code/skills/dr_06_technology_layer/SKILL.md +111 -94
- package/dist/integrations/claude_code/skills/dr_07_api_layer/SKILL.md +143 -157
- package/dist/integrations/claude_code/skills/dr_08_data_model_layer/SKILL.md +117 -33
- package/dist/integrations/claude_code/skills/dr_09_dataset_layer/SKILL.md +74 -25
- package/dist/integrations/claude_code/skills/dr_10_ux_layer/SKILL.md +88 -12
- package/dist/integrations/claude_code/skills/dr_11_navigation_layer/SKILL.md +83 -24
- package/dist/integrations/claude_code/skills/dr_12_apm_layer/SKILL.md +57 -12
- package/dist/integrations/claude_code/skills/dr_13_testing_layer/SKILL.md +92 -15
- package/dist/integrations/claude_code/skills/dr_change_planning/SKILL.md +119 -0
- package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +3 -0
- package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +1 -1
- package/dist/integrations/github_copilot/agents/dr-architect.md +1 -1
- package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +182 -102
- package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +266 -148
- package/dist/integrations/github_copilot/skills/dr_03_product_layer/SKILL.md +547 -86
- package/dist/integrations/github_copilot/skills/dr_04_security_layer/SKILL.md +164 -169
- package/dist/integrations/github_copilot/skills/dr_05_application_layer/SKILL.md +420 -150
- package/dist/integrations/github_copilot/skills/dr_06_technology_layer/SKILL.md +331 -138
- package/dist/integrations/github_copilot/skills/dr_07_api_layer/SKILL.md +265 -201
- package/dist/integrations/github_copilot/skills/dr_08_data_model_layer/SKILL.md +181 -58
- package/dist/integrations/github_copilot/skills/dr_09_dataset_layer/SKILL.md +209 -57
- package/dist/integrations/github_copilot/skills/dr_10_ux_layer/SKILL.md +277 -112
- package/dist/integrations/github_copilot/skills/dr_11_navigation_layer/SKILL.md +219 -70
- package/dist/integrations/github_copilot/skills/dr_12_apm_layer/SKILL.md +189 -105
- package/dist/integrations/github_copilot/skills/dr_13_testing_layer/SKILL.md +222 -102
- package/dist/integrations/github_copilot/skills/dr_change_planning/SKILL.md +119 -0
- package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +3 -0
- package/dist/integrations/hash-utils.js.map +2 -2
- package/dist/mcp/api-key-manager.js +14 -1
- package/dist/mcp/api-key-manager.js.map +2 -2
- package/dist/mcp/changeset-only.js +34 -0
- package/dist/mcp/changeset-only.js.map +7 -0
- package/dist/mcp/tool-registry.js +19 -3
- package/dist/mcp/tool-registry.js.map +2 -2
- package/dist/mcp/tools/changeset-analysis-tools.js +78 -0
- package/dist/mcp/tools/changeset-analysis-tools.js.map +7 -0
- package/dist/mcp/tools/changeset-editing.js +184 -0
- package/dist/mcp/tools/changeset-editing.js.map +7 -0
- package/dist/mcp/tools/changeset-lifecycle.js +83 -0
- package/dist/mcp/tools/changeset-lifecycle.js.map +7 -0
- package/dist/mcp/tools/changeset-shared.js +31 -0
- package/dist/mcp/tools/changeset-shared.js.map +7 -0
- package/dist/mcp/tools/changeset-show.js +17 -1
- package/dist/mcp/tools/changeset-show.js.map +2 -2
- package/dist/mcp/tools/changeset-verify.js +43 -0
- package/dist/mcp/tools/changeset-verify.js.map +7 -0
- package/dist/mcp/tools/index.js +19 -1
- package/dist/mcp/tools/index.js.map +2 -2
- package/dist/mcp/tools/model-add.js +6 -5
- package/dist/mcp/tools/model-add.js.map +2 -2
- package/dist/mcp/tools/model-delete.js +2 -2
- package/dist/mcp/tools/model-delete.js.map +2 -2
- package/dist/mcp/tools/model-search.js +14 -0
- package/dist/mcp/tools/model-search.js.map +2 -2
- package/dist/mcp/tools/model-show.js +29 -2
- package/dist/mcp/tools/model-show.js.map +2 -2
- package/dist/mcp/tools/model-trace.js +93 -30
- package/dist/mcp/tools/model-trace.js.map +2 -2
- package/dist/mcp/tools/model-update.js +35 -19
- package/dist/mcp/tools/model-update.js.map +2 -2
- package/dist/mcp/tools/relationship-tools.js +98 -0
- package/dist/mcp/tools/relationship-tools.js.map +7 -0
- package/dist/mcp/tools/shared.js +25 -2
- package/dist/mcp/tools/shared.js.map +2 -2
- package/dist/mcp/tools/spec-type.js +90 -0
- package/dist/mcp/tools/spec-type.js.map +7 -0
- package/dist/schemas/bundled/analyzers/cbm.json +1186 -68
- package/dist/schemas/bundled/analyzers/manifest.json +2 -2
- package/dist/schemas/bundled/api.json +1029 -1658
- package/dist/schemas/bundled/apm.json +499 -734
- package/dist/schemas/bundled/application.json +735 -371
- package/dist/schemas/bundled/base.json +3 -220
- package/dist/schemas/bundled/business.json +452 -366
- package/dist/schemas/bundled/data-model.json +395 -411
- package/dist/schemas/bundled/data-store.json +334 -558
- package/dist/schemas/bundled/manifest.json +18 -18
- package/dist/schemas/bundled/motivation.json +349 -368
- package/dist/schemas/bundled/navigation.json +415 -731
- package/dist/schemas/bundled/product.json +325 -159
- package/dist/schemas/bundled/security.json +864 -1232
- package/dist/schemas/bundled/technology.json +574 -703
- package/dist/schemas/bundled/testing.json +718 -1643
- package/dist/schemas/bundled/ux.json +739 -1352
- package/dist/server/schemas.js +8 -0
- package/dist/server/schemas.js.map +2 -2
- package/dist/server/server.js +218 -34
- package/dist/server/server.js.map +2 -2
- package/dist/server-entry.js +2 -1
- package/dist/server-entry.js.map +2 -2
- package/dist/telemetry/index.js +1 -1
- package/dist/utils/ansi-suppressor.js +6 -8
- package/dist/utils/ansi-suppressor.js.map +2 -2
- package/dist/utils/attribute-patch.js +41 -0
- package/dist/utils/attribute-patch.js.map +7 -0
- package/dist/utils/error-hints.js +29 -0
- package/dist/utils/error-hints.js.map +7 -0
- package/dist/utils/errors.js +9 -3
- package/dist/utils/errors.js.map +2 -2
- package/dist/utils/project-paths.js +26 -1
- package/dist/utils/project-paths.js.map +2 -2
- package/dist/utils/source-reference.js +14 -12
- package/dist/utils/source-reference.js.map +2 -2
- package/dist/utils/spec-version.js +2 -2
- package/dist/utils/spec-version.js.map +1 -1
- package/dist/validators/composed-reference-validator.js +5 -27
- package/dist/validators/composed-reference-validator.js.map +2 -2
- package/dist/validators/reference-validator.js +0 -7
- package/dist/validators/reference-validator.js.map +2 -2
- package/dist/validators/relationship-schema-validator.js +3 -3
- package/dist/validators/relationship-schema-validator.js.map +2 -2
- package/dist/validators/schema-validator.js +27 -9
- package/dist/validators/schema-validator.js.map +2 -2
- package/dist/validators/types.js.map +1 -1
- package/dist/viewer/README.md +6 -6
- package/dist/viewer/assets/main-CxzcuU_o.js +84 -0
- package/dist/viewer/assets/main-j-7ULYpm.css +1 -0
- package/dist/viewer/index.html +2 -2
- package/dist/viewer/manifest.json +10 -10
- package/dist/viewer/version.json +1 -1
- package/package.json +2 -1
- package/dist/viewer/assets/main-B7AOQXXX.js +0 -81
- package/dist/viewer/assets/main-vdrFrG7q.css +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/mcp/tools/shared.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Shared helpers for MCP model tool handlers.\n *\n * Centralizes model loading and the CLIError -> structured error content\n * translation so individual tool handlers stay focused on their own domain\n * logic.\n */\n\nimport { z, type ZodRawShape } from \"zod\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { Model } from \"../../core/model.js\";\nimport {\n CLIError,\n ModelNotFoundError,\n getErrorMessage,\n type ErrorContext,\n} from \"../../utils/errors.js\";\n\n/** Shared input field: lets a client point at a model outside the server's cwd. */\nexport const rootPathSchema = z\n .string()\n .optional()\n .describe(\n \"Absolute path to the project root containing documentation-robotics/. Defaults to the MCP server's working directory.\"\n );\n\nexport interface McpToolDefinition<Shape extends ZodRawShape = ZodRawShape> {\n name: string;\n description: string;\n inputSchema: Shape;\n // Method-shorthand (not an arrow-typed property) so tool definitions with\n // differently-shaped Args can share the heterogeneous MODEL_TOOLS array in\n // tool-registry.ts without a manual cast back to `any` at the storage site.\n handler(args: z.infer<z.ZodObject<Shape>>): Promise<CallToolResult>;\n}\n\n/**\n * Per-rootPath cache of the loaded architecture model, held for the lifetime of the\n * MCP server process: the Model is loaded once and reused across tool calls rather\n * than reread from disk on every invocation. Keyed by the raw `rootPath` argument\n * (`\"\"` for the server's default cwd), matching how MCP clients address a model\n * across calls.\n */\nconst modelCache = new Map<string, Promise<Model>>();\n\nfunction modelCacheKey(rootPath?: string): string {\n return rootPath ?? \"\";\n}\n\n/** Test-only escape hatch: clears the module-private model cache between test cases. */\nexport function clearModelCache(): void {\n modelCache.clear();\n}\n\n/** Reads the model fresh from disk, translating \"no model found\" into a CLIError consistently. */\nasync function readModelFromDisk(rootPath?: string): Promise<Model> {\n try {\n // Always a full, non-lazy load: the cached instance must be able to answer any\n // tool call regardless of which layers/options the first caller happened to need.\n return await Model.load(rootPath, { lazyLoad: false });\n } catch (error) {\n if (error instanceof CLIError) {\n throw error;\n }\n const message = getErrorMessage(error).toLowerCase();\n if (\n message.includes(\"no dr project\") ||\n message.includes(\"model not found\") ||\n message.includes(\"no model found\")\n ) {\n throw new ModelNotFoundError(rootPath);\n }\n throw error;\n }\n}\n\n/** Returns the cached model for this rootPath, loading it from disk on first use. */\nexport async function loadModel(rootPath?: string): Promise<Model> {\n const key = modelCacheKey(rootPath);\n const cached = modelCache.get(key);\n if (cached) {\n return cached;\n }\n\n const promise = readModelFromDisk(rootPath);\n modelCache.set(key, promise);\n evictOnFailure(key, promise);\n return promise;\n}\n\n/** Forces a fresh read from disk, replacing any cached instance for this rootPath. */\nexport async function reloadModel(rootPath?: string): Promise<Model> {\n const key = modelCacheKey(rootPath);\n const promise = readModelFromDisk(rootPath);\n modelCache.set(key, promise);\n evictOnFailure(key, promise);\n return promise;\n}\n\n/**\n * Don't let a failed load poison the cache for subsequent (possibly-fixed) calls.\n * Guarded by identity: if a newer promise has since replaced this one for `key`\n * (e.g. a concurrent reloadModel()), a stale rejection must not evict it.\n */\nfunction evictOnFailure(key: string, promise: Promise<Model>): void {\n promise.catch(() => {\n if (modelCache.get(key) === promise) {\n modelCache.delete(key);\n }\n });\n}\n\n
|
|
5
|
-
"mappings": "AAQA,SAAS,SAA2B;AAEpC,SAAS,aAAa;AACtB,SACE,UACA,oBACA,uBAEK;
|
|
4
|
+
"sourcesContent": ["/**\n * Shared helpers for MCP model tool handlers.\n *\n * Centralizes model loading and the CLIError -> structured error content\n * translation so individual tool handlers stay focused on their own domain\n * logic.\n */\n\nimport { z, type ZodRawShape } from \"zod\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { Model } from \"../../core/model.js\";\nimport {\n CLIError,\n ModelNotFoundError,\n getErrorMessage,\n type ErrorContext,\n} from \"../../utils/errors.js\";\nimport { ChangesetOnlyError } from \"../../core/changeset-only-guard.js\";\nimport { changesetOnlyError } from \"../changeset-only.js\";\n\n/** Shared input field: lets a client point at a model outside the server's cwd. */\nexport const rootPathSchema = z\n .string()\n .optional()\n .describe(\n \"Absolute path to the project root containing documentation-robotics/. Defaults to the MCP server's working directory.\"\n );\n\nexport interface McpToolDefinition<Shape extends ZodRawShape = ZodRawShape> {\n name: string;\n description: string;\n inputSchema: Shape;\n // Method-shorthand (not an arrow-typed property) so tool definitions with\n // differently-shaped Args can share the heterogeneous MODEL_TOOLS array in\n // tool-registry.ts without a manual cast back to `any` at the storage site.\n handler(args: z.infer<z.ZodObject<Shape>>): Promise<CallToolResult>;\n}\n\n/**\n * Per-rootPath cache of the loaded architecture model, held for the lifetime of the\n * MCP server process: the Model is loaded once and reused across tool calls rather\n * than reread from disk on every invocation. Keyed by the raw `rootPath` argument\n * (`\"\"` for the server's default cwd), matching how MCP clients address a model\n * across calls.\n */\nconst modelCache = new Map<string, Promise<Model>>();\n\nfunction modelCacheKey(rootPath?: string): string {\n return rootPath ?? \"\";\n}\n\n/** Test-only escape hatch: clears the module-private model cache between test cases. */\nexport function clearModelCache(): void {\n modelCache.clear();\n}\n\n/** Reads the model fresh from disk, translating \"no model found\" into a CLIError consistently. */\nasync function readModelFromDisk(rootPath?: string): Promise<Model> {\n try {\n // Always a full, non-lazy load: the cached instance must be able to answer any\n // tool call regardless of which layers/options the first caller happened to need.\n return await Model.load(rootPath, { lazyLoad: false });\n } catch (error) {\n if (error instanceof CLIError) {\n throw error;\n }\n const message = getErrorMessage(error).toLowerCase();\n if (\n message.includes(\"no dr project\") ||\n message.includes(\"model not found\") ||\n message.includes(\"no model found\")\n ) {\n throw new ModelNotFoundError(rootPath);\n }\n throw error;\n }\n}\n\n/** Returns the cached model for this rootPath, loading it from disk on first use. */\nexport async function loadModel(rootPath?: string): Promise<Model> {\n const key = modelCacheKey(rootPath);\n const cached = modelCache.get(key);\n if (cached) {\n return cached;\n }\n\n const promise = readModelFromDisk(rootPath);\n modelCache.set(key, promise);\n evictOnFailure(key, promise);\n return promise;\n}\n\n/** Forces a fresh read from disk, replacing any cached instance for this rootPath. */\nexport async function reloadModel(rootPath?: string): Promise<Model> {\n const key = modelCacheKey(rootPath);\n const promise = readModelFromDisk(rootPath);\n modelCache.set(key, promise);\n evictOnFailure(key, promise);\n return promise;\n}\n\n/**\n * Don't let a failed load poison the cache for subsequent (possibly-fixed) calls.\n * Guarded by identity: if a newer promise has since replaced this one for `key`\n * (e.g. a concurrent reloadModel()), a stale rejection must not evict it.\n */\nfunction evictOnFailure(key: string, promise: Promise<Model>): void {\n promise.catch(() => {\n if (modelCache.get(key) === promise) {\n modelCache.delete(key);\n }\n });\n}\n\n/**\n * Wraps structured data as the tool's JSON text content. `compact` keeps the indentation of the\n * outer structure but writes any object or array that fits on a line on one line (the same JSON,\n * a fraction of the lines), for large results such as the brief.\n */\nexport function jsonResult(data: unknown, options?: { isError?: boolean; compact?: boolean }): CallToolResult {\n return {\n content: [{ type: \"text\", text: options?.compact ? compactJson(data) : JSON.stringify(data, null, 2) }],\n ...(options?.isError ? { isError: true } : {}),\n };\n}\n\nconst COMPACT_LINE = 140;\n\n/** JSON indented by two spaces, with every object or array whose one-line form is short kept on one line. */\nexport function compactJson(data: unknown): string {\n const write = (raw: unknown, indent: string): string | undefined => {\n const value =\n raw !== null && typeof raw === \"object\" && typeof (raw as { toJSON?: unknown }).toJSON === \"function\"\n ? (raw as { toJSON: () => unknown }).toJSON()\n : raw;\n const inline = JSON.stringify(value);\n if (inline === undefined || value === null || typeof value !== \"object\") return inline;\n if (inline.length + indent.length <= COMPACT_LINE) return inline;\n const inner = indent + \" \";\n if (Array.isArray(value)) {\n const items = value.map((item) => inner + (write(item, inner) ?? \"null\"));\n return `[\\n${items.join(\",\\n\")}\\n${indent}]`;\n }\n const fields = Object.entries(value as Record<string, unknown>)\n .map(([key, item]) => {\n const text = write(item, inner);\n return text === undefined ? undefined : `${inner}${JSON.stringify(key)}: ${text}`;\n })\n .filter((line): line is string => line !== undefined);\n return `{\\n${fields.join(\",\\n\")}\\n${indent}}`;\n };\n return write(data, \"\") ?? \"null\";\n}\n\n/** Converts a thrown error into a structured, non-throwing tool error result. */\nexport function errorResult(error: unknown): CallToolResult {\n if (error instanceof CLIError) {\n const context: ErrorContext | undefined = error.context;\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n error: error.message,\n category: errorCategoryName(error.exitCode),\n suggestions: error.suggestions ?? [],\n ...(context?.operation ? { operation: context.operation } : {}),\n ...(context?.relatedElements ? { relatedElements: context.relatedElements } : {}),\n ...(context?.partialProgress ? { partialProgress: context.partialProgress } : {}),\n },\n null,\n 2\n ),\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: getErrorMessage(error) }, null, 2) }],\n isError: true,\n };\n}\n\nfunction errorCategoryName(exitCode: number): string {\n switch (exitCode) {\n case 1:\n return \"user\";\n case 2:\n return \"not_found\";\n case 3:\n return \"system\";\n case 4:\n return \"validation\";\n case 5:\n return \"breaking_change\";\n default:\n return \"unknown\";\n }\n}\n\n/** Runs a tool handler body, catching any error into a structured tool result instead of throwing. */\nexport async function runTool(fn: () => Promise<CallToolResult>): Promise<CallToolResult> {\n try {\n return await fn();\n } catch (error) {\n logToolError(error);\n if (error instanceof ChangesetOnlyError) {\n // A base-model save was refused (DR_CHANGESET_ONLY) after the handler may already have\n // edited the cached model in memory: drop the cache so the next call rereads disk, and\n // answer in MCP terms (changeset_create) rather than CLI ones.\n clearModelCache();\n return errorResult(changesetOnlyError());\n }\n return errorResult(error);\n }\n}\n\n/**\n * Logs a tool failure to stderr unconditionally (independent of telemetry\n * settings, which are off by default) so server operators have visibility\n * into failures. Non-CLIError exceptions include their stack trace, since\n * that's otherwise discarded once errorResult() reduces them to a message.\n */\nfunction logToolError(error: unknown): void {\n if (error instanceof CLIError) {\n console.error(`[mcp] tool error: ${error.message}`);\n } else if (error instanceof Error) {\n console.error(`[mcp] tool error: ${error.stack ?? error.message}`);\n } else {\n console.error(`[mcp] tool error: ${getErrorMessage(error)}`);\n }\n}\n"],
|
|
5
|
+
"mappings": "AAQA,SAAS,SAA2B;AAEpC,SAAS,aAAa;AACtB,SACE,UACA,oBACA,uBAEK;AACP,SAAS,0BAA0B;AACnC,SAAS,0BAA0B;AAG5B,MAAM,iBAAiB,EAC3B,OAAM,EACN,SAAQ,EACR,SACC,uHAAuH,GAoBrH,aAAa,oBAAI,IAAG;AAE1B,SAAS,cAAc,UAAiB;AACtC,SAAO,YAAY;AACrB;AAGM,SAAU,kBAAe;AAC7B,aAAW,MAAK;AAClB;AAGA,eAAe,kBAAkB,UAAiB;AAChD,MAAI;AAGF,WAAO,MAAM,MAAM,KAAK,UAAU,EAAE,UAAU,GAAK,CAAE;EACvD,SAAS,OAAO;AACd,QAAI,iBAAiB;AACnB,YAAM;AAER,UAAM,UAAU,gBAAgB,KAAK,EAAE,YAAW;AAClD,UACE,QAAQ,SAAS,eAAe,KAChC,QAAQ,SAAS,iBAAiB,KAClC,QAAQ,SAAS,gBAAgB,IAE3B,IAAI,mBAAmB,QAAQ,IAEjC;EACR;AACF;AAGA,eAAsB,UAAU,UAAiB;AAC/C,QAAM,MAAM,cAAc,QAAQ,GAC5B,SAAS,WAAW,IAAI,GAAG;AACjC,MAAI;AACF,WAAO;AAGT,QAAM,UAAU,kBAAkB,QAAQ;AAC1C,oBAAW,IAAI,KAAK,OAAO,GAC3B,eAAe,KAAK,OAAO,GACpB;AACT;AAGA,eAAsB,YAAY,UAAiB;AACjD,QAAM,MAAM,cAAc,QAAQ,GAC5B,UAAU,kBAAkB,QAAQ;AAC1C,oBAAW,IAAI,KAAK,OAAO,GAC3B,eAAe,KAAK,OAAO,GACpB;AACT;AAOA,SAAS,eAAe,KAAa,SAAuB;AAC1D,UAAQ,MAAM,MAAK;AACjB,IAAI,WAAW,IAAI,GAAG,MAAM,WAC1B,WAAW,OAAO,GAAG;EAEzB,CAAC;AACH;AAOM,SAAU,WAAW,MAAe,SAAkD;AAC1F,SAAO;IACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,SAAS,UAAU,YAAY,IAAI,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,EAAC,CAAE;IACtG,GAAI,SAAS,UAAU,EAAE,SAAS,GAAI,IAAK,CAAA;;AAE/C;AAEA,MAAM,eAAe;AAGf,SAAU,YAAY,MAAa;AACvC,QAAM,QAAQ,CAAC,KAAc,WAAsC;AACjE,UAAM,QACJ,QAAQ,QAAQ,OAAO,OAAQ,YAAY,OAAQ,IAA6B,UAAW,aACtF,IAAkC,OAAM,IACzC,KACA,SAAS,KAAK,UAAU,KAAK;AAEnC,QADI,WAAW,UAAa,UAAU,QAAQ,OAAO,SAAU,YAC3D,OAAO,SAAS,OAAO,UAAU;AAAc,aAAO;AAC1D,UAAM,QAAQ,SAAS;AACvB,WAAI,MAAM,QAAQ,KAAK,IAEd;EADO,MAAM,IAAI,CAAC,SAAS,SAAS,MAAM,MAAM,KAAK,KAAK,OAAO,EACrD,KAAK;CAAK,CAAC;EAAK,MAAM,MAQpC;EANQ,OAAO,QAAQ,KAAgC,EAC3D,IAAI,CAAC,CAAC,KAAK,IAAI,MAAK;AACnB,YAAM,OAAO,MAAM,MAAM,KAAK;AAC9B,aAAO,SAAS,SAAY,SAAY,GAAG,KAAK,GAAG,KAAK,UAAU,GAAG,CAAC,KAAK,IAAI;IACjF,CAAC,EACA,OAAO,CAAC,SAAyB,SAAS,MAAS,EAClC,KAAK;CAAK,CAAC;EAAK,MAAM;EAC5C;AACA,SAAO,MAAM,MAAM,EAAE,KAAK;AAC5B;AAGM,SAAU,YAAY,OAAc;AACxC,MAAI,iBAAiB,UAAU;AAC7B,UAAM,UAAoC,MAAM;AAChD,WAAO;MACL,SAAS;QACP;UACE,MAAM;UACN,MAAM,KAAK,UACT;YACE,OAAO,MAAM;YACb,UAAU,kBAAkB,MAAM,QAAQ;YAC1C,aAAa,MAAM,eAAe,CAAA;YAClC,GAAI,SAAS,YAAY,EAAE,WAAW,QAAQ,UAAS,IAAK,CAAA;YAC5D,GAAI,SAAS,kBAAkB,EAAE,iBAAiB,QAAQ,gBAAe,IAAK,CAAA;YAC9E,GAAI,SAAS,kBAAkB,EAAE,iBAAiB,QAAQ,gBAAe,IAAK,CAAA;aAEhF,MACA,CAAC;;;MAIP,SAAS;;EAEb;AAEA,SAAO;IACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,gBAAgB,KAAK,EAAC,GAAI,MAAM,CAAC,EAAC,CAAE;IAC5F,SAAS;;AAEb;AAEA,SAAS,kBAAkB,UAAgB;AACzC,UAAQ,UAAU;IAChB,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT;AACE,aAAO;EACX;AACF;AAGA,eAAsB,QAAQ,IAAiC;AAC7D,MAAI;AACF,WAAO,MAAM,GAAE;EACjB,SAAS,OAAO;AAEd,WADA,aAAa,KAAK,GACd,iBAAiB,sBAInB,gBAAe,GACR,YAAY,mBAAkB,CAAE,KAElC,YAAY,KAAK;EAC1B;AACF;AAQA,SAAS,aAAa,OAAc;AAClC,EAAI,iBAAiB,WACnB,QAAQ,MAAM,qBAAqB,MAAM,OAAO,EAAE,IACzC,iBAAiB,QAC1B,QAAQ,MAAM,qBAAqB,MAAM,SAAS,MAAM,OAAO,EAAE,IAEjE,QAAQ,MAAM,qBAAqB,gBAAgB,KAAK,CAAC,EAAE;AAE/D;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { SpecDataLoader } from "../../core/spec-loader.js";
|
|
3
|
+
import { getAllLayerIds, isValidLayer } from "../../generated/layer-registry.js";
|
|
4
|
+
import { getNodeType, getNodeTypesForLayer, isValidNodeType, normalizeNodeType } from "../../generated/node-types.js";
|
|
5
|
+
import { RELATIONSHIPS_BY_DESTINATION, RELATIONSHIPS_BY_SOURCE } from "../../generated/relationship-index.js";
|
|
6
|
+
import { CLIError, ErrorCategory, findSimilar, formatValidOptions } from "../../utils/errors.js";
|
|
7
|
+
import { jsonResult, runTool } from "./shared.js";
|
|
8
|
+
const inputSchema = {
|
|
9
|
+
layer: z.string().describe("Canonical layer name, e.g. 'api', 'data-model'."),
|
|
10
|
+
type: z.string().optional().describe("Node type within the layer, e.g. 'operation'. Omit to list the layer's types."),
|
|
11
|
+
predicate: z.string().optional().describe("Only list relationships with this predicate."),
|
|
12
|
+
otherLayer: z.string().optional().describe("Only list relationships whose other end is in this layer.")
|
|
13
|
+
};
|
|
14
|
+
let loaderPromise = null;
|
|
15
|
+
function specLoader() {
|
|
16
|
+
if (!loaderPromise) {
|
|
17
|
+
const loader = new SpecDataLoader();
|
|
18
|
+
loaderPromise = loader.load().then(() => loader), loaderPromise.catch(() => {
|
|
19
|
+
loaderPromise = null;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
return loaderPromise;
|
|
23
|
+
}
|
|
24
|
+
async function specTypeHandler(args) {
|
|
25
|
+
return runTool(async () => {
|
|
26
|
+
if (!isValidLayer(args.layer)) {
|
|
27
|
+
const layers = getAllLayerIds(), similar = findSimilar(args.layer, layers, 3);
|
|
28
|
+
throw new CLIError(`Unknown layer "${args.layer}"`, ErrorCategory.USER, [
|
|
29
|
+
...similar.length > 0 ? [`Did you mean: ${similar.join(" or ")}?`] : [],
|
|
30
|
+
`Valid layers: ${formatValidOptions(layers)}`
|
|
31
|
+
]);
|
|
32
|
+
}
|
|
33
|
+
const loader = await specLoader();
|
|
34
|
+
if (!args.type) {
|
|
35
|
+
const layer = loader.getLayer(args.layer);
|
|
36
|
+
return jsonResult({
|
|
37
|
+
layer: args.layer,
|
|
38
|
+
description: layer?.description,
|
|
39
|
+
types: getNodeTypesForLayer(args.layer).map((t) => ({
|
|
40
|
+
type: t.type,
|
|
41
|
+
title: t.title,
|
|
42
|
+
definition: firstSentence(loader.getNodeType(t.specNodeId)?.description),
|
|
43
|
+
requiredAttributes: t.requiredAttributes
|
|
44
|
+
}))
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
if (!isValidNodeType(args.layer, args.type)) {
|
|
48
|
+
const names = getNodeTypesForLayer(args.layer).map((t) => t.type), similar = findSimilar(args.type, names, 3);
|
|
49
|
+
throw new CLIError(`Invalid type "${args.type}" for layer "${args.layer}"`, ErrorCategory.USER, [
|
|
50
|
+
...similar.length > 0 ? [`Did you mean: ${similar.join(" or ")}?`] : [],
|
|
51
|
+
`Valid types for ${args.layer}: ${formatValidOptions(names)}`
|
|
52
|
+
]);
|
|
53
|
+
}
|
|
54
|
+
const specNodeId = `${args.layer}.${normalizeNodeType(args.layer, args.type)}`, info = getNodeType(specNodeId), spec = loader.getNodeType(specNodeId), keep = (rel, otherEnd) => (!args.predicate || rel.predicate === args.predicate) && (!args.otherLayer || otherEnd.startsWith(`${args.otherLayer}.`)), outgoing = (RELATIONSHIPS_BY_SOURCE.get(specNodeId) ?? []).filter((r) => keep(r, r.destinationSpecNodeId)).map((r) => ({ predicate: r.predicate, target: r.destinationSpecNodeId, ...r.required ? { required: !0 } : {} })), incoming = (RELATIONSHIPS_BY_DESTINATION.get(specNodeId) ?? []).filter((r) => keep(r, r.sourceSpecNodeId)).map((r) => ({ source: r.sourceSpecNodeId, predicate: r.predicate, ...r.required ? { required: !0 } : {} })), attributes = Object.entries(info.attributeConstraints).map(([name, constraint]) => {
|
|
55
|
+
const c = constraint;
|
|
56
|
+
return {
|
|
57
|
+
name,
|
|
58
|
+
required: info.requiredAttributes.includes(name),
|
|
59
|
+
...c.type ? { type: c.type } : {},
|
|
60
|
+
...c.enum ? { enum: c.enum } : {},
|
|
61
|
+
...c.description ? { description: c.description } : {}
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
return jsonResult({
|
|
65
|
+
specNodeId,
|
|
66
|
+
title: info.title,
|
|
67
|
+
definition: spec?.description,
|
|
68
|
+
attributes,
|
|
69
|
+
outgoing,
|
|
70
|
+
incoming
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
const specTypeTool = {
|
|
75
|
+
name: "spec_type",
|
|
76
|
+
description: "Look up a node type in the spec: its definition, attributes (required ones, enum values) and the relationships the catalog allows from and to it. Omit 'type' to list a layer's types. Use before model_add and relationship_add.",
|
|
77
|
+
inputSchema,
|
|
78
|
+
handler: specTypeHandler
|
|
79
|
+
};
|
|
80
|
+
function firstSentence(text) {
|
|
81
|
+
if (!text)
|
|
82
|
+
return;
|
|
83
|
+
const match = text.match(/^.*?[.!?](\s|$)/);
|
|
84
|
+
return (match ? match[0] : text).trim();
|
|
85
|
+
}
|
|
86
|
+
export {
|
|
87
|
+
specTypeHandler,
|
|
88
|
+
specTypeTool
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=spec-type.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/mcp/tools/spec-type.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * spec_type \u2014 what the spec says about one node type: its definition, its attributes (required,\n * enums), and every relationship the catalog allows from it and to it.\n *\n * This is the lookup a planner needs before staging an element: model_add fails on a missing\n * required attribute, and relationship_add fails on a triple the catalog does not list.\n */\n\nimport { z } from \"zod\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { SpecDataLoader } from \"../../core/spec-loader.js\";\nimport { getAllLayerIds, isValidLayer } from \"../../generated/layer-registry.js\";\nimport {\n getNodeType,\n getNodeTypesForLayer,\n isValidNodeType,\n normalizeNodeType,\n type SpecNodeId,\n} from \"../../generated/node-types.js\";\nimport { RELATIONSHIPS_BY_DESTINATION, RELATIONSHIPS_BY_SOURCE, type RelationshipSpec } from \"../../generated/relationship-index.js\";\nimport { CLIError, ErrorCategory, findSimilar, formatValidOptions } from \"../../utils/errors.js\";\nimport { jsonResult, runTool, type McpToolDefinition } from \"./shared.js\";\n\nconst inputSchema = {\n layer: z.string().describe(\"Canonical layer name, e.g. 'api', 'data-model'.\"),\n type: z\n .string()\n .optional()\n .describe(\"Node type within the layer, e.g. 'operation'. Omit to list the layer's types.\"),\n predicate: z.string().optional().describe(\"Only list relationships with this predicate.\"),\n otherLayer: z.string().optional().describe(\"Only list relationships whose other end is in this layer.\"),\n};\n\nexport type SpecTypeArgs = z.infer<z.ZodObject<typeof inputSchema>>;\n\nlet loaderPromise: Promise<SpecDataLoader> | null = null;\nfunction specLoader(): Promise<SpecDataLoader> {\n if (!loaderPromise) {\n const loader = new SpecDataLoader();\n loaderPromise = loader.load().then(() => loader);\n loaderPromise.catch(() => {\n loaderPromise = null;\n });\n }\n return loaderPromise;\n}\n\nexport async function specTypeHandler(args: SpecTypeArgs): Promise<CallToolResult> {\n return runTool(async () => {\n if (!isValidLayer(args.layer)) {\n const layers = getAllLayerIds();\n const similar = findSimilar(args.layer, layers, 3);\n throw new CLIError(`Unknown layer \"${args.layer}\"`, ErrorCategory.USER, [\n ...(similar.length > 0 ? [`Did you mean: ${similar.join(\" or \")}?`] : []),\n `Valid layers: ${formatValidOptions(layers)}`,\n ]);\n }\n\n const loader = await specLoader();\n\n if (!args.type) {\n const layer = loader.getLayer(args.layer);\n return jsonResult({\n layer: args.layer,\n description: layer?.description,\n types: getNodeTypesForLayer(args.layer).map((t) => ({\n type: t.type,\n title: t.title,\n definition: firstSentence(loader.getNodeType(t.specNodeId)?.description),\n requiredAttributes: t.requiredAttributes,\n })),\n });\n }\n\n if (!isValidNodeType(args.layer, args.type)) {\n const names = getNodeTypesForLayer(args.layer).map((t) => t.type);\n const similar = findSimilar(args.type, names, 3);\n throw new CLIError(`Invalid type \"${args.type}\" for layer \"${args.layer}\"`, ErrorCategory.USER, [\n ...(similar.length > 0 ? [`Did you mean: ${similar.join(\" or \")}?`] : []),\n `Valid types for ${args.layer}: ${formatValidOptions(names)}`,\n ]);\n }\n\n const specNodeId = `${args.layer}.${normalizeNodeType(args.layer, args.type)}` as SpecNodeId;\n const info = getNodeType(specNodeId)!;\n const spec = loader.getNodeType(specNodeId);\n\n const keep = (rel: RelationshipSpec, otherEnd: string) =>\n (!args.predicate || rel.predicate === args.predicate) &&\n (!args.otherLayer || otherEnd.startsWith(`${args.otherLayer}.`));\n\n const outgoing = (RELATIONSHIPS_BY_SOURCE.get(specNodeId) ?? [])\n .filter((r) => keep(r, r.destinationSpecNodeId))\n .map((r) => ({ predicate: r.predicate, target: r.destinationSpecNodeId, ...(r.required ? { required: true } : {}) }));\n const incoming = (RELATIONSHIPS_BY_DESTINATION.get(specNodeId) ?? [])\n .filter((r) => keep(r, r.sourceSpecNodeId))\n .map((r) => ({ source: r.sourceSpecNodeId, predicate: r.predicate, ...(r.required ? { required: true } : {}) }));\n\n const attributes = Object.entries(info.attributeConstraints).map(([name, constraint]) => {\n const c = constraint as Record<string, unknown>;\n return {\n name,\n required: info.requiredAttributes.includes(name),\n ...(c.type ? { type: c.type } : {}),\n ...(c.enum ? { enum: c.enum } : {}),\n ...(c.description ? { description: c.description } : {}),\n };\n });\n\n return jsonResult({\n specNodeId,\n title: info.title,\n definition: spec?.description,\n attributes,\n outgoing,\n incoming,\n });\n });\n}\n\nexport const specTypeTool: McpToolDefinition<typeof inputSchema> = {\n name: \"spec_type\",\n description:\n \"Look up a node type in the spec: its definition, attributes (required ones, enum values) and the relationships \" +\n \"the catalog allows from and to it. Omit 'type' to list a layer's types. Use before model_add and relationship_add.\",\n inputSchema,\n handler: specTypeHandler,\n};\n\nfunction firstSentence(text: string | undefined): string | undefined {\n if (!text) return undefined;\n const match = text.match(/^.*?[.!?](\\s|$)/);\n return (match ? match[0] : text).trim();\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|