@fragments-sdk/mcp 0.10.0 → 0.10.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/dist/bin.js CHANGED
@@ -4,8 +4,7 @@ import {
4
4
  resolveDataAdapter,
5
5
  resolveSearchApiKey,
6
6
  startMcpServer
7
- } from "./chunk-YJTMK4JY.js";
8
- import "./chunk-4SVS3AA3.js";
7
+ } from "./chunk-KGFM5SCE.js";
9
8
  import "./chunk-7D4SUZUM.js";
10
9
 
11
10
  // src/bin.ts
@@ -124,7 +123,7 @@ if (generateRules) {
124
123
  }
125
124
  }
126
125
  const data = await adapter.load(projectRoot);
127
- const { BRAND } = await import("./constants-BLN4SSNH.js");
126
+ const { BRAND } = await import("@fragments-sdk/core");
128
127
  const brandName = fileConfig?.brand?.name ?? BRAND.name;
129
128
  const files = generateRulesFiles({
130
129
  data,
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { startMcpServer } from './server.js';\nimport { loadConfigFile } from './config.js';\nimport { resolveDataAdapter, resolveSearchApiKey } from './source-selection.js';\n\n// Parse command line arguments\nconst args = process.argv.slice(2);\n\n// ---------------------------------------------------------------------------\n// Subcommand: init\n// ---------------------------------------------------------------------------\nif (args[0] === 'init') {\n const { runInit } = await import('./init.js');\n const initArgs = args.slice(1);\n\n let projectRoot = process.cwd();\n let clients: string[] | undefined;\n\n for (let i = 0; i < initArgs.length; i++) {\n const arg = initArgs[i];\n if (arg === '--project-root' || arg === '-p') {\n projectRoot = initArgs[++i] ?? projectRoot;\n } else if (arg === '--client' || arg === '-c') {\n clients = (initArgs[++i] ?? '').split(',').map((s) => s.trim());\n } else if (arg === '--help' || arg === '-h') {\n console.log(`\nUsage: fragments-mcp init [options]\n\nWrite MCP server config for your AI editor(s).\nAuto-detects Claude Code, Cursor, VS Code, and Windsurf.\n\nOptions:\n -p, --project-root <path> Project root directory (default: cwd)\n -c, --client <list> Comma-separated clients: claude,cursor,vscode,windsurf\n (default: auto-detect)\n -h, --help Show this help message\n\nExamples:\n npx @fragments-sdk/mcp init\n npx @fragments-sdk/mcp init --client cursor,claude\n`);\n process.exit(0);\n }\n }\n\n runInit({ projectRoot, clients: clients as import('./init.js').Client[] });\n process.exit(0);\n}\n\n// ---------------------------------------------------------------------------\n// Main: MCP server mode\n// ---------------------------------------------------------------------------\nlet projectRoot = process.cwd();\nlet cloudApiKey: string | undefined;\nlet source: 'auto' | 'fragments-json' | 'cloud' | 'bundle' | 'extract' =\n 'auto';\nlet generateRules = false;\nlet rulesFormats: string | undefined;\nlet force = false;\n\nfor (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (arg === '--project-root' || arg === '-p') {\n projectRoot = args[++i] ?? projectRoot;\n } else if (arg === '--cloud-api-key') {\n cloudApiKey = args[++i];\n } else if (arg === '--source') {\n const next = args[++i];\n if (\n next === 'auto' ||\n next === 'fragments-json' ||\n next === 'cloud' ||\n next === 'bundle' ||\n next === 'extract'\n ) {\n source = next;\n } else {\n console.error(\n `Invalid source: \"${next}\". Valid values: auto, fragments-json, cloud, bundle, extract`,\n );\n process.exit(1);\n }\n } else if (arg === '--generate-rules') {\n generateRules = true;\n } else if (arg === '--formats') {\n rulesFormats = args[++i];\n } else if (arg === '--force') {\n force = true;\n } else if (arg === '--help' || arg === '-h') {\n console.log(`\nUsage: fragments-mcp [command] [options]\n\nStandalone MCP server for design system intelligence.\nProvides UI validation, deterministic repair, token suggestions, and Cloud findings.\n\nCommands:\n init Write MCP config for your AI editor(s)\n\nOptions:\n -p, --project-root <path> Project root directory (default: cwd)\n --cloud-api-key <key> Cloud API key for org-scoped catalog access\n --source <mode> Source override: auto, fragments-json, cloud, bundle, extract\n --generate-rules Generate IDE rules files and exit\n --formats <list> Comma-separated formats: cursor,claude,copilot (default: all)\n --force Overwrite existing rules files\n -h, --help Show this help message\n\nQuick start:\n npx @fragments-sdk/mcp init\n`);\n process.exit(0);\n }\n}\n\nconst fileConfig = loadConfigFile(projectRoot) ?? undefined;\nconst serverConfig = {\n projectRoot,\n searchApiKey: resolveSearchApiKey({ projectRoot }, fileConfig),\n cloudApiKey,\n source,\n fileConfig,\n};\nconst { adapter, mode } = resolveDataAdapter(serverConfig, fileConfig);\n\nif (mode === 'extract') {\n console.error(\n '[fragments-mcp] No fragments.json found — auto-extracting from source.',\n );\n}\n\n// --generate-rules: generate IDE rules and exit\nif (generateRules) {\n (async () => {\n const { generateRulesFiles } = await import('./rules.js');\n type RulesFormat = 'cursor' | 'claude' | 'copilot';\n\n const defaultFormats: RulesFormat[] = ['cursor', 'claude', 'copilot'];\n const formats: RulesFormat[] = rulesFormats\n ? (rulesFormats.split(',').map(f => f.trim()) as RulesFormat[])\n : defaultFormats;\n\n // Validate formats\n const validFormats = new Set(['cursor', 'claude', 'copilot']);\n for (const fmt of formats) {\n if (!validFormats.has(fmt)) {\n console.error(`Invalid format: \"${fmt}\". Valid formats: cursor, claude, copilot`);\n process.exit(1);\n }\n }\n\n // Load data using the same adapter\n const data = await adapter.load(projectRoot);\n\n // Resolve brand name from config\n const { BRAND } = await import('./constants.js');\n const brandName = fileConfig?.brand?.name ?? BRAND.name;\n\n // Generate rules\n const files = generateRulesFiles({\n data,\n brandName,\n outputDir: projectRoot,\n formats,\n force,\n });\n\n if (files.length === 0) {\n console.log('No rules files generated.');\n } else {\n console.log(`Generated ${files.length} rules file(s):`);\n for (const file of files) {\n console.log(` ${file}`);\n }\n }\n\n process.exit(0);\n })().catch((error) => {\n console.error('Failed to generate rules:', error instanceof Error ? error.message : error);\n process.exit(1);\n });\n} else {\n // Default: start MCP server\n startMcpServer({\n projectRoot,\n searchApiKey: resolveSearchApiKey({ projectRoot }, fileConfig),\n cloudApiKey,\n source,\n fileConfig,\n adapter,\n }).catch((error) => {\n console.error('Failed to start MCP server:', error);\n process.exit(1);\n });\n}\n"],"mappings":"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","names":["projectRoot"]}
1
+ {"version":3,"sources":["../src/bin.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { startMcpServer } from './server.js';\nimport { loadConfigFile } from './config.js';\nimport { resolveDataAdapter, resolveSearchApiKey } from './source-selection.js';\n\n// Parse command line arguments\nconst args = process.argv.slice(2);\n\n// ---------------------------------------------------------------------------\n// Subcommand: init\n// ---------------------------------------------------------------------------\nif (args[0] === 'init') {\n const { runInit } = await import('./init.js');\n const initArgs = args.slice(1);\n\n let projectRoot = process.cwd();\n let clients: string[] | undefined;\n\n for (let i = 0; i < initArgs.length; i++) {\n const arg = initArgs[i];\n if (arg === '--project-root' || arg === '-p') {\n projectRoot = initArgs[++i] ?? projectRoot;\n } else if (arg === '--client' || arg === '-c') {\n clients = (initArgs[++i] ?? '').split(',').map((s) => s.trim());\n } else if (arg === '--help' || arg === '-h') {\n console.log(`\nUsage: fragments-mcp init [options]\n\nWrite MCP server config for your AI editor(s).\nAuto-detects Claude Code, Cursor, VS Code, and Windsurf.\n\nOptions:\n -p, --project-root <path> Project root directory (default: cwd)\n -c, --client <list> Comma-separated clients: claude,cursor,vscode,windsurf\n (default: auto-detect)\n -h, --help Show this help message\n\nExamples:\n npx @fragments-sdk/mcp init\n npx @fragments-sdk/mcp init --client cursor,claude\n`);\n process.exit(0);\n }\n }\n\n runInit({ projectRoot, clients: clients as import('./init.js').Client[] });\n process.exit(0);\n}\n\n// ---------------------------------------------------------------------------\n// Main: MCP server mode\n// ---------------------------------------------------------------------------\nlet projectRoot = process.cwd();\nlet cloudApiKey: string | undefined;\nlet source: 'auto' | 'fragments-json' | 'cloud' | 'bundle' | 'extract' =\n 'auto';\nlet generateRules = false;\nlet rulesFormats: string | undefined;\nlet force = false;\n\nfor (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (arg === '--project-root' || arg === '-p') {\n projectRoot = args[++i] ?? projectRoot;\n } else if (arg === '--cloud-api-key') {\n cloudApiKey = args[++i];\n } else if (arg === '--source') {\n const next = args[++i];\n if (\n next === 'auto' ||\n next === 'fragments-json' ||\n next === 'cloud' ||\n next === 'bundle' ||\n next === 'extract'\n ) {\n source = next;\n } else {\n console.error(\n `Invalid source: \"${next}\". Valid values: auto, fragments-json, cloud, bundle, extract`,\n );\n process.exit(1);\n }\n } else if (arg === '--generate-rules') {\n generateRules = true;\n } else if (arg === '--formats') {\n rulesFormats = args[++i];\n } else if (arg === '--force') {\n force = true;\n } else if (arg === '--help' || arg === '-h') {\n console.log(`\nUsage: fragments-mcp [command] [options]\n\nStandalone MCP server for design system intelligence.\nProvides UI validation, deterministic repair, token suggestions, and Cloud findings.\n\nCommands:\n init Write MCP config for your AI editor(s)\n\nOptions:\n -p, --project-root <path> Project root directory (default: cwd)\n --cloud-api-key <key> Cloud API key for org-scoped catalog access\n --source <mode> Source override: auto, fragments-json, cloud, bundle, extract\n --generate-rules Generate IDE rules files and exit\n --formats <list> Comma-separated formats: cursor,claude,copilot (default: all)\n --force Overwrite existing rules files\n -h, --help Show this help message\n\nQuick start:\n npx @fragments-sdk/mcp init\n`);\n process.exit(0);\n }\n}\n\nconst fileConfig = loadConfigFile(projectRoot) ?? undefined;\nconst serverConfig = {\n projectRoot,\n searchApiKey: resolveSearchApiKey({ projectRoot }, fileConfig),\n cloudApiKey,\n source,\n fileConfig,\n};\nconst { adapter, mode } = resolveDataAdapter(serverConfig, fileConfig);\n\nif (mode === 'extract') {\n console.error(\n '[fragments-mcp] No fragments.json found — auto-extracting from source.',\n );\n}\n\n// --generate-rules: generate IDE rules and exit\nif (generateRules) {\n (async () => {\n const { generateRulesFiles } = await import('./rules.js');\n type RulesFormat = 'cursor' | 'claude' | 'copilot';\n\n const defaultFormats: RulesFormat[] = ['cursor', 'claude', 'copilot'];\n const formats: RulesFormat[] = rulesFormats\n ? (rulesFormats.split(',').map(f => f.trim()) as RulesFormat[])\n : defaultFormats;\n\n // Validate formats\n const validFormats = new Set(['cursor', 'claude', 'copilot']);\n for (const fmt of formats) {\n if (!validFormats.has(fmt)) {\n console.error(`Invalid format: \"${fmt}\". Valid formats: cursor, claude, copilot`);\n process.exit(1);\n }\n }\n\n // Load data using the same adapter\n const data = await adapter.load(projectRoot);\n\n // Resolve brand name from config\n const { BRAND } = await import('@fragments-sdk/core');\n const brandName = fileConfig?.brand?.name ?? BRAND.name;\n\n // Generate rules\n const files = generateRulesFiles({\n data,\n brandName,\n outputDir: projectRoot,\n formats,\n force,\n });\n\n if (files.length === 0) {\n console.log('No rules files generated.');\n } else {\n console.log(`Generated ${files.length} rules file(s):`);\n for (const file of files) {\n console.log(` ${file}`);\n }\n }\n\n process.exit(0);\n })().catch((error) => {\n console.error('Failed to generate rules:', error instanceof Error ? error.message : error);\n process.exit(1);\n });\n} else {\n // Default: start MCP server\n startMcpServer({\n projectRoot,\n searchApiKey: resolveSearchApiKey({ projectRoot }, fileConfig),\n cloudApiKey,\n source,\n fileConfig,\n adapter,\n }).catch((error) => {\n console.error('Failed to start MCP server:', error);\n process.exit(1);\n });\n}\n"],"mappings":";;;;;;;;;;AAMA,IAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AAKjC,IAAI,KAAK,CAAC,MAAM,QAAQ;AACtB,QAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,WAAW;AAC5C,QAAM,WAAW,KAAK,MAAM,CAAC;AAE7B,MAAIA,eAAc,QAAQ,IAAI;AAC9B,MAAI;AAEJ,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,MAAM,SAAS,CAAC;AACtB,QAAI,QAAQ,oBAAoB,QAAQ,MAAM;AAC5C,MAAAA,eAAc,SAAS,EAAE,CAAC,KAAKA;AAAA,IACjC,WAAW,QAAQ,cAAc,QAAQ,MAAM;AAC7C,iBAAW,SAAS,EAAE,CAAC,KAAK,IAAI,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,IAChE,WAAW,QAAQ,YAAY,QAAQ,MAAM;AAC3C,cAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAejB;AACK,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,UAAQ,EAAE,aAAAA,cAAa,QAAiD,CAAC;AACzE,UAAQ,KAAK,CAAC;AAChB;AAKA,IAAI,cAAc,QAAQ,IAAI;AAC9B,IAAI;AACJ,IAAI,SACF;AACF,IAAI,gBAAgB;AACpB,IAAI;AACJ,IAAI,QAAQ;AAEZ,SAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,QAAM,MAAM,KAAK,CAAC;AAElB,MAAI,QAAQ,oBAAoB,QAAQ,MAAM;AAC5C,kBAAc,KAAK,EAAE,CAAC,KAAK;AAAA,EAC7B,WAAW,QAAQ,mBAAmB;AACpC,kBAAc,KAAK,EAAE,CAAC;AAAA,EACxB,WAAW,QAAQ,YAAY;AAC7B,UAAM,OAAO,KAAK,EAAE,CAAC;AACrB,QACE,SAAS,UACT,SAAS,oBACT,SAAS,WACT,SAAS,YACT,SAAS,WACT;AACA,eAAS;AAAA,IACX,OAAO;AACL,cAAQ;AAAA,QACN,oBAAoB,IAAI;AAAA,MAC1B;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,WAAW,QAAQ,oBAAoB;AACrC,oBAAgB;AAAA,EAClB,WAAW,QAAQ,aAAa;AAC9B,mBAAe,KAAK,EAAE,CAAC;AAAA,EACzB,WAAW,QAAQ,WAAW;AAC5B,YAAQ;AAAA,EACV,WAAW,QAAQ,YAAY,QAAQ,MAAM;AAC3C,YAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAoBf;AACG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,IAAM,aAAa,eAAe,WAAW,KAAK;AAClD,IAAM,eAAe;AAAA,EACnB;AAAA,EACA,cAAc,oBAAoB,EAAE,YAAY,GAAG,UAAU;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,EAAE,SAAS,KAAK,IAAI,mBAAmB,cAAc,UAAU;AAErE,IAAI,SAAS,WAAW;AACtB,UAAQ;AAAA,IACN;AAAA,EACF;AACF;AAGA,IAAI,eAAe;AACjB,GAAC,YAAY;AACX,UAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,qBAAY;AAGxD,UAAM,iBAAgC,CAAC,UAAU,UAAU,SAAS;AACpE,UAAM,UAAyB,eAC1B,aAAa,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,IAC1C;AAGJ,UAAM,eAAe,oBAAI,IAAI,CAAC,UAAU,UAAU,SAAS,CAAC;AAC5D,eAAW,OAAO,SAAS;AACzB,UAAI,CAAC,aAAa,IAAI,GAAG,GAAG;AAC1B,gBAAQ,MAAM,oBAAoB,GAAG,2CAA2C;AAChF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAGA,UAAM,OAAO,MAAM,QAAQ,KAAK,WAAW;AAG3C,UAAM,EAAE,MAAM,IAAI,MAAM,OAAO,qBAAqB;AACpD,UAAM,YAAY,YAAY,OAAO,QAAQ,MAAM;AAGnD,UAAM,QAAQ,mBAAmB;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,IAAI,2BAA2B;AAAA,IACzC,OAAO;AACL,cAAQ,IAAI,aAAa,MAAM,MAAM,iBAAiB;AACtD,iBAAW,QAAQ,OAAO;AACxB,gBAAQ,IAAI,KAAK,IAAI,EAAE;AAAA,MACzB;AAAA,IACF;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU;AACpB,YAAQ,MAAM,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AACzF,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH,OAAO;AAEL,iBAAe;AAAA,IACb;AAAA,IACA,cAAc,oBAAoB,EAAE,YAAY,GAAG,UAAU;AAAA,IAC7D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,EAAE,MAAM,CAAC,UAAU;AAClB,YAAQ,MAAM,+BAA+B,KAAK;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;","names":["projectRoot"]}
@@ -1,7 +1,3 @@
1
- import {
2
- BRAND
3
- } from "./chunk-4SVS3AA3.js";
4
-
5
1
  // src/server.ts
6
2
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
7
3
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
@@ -17,6 +13,7 @@ import { existsSync as existsSync8 } from "fs";
17
13
  import { readFileSync as readFileSync6 } from "fs";
18
14
  import { join as join7 } from "path";
19
15
  import { fileURLToPath } from "url";
16
+ import { BRAND as BRAND4 } from "@fragments-sdk/core";
20
17
 
21
18
  // src/config.ts
22
19
  import { readFileSync, existsSync } from "fs";
@@ -311,12 +308,7 @@ var tokensSuggestHandler = async (args, ctx) => {
311
308
  };
312
309
 
313
310
  // src/tools/spec-govern.ts
314
- var SEVERITY_WEIGHTS = {
315
- critical: 10,
316
- serious: 5,
317
- moderate: 2,
318
- minor: 1
319
- };
311
+ import { SEVERITY_WEIGHTS, maxSeverity } from "@fragments-sdk/core/severity";
320
312
  function isRuleEnabled(rule, defaultEnabled = true) {
321
313
  if (rule === void 0) return defaultEnabled;
322
314
  if (typeof rule === "boolean") return rule;
@@ -355,9 +347,8 @@ function flattenNodes(spec) {
355
347
  return flattened;
356
348
  }
357
349
  function worstSeverity(violations) {
358
- const order = ["critical", "serious", "moderate", "minor"];
359
350
  return violations.reduce(
360
- (worst, violation) => order.indexOf(violation.severity) < order.indexOf(worst) ? violation.severity : worst,
351
+ (worst, violation) => maxSeverity(worst, violation.severity),
361
352
  "minor"
362
353
  );
363
354
  }
@@ -1825,10 +1816,7 @@ var findingsForFileHandler = async (args, ctx) => {
1825
1816
 
1826
1817
  // src/tools/swap-to-canonical.ts
1827
1818
  import * as ts from "typescript";
1828
- import {
1829
- resolveCanonicalForHtmlElement,
1830
- formatRawHtmlElement
1831
- } from "@fragments-sdk/classifier";
1819
+ import { resolveCanonicalForHtmlElement, formatRawHtmlElement } from "@fragments-sdk/classifier";
1832
1820
 
1833
1821
  // src/canonical-mappings-service.ts
1834
1822
  async function fetchCanonicalMappings(apiKey, cloudUrl) {
@@ -1899,15 +1887,11 @@ function walkRawJsxElements(source) {
1899
1887
  }
1900
1888
  var formatRawElement = formatRawHtmlElement;
1901
1889
  function buildPropMapping(attrs, rowMapping) {
1902
- const transforms = new Map(
1903
- rowMapping.map((m) => [m.rawProp, m])
1904
- );
1890
+ const transforms = new Map(rowMapping.map((m) => [m.rawProp, m]));
1905
1891
  const mapping = [];
1906
1892
  for (const rawProp of attrs.keys()) {
1907
1893
  if (rawProp === "type") continue;
1908
- mapping.push(
1909
- transforms.get(rawProp) ?? { rawProp, canonicalProp: rawProp }
1910
- );
1894
+ mapping.push(transforms.get(rawProp) ?? { rawProp, canonicalProp: rawProp });
1911
1895
  }
1912
1896
  return mapping;
1913
1897
  }
@@ -1931,7 +1915,7 @@ function groupMappingsByCanonical(mappings) {
1931
1915
  }
1932
1916
  function buildSwapSuggestions(args) {
1933
1917
  const eligible = args.mappings.filter(
1934
- (m) => m.canonicalConfidence === "auto" || m.canonicalConfidence === "overridden"
1918
+ (m) => (m.canonicalStatus ?? legacyStatusForMapping(m)) === "confirmed"
1935
1919
  );
1936
1920
  if (eligible.length === 0) return [];
1937
1921
  const byCanonical = groupMappingsByCanonical(eligible);
@@ -1973,6 +1957,9 @@ function buildSwapSuggestions(args) {
1973
1957
  }
1974
1958
  return suggestions;
1975
1959
  }
1960
+ function legacyStatusForMapping(mapping) {
1961
+ return mapping.canonicalConfidence === "overridden" || mapping.canonicalConfidence === "auto" ? "confirmed" : "proposed";
1962
+ }
1976
1963
  var swapToCanonicalHandler = async (args, ctx) => {
1977
1964
  const apiKey = resolveCloudApiKey(ctx);
1978
1965
  if (!apiKey) return missingKeyError();
@@ -1993,11 +1980,12 @@ var swapToCanonicalHandler = async (args, ctx) => {
1993
1980
  fileContent,
1994
1981
  mappings
1995
1982
  });
1983
+ const message = mappings.length === 0 ? "No confirmed canonical primitives are configured for this project. Visit the Components page to confirm primitives." : void 0;
1996
1984
  return {
1997
1985
  content: [
1998
1986
  {
1999
1987
  type: "text",
2000
- text: JSON.stringify({ suggestions, filePath })
1988
+ text: JSON.stringify({ suggestions, filePath, message })
2001
1989
  }
2002
1990
  ],
2003
1991
  _meta: {
@@ -2177,6 +2165,7 @@ import { readFile } from "fs/promises";
2177
2165
  import { existsSync as existsSync2, readFileSync as readFileSync3, readdirSync } from "fs";
2178
2166
  import { join as join2, dirname, resolve } from "path";
2179
2167
  import { createRequire } from "module";
2168
+ import { BRAND } from "@fragments-sdk/core";
2180
2169
  function resolveWorkspaceGlob(baseDir, pattern) {
2181
2170
  const parts = pattern.split("/");
2182
2171
  let dirs = [baseDir];
@@ -2334,6 +2323,9 @@ function findBundleManifest(startDir) {
2334
2323
  return found;
2335
2324
  }
2336
2325
 
2326
+ // src/adapters/fragments-json.ts
2327
+ import { BRAND as BRAND2 } from "@fragments-sdk/core";
2328
+
2337
2329
  // src/adapters/snapshot-converters.ts
2338
2330
  import { mcpSnapshotSchema } from "@fragments-sdk/core";
2339
2331
  function slugify(value) {
@@ -2526,18 +2518,18 @@ var FragmentsJsonAdapter = class {
2526
2518
  const paths = this.discover(projectRoot);
2527
2519
  if (paths.length === 0) {
2528
2520
  throw new Error(
2529
- `No ${BRAND.outFile} found. Searched ${projectRoot} and package.json dependencies.
2521
+ `No ${BRAND2.outFile} found. Searched ${projectRoot} and package.json dependencies.
2530
2522
 
2531
2523
  Fix: Add a project-level MCP config so the server runs from your workspace root:
2532
2524
 
2533
2525
  Cursor: .cursor/mcp.json
2534
2526
  VS Code: .vscode/mcp.json
2535
- Claude: claude mcp add ${BRAND.nameLower} -- npx @fragments-sdk/mcp
2527
+ Claude: claude mcp add ${BRAND2.nameLower} -- npx @fragments-sdk/mcp
2536
2528
  Windsurf: .windsurf/mcp.json
2537
2529
 
2538
2530
  Or pass --project-root: npx @fragments-sdk/mcp -p /path/to/project
2539
2531
 
2540
- If you're a library author, run \`${BRAND.cliCommand} build\` first.`
2532
+ If you're a library author, run \`${BRAND2.cliCommand} build\` first.`
2541
2533
  );
2542
2534
  }
2543
2535
  const content = await readFile(paths[0], "utf-8");
@@ -2586,7 +2578,7 @@ If you're a library author, run \`${BRAND.cliCommand} build\` first.`
2586
2578
  const snapshot = validateSnapshot({
2587
2579
  schemaVersion: 1,
2588
2580
  sourceType: "fragments-json",
2589
- sourceLabel: BRAND.outFile,
2581
+ sourceLabel: BRAND2.outFile,
2590
2582
  capabilities: buildCapabilities({
2591
2583
  components,
2592
2584
  blocks,
@@ -3005,7 +2997,7 @@ Check that your tsconfig.json includes the component directories.`
3005
2997
  var extractorModulePromise = null;
3006
2998
  async function loadExtractorModule() {
3007
2999
  if (!extractorModulePromise) {
3008
- extractorModulePromise = import("./dist-TTCI6TME.js");
3000
+ extractorModulePromise = import("./dist-LVC53MY5.js");
3009
3001
  }
3010
3002
  return extractorModulePromise;
3011
3003
  }
@@ -3612,6 +3604,7 @@ import {
3612
3604
  bundleManifestSchema,
3613
3605
  bundleTokenFileSchema
3614
3606
  } from "@fragments-sdk/core";
3607
+ import { BRAND as BRAND3 } from "@fragments-sdk/core";
3615
3608
  async function readJsonFile(path, parser, label) {
3616
3609
  const content = await readFile2(path, "utf-8");
3617
3610
  try {
@@ -3730,7 +3723,7 @@ var BundleAdapter = class {
3730
3723
  const manifests = this.discover(projectRoot);
3731
3724
  if (manifests.length === 0) {
3732
3725
  throw new Error(
3733
- `No ${BRAND.dataDir}/${BRAND.manifestFile} found. Run \`${BRAND.cliCommand} context install --cloud\` or commit a Fragments bundle into your workspace.`
3726
+ `No ${BRAND3.dataDir}/${BRAND3.manifestFile} found. Run \`${BRAND3.cliCommand} context install --cloud\` or commit a Fragments bundle into your workspace.`
3734
3727
  );
3735
3728
  }
3736
3729
  const manifestPath = manifests[0];
@@ -3788,7 +3781,7 @@ var BundleAdapter = class {
3788
3781
  const snapshot = validateSnapshot({
3789
3782
  schemaVersion: 1,
3790
3783
  sourceType: "bundle",
3791
- sourceLabel: `${BRAND.dataDir}/${BRAND.manifestFile}`,
3784
+ sourceLabel: `${BRAND3.dataDir}/${BRAND3.manifestFile}`,
3792
3785
  capabilities: buildCapabilities({
3793
3786
  components,
3794
3787
  tokens
@@ -4044,7 +4037,7 @@ var TOOL_DEFINITION_BY_KEY = new Map(
4044
4037
  function createMcpServer(config) {
4045
4038
  const server = new Server(
4046
4039
  {
4047
- name: `${BRAND.nameLower}-mcp`,
4040
+ name: `${BRAND4.nameLower}-mcp`,
4048
4041
  version: MCP_SERVER_VERSION
4049
4042
  },
4050
4043
  {
@@ -4267,4 +4260,4 @@ export {
4267
4260
  startMcpServer,
4268
4261
  createSandboxServer
4269
4262
  };
4270
- //# sourceMappingURL=chunk-YJTMK4JY.js.map
4263
+ //# sourceMappingURL=chunk-KGFM5SCE.js.map