foundry-design 0.2.0-beta.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.
@@ -0,0 +1,458 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { accessSync } from 'node:fs';
3
+ import { access, mkdir, readFile, rm, rmdir, writeFile } from 'node:fs/promises';
4
+ import { dirname, join, relative, resolve } from 'node:path';
5
+ import { detectPlatform } from './project.js';
6
+ const START = '>>> Foundry Design Control';
7
+ const END = '<<< Foundry Design Control';
8
+ async function exists(path) {
9
+ try {
10
+ await access(path);
11
+ return true;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ async function readText(path) {
18
+ try {
19
+ return await readFile(path, 'utf8');
20
+ }
21
+ catch {
22
+ return '';
23
+ }
24
+ }
25
+ function digest(content) {
26
+ return createHash('sha256').update(content).digest('hex');
27
+ }
28
+ function slash(path) {
29
+ return path.replaceAll('\\', '/');
30
+ }
31
+ function relativeImport(from, to) {
32
+ const path = slash(relative(dirname(from), to));
33
+ return path.startsWith('.') ? path : `./${path}`;
34
+ }
35
+ async function packageJson(root) {
36
+ try {
37
+ return JSON.parse(await readFile(join(root, 'package.json'), 'utf8'));
38
+ }
39
+ catch {
40
+ return {};
41
+ }
42
+ }
43
+ export async function detectWebFramework(root) {
44
+ const pkg = await packageJson(root);
45
+ const dependencies = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };
46
+ if (dependencies.next)
47
+ return 'next';
48
+ if (dependencies.vite)
49
+ return 'vite';
50
+ if (await exists(join(root, 'index.html')))
51
+ return 'html';
52
+ return 'generic';
53
+ }
54
+ function packageManager(root) {
55
+ if (existsSync(join(root, 'pnpm-lock.yaml')))
56
+ return { command: 'pnpm', runArgs: (script) => [script] };
57
+ if (existsSync(join(root, 'yarn.lock')))
58
+ return { command: 'yarn', runArgs: (script) => [script] };
59
+ if (existsSync(join(root, 'bun.lockb')) || existsSync(join(root, 'bun.lock')))
60
+ return { command: 'bun', runArgs: (script) => ['run', script] };
61
+ return { command: 'npm', runArgs: (script) => ['run', script] };
62
+ }
63
+ function existsSync(path) {
64
+ try {
65
+ accessSync(path);
66
+ return true;
67
+ }
68
+ catch {
69
+ return false;
70
+ }
71
+ }
72
+ async function detectDevCommand(root) {
73
+ const pkg = await packageJson(root);
74
+ const script = pkg.scripts?.dev ? 'dev' : pkg.scripts?.start ? 'start' : undefined;
75
+ if (!script)
76
+ return undefined;
77
+ const manager = packageManager(root);
78
+ return { command: manager.command, args: manager.runArgs(script) };
79
+ }
80
+ function defaultTarget(framework) {
81
+ if (framework === 'vite')
82
+ return 'http://127.0.0.1:5173';
83
+ if (framework === 'next')
84
+ return 'http://127.0.0.1:3000';
85
+ if (framework === 'html')
86
+ return 'http://127.0.0.1:3000';
87
+ return undefined;
88
+ }
89
+ async function detectAgents(root) {
90
+ const detected = [];
91
+ if (await exists(join(root, '.cursor')))
92
+ detected.push('cursor');
93
+ if ((await exists(join(root, '.claude'))) || (await exists(join(root, '.mcp.json'))))
94
+ detected.push('claude');
95
+ if (await exists(join(root, '.codex')))
96
+ detected.push('codex');
97
+ return detected.length ? [...new Set(detected)] : ['codex'];
98
+ }
99
+ async function findFirst(root, candidates) {
100
+ for (const candidate of candidates) {
101
+ const path = join(root, candidate);
102
+ if (await exists(path))
103
+ return path;
104
+ }
105
+ return undefined;
106
+ }
107
+ async function integrationFile(root, framework) {
108
+ if (framework === 'next') {
109
+ return findFirst(root, [
110
+ 'app/layout.tsx',
111
+ 'app/layout.jsx',
112
+ 'src/app/layout.tsx',
113
+ 'src/app/layout.jsx',
114
+ ]);
115
+ }
116
+ if (framework === 'vite') {
117
+ return findFirst(root, [
118
+ 'src/main.tsx',
119
+ 'src/main.jsx',
120
+ 'src/main.ts',
121
+ 'src/main.js',
122
+ 'index.html',
123
+ ]);
124
+ }
125
+ if (framework === 'html')
126
+ return join(root, 'index.html');
127
+ return undefined;
128
+ }
129
+ export async function createSetupPlan(rootInput, options = {}) {
130
+ const root = resolve(rootInput);
131
+ const platform = await detectPlatform(root);
132
+ const framework = platform === 'web' ? await detectWebFramework(root) : undefined;
133
+ const agents = options.agents ?? (await detectAgents(root));
134
+ const integration = await integrationFile(root, framework);
135
+ const files = [
136
+ join(root, '.foundry', 'foundry.config.json'),
137
+ join(root, '.foundry', 'install-manifest.json'),
138
+ ];
139
+ if (platform === 'web')
140
+ files.push(join(root, '.foundry', 'web-adapter.ts'));
141
+ if (platform === 'swiftui')
142
+ files.push(join(root, '.foundry', 'swiftui-setup.md'));
143
+ if (platform === 'react-native')
144
+ files.push(join(root, '.foundry', 'react-native-setup.md'));
145
+ if (agents.includes('codex'))
146
+ files.push(join(root, '.codex', 'config.toml'));
147
+ if (agents.includes('cursor'))
148
+ files.push(join(root, '.cursor', 'mcp.json'));
149
+ if (agents.includes('claude'))
150
+ files.push(join(root, '.mcp.json'));
151
+ if (integration) {
152
+ files.push(integration);
153
+ if (framework === 'next')
154
+ files.push(join(dirname(integration), 'foundry-loader.tsx'));
155
+ }
156
+ files.push(join(root, '.gitignore'));
157
+ return {
158
+ root,
159
+ platform,
160
+ framework,
161
+ agents,
162
+ files: [...new Set(files)],
163
+ integrationFile: integration,
164
+ targetUrl: options.targetUrl ?? defaultTarget(framework),
165
+ devCommand: await detectDevCommand(root),
166
+ };
167
+ }
168
+ function managedBlock(content, syntax) {
169
+ const prefix = syntax === 'html' ? '<!-- ' : syntax === 'hash' ? '# ' : '// ';
170
+ const suffix = syntax === 'html' ? ' -->' : '';
171
+ return `${prefix}${START}${suffix}\n${content.trim()}\n${prefix}${END}${suffix}`;
172
+ }
173
+ function stripManagedBlock(content) {
174
+ const escapedStart = START.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
175
+ const escapedEnd = END.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
176
+ const pattern = new RegExp(`(?:\\/\\/|#|<!--)\\s*${escapedStart}(?:\\s*-->)?[\\s\\S]*?(?:\\/\\/|#|<!--)\\s*${escapedEnd}(?:\\s*-->)?\\s*`, 'g');
177
+ return (content
178
+ .replace(pattern, '')
179
+ .replace(/\n{3,}/g, '\n\n')
180
+ .trimEnd() + '\n');
181
+ }
182
+ async function setManagedBlock(path, block) {
183
+ const original = await readText(path);
184
+ const next = `${stripManagedBlock(original).trimEnd()}${original.trim() ? '\n\n' : ''}${block}\n`;
185
+ if (next === original)
186
+ return false;
187
+ await mkdir(dirname(path), { recursive: true });
188
+ await writeFile(path, next);
189
+ return true;
190
+ }
191
+ async function writeGenerated(path, content) {
192
+ await mkdir(dirname(path), { recursive: true });
193
+ await writeFile(path, content);
194
+ return { path, sha256: digest(content) };
195
+ }
196
+ function adapterSource(runtimeUrl) {
197
+ return `/** Foundry development adapter. Safe to commit; inactive outside an explicit session. */
198
+ export async function installFoundryDesignControl(): Promise<void> {
199
+ if (typeof window === 'undefined') return;
200
+ const query = new URLSearchParams(window.location.search);
201
+ if (!query.has('__foundry_session')) return;
202
+ const module = await import(/* @vite-ignore */ '${runtimeUrl}/adapter.js');
203
+ module.installFoundryInspector();
204
+ }
205
+ `;
206
+ }
207
+ async function configureWebIntegration(plan, generated, managedBlocks) {
208
+ const entry = plan.integrationFile;
209
+ if (!entry)
210
+ return undefined;
211
+ if (plan.framework === 'next') {
212
+ const appRoot = dirname(entry);
213
+ const loader = join(appRoot, 'foundry-loader.tsx');
214
+ const runtimeUrl = 'http://127.0.0.1:4387';
215
+ const loaderContent = `'use client';
216
+
217
+ import { useEffect } from 'react';
218
+
219
+ export function FoundryLoader(): null {
220
+ useEffect(() => {
221
+ const query = new URLSearchParams(window.location.search);
222
+ if (!query.has('__foundry_session')) return;
223
+ void import(/* webpackIgnore: true */ '${runtimeUrl}/adapter.js').then((module) =>
224
+ module.installFoundryInspector(),
225
+ );
226
+ }, []);
227
+ return null;
228
+ }
229
+ `;
230
+ generated.push(await writeGenerated(loader, loaderContent));
231
+ const original = await readText(entry);
232
+ if (!original.includes('FoundryLoader')) {
233
+ const withImport = `import { FoundryLoader } from './foundry-loader';\n${original}`;
234
+ const next = withImport.replace(/(<body(?:\s[^>]*)?>)/, '$1\n <FoundryLoader />');
235
+ if (next === withImport)
236
+ throw new Error(`Could not locate <body> in ${entry}`);
237
+ await writeFile(entry, next);
238
+ }
239
+ managedBlocks.push(entry);
240
+ return entry;
241
+ }
242
+ if (entry.endsWith('.html')) {
243
+ const raw = await readText(entry);
244
+ if (!raw.includes(START) &&
245
+ raw.includes('__foundry_session') &&
246
+ raw.includes('installFoundryInspector'))
247
+ return undefined;
248
+ const original = stripManagedBlock(raw);
249
+ const script = managedBlock(`<script type="module">
250
+ const query = new URLSearchParams(location.search);
251
+ if (query.has('__foundry_session')) {
252
+ const module = await import('http://127.0.0.1:4387/adapter.js');
253
+ module.installFoundryInspector();
254
+ }
255
+ </script>`, 'html');
256
+ const next = original.includes('</body>')
257
+ ? original.replace('</body>', ` ${script.replaceAll('\n', '\n ')}\n</body>`)
258
+ : `${original.trimEnd()}\n${script}\n`;
259
+ await writeFile(entry, next);
260
+ managedBlocks.push(entry);
261
+ return entry;
262
+ }
263
+ const adapter = join(plan.root, '.foundry', 'web-adapter.ts');
264
+ const existing = await readText(entry);
265
+ if (!existing.includes(START) &&
266
+ (existing.includes('installFoundryDesignControl') || existing.includes('.foundry/web-adapter')))
267
+ return undefined;
268
+ const specifier = relativeImport(entry, adapter);
269
+ const block = managedBlock(`if (import.meta.env.DEV) {
270
+ void import('${specifier}').then(({ installFoundryDesignControl }) =>
271
+ installFoundryDesignControl(),
272
+ );
273
+ }`, 'line');
274
+ await setManagedBlock(entry, block);
275
+ managedBlocks.push(entry);
276
+ return entry;
277
+ }
278
+ function mcpServer(packageRoot) {
279
+ if (packageRoot) {
280
+ return {
281
+ command: 'pnpm',
282
+ args: ['--dir', packageRoot, '--filter', 'foundry-design-mcp-server', 'start'],
283
+ env: { FOUNDRY_DESIGN_RUNTIME_URL: 'http://127.0.0.1:4387' },
284
+ };
285
+ }
286
+ return {
287
+ command: 'npx',
288
+ args: ['-y', 'foundry-design-mcp-server@0.1.0'],
289
+ env: { FOUNDRY_DESIGN_RUNTIME_URL: 'http://127.0.0.1:4387' },
290
+ };
291
+ }
292
+ async function configureCodex(path, packageRoot) {
293
+ const server = mcpServer(packageRoot);
294
+ const block = managedBlock(`[mcp_servers.foundry-design-control]
295
+ command = ${JSON.stringify(server.command)}
296
+ args = ${JSON.stringify(server.args)}
297
+
298
+ [mcp_servers.foundry-design-control.env]
299
+ FOUNDRY_DESIGN_RUNTIME_URL = "http://127.0.0.1:4387"`, 'hash');
300
+ await setManagedBlock(path, block);
301
+ }
302
+ async function configureJson(path, packageRoot) {
303
+ let current = {};
304
+ try {
305
+ current = JSON.parse(await readFile(path, 'utf8'));
306
+ }
307
+ catch {
308
+ /* Create a new config. */
309
+ }
310
+ current.mcpServers = {
311
+ ...(current.mcpServers ?? {}),
312
+ 'foundry-design-control': mcpServer(packageRoot),
313
+ };
314
+ await mkdir(dirname(path), { recursive: true });
315
+ await writeFile(path, `${JSON.stringify(current, null, 2)}\n`);
316
+ }
317
+ export async function setupProject(rootInput, options = {}) {
318
+ const plan = await createSetupPlan(rootInput, options);
319
+ const runtimeUrl = options.runtimeUrl ?? 'http://127.0.0.1:4387';
320
+ const generated = [];
321
+ const managedBlocks = [];
322
+ const jsonConfigs = [];
323
+ const changed = [];
324
+ const config = {
325
+ version: 2,
326
+ platform: plan.platform,
327
+ ...(plan.framework ? { framework: plan.framework } : {}),
328
+ runtimeUrl,
329
+ ...(plan.targetUrl ? { targetUrl: plan.targetUrl } : {}),
330
+ ...(plan.devCommand ? { devCommand: plan.devCommand } : {}),
331
+ instrumented: plan.platform !== 'web' || Boolean(plan.integrationFile),
332
+ design: {
333
+ componentRoots: ['src', 'app', 'components'],
334
+ exclude: ['node_modules', 'dist', 'build', '.next', 'coverage'],
335
+ viewports: [
336
+ { id: 'mobile', label: 'Mobile', width: 390, height: 844 },
337
+ { id: 'tablet', label: 'Tablet', width: 768, height: 1024 },
338
+ { id: 'desktop', label: 'Desktop', width: 1440, height: 900 },
339
+ ],
340
+ themes: [
341
+ { id: 'light', label: 'Light', attribute: 'data-theme', value: 'light' },
342
+ { id: 'dark', label: 'Dark', attribute: 'data-theme', value: 'dark' },
343
+ ],
344
+ },
345
+ };
346
+ const configFile = join(plan.root, '.foundry', 'foundry.config.json');
347
+ generated.push(await writeGenerated(configFile, `${JSON.stringify(config, null, 2)}\n`));
348
+ changed.push(configFile);
349
+ if (plan.platform === 'web') {
350
+ const adapter = join(plan.root, '.foundry', 'web-adapter.ts');
351
+ generated.push(await writeGenerated(adapter, adapterSource(runtimeUrl)));
352
+ changed.push(adapter);
353
+ const integration = await configureWebIntegration(plan, generated, managedBlocks);
354
+ if (integration)
355
+ changed.push(integration);
356
+ }
357
+ else {
358
+ const setup = join(plan.root, '.foundry', `${plan.platform}-setup.md`);
359
+ const content = plan.platform === 'swiftui'
360
+ ? '# Foundry SwiftUI setup\n\nAdd FoundryDesignControl only to DEBUG builds and mark meaningful views with `.foundryInspectable`.\n'
361
+ : '# Foundry React Native setup\n\nCreate the debug adapter and register semantic targets using `measureInWindow`.\n';
362
+ generated.push(await writeGenerated(setup, content));
363
+ changed.push(setup);
364
+ }
365
+ const gitignore = join(plan.root, '.gitignore');
366
+ await setManagedBlock(gitignore, managedBlock('.foundry/sessions/', 'hash'));
367
+ managedBlocks.push(gitignore);
368
+ changed.push(gitignore);
369
+ if (plan.agents.includes('codex')) {
370
+ const path = join(plan.root, '.codex', 'config.toml');
371
+ await configureCodex(path, options.packageRoot);
372
+ managedBlocks.push(path);
373
+ changed.push(path);
374
+ }
375
+ if (plan.agents.includes('cursor')) {
376
+ const path = join(plan.root, '.cursor', 'mcp.json');
377
+ await configureJson(path, options.packageRoot);
378
+ jsonConfigs.push(path);
379
+ changed.push(path);
380
+ }
381
+ if (plan.agents.includes('claude')) {
382
+ const path = join(plan.root, '.mcp.json');
383
+ await configureJson(path, options.packageRoot);
384
+ jsonConfigs.push(path);
385
+ changed.push(path);
386
+ }
387
+ const manifest = {
388
+ version: 1,
389
+ agents: plan.agents,
390
+ generatedFiles: generated,
391
+ managedBlocks,
392
+ jsonConfigs,
393
+ installedAt: new Date().toISOString(),
394
+ };
395
+ const manifestFile = join(plan.root, '.foundry', 'install-manifest.json');
396
+ await writeFile(manifestFile, `${JSON.stringify(manifest, null, 2)}\n`);
397
+ changed.push(manifestFile);
398
+ return { ...plan, changed: [...new Set(changed)] };
399
+ }
400
+ async function removeJsonServer(path) {
401
+ try {
402
+ const current = JSON.parse(await readFile(path, 'utf8'));
403
+ if (!current.mcpServers?.['foundry-design-control'])
404
+ return;
405
+ delete current.mcpServers['foundry-design-control'];
406
+ if (Object.keys(current.mcpServers).length === 0)
407
+ delete current.mcpServers;
408
+ await writeFile(path, `${JSON.stringify(current, null, 2)}\n`);
409
+ }
410
+ catch {
411
+ /* Preserve unreadable user configuration. */
412
+ }
413
+ }
414
+ export async function uninstallProject(rootInput) {
415
+ const root = resolve(rootInput);
416
+ const manifestFile = join(root, '.foundry', 'install-manifest.json');
417
+ const manifest = JSON.parse(await readFile(manifestFile, 'utf8'));
418
+ const removed = [];
419
+ const preserved = [];
420
+ for (const path of manifest.managedBlocks) {
421
+ const original = await readText(path);
422
+ if (!original)
423
+ continue;
424
+ let next = stripManagedBlock(original);
425
+ if (path.endsWith('layout.tsx') || path.endsWith('layout.jsx')) {
426
+ next = next
427
+ .replace("import { FoundryLoader } from './foundry-loader';\n", '')
428
+ .replace(/\s*<FoundryLoader \/>\n?/, '\n');
429
+ }
430
+ await writeFile(path, next);
431
+ removed.push(path);
432
+ }
433
+ for (const path of manifest.jsonConfigs) {
434
+ await removeJsonServer(path);
435
+ removed.push(path);
436
+ }
437
+ for (const file of manifest.generatedFiles) {
438
+ const content = await readText(file.path);
439
+ if (!content)
440
+ continue;
441
+ if (digest(content) !== file.sha256) {
442
+ preserved.push(file.path);
443
+ continue;
444
+ }
445
+ await rm(file.path);
446
+ removed.push(file.path);
447
+ }
448
+ await rm(manifestFile);
449
+ removed.push(manifestFile);
450
+ try {
451
+ await rmdir(join(root, '.foundry'));
452
+ }
453
+ catch {
454
+ /* Keep non-empty project data. */
455
+ }
456
+ return { removed: [...new Set(removed)], preserved };
457
+ }
458
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Platform } from 'foundry-design-protocol';
2
+ export declare function detectPlatform(root: string): Promise<Platform>;
3
+ export declare function addSessionParams(targetUrl: string, sessionId: string, token: string): string;
4
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAWxD,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiBpE;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK5F"}
@@ -0,0 +1,37 @@
1
+ import { access, readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ async function exists(path) {
4
+ try {
5
+ await access(path);
6
+ return true;
7
+ }
8
+ catch {
9
+ return false;
10
+ }
11
+ }
12
+ export async function detectPlatform(root) {
13
+ const packageFile = join(root, 'package.json');
14
+ if (await exists(packageFile)) {
15
+ try {
16
+ const packageJson = JSON.parse(await readFile(packageFile, 'utf8'));
17
+ const dependencies = { ...packageJson.dependencies, ...packageJson.devDependencies };
18
+ if (dependencies['react-native'] || dependencies.expo)
19
+ return 'react-native';
20
+ }
21
+ catch {
22
+ /* Fall through to filesystem signals. */
23
+ }
24
+ }
25
+ if (await exists(join(root, 'Package.swift')))
26
+ return 'swiftui';
27
+ if (await exists(packageFile))
28
+ return 'web';
29
+ return 'web';
30
+ }
31
+ export function addSessionParams(targetUrl, sessionId, token) {
32
+ const url = new URL(targetUrl);
33
+ url.searchParams.set('__foundry_session', sessionId);
34
+ url.searchParams.set('__foundry_token', token);
35
+ return url.toString();
36
+ }
37
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,KAAK,UAAU,MAAM,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC/C,IAAI,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAGjE,CAAC;YACF,MAAM,YAAY,GAAG,EAAE,GAAG,WAAW,CAAC,YAAY,EAAE,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;YACrF,IAAI,YAAY,CAAC,cAAc,CAAC,IAAI,YAAY,CAAC,IAAI;gBAAE,OAAO,cAAc,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;QAC3C,CAAC;IACH,CAAC;IACD,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAChE,IAAI,MAAM,MAAM,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,SAAiB,EAAE,KAAa;IAClF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/B,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;IACrD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "foundry-design",
3
+ "version": "0.2.0-beta.1",
4
+ "description": "Install and run the local-first Foundry visual design control plane",
5
+ "type": "module",
6
+ "files": [
7
+ "dist",
8
+ "!dist/*.test.*",
9
+ "!dist/**/*.test.*"
10
+ ],
11
+ "bin": {
12
+ "foundry-design": "dist/index.js"
13
+ },
14
+ "engines": {
15
+ "node": ">=20"
16
+ },
17
+ "license": "MIT",
18
+ "homepage": "https://github.com/seanx24x/foundry-design-control#readme",
19
+ "bugs": "https://github.com/seanx24x/foundry-design-control/issues",
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/seanx24x/foundry-design-control.git",
26
+ "directory": "packages/cli"
27
+ },
28
+ "keywords": [
29
+ "design",
30
+ "codex",
31
+ "cursor",
32
+ "claude",
33
+ "mcp",
34
+ "inspector"
35
+ ],
36
+ "dependencies": {
37
+ "foundry-design-protocol": "0.2.0-beta.1",
38
+ "foundry-design-runtime": "0.2.0-beta.1"
39
+ },
40
+ "scripts": {
41
+ "build": "tsc -p tsconfig.json",
42
+ "typecheck": "tsc -p tsconfig.json --noEmit",
43
+ "test": "node --import tsx --test src/*.test.ts",
44
+ "start": "tsx src/index.ts"
45
+ }
46
+ }