@layoutdesign/context 0.5.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.
Files changed (88) hide show
  1. package/README.md +71 -0
  2. package/dist/bin/cli.js +35 -0
  3. package/dist/bin/cli.js.map +1 -1
  4. package/dist/src/cli/diff.d.ts +4 -0
  5. package/dist/src/cli/diff.d.ts.map +1 -0
  6. package/dist/src/cli/diff.js +53 -0
  7. package/dist/src/cli/diff.js.map +1 -0
  8. package/dist/src/cli/import-tokens-json.d.ts +5 -0
  9. package/dist/src/cli/import-tokens-json.d.ts.map +1 -0
  10. package/dist/src/cli/import-tokens-json.js +174 -0
  11. package/dist/src/cli/import-tokens-json.js.map +1 -0
  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 +25 -0
  15. package/dist/src/cli/install.js.map +1 -1
  16. package/dist/src/cli/lint.d.ts +7 -0
  17. package/dist/src/cli/lint.d.ts.map +1 -0
  18. package/dist/src/cli/lint.js +80 -0
  19. package/dist/src/cli/lint.js.map +1 -0
  20. package/dist/src/cli/live-notify.d.ts +2 -0
  21. package/dist/src/cli/live-notify.d.ts.map +1 -0
  22. package/dist/src/cli/live-notify.js +29 -0
  23. package/dist/src/cli/live-notify.js.map +1 -0
  24. package/dist/src/install/live.d.ts +5 -0
  25. package/dist/src/install/live.d.ts.map +1 -0
  26. package/dist/src/install/live.js +285 -0
  27. package/dist/src/install/live.js.map +1 -0
  28. package/dist/src/kit/stage.d.ts +19 -0
  29. package/dist/src/kit/stage.d.ts.map +1 -0
  30. package/dist/src/kit/stage.js +30 -0
  31. package/dist/src/kit/stage.js.map +1 -0
  32. package/dist/src/lint/diff.d.ts +23 -0
  33. package/dist/src/lint/diff.d.ts.map +1 -0
  34. package/dist/src/lint/diff.js +62 -0
  35. package/dist/src/lint/diff.js.map +1 -0
  36. package/dist/src/lint/layout-md.d.ts +21 -0
  37. package/dist/src/lint/layout-md.d.ts.map +1 -0
  38. package/dist/src/lint/layout-md.js +376 -0
  39. package/dist/src/lint/layout-md.js.map +1 -0
  40. package/dist/src/mcp/live-lock-store.d.ts +40 -0
  41. package/dist/src/mcp/live-lock-store.d.ts.map +1 -0
  42. package/dist/src/mcp/live-lock-store.js +134 -0
  43. package/dist/src/mcp/live-lock-store.js.map +1 -0
  44. package/dist/src/mcp/server.d.ts.map +1 -1
  45. package/dist/src/mcp/server.js +11 -0
  46. package/dist/src/mcp/server.js.map +1 -1
  47. package/dist/src/mcp/tools/_live-socket.d.ts +23 -0
  48. package/dist/src/mcp/tools/_live-socket.d.ts.map +1 -0
  49. package/dist/src/mcp/tools/_live-socket.js +135 -0
  50. package/dist/src/mcp/tools/_live-socket.js.map +1 -0
  51. package/dist/src/mcp/tools/check-setup.d.ts +14 -1
  52. package/dist/src/mcp/tools/check-setup.d.ts.map +1 -1
  53. package/dist/src/mcp/tools/check-setup.js +75 -1
  54. package/dist/src/mcp/tools/check-setup.js.map +1 -1
  55. package/dist/src/mcp/tools/get-recent-visual-edits.d.ts +40 -0
  56. package/dist/src/mcp/tools/get-recent-visual-edits.d.ts.map +1 -0
  57. package/dist/src/mcp/tools/get-recent-visual-edits.js +106 -0
  58. package/dist/src/mcp/tools/get-recent-visual-edits.js.map +1 -0
  59. package/dist/src/mcp/tools/get-selected-element.d.ts +10 -0
  60. package/dist/src/mcp/tools/get-selected-element.d.ts.map +1 -0
  61. package/dist/src/mcp/tools/get-selected-element.js +46 -0
  62. package/dist/src/mcp/tools/get-selected-element.js.map +1 -0
  63. package/dist/src/mcp/tools/lock-file.d.ts +28 -0
  64. package/dist/src/mcp/tools/lock-file.d.ts.map +1 -0
  65. package/dist/src/mcp/tools/lock-file.js +42 -0
  66. package/dist/src/mcp/tools/lock-file.js.map +1 -0
  67. package/dist/src/mcp/tools/unlock-file.d.ts +23 -0
  68. package/dist/src/mcp/tools/unlock-file.d.ts.map +1 -0
  69. package/dist/src/mcp/tools/unlock-file.js +23 -0
  70. package/dist/src/mcp/tools/unlock-file.js.map +1 -0
  71. package/dist/src/plugins/next/babel-loader.d.ts +8 -0
  72. package/dist/src/plugins/next/babel-loader.d.ts.map +1 -0
  73. package/dist/src/plugins/next/babel-loader.js +26 -0
  74. package/dist/src/plugins/next/babel-loader.js.map +1 -0
  75. package/dist/src/plugins/next/index.d.ts +23 -0
  76. package/dist/src/plugins/next/index.d.ts.map +1 -0
  77. package/dist/src/plugins/next/index.js +58 -0
  78. package/dist/src/plugins/next/index.js.map +1 -0
  79. package/dist/src/plugins/transform.d.ts +19 -0
  80. package/dist/src/plugins/transform.d.ts.map +1 -0
  81. package/dist/src/plugins/transform.js +177 -0
  82. package/dist/src/plugins/transform.js.map +1 -0
  83. package/dist/src/plugins/vite/index.d.ts +24 -0
  84. package/dist/src/plugins/vite/index.d.ts.map +1 -0
  85. package/dist/src/plugins/vite/index.js +56 -0
  86. package/dist/src/plugins/vite/index.js.map +1 -0
  87. package/package.json +32 -9
  88. package/skills/layout-md/SKILL.md +135 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../../src/cli/lint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function liveNotifyCommand(file?: string): Promise<void>;
2
+ //# sourceMappingURL=live-notify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-notify.d.ts","sourceRoot":"","sources":["../../../src/cli/live-notify.ts"],"names":[],"mappings":"AAUA,wBAAsB,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAepE"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * `layout-context live-notify [file]`
3
+ *
4
+ * The optional Claude Code hook (PRD 08) runs this after Claude edits a file.
5
+ * It best-effort pings a running layout Live over its Unix socket so Live can
6
+ * refresh / show a diff banner. Completely silent and a no-op when Live isn't
7
+ * running — it must never disrupt Claude Code's hook output.
8
+ */
9
+ import { connectToLive } from "../mcp/tools/_live-socket.js";
10
+ export async function liveNotifyCommand(file) {
11
+ let conn = null;
12
+ try {
13
+ conn = await connectToLive(process.cwd());
14
+ if (!conn)
15
+ return; // Live not running — silent no-op
16
+ await conn.send({
17
+ method: "notify",
18
+ params: { event: "claude-edited", file: file ?? null },
19
+ });
20
+ }
21
+ catch {
22
+ // Live may not implement `notify` yet, or the socket hiccuped — the
23
+ // connection attempt is itself the useful signal; stay silent.
24
+ }
25
+ finally {
26
+ conn?.close();
27
+ }
28
+ }
29
+ //# sourceMappingURL=live-notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-notify.js","sourceRoot":"","sources":["../../../src/cli/live-notify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAa;IACnD,IAAI,IAAI,GAA8C,IAAI,CAAC;IAC3D,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,kCAAkC;QACrD,MAAM,IAAI,CAAC,IAAI,CAAC;YACd,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE;SACvD,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,oEAAoE;QACpE,+DAA+D;IACjE,CAAC;YAAS,CAAC;QACT,IAAI,EAAE,KAAK,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type Framework = "vite" | "next" | "unknown";
2
+ /** Read package.json deps to decide which build plugin applies. */
3
+ export declare function detectFramework(projectRoot: string): Framework;
4
+ export declare function installLive(projectRoot: string): Promise<void>;
5
+ //# sourceMappingURL=live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../../src/install/live.ts"],"names":[],"mappings":"AAuBA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AA2CpD,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAe9D;AA2QD,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBpE"}
@@ -0,0 +1,285 @@
1
+ /**
2
+ * `npx @layoutdesign/context install --live`
3
+ *
4
+ * Wires a project up for layout Live:
5
+ * 1. Detect framework (vite | next) from package.json
6
+ * 2. Add the matching build plugin to vite.config / next.config (recast —
7
+ * formatting + comments preserved; original backed up first)
8
+ * 3. Create .layout/live/ with config.json + a local .gitignore
9
+ * 4. Append the layout-live managed block to CLAUDE.md
10
+ *
11
+ * Every step is idempotent: re-running --live when everything is already set
12
+ * up makes no changes and reports "already configured".
13
+ */
14
+ import fs from "node:fs";
15
+ import path from "node:path";
16
+ import { createRequire } from "node:module";
17
+ import chalk from "chalk";
18
+ const require = createRequire(import.meta.url);
19
+ // recast + its TS/JSX parser are CJS — load via createRequire under ESM.
20
+ const recast = require("recast");
21
+ const babelTsParser = require("recast/parsers/babel-ts");
22
+ const VITE_IMPORT = `import layout from "@layoutdesign/context/vite-plugin";`;
23
+ const NEXT_IMPORT = `import withLayout from "@layoutdesign/context/next-plugin";`;
24
+ const CLAUDE_BEGIN = "<!-- BEGIN layout-live (managed) -->";
25
+ const CLAUDE_END = "<!-- END layout-live (managed) -->";
26
+ const CLAUDE_BLOCK = `${CLAUDE_BEGIN}
27
+ ## Recent visual edits (layout Live)
28
+
29
+ The user has layout Live installed (desktop app). They may make visual edits — colour, spacing, typography tweaks — directly in their running app. These edits land in source files instantly.
30
+
31
+ When relevant, use these MCP tools:
32
+ - \`get-recent-visual-edits\` — recent class/token changes
33
+ - \`get-selected-element\` — element currently selected in Live (use when the user says "this" or "that one")
34
+ - \`lock-file\` / \`unlock-file\` — coordinate file access before editing
35
+
36
+ If you are about to edit a file the user is also editing visually:
37
+ 1. Call \`lock-file\` with the file path and a short TTL (default 60s).
38
+ 2. If the lock is held by Live, wait briefly and retry, or surface to the user.
39
+ 3. Make your edit, then call \`unlock-file\`.
40
+
41
+ The user holds priority on visual edits. Don't undo visual tweaks unless they explicitly ask.
42
+ ${CLAUDE_END}`;
43
+ const LIVE_CONFIG = {
44
+ $schema: "https://layout.design/schema/live-config/v1.json",
45
+ version: 1,
46
+ snapToScale: true,
47
+ complianceScoring: {
48
+ enabled: true,
49
+ debounceMs: 2000,
50
+ minEditsBetweenChecks: 5,
51
+ },
52
+ exclude: [],
53
+ };
54
+ const LIVE_GITIGNORE = "recent-edits.*\nlocks.json\nconflicts.json\n";
55
+ /** Read package.json deps to decide which build plugin applies. */
56
+ export function detectFramework(projectRoot) {
57
+ const pkgPath = path.join(projectRoot, "package.json");
58
+ if (!fs.existsSync(pkgPath))
59
+ return "unknown";
60
+ try {
61
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
62
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
63
+ if (deps["next"])
64
+ return "next";
65
+ if (deps["vite"])
66
+ return "vite";
67
+ }
68
+ catch {
69
+ /* fall through */
70
+ }
71
+ return "unknown";
72
+ }
73
+ function findConfig(projectRoot, base) {
74
+ for (const ext of ["ts", "mts", "js", "mjs"]) {
75
+ const p = path.join(projectRoot, `${base}.config.${ext}`);
76
+ if (fs.existsSync(p))
77
+ return p;
78
+ }
79
+ return null;
80
+ }
81
+ function backup(configPath) {
82
+ const backupPath = `${configPath}.layout-backup`;
83
+ if (!fs.existsSync(backupPath)) {
84
+ fs.copyFileSync(configPath, backupPath);
85
+ }
86
+ }
87
+ function parse(src) {
88
+ return recast.parse(src, { parser: babelTsParser });
89
+ }
90
+ /** Insert an import line at the top if its specifier isn't already present. */
91
+ function ensureImport(src, importLine, specifier) {
92
+ if (src.includes(specifier))
93
+ return src;
94
+ return `${importLine}\n${src}`;
95
+ }
96
+ /**
97
+ * Add `layout()` as the first entry of the Vite `plugins` array. Returns the
98
+ * new source, or null if the config shape is too unusual to edit safely.
99
+ */
100
+ function patchViteConfig(src) {
101
+ if (src.includes("@layoutdesign/context/vite-plugin"))
102
+ return src; // idempotent
103
+ let ast;
104
+ try {
105
+ ast = parse(src);
106
+ }
107
+ catch {
108
+ return null;
109
+ }
110
+ let patched = false;
111
+ // babel-ts produces ObjectProperty nodes (not ESTree Property).
112
+ recast.types.visit(ast, {
113
+ visitObjectProperty(p) {
114
+ const key = p.node.key;
115
+ const keyName = key?.name ?? key?.value;
116
+ if (keyName === "plugins" && p.node.value?.type === "ArrayExpression") {
117
+ const callExpr = recast.types.builders.callExpression(recast.types.builders.identifier("layout"), []);
118
+ p.node.value.elements.unshift(callExpr);
119
+ patched = true;
120
+ return false;
121
+ }
122
+ this.traverse(p);
123
+ },
124
+ });
125
+ if (!patched)
126
+ return null;
127
+ const printed = recast.print(ast).code;
128
+ return ensureImport(printed, VITE_IMPORT, "@layoutdesign/context/vite-plugin");
129
+ }
130
+ /**
131
+ * Wrap the default export with `withLayout(...)`. Handles
132
+ * `export default <expr>` (incl. an identifier referencing the config object).
133
+ */
134
+ function patchNextConfig(src) {
135
+ if (src.includes("@layoutdesign/context/next-plugin"))
136
+ return src; // idempotent
137
+ let ast;
138
+ try {
139
+ ast = parse(src);
140
+ }
141
+ catch {
142
+ return null;
143
+ }
144
+ const b = recast.types.builders;
145
+ let patched = false;
146
+ recast.types.visit(ast, {
147
+ visitExportDefaultDeclaration(p) {
148
+ const decl = p.node.declaration;
149
+ if (decl) {
150
+ p.node.declaration = b.callExpression(b.identifier("withLayout"), [
151
+ decl,
152
+ ]);
153
+ patched = true;
154
+ }
155
+ return false;
156
+ },
157
+ visitAssignmentExpression(p) {
158
+ // CommonJS: module.exports = <expr>
159
+ const left = p.node.left;
160
+ if (left?.type === "MemberExpression" &&
161
+ left.object?.name === "module" &&
162
+ left.property?.name === "exports") {
163
+ p.node.right = b.callExpression(b.identifier("withLayout"), [
164
+ p.node.right,
165
+ ]);
166
+ patched = true;
167
+ return false;
168
+ }
169
+ this.traverse(p);
170
+ },
171
+ });
172
+ if (!patched)
173
+ return null;
174
+ const printed = recast.print(ast).code;
175
+ const importLine = src.includes("module.exports")
176
+ ? `const withLayout = require("@layoutdesign/context/next-plugin").default;`
177
+ : NEXT_IMPORT;
178
+ return ensureImport(printed, importLine, "@layoutdesign/context/next-plugin");
179
+ }
180
+ function installPlugin(projectRoot, framework) {
181
+ const base = framework === "next" ? "next" : "vite";
182
+ const configPath = findConfig(projectRoot, base);
183
+ if (!configPath) {
184
+ console.log(chalk.yellow(" ⚠"), `No ${base}.config.* found. Add the plugin manually:`);
185
+ console.log(chalk.dim(framework === "next"
186
+ ? ` ${NEXT_IMPORT}\n export default withLayout({ /* ...config */ });`
187
+ : ` ${VITE_IMPORT}\n plugins: [layout(), react()]`));
188
+ return { changed: false };
189
+ }
190
+ const original = fs.readFileSync(configPath, "utf8");
191
+ const patched = framework === "next"
192
+ ? patchNextConfig(original)
193
+ : patchViteConfig(original);
194
+ if (patched === null) {
195
+ console.log(chalk.yellow(" ⚠"), `${path.basename(configPath)} has an unusual shape — not modified. Add manually:`);
196
+ console.log(chalk.dim(framework === "next"
197
+ ? ` Wrap your config export with withLayout() from @layoutdesign/context/next-plugin`
198
+ : ` Add layout() (before react()) to plugins, import from @layoutdesign/context/vite-plugin`));
199
+ return { changed: false };
200
+ }
201
+ if (patched === original) {
202
+ console.log(chalk.dim(" ↳"), `${path.basename(configPath)}: plugin already configured`);
203
+ return { changed: false };
204
+ }
205
+ backup(configPath);
206
+ fs.writeFileSync(configPath, patched);
207
+ console.log(chalk.green(" ✓"), `${path.basename(configPath)}: added layout build plugin ${chalk.dim("(backup: " + path.basename(configPath) + ".layout-backup)")}`);
208
+ return { changed: true };
209
+ }
210
+ function ensureLayoutLiveDir(projectRoot) {
211
+ const liveDir = path.join(projectRoot, ".layout", "live");
212
+ let changed = false;
213
+ fs.mkdirSync(liveDir, { recursive: true });
214
+ const configFile = path.join(liveDir, "config.json");
215
+ if (!fs.existsSync(configFile)) {
216
+ fs.writeFileSync(configFile, JSON.stringify(LIVE_CONFIG, null, 2) + "\n");
217
+ changed = true;
218
+ }
219
+ const gitignoreFile = path.join(liveDir, ".gitignore");
220
+ if (!fs.existsSync(gitignoreFile)) {
221
+ fs.writeFileSync(gitignoreFile, LIVE_GITIGNORE);
222
+ changed = true;
223
+ }
224
+ console.log(changed ? chalk.green(" ✓") : chalk.dim(" ↳"), changed
225
+ ? ".layout/live/ created (config.json + .gitignore)"
226
+ : ".layout/live/ already present");
227
+ return { changed };
228
+ }
229
+ /**
230
+ * Apply the delimited managed block to one agent file, idempotently.
231
+ * `createIfMissing` distinguishes CLAUDE.md (always created) from
232
+ * AGENTS.md / .cursorrules (only augmented if the project already has them).
233
+ */
234
+ function applyManagedBlock(file, label, createIfMissing) {
235
+ const exists = fs.existsSync(file);
236
+ if (!exists && !createIfMissing)
237
+ return { changed: false };
238
+ const existing = exists ? fs.readFileSync(file, "utf8") : "";
239
+ if (existing.includes(CLAUDE_BEGIN)) {
240
+ const before = existing.slice(0, existing.indexOf(CLAUDE_BEGIN));
241
+ const afterIdx = existing.indexOf(CLAUDE_END);
242
+ const after = afterIdx === -1 ? "" : existing.slice(afterIdx + CLAUDE_END.length);
243
+ const next = `${before}${CLAUDE_BLOCK}${after}`;
244
+ if (next === existing) {
245
+ console.log(chalk.dim(" ↳"), `${label}: managed block already current`);
246
+ return { changed: false };
247
+ }
248
+ fs.writeFileSync(file, next);
249
+ console.log(chalk.green(" ✓"), `${label}: refreshed layout-live block`);
250
+ return { changed: true };
251
+ }
252
+ const sep = existing.length === 0 ? "" : existing.endsWith("\n") ? "\n" : "\n\n";
253
+ fs.writeFileSync(file, `${existing}${sep}${CLAUDE_BLOCK}\n`);
254
+ console.log(chalk.green(" ✓"), existing.length === 0
255
+ ? `${label}: created with layout-live block`
256
+ : `${label}: appended layout-live block`);
257
+ return { changed: true };
258
+ }
259
+ function appendClaudeMdSection(projectRoot) {
260
+ // CLAUDE.md is created if absent; AGENTS.md / .cursorrules are only
261
+ // augmented when the project already exports them.
262
+ const claude = applyManagedBlock(path.join(projectRoot, "CLAUDE.md"), "CLAUDE.md", true);
263
+ const agents = applyManagedBlock(path.join(projectRoot, "AGENTS.md"), "AGENTS.md", false);
264
+ const cursor = applyManagedBlock(path.join(projectRoot, ".cursorrules"), ".cursorrules", false);
265
+ return {
266
+ changed: claude.changed || agents.changed || cursor.changed,
267
+ };
268
+ }
269
+ export async function installLive(projectRoot) {
270
+ console.log();
271
+ console.log(chalk.bold(" layout Live"));
272
+ const framework = detectFramework(projectRoot);
273
+ if (framework === "unknown") {
274
+ console.log(chalk.yellow(" ⚠"), "Could not detect Vite or Next.js in package.json — skipping plugin step.");
275
+ }
276
+ else {
277
+ console.log(chalk.dim(` ↳ Framework detected: ${framework}`));
278
+ installPlugin(projectRoot, framework);
279
+ }
280
+ ensureLayoutLiveDir(projectRoot);
281
+ appendClaudeMdSection(projectRoot);
282
+ console.log();
283
+ console.log(chalk.dim(" layout Live tools are exposed by the MCP server automatically."));
284
+ }
285
+ //# sourceMappingURL=live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.js","sourceRoot":"","sources":["../../../src/install/live.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Resolve a user-supplied kit reference into a directory that the loader can
3
+ * read. Accepts:
4
+ * 1. A path to a directory containing a .layout/ subfolder (default for
5
+ * consumer projects).
6
+ * 2. A path to a directory with layout.md at its root (a bundled kit or
7
+ * an unzipped export). Staged into a temp dir that wraps it in .layout/.
8
+ * 3. A bundled kit name (linear-lite, stripe-lite, notion-lite). Likewise
9
+ * staged.
10
+ *
11
+ * The caller MUST invoke the returned cleanup() when done to remove any temp
12
+ * directory the function created.
13
+ */
14
+ export interface StagedKit {
15
+ path: string;
16
+ cleanup: () => void;
17
+ }
18
+ export declare function stageKitReference(input: string | undefined): StagedKit;
19
+ //# sourceMappingURL=stage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage.d.ts","sourceRoot":"","sources":["../../../src/kit/stage.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAUtE"}
@@ -0,0 +1,30 @@
1
+ import { existsSync, mkdtempSync, writeFileSync, mkdirSync, readFileSync, rmSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join, resolve } from "node:path";
4
+ import { LAYOUT_DIR, LAYOUT_MD_FILE, TOKENS_CSS_FILE, TOKENS_JSON_FILE, KIT_MANIFEST_FILE, } from "./types.js";
5
+ import { getBundledKitPath } from "./loader.js";
6
+ export function stageKitReference(input) {
7
+ if (!input)
8
+ return { path: process.cwd(), cleanup: () => { } };
9
+ const abs = resolve(input);
10
+ if (existsSync(join(abs, LAYOUT_DIR)))
11
+ return { path: abs, cleanup: () => { } };
12
+ if (existsSync(join(abs, LAYOUT_MD_FILE)))
13
+ return stageDirAsKit(abs);
14
+ const bundled = getBundledKitPath(input);
15
+ if (bundled)
16
+ return stageDirAsKit(bundled);
17
+ return { path: abs, cleanup: () => { } };
18
+ }
19
+ function stageDirAsKit(kitDir) {
20
+ const tmp = mkdtempSync(join(tmpdir(), "layout-stage-"));
21
+ const layoutDir = join(tmp, LAYOUT_DIR);
22
+ mkdirSync(layoutDir, { recursive: true });
23
+ for (const f of [LAYOUT_MD_FILE, TOKENS_CSS_FILE, TOKENS_JSON_FILE, KIT_MANIFEST_FILE]) {
24
+ const src = join(kitDir, f);
25
+ if (existsSync(src))
26
+ writeFileSync(join(layoutDir, f), readFileSync(src));
27
+ }
28
+ return { path: tmp, cleanup: () => rmSync(tmp, { recursive: true, force: true }) };
29
+ }
30
+ //# sourceMappingURL=stage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage.js","sourceRoot":"","sources":["../../../src/kit/stage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,UAAU,EACV,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAoBhD,MAAM,UAAU,iBAAiB,CAAC,KAAyB;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;IAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;IAC/E,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAAE,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;IAErE,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,OAAO;QAAE,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;IAE3C,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,aAAa,CAAC,MAAc;IACnC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACxC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,EAAE,CAAC;QACvF,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5B,IAAI,UAAU,CAAC,GAAG,CAAC;YAAE,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACrF,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { Kit } from "../kit/types.js";
2
+ export interface TokenChange {
3
+ name: string;
4
+ before?: string;
5
+ after?: string;
6
+ }
7
+ export interface KitDiff {
8
+ tokens: {
9
+ added: TokenChange[];
10
+ removed: TokenChange[];
11
+ modified: TokenChange[];
12
+ };
13
+ sections: {
14
+ added: string[];
15
+ removed: string[];
16
+ };
17
+ summary: {
18
+ totalChanges: number;
19
+ breakingChanges: number;
20
+ };
21
+ }
22
+ export declare function diffKits(base: Kit, head: Kit): KitDiff;
23
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/lint/diff.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAE3C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE;QACN,KAAK,EAAE,WAAW,EAAE,CAAC;QACrB,OAAO,EAAE,WAAW,EAAE,CAAC;QACvB,QAAQ,EAAE,WAAW,EAAE,CAAC;KACzB,CAAC;IACF,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAqBD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAoCtD"}
@@ -0,0 +1,62 @@
1
+ // Token-level diff engine for two layout kits. Mirrors the shape of the
2
+ // extraction-diff UI in Studio so outputs are recognisable to anyone who
3
+ // has used re-extract.
4
+ function parseCssTokens(css) {
5
+ const map = new Map();
6
+ if (!css)
7
+ return map;
8
+ for (const match of css.matchAll(/^\s*(--[a-zA-Z0-9_-]+)\s*:\s*([^;\n]+);/gm)) {
9
+ const name = match[1];
10
+ const value = match[2];
11
+ if (name && value)
12
+ map.set(name, value.trim());
13
+ }
14
+ return map;
15
+ }
16
+ function parseSections(layoutMd) {
17
+ const out = new Set();
18
+ for (const match of layoutMd.matchAll(/^##\s+(.+)$/gm)) {
19
+ if (match[1])
20
+ out.add(match[1].trim());
21
+ }
22
+ return out;
23
+ }
24
+ export function diffKits(base, head) {
25
+ const baseTokens = parseCssTokens(base.tokensCss);
26
+ const headTokens = parseCssTokens(head.tokensCss);
27
+ const added = [];
28
+ const removed = [];
29
+ const modified = [];
30
+ for (const [name, value] of headTokens) {
31
+ if (!baseTokens.has(name)) {
32
+ added.push({ name, after: value });
33
+ }
34
+ else if (baseTokens.get(name) !== value) {
35
+ modified.push({ name, before: baseTokens.get(name), after: value });
36
+ }
37
+ }
38
+ for (const [name, value] of baseTokens) {
39
+ if (!headTokens.has(name))
40
+ removed.push({ name, before: value });
41
+ }
42
+ const baseSections = parseSections(base.layoutMd);
43
+ const headSections = parseSections(head.layoutMd);
44
+ const sectionsAdded = [];
45
+ const sectionsRemoved = [];
46
+ for (const s of headSections)
47
+ if (!baseSections.has(s))
48
+ sectionsAdded.push(s);
49
+ for (const s of baseSections)
50
+ if (!headSections.has(s))
51
+ sectionsRemoved.push(s);
52
+ const totalChanges = added.length + removed.length + modified.length + sectionsAdded.length + sectionsRemoved.length;
53
+ // Breaking: removed tokens + removed sections (references in downstream code
54
+ // may now fail).
55
+ const breakingChanges = removed.length + sectionsRemoved.length;
56
+ return {
57
+ tokens: { added, removed, modified },
58
+ sections: { added: sectionsAdded, removed: sectionsRemoved },
59
+ summary: { totalChanges, breakingChanges },
60
+ };
61
+ }
62
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/lint/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Kit } from "../kit/types.js";
2
+ export type LintSeverity = "error" | "warning" | "info";
3
+ export interface LintIssue {
4
+ ruleId: string;
5
+ severity: LintSeverity;
6
+ message: string;
7
+ file?: "layout.md" | "tokens.css" | "tokens.json";
8
+ line?: number;
9
+ detail?: Record<string, unknown>;
10
+ }
11
+ export interface LintResult {
12
+ issues: LintIssue[];
13
+ summary: {
14
+ errors: number;
15
+ warnings: number;
16
+ info: number;
17
+ passed: boolean;
18
+ };
19
+ }
20
+ export declare function lintKit(kit: Kit): LintResult;
21
+ //# sourceMappingURL=layout-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-md.d.ts","sourceRoot":"","sources":["../../../src/lint/layout-md.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAE3C,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAExD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,GAAG,YAAY,GAAG,aAAa,CAAC;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;CACH;AAqWD,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,UAAU,CAkB5C"}