@layoutdesign/context 0.1.12 → 0.2.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/dist/bin/cli.js +29 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/src/cli/config.d.ts +19 -0
- package/dist/src/cli/config.d.ts.map +1 -0
- package/dist/src/cli/config.js +100 -0
- package/dist/src/cli/config.js.map +1 -0
- package/dist/src/cli/login.d.ts +4 -0
- package/dist/src/cli/login.d.ts.map +1 -0
- package/dist/src/cli/login.js +58 -0
- package/dist/src/cli/login.js.map +1 -0
- package/dist/src/cli/pull.d.ts +8 -0
- package/dist/src/cli/pull.d.ts.map +1 -0
- package/dist/src/cli/pull.js +108 -0
- package/dist/src/cli/pull.js.map +1 -0
- package/package.json +1 -1
package/dist/bin/cli.js
CHANGED
|
@@ -8,6 +8,8 @@ import { useCommand } from "../src/cli/use.js";
|
|
|
8
8
|
import { listCommand } from "../src/cli/list.js";
|
|
9
9
|
import { installCommand } from "../src/cli/install.js";
|
|
10
10
|
import { doctorCommand } from "../src/cli/doctor.js";
|
|
11
|
+
import { loginCommand, logoutCommand, whoamiCommand } from "../src/cli/login.js";
|
|
12
|
+
import { pullCommand } from "../src/cli/pull.js";
|
|
11
13
|
const require = createRequire(import.meta.url);
|
|
12
14
|
const pkg = require("../../package.json");
|
|
13
15
|
const program = new Command();
|
|
@@ -60,5 +62,32 @@ program
|
|
|
60
62
|
.action(async () => {
|
|
61
63
|
await doctorCommand();
|
|
62
64
|
});
|
|
65
|
+
program
|
|
66
|
+
.command("login <api-key>")
|
|
67
|
+
.description("Authenticate with your Layout API key (from layout.design)")
|
|
68
|
+
.action(async (apiKey) => {
|
|
69
|
+
await loginCommand(apiKey);
|
|
70
|
+
});
|
|
71
|
+
program
|
|
72
|
+
.command("logout")
|
|
73
|
+
.description("Remove stored API key")
|
|
74
|
+
.action(() => {
|
|
75
|
+
logoutCommand();
|
|
76
|
+
});
|
|
77
|
+
program
|
|
78
|
+
.command("whoami")
|
|
79
|
+
.description("Show current authentication status")
|
|
80
|
+
.action(() => {
|
|
81
|
+
whoamiCommand();
|
|
82
|
+
});
|
|
83
|
+
program
|
|
84
|
+
.command("pull [project-id]")
|
|
85
|
+
.description("Pull design context from Layout into .layout/")
|
|
86
|
+
.option("-o, --output <dir>", "Output directory", ".layout")
|
|
87
|
+
.option("-f, --formats <formats>", "Comma-separated: design-md,claude-md,agents-md,cursor-rules,tokens-css,tokens-json,tailwind-config")
|
|
88
|
+
.option("-p, --project-id <id>", "Project ID (overrides argument)")
|
|
89
|
+
.action(async (projectIdArg, options) => {
|
|
90
|
+
await pullCommand(projectIdArg, options);
|
|
91
|
+
});
|
|
63
92
|
program.parse();
|
|
64
93
|
//# sourceMappingURL=cli.js.map
|
package/dist/bin/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface LayoutConfig {
|
|
2
|
+
apiKey?: string;
|
|
3
|
+
baseUrl?: string;
|
|
4
|
+
defaultProjectId?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Read config from (in priority order): env vars > local .layoutrc > global ~/.layoutrc
|
|
8
|
+
*/
|
|
9
|
+
export declare function readConfig(): LayoutConfig;
|
|
10
|
+
/**
|
|
11
|
+
* Save config to ~/.layoutrc (global). File is created with 0o600 permissions.
|
|
12
|
+
*/
|
|
13
|
+
export declare function saveConfig(updates: Partial<LayoutConfig>): void;
|
|
14
|
+
/**
|
|
15
|
+
* Delete the global config file.
|
|
16
|
+
*/
|
|
17
|
+
export declare function clearConfig(): void;
|
|
18
|
+
export declare function getGlobalConfigLocation(): string;
|
|
19
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAeD;;GAEG;AACH,wBAAgB,UAAU,IAAI,YAAY,CA4BzC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAkB/D;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAKlC;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD"}
|
|
@@ -0,0 +1,100 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/cli/pull.ts"],"names":[],"mappings":"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"}
|