@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 +2 -3
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-YJTMK4JY.js → chunk-KGFM5SCE.js} +26 -33
- package/dist/chunk-KGFM5SCE.js.map +1 -0
- package/dist/{dist-TTCI6TME.js → dist-LVC53MY5.js} +48 -10
- package/dist/{dist-TTCI6TME.js.map → dist-LVC53MY5.js.map} +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/server.js +1 -2
- package/package.json +5 -5
- package/dist/chunk-4SVS3AA3.js +0 -78
- package/dist/chunk-4SVS3AA3.js.map +0 -1
- package/dist/chunk-YJTMK4JY.js.map +0 -1
- package/dist/constants-BLN4SSNH.js +0 -10
- package/dist/constants-BLN4SSNH.js.map +0 -1
package/dist/bin.js
CHANGED
|
@@ -4,8 +4,7 @@ import {
|
|
|
4
4
|
resolveDataAdapter,
|
|
5
5
|
resolveSearchApiKey,
|
|
6
6
|
startMcpServer
|
|
7
|
-
} from "./chunk-
|
|
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("
|
|
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('
|
|
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":"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","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
|
-
|
|
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) =>
|
|
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.
|
|
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 ${
|
|
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 ${
|
|
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 \`${
|
|
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:
|
|
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-
|
|
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 ${
|
|
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: `${
|
|
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: `${
|
|
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-
|
|
4263
|
+
//# sourceMappingURL=chunk-KGFM5SCE.js.map
|