@layoutdesign/context 0.2.0 → 0.2.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.
Files changed (59) hide show
  1. package/README.md +25 -11
  2. package/dist/bin/cli.js +17 -32
  3. package/dist/bin/cli.js.map +1 -1
  4. package/dist/src/cli/doctor.d.ts +4 -1
  5. package/dist/src/cli/doctor.d.ts.map +1 -1
  6. package/dist/src/cli/doctor.js +37 -6
  7. package/dist/src/cli/doctor.js.map +1 -1
  8. package/dist/src/cli/import-zip.d.ts.map +1 -1
  9. package/dist/src/cli/import-zip.js +11 -3
  10. package/dist/src/cli/import-zip.js.map +1 -1
  11. package/dist/src/cli/init.js +4 -4
  12. package/dist/src/cli/install.d.ts +1 -0
  13. package/dist/src/cli/install.d.ts.map +1 -1
  14. package/dist/src/cli/install.js +84 -19
  15. package/dist/src/cli/install.js.map +1 -1
  16. package/dist/src/cli/serve-local.d.ts +5 -0
  17. package/dist/src/cli/serve-local.d.ts.map +1 -0
  18. package/dist/src/cli/serve-local.js +109 -0
  19. package/dist/src/cli/serve-local.js.map +1 -0
  20. package/dist/src/index.d.ts +1 -1
  21. package/dist/src/index.js +1 -1
  22. package/dist/src/kit/loader.d.ts.map +1 -1
  23. package/dist/src/kit/loader.js +17 -9
  24. package/dist/src/kit/loader.js.map +1 -1
  25. package/dist/src/kit/parser.d.ts +4 -4
  26. package/dist/src/kit/parser.js +4 -4
  27. package/dist/src/kit/types.d.ts +2 -2
  28. package/dist/src/kit/types.js +1 -1
  29. package/dist/src/mcp/tools/design-in-figma.js +1 -1
  30. package/dist/src/mcp/tools/get-design-system.js +3 -3
  31. package/dist/src/mcp/tools/list-components.js +1 -1
  32. package/dist/src/mcp/tools/push-to-figma.d.ts +9 -1
  33. package/dist/src/mcp/tools/push-to-figma.d.ts.map +1 -1
  34. package/dist/src/mcp/tools/push-to-figma.js +163 -86
  35. package/dist/src/mcp/tools/push-to-figma.js.map +1 -1
  36. package/dist/src/mcp/tools/update-tokens.js +14 -14
  37. package/dist/src/preview/server.d.ts.map +1 -1
  38. package/dist/src/preview/server.js +11 -5
  39. package/dist/src/preview/server.js.map +1 -1
  40. package/dist/src/preview/ws.d.ts +4 -0
  41. package/dist/src/preview/ws.d.ts.map +1 -1
  42. package/dist/src/preview/ws.js +9 -1
  43. package/dist/src/preview/ws.js.map +1 -1
  44. package/package.json +1 -1
  45. package/dist/src/cli/config.d.ts +0 -19
  46. package/dist/src/cli/config.d.ts.map +0 -1
  47. package/dist/src/cli/config.js +0 -100
  48. package/dist/src/cli/config.js.map +0 -1
  49. package/dist/src/cli/login.d.ts +0 -4
  50. package/dist/src/cli/login.d.ts.map +0 -1
  51. package/dist/src/cli/login.js +0 -58
  52. package/dist/src/cli/login.js.map +0 -1
  53. package/dist/src/cli/pull.d.ts +0 -8
  54. package/dist/src/cli/pull.d.ts.map +0 -1
  55. package/dist/src/cli/pull.js +0 -108
  56. package/dist/src/cli/pull.js.map +0 -1
  57. /package/kits/linear-lite/{DESIGN.md → layout.md} +0 -0
  58. /package/kits/notion-lite/{DESIGN.md → layout.md} +0 -0
  59. /package/kits/stripe-lite/{DESIGN.md → layout.md} +0 -0
@@ -1,100 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import os from "node:os";
4
- const CONFIG_FILENAME = ".layoutrc";
5
- const ENV_KEY = "LAYOUT_API_KEY";
6
- const ENV_BASE_URL = "LAYOUT_BASE_URL";
7
- const DEFAULT_BASE_URL = "https://layout.design";
8
- function getGlobalConfigPath() {
9
- return path.join(os.homedir(), CONFIG_FILENAME);
10
- }
11
- function getLocalConfigPath() {
12
- return path.join(process.cwd(), CONFIG_FILENAME);
13
- }
14
- /**
15
- * Read config from (in priority order): env vars > local .layoutrc > global ~/.layoutrc
16
- */
17
- export function readConfig() {
18
- const config = {};
19
- // 1. Global config (~/.layoutrc)
20
- const globalPath = getGlobalConfigPath();
21
- if (fs.existsSync(globalPath)) {
22
- Object.assign(config, parseConfigFile(globalPath));
23
- }
24
- // 2. Local config (./.layoutrc) — overrides global
25
- const localPath = getLocalConfigPath();
26
- if (fs.existsSync(localPath)) {
27
- Object.assign(config, parseConfigFile(localPath));
28
- }
29
- // 3. Env vars — highest priority
30
- if (process.env[ENV_KEY]) {
31
- config.apiKey = process.env[ENV_KEY];
32
- }
33
- if (process.env[ENV_BASE_URL]) {
34
- config.baseUrl = process.env[ENV_BASE_URL];
35
- }
36
- if (!config.baseUrl) {
37
- config.baseUrl = DEFAULT_BASE_URL;
38
- }
39
- return config;
40
- }
41
- /**
42
- * Save config to ~/.layoutrc (global). File is created with 0o600 permissions.
43
- */
44
- export function saveConfig(updates) {
45
- const configPath = getGlobalConfigPath();
46
- const existing = fs.existsSync(configPath) ? parseConfigFile(configPath) : {};
47
- const merged = { ...existing, ...updates };
48
- const lines = [
49
- "# Layout CLI config — https://layout.design",
50
- "# Do not commit this file to version control",
51
- ];
52
- if (merged.apiKey)
53
- lines.push(`api_key=${merged.apiKey}`);
54
- if (merged.baseUrl && merged.baseUrl !== DEFAULT_BASE_URL) {
55
- lines.push(`base_url=${merged.baseUrl}`);
56
- }
57
- if (merged.defaultProjectId) {
58
- lines.push(`default_project_id=${merged.defaultProjectId}`);
59
- }
60
- fs.writeFileSync(configPath, lines.join("\n") + "\n", { mode: 0o600 });
61
- }
62
- /**
63
- * Delete the global config file.
64
- */
65
- export function clearConfig() {
66
- const configPath = getGlobalConfigPath();
67
- if (fs.existsSync(configPath)) {
68
- fs.unlinkSync(configPath);
69
- }
70
- }
71
- export function getGlobalConfigLocation() {
72
- return getGlobalConfigPath();
73
- }
74
- function parseConfigFile(filePath) {
75
- const content = fs.readFileSync(filePath, "utf-8");
76
- const config = {};
77
- for (const line of content.split("\n")) {
78
- const trimmed = line.trim();
79
- if (!trimmed || trimmed.startsWith("#"))
80
- continue;
81
- const eqIndex = trimmed.indexOf("=");
82
- if (eqIndex === -1)
83
- continue;
84
- const key = trimmed.slice(0, eqIndex).trim();
85
- const value = trimmed.slice(eqIndex + 1).trim();
86
- switch (key) {
87
- case "api_key":
88
- config.apiKey = value;
89
- break;
90
- case "base_url":
91
- config.baseUrl = value;
92
- break;
93
- case "default_project_id":
94
- config.defaultProjectId = value;
95
- break;
96
- }
97
- }
98
- return config;
99
- }
100
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/config.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- export declare function loginCommand(apiKey: string): Promise<void>;
2
- export declare function logoutCommand(): void;
3
- export declare function whoamiCommand(): void;
4
- //# sourceMappingURL=login.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/login.ts"],"names":[],"mappings":"AAGA,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ChE;AAED,wBAAgB,aAAa,IAAI,IAAI,CAGpC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAepC"}
@@ -1,58 +0,0 @@
1
- import chalk from "chalk";
2
- import { readConfig, saveConfig, clearConfig, getGlobalConfigLocation } from "./config.js";
3
- export async function loginCommand(apiKey) {
4
- if (!apiKey.startsWith("lyt_")) {
5
- console.log(chalk.red("Error:"), "Invalid API key format. Keys start with lyt_");
6
- process.exit(1);
7
- }
8
- const config = readConfig();
9
- const baseUrl = config.baseUrl ?? "https://layout.design";
10
- console.log(chalk.dim("Validating API key..."));
11
- try {
12
- const res = await fetch(`${baseUrl}/api/export/pull`, {
13
- headers: { Authorization: `Bearer ${apiKey}` },
14
- });
15
- if (res.status === 401) {
16
- console.log(chalk.red("Error:"), "Invalid or revoked API key.");
17
- process.exit(1);
18
- }
19
- if (res.status === 403) {
20
- console.log(chalk.red("Error:"), "API key does not have read scope.");
21
- process.exit(1);
22
- }
23
- // 404 is fine — means auth worked but no projects exist yet
24
- if (!res.ok && res.status !== 404) {
25
- console.log(chalk.red("Error:"), `Unexpected response: ${res.status}`);
26
- process.exit(1);
27
- }
28
- }
29
- catch (err) {
30
- console.log(chalk.red("Error:"), `Could not connect to ${baseUrl}: ${err instanceof Error ? err.message : "unknown error"}`);
31
- process.exit(1);
32
- }
33
- saveConfig({ apiKey });
34
- const preview = `${apiKey.slice(0, 7)}...${apiKey.slice(-4)}`;
35
- console.log(chalk.green("✓"), `Authenticated as ${chalk.bold(preview)}`);
36
- console.log(chalk.dim(` Key saved to ${getGlobalConfigLocation()}`));
37
- console.log();
38
- console.log(`Run ${chalk.cyan("layout-context pull")} to fetch your design system.`);
39
- }
40
- export function logoutCommand() {
41
- clearConfig();
42
- console.log(chalk.green("✓"), "Logged out. API key removed from ~/.layoutrc");
43
- }
44
- export function whoamiCommand() {
45
- const config = readConfig();
46
- if (!config.apiKey) {
47
- console.log(chalk.yellow("Not authenticated."));
48
- console.log(` Run ${chalk.cyan("layout-context login <api-key>")} to get started.`);
49
- return;
50
- }
51
- const preview = `${config.apiKey.slice(0, 7)}...${config.apiKey.slice(-4)}`;
52
- console.log(chalk.green("✓"), `Authenticated as ${chalk.bold(preview)}`);
53
- console.log(` Base URL: ${chalk.dim(config.baseUrl)}`);
54
- if (config.defaultProjectId) {
55
- console.log(` Default project: ${chalk.dim(config.defaultProjectId)}`);
56
- }
57
- }
58
- //# sourceMappingURL=login.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/login.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- interface PullOptions {
2
- output?: string;
3
- formats?: string;
4
- projectId?: string;
5
- }
6
- export declare function pullCommand(projectIdArg: string | undefined, options: PullOptions): Promise<void>;
7
- export {};
8
- //# sourceMappingURL=pull.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../src/cli/pull.ts"],"names":[],"mappings":"AAgBA,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,WAAW,CAC/B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAiGf"}
@@ -1,108 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import chalk from "chalk";
4
- import { readConfig } from "./config.js";
5
- import { LAYOUT_DIR } from "../kit/types.js";
6
- export async function pullCommand(projectIdArg, options) {
7
- const config = readConfig();
8
- if (!config.apiKey) {
9
- console.log(chalk.red("Error:"), "Not authenticated.");
10
- console.log(` Run ${chalk.cyan("layout-context login <api-key>")} first.`);
11
- process.exit(1);
12
- }
13
- const projectId = projectIdArg ?? options.projectId ?? config.defaultProjectId;
14
- const outputDir = options.output ?? LAYOUT_DIR;
15
- const baseUrl = config.baseUrl ?? "https://layout.design";
16
- // Build query params
17
- const params = new URLSearchParams();
18
- if (projectId)
19
- params.set("projectId", projectId);
20
- if (options.formats)
21
- params.set("formats", options.formats);
22
- const url = `${baseUrl}/api/export/pull${params.toString() ? `?${params}` : ""}`;
23
- console.log(chalk.dim("Pulling design context..."));
24
- let res;
25
- try {
26
- res = await fetch(url, {
27
- headers: { Authorization: `Bearer ${config.apiKey}` },
28
- });
29
- }
30
- catch (err) {
31
- console.log(chalk.red("Error:"), `Could not connect to ${baseUrl}: ${err instanceof Error ? err.message : "unknown error"}`);
32
- process.exit(1);
33
- }
34
- if (!res.ok) {
35
- const body = (await res.json().catch(() => ({ error: "Unknown error" })));
36
- console.log(chalk.red("Error:"), body.error ?? `HTTP ${res.status}`);
37
- process.exit(1);
38
- }
39
- const data = (await res.json());
40
- const fileEntries = Object.entries(data.files);
41
- if (fileEntries.length === 0) {
42
- console.log(chalk.yellow("Warning:"), "No files returned. Check your project has extraction data.");
43
- process.exit(1);
44
- }
45
- // Write files
46
- const cwd = process.cwd();
47
- let created = 0;
48
- let updated = 0;
49
- for (const [relativePath, content] of fileEntries) {
50
- const fullPath = path.join(cwd, outputDir, relativePath);
51
- const dir = path.dirname(fullPath);
52
- if (!fs.existsSync(dir)) {
53
- fs.mkdirSync(dir, { recursive: true });
54
- }
55
- const existed = fs.existsSync(fullPath);
56
- fs.writeFileSync(fullPath, content, "utf-8");
57
- if (existed) {
58
- updated++;
59
- }
60
- else {
61
- created++;
62
- }
63
- }
64
- console.log();
65
- console.log(chalk.green("✓"), `Pulled ${chalk.bold(data.project.name)}`);
66
- console.log();
67
- for (const relativePath of Object.keys(data.files)) {
68
- console.log(` ${chalk.dim("•")} ${outputDir}/${relativePath}`);
69
- }
70
- console.log();
71
- console.log(chalk.dim(` ${created} created, ${updated} updated — ${fileEntries.length} files total`));
72
- // Merge CLAUDE.md into root if present
73
- const claudeMdPath = path.join(cwd, outputDir, "CLAUDE.md");
74
- if (fs.existsSync(claudeMdPath)) {
75
- mergeClaudeMd(cwd, claudeMdPath);
76
- }
77
- console.log();
78
- console.log(`Run ${chalk.cyan("layout-context install")} to connect the MCP server.`);
79
- }
80
- /** Markers for idempotent CLAUDE.md injection */
81
- const SECTION_START = "<!-- layout:design-system:start -->";
82
- const SECTION_END = "<!-- layout:design-system:end -->";
83
- function mergeClaudeMd(cwd, sourcePath) {
84
- const content = fs.readFileSync(sourcePath, "utf-8").trim();
85
- if (!content)
86
- return;
87
- const wrapped = `${SECTION_START}\n${content}\n${SECTION_END}`;
88
- const rootPath = path.join(cwd, "CLAUDE.md");
89
- if (fs.existsSync(rootPath)) {
90
- const existing = fs.readFileSync(rootPath, "utf-8");
91
- const startIdx = existing.indexOf(SECTION_START);
92
- const endIdx = existing.indexOf(SECTION_END);
93
- if (startIdx !== -1 && endIdx !== -1) {
94
- const before = existing.slice(0, startIdx);
95
- const after = existing.slice(endIdx + SECTION_END.length);
96
- fs.writeFileSync(rootPath, before + wrapped + after);
97
- console.log(` ${chalk.dim("•")} CLAUDE.md (updated design system section)`);
98
- return;
99
- }
100
- const separator = existing.endsWith("\n") ? "\n" : "\n\n";
101
- fs.writeFileSync(rootPath, existing + separator + wrapped + "\n");
102
- console.log(` ${chalk.dim("•")} CLAUDE.md (appended design system section)`);
103
- return;
104
- }
105
- fs.writeFileSync(rootPath, wrapped + "\n");
106
- console.log(` ${chalk.dim("•")} CLAUDE.md (created with design system section)`);
107
- }
108
- //# sourceMappingURL=pull.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/cli/pull.ts"],"names":[],"mappings":"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"}
File without changes
File without changes
File without changes