@substrate-kit/cli 0.1.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.
Files changed (93) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +101 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/add.d.ts +6 -0
  6. package/dist/commands/add.d.ts.map +1 -0
  7. package/dist/commands/add.js +311 -0
  8. package/dist/commands/add.js.map +1 -0
  9. package/dist/commands/browse.d.ts +2 -0
  10. package/dist/commands/browse.d.ts.map +1 -0
  11. package/dist/commands/browse.js +25 -0
  12. package/dist/commands/browse.js.map +1 -0
  13. package/dist/commands/create.d.ts +9 -0
  14. package/dist/commands/create.d.ts.map +1 -0
  15. package/dist/commands/create.js +414 -0
  16. package/dist/commands/create.js.map +1 -0
  17. package/dist/commands/docs.d.ts +4 -0
  18. package/dist/commands/docs.d.ts.map +1 -0
  19. package/dist/commands/docs.js +155 -0
  20. package/dist/commands/docs.js.map +1 -0
  21. package/dist/commands/init.d.ts +6 -0
  22. package/dist/commands/init.d.ts.map +1 -0
  23. package/dist/commands/init.js +134 -0
  24. package/dist/commands/init.js.map +1 -0
  25. package/dist/commands/variables.d.ts +4 -0
  26. package/dist/commands/variables.d.ts.map +1 -0
  27. package/dist/commands/variables.js +111 -0
  28. package/dist/commands/variables.js.map +1 -0
  29. package/dist/index.d.ts +3 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +5 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/mcp/registry.d.ts +3 -0
  34. package/dist/mcp/registry.d.ts.map +1 -0
  35. package/dist/mcp/registry.js +43 -0
  36. package/dist/mcp/registry.js.map +1 -0
  37. package/dist/mcp/server.d.ts +3 -0
  38. package/dist/mcp/server.d.ts.map +1 -0
  39. package/dist/mcp/server.js +39 -0
  40. package/dist/mcp/server.js.map +1 -0
  41. package/dist/mcp/tools/get-component.d.ts +17 -0
  42. package/dist/mcp/tools/get-component.d.ts.map +1 -0
  43. package/dist/mcp/tools/get-component.js +23 -0
  44. package/dist/mcp/tools/get-component.js.map +1 -0
  45. package/dist/mcp/tools/install.d.ts +10 -0
  46. package/dist/mcp/tools/install.d.ts.map +1 -0
  47. package/dist/mcp/tools/install.js +40 -0
  48. package/dist/mcp/tools/install.js.map +1 -0
  49. package/dist/mcp/tools/search.d.ts +11 -0
  50. package/dist/mcp/tools/search.d.ts.map +1 -0
  51. package/dist/mcp/tools/search.js +30 -0
  52. package/dist/mcp/tools/search.js.map +1 -0
  53. package/dist/mcp/tools/theme.d.ts +10 -0
  54. package/dist/mcp/tools/theme.d.ts.map +1 -0
  55. package/dist/mcp/tools/theme.js +37 -0
  56. package/dist/mcp/tools/theme.js.map +1 -0
  57. package/dist/mcp/types.d.ts +31 -0
  58. package/dist/mcp/types.d.ts.map +1 -0
  59. package/dist/mcp/types.js +2 -0
  60. package/dist/mcp/types.js.map +1 -0
  61. package/dist/utils/detect-pm.d.ts +5 -0
  62. package/dist/utils/detect-pm.d.ts.map +1 -0
  63. package/dist/utils/detect-pm.js +20 -0
  64. package/dist/utils/detect-pm.js.map +1 -0
  65. package/dist/utils/fs.d.ts +7 -0
  66. package/dist/utils/fs.d.ts.map +1 -0
  67. package/dist/utils/fs.js +52 -0
  68. package/dist/utils/fs.js.map +1 -0
  69. package/dist/utils/logger.d.ts +10 -0
  70. package/dist/utils/logger.d.ts.map +1 -0
  71. package/dist/utils/logger.js +15 -0
  72. package/dist/utils/logger.js.map +1 -0
  73. package/dist/utils/shell.d.ts +7 -0
  74. package/dist/utils/shell.d.ts.map +1 -0
  75. package/dist/utils/shell.js +28 -0
  76. package/dist/utils/shell.js.map +1 -0
  77. package/package.json +37 -0
  78. package/skills/3d-scene/SKILL.md +172 -0
  79. package/skills/animation/SKILL.md +194 -0
  80. package/skills/canvas-2d/SKILL.md +132 -0
  81. package/skills/composing-panels/SKILL.md +309 -0
  82. package/skills/create-custom-tool/SKILL.md +157 -0
  83. package/skills/data-visualisation/SKILL.md +228 -0
  84. package/skills/image-generation/SKILL.md +211 -0
  85. package/skills/scaffold-playground/SKILL.md +141 -0
  86. package/skills/substrate-canvas/SKILL.md +217 -0
  87. package/skills/substrate-controls/SKILL.md +242 -0
  88. package/skills/substrate-feedback/SKILL.md +219 -0
  89. package/skills/substrate-interaction/SKILL.md +286 -0
  90. package/skills/substrate-nodes/SKILL.md +208 -0
  91. package/skills/substrate-scaffold/SKILL.md +206 -0
  92. package/skills/theming/SKILL.md +117 -0
  93. package/skills/wire-interactions/SKILL.md +155 -0
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function createCli(): Command;
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA0BnC,wBAAgB,SAAS,IAAI,OAAO,CAkFnC"}
package/dist/cli.js ADDED
@@ -0,0 +1,101 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ import { Command } from "commander";
3
+ import { init } from "./commands/init.js";
4
+ import { add } from "./commands/add.js";
5
+ import { create } from "./commands/create.js";
6
+ import { docs } from "./commands/docs.js";
7
+ import { browse } from "./commands/browse.js";
8
+ import { variables } from "./commands/variables.js";
9
+ import { startServer } from "./mcp/server.js";
10
+ import { log } from "./utils/logger.js";
11
+ async function promptProjectName() {
12
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
13
+ try {
14
+ log.blank();
15
+ const name = await rl.question(" Project name: ");
16
+ const trimmed = name.trim();
17
+ if (!trimmed) {
18
+ log.error("Project name is required");
19
+ process.exit(1);
20
+ }
21
+ return trimmed;
22
+ }
23
+ finally {
24
+ rl.close();
25
+ }
26
+ }
27
+ export function createCli() {
28
+ const program = new Command();
29
+ program
30
+ .name("substrate-kit")
31
+ .description("Scaffold interactive canvas playgrounds with Substrate primitives")
32
+ .version("0.1.0");
33
+ program
34
+ .command("init")
35
+ .description("Initialise Substrate skills and configuration in the current project")
36
+ .option("--force", "Overwrite existing skills and CLAUDE.md", false)
37
+ .option("--skip-components-json", "Don't touch components.json", false)
38
+ .action(async (options) => {
39
+ await init({
40
+ force: options.force,
41
+ skipComponentsJson: options.skipComponentsJson,
42
+ });
43
+ });
44
+ program
45
+ .command("create")
46
+ .description("Create a new Substrate playground project (alias for npx create-substrate)")
47
+ .argument("[project-name]", "Name for the new project")
48
+ .option("--surface <type>", "Surface type (canvas-2d, 3d-scene, animation, node-editor, data-vis, image-gen, blank)")
49
+ .option("--skip-install", "Skip dependency installation", false)
50
+ .option("--skip-git", "Don't initialise git", false)
51
+ .option("--package-manager <pm>", "Force package manager (npm, pnpm, bun)")
52
+ .action(async (projectName, options) => {
53
+ const name = projectName || await promptProjectName();
54
+ await create(name, {
55
+ surface: options.surface,
56
+ skipInstall: options.skipInstall,
57
+ skipGit: options.skipGit,
58
+ packageManager: options.packageManager,
59
+ });
60
+ });
61
+ program
62
+ .command("add")
63
+ .description("Install Substrate components from substrate.georgedrury.co.uk")
64
+ .argument("[components...]", "Component names to install (opens picker if omitted)")
65
+ .option("--category <name>", "Install all components in a category")
66
+ .option("--list-categories", "Show available categories and their components", false)
67
+ .action(async (components, options) => {
68
+ await add(components, { category: options.category, listCategories: options.listCategories });
69
+ });
70
+ program
71
+ .command("docs")
72
+ .description("View component documentation in the terminal")
73
+ .argument("[component]", "Component name or search query")
74
+ .option("--list", "List all components", false)
75
+ .action(async (component, options) => {
76
+ await docs(component, { list: options.list });
77
+ });
78
+ program
79
+ .command("browse")
80
+ .description("Open component docs in the browser")
81
+ .argument("[component]", "Component name (opens docs home if omitted)")
82
+ .action((component) => {
83
+ browse(component);
84
+ });
85
+ program
86
+ .command("variables")
87
+ .description("Show theme override variables for a component")
88
+ .argument("[component]", "Component name (e.g. panel, design-canvas)")
89
+ .option("--all", "List all components with theme variables", false)
90
+ .action(async (component, options) => {
91
+ await variables(component, { all: options.all });
92
+ });
93
+ program
94
+ .command("mcp")
95
+ .description("Start the Substrate MCP server (stdio transport)")
96
+ .action(async () => {
97
+ await startServer();
98
+ });
99
+ return program;
100
+ }
101
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface AddOptions {
2
+ category?: string;
3
+ listCategories?: boolean;
4
+ }
5
+ export declare function add(components: string[], options?: AddOptions): Promise<void>;
6
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AA6PA,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,OAAO,CAAA;CACxB;AAgBD,wBAAsB,GAAG,CACxB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,GAAE,UAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CAuGf"}
@@ -0,0 +1,311 @@
1
+ import { createInterface } from "node:readline";
2
+ import { join, dirname } from "node:path";
3
+ import { readFileSync, existsSync } from "node:fs";
4
+ import { fileURLToPath } from "node:url";
5
+ import { exec } from "../utils/shell.js";
6
+ import { exists } from "../utils/fs.js";
7
+ import { log } from "../utils/logger.js";
8
+ const __dirname = dirname(fileURLToPath(import.meta.url));
9
+ const REGISTRY_BASE = "https://substrate.georgedrury.co.uk/r";
10
+ const REGISTRY_URL = "https://substrate.georgedrury.co.uk/registry.json";
11
+ async function loadRegistry() {
12
+ const localPath = join(process.cwd(), "registry.json");
13
+ if (existsSync(localPath)) {
14
+ try {
15
+ return JSON.parse(readFileSync(localPath, "utf-8"));
16
+ }
17
+ catch {
18
+ /* fall through */
19
+ }
20
+ }
21
+ try {
22
+ const res = await fetch(REGISTRY_URL);
23
+ if (res.ok)
24
+ return (await res.json());
25
+ }
26
+ catch {
27
+ /* fall through */
28
+ }
29
+ const bundledPaths = [
30
+ join(__dirname, "..", "..", "registry.json"),
31
+ join(__dirname, "..", "..", "..", "registry.json"),
32
+ ];
33
+ for (const p of bundledPaths) {
34
+ if (existsSync(p)) {
35
+ try {
36
+ return JSON.parse(readFileSync(p, "utf-8"));
37
+ }
38
+ catch {
39
+ /* fall through */
40
+ }
41
+ }
42
+ }
43
+ return null;
44
+ }
45
+ function getCategories(registry) {
46
+ const cats = new Map();
47
+ for (const item of registry.items) {
48
+ for (const cat of item.categories || ["other"]) {
49
+ if (!cats.has(cat))
50
+ cats.set(cat, []);
51
+ cats.get(cat).push(item);
52
+ }
53
+ }
54
+ return cats;
55
+ }
56
+ async function interactivePicker(registry) {
57
+ const items = registry.items;
58
+ const selected = new Set();
59
+ let cursor = 0;
60
+ let searchQuery = "";
61
+ let mode = "browse";
62
+ function getFiltered() {
63
+ if (!searchQuery)
64
+ return items;
65
+ const q = searchQuery.toLowerCase();
66
+ return items.filter((i) => i.name.includes(q) ||
67
+ (i.title || "").toLowerCase().includes(q) ||
68
+ (i.description || "").toLowerCase().includes(q) ||
69
+ (i.categories || []).some((c) => c.toLowerCase().includes(q)));
70
+ }
71
+ function render() {
72
+ const filtered = getFiltered();
73
+ const pageSize = Math.min(15, process.stdout.rows - 6);
74
+ const start = Math.max(0, cursor - pageSize + 1);
75
+ const end = Math.min(filtered.length, start + pageSize);
76
+ process.stdout.write("\x1B[2J\x1B[H");
77
+ console.log(" Select components to install (space to toggle, enter to confirm, / to search)\n");
78
+ if (searchQuery) {
79
+ console.log(` Search: ${searchQuery} (${filtered.length} results)\n`);
80
+ }
81
+ for (let i = start; i < end; i++) {
82
+ const item = filtered[i];
83
+ const originalIdx = items.indexOf(item);
84
+ const isSelected = selected.has(originalIdx);
85
+ const isCursor = i === cursor;
86
+ const marker = isSelected ? "[x]" : "[ ]";
87
+ const pointer = isCursor ? ">" : " ";
88
+ const desc = item.description
89
+ ? ` — ${item.description.slice(0, 50)}${item.description.length > 50 ? "..." : ""}`
90
+ : "";
91
+ console.log(` ${pointer} ${marker} ${item.name}${desc}`);
92
+ }
93
+ console.log();
94
+ const count = selected.size;
95
+ console.log(` ${count} selected${count > 0 ? ": " + [...selected].map((i) => items[i].name).join(", ") : ""}`);
96
+ }
97
+ return new Promise((resolve) => {
98
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
99
+ if (process.stdin.isTTY) {
100
+ process.stdin.setRawMode(true);
101
+ }
102
+ process.stdin.resume();
103
+ render();
104
+ process.stdin.on("data", (data) => {
105
+ const key = data.toString();
106
+ const filtered = getFiltered();
107
+ if (mode === "search") {
108
+ if (key === "\r" || key === "\n" || key === "\x1B") {
109
+ mode = "browse";
110
+ cursor = 0;
111
+ render();
112
+ return;
113
+ }
114
+ if (key === "\x7F" || key === "\b") {
115
+ searchQuery = searchQuery.slice(0, -1);
116
+ cursor = 0;
117
+ render();
118
+ return;
119
+ }
120
+ if (key.length === 1 && key >= " ") {
121
+ searchQuery += key;
122
+ cursor = 0;
123
+ render();
124
+ return;
125
+ }
126
+ return;
127
+ }
128
+ if (key === "/" || key === "f") {
129
+ mode = "search";
130
+ searchQuery = "";
131
+ cursor = 0;
132
+ render();
133
+ return;
134
+ }
135
+ if (key === "\x1B[A" || key === "k") {
136
+ cursor = Math.max(0, cursor - 1);
137
+ render();
138
+ return;
139
+ }
140
+ if (key === "\x1B[B" || key === "j") {
141
+ cursor = Math.min(filtered.length - 1, cursor + 1);
142
+ render();
143
+ return;
144
+ }
145
+ if (key === " ") {
146
+ if (filtered.length > 0) {
147
+ const originalIdx = items.indexOf(filtered[cursor]);
148
+ if (selected.has(originalIdx)) {
149
+ selected.delete(originalIdx);
150
+ }
151
+ else {
152
+ selected.add(originalIdx);
153
+ }
154
+ }
155
+ render();
156
+ return;
157
+ }
158
+ if (key === "\r" || key === "\n") {
159
+ if (process.stdin.isTTY) {
160
+ process.stdin.setRawMode(false);
161
+ }
162
+ rl.close();
163
+ process.stdout.write("\x1B[2J\x1B[H");
164
+ resolve([...selected].map((i) => items[i].name));
165
+ return;
166
+ }
167
+ if (key === "q" || key === "\x03") {
168
+ if (process.stdin.isTTY) {
169
+ process.stdin.setRawMode(false);
170
+ }
171
+ rl.close();
172
+ process.stdout.write("\x1B[2J\x1B[H");
173
+ resolve([]);
174
+ return;
175
+ }
176
+ if (key === "a") {
177
+ for (const item of filtered) {
178
+ selected.add(items.indexOf(item));
179
+ }
180
+ render();
181
+ return;
182
+ }
183
+ if (key === "n") {
184
+ selected.clear();
185
+ render();
186
+ return;
187
+ }
188
+ });
189
+ });
190
+ }
191
+ function extractOverrideKeys(item) {
192
+ const theme = item.cssVars?.theme;
193
+ if (!theme)
194
+ return [];
195
+ const keys = [];
196
+ for (const value of Object.values(theme)) {
197
+ const match = value.match(/^var\(--([^,)]+)/);
198
+ if (match)
199
+ keys.push(`--${match[1]}`);
200
+ }
201
+ return keys;
202
+ }
203
+ function printThemeHint(item) {
204
+ const keys = extractOverrideKeys(item);
205
+ if (keys.length === 0)
206
+ return;
207
+ console.log();
208
+ console.log(` Theme overrides:`);
209
+ for (const key of keys) {
210
+ console.log(` ${key}`);
211
+ }
212
+ }
213
+ function printCategories(registry) {
214
+ const cats = getCategories(registry);
215
+ console.log();
216
+ console.log("Available categories:");
217
+ console.log();
218
+ for (const [category, items] of cats) {
219
+ console.log(` ${category} (${items.length})`);
220
+ for (const item of items) {
221
+ console.log(` ${item.name}`);
222
+ }
223
+ console.log();
224
+ }
225
+ }
226
+ export async function add(components, options = {}) {
227
+ if (options.listCategories) {
228
+ const registry = await loadRegistry();
229
+ if (!registry) {
230
+ log.error("Could not load the Substrate registry.");
231
+ process.exit(1);
232
+ }
233
+ printCategories(registry);
234
+ return;
235
+ }
236
+ let cwd = process.cwd();
237
+ let found = false;
238
+ while (cwd !== "/") {
239
+ if (exists(join(cwd, "components.json"))) {
240
+ found = true;
241
+ break;
242
+ }
243
+ cwd = join(cwd, "..");
244
+ }
245
+ if (!found) {
246
+ log.error("No components.json found. Run 'substrate init' first or ensure you're in a project directory.");
247
+ process.exit(1);
248
+ }
249
+ if (options.category && components.length === 0) {
250
+ const registry = await loadRegistry();
251
+ if (!registry) {
252
+ log.error("Could not load the Substrate registry.");
253
+ process.exit(1);
254
+ }
255
+ const cats = getCategories(registry);
256
+ const catItems = cats.get(options.category.toLowerCase());
257
+ if (!catItems) {
258
+ log.error(`Category "${options.category}" not found.`);
259
+ console.log();
260
+ printCategories(registry);
261
+ process.exit(1);
262
+ }
263
+ components = catItems.map((i) => i.name);
264
+ console.log();
265
+ console.log(` ${options.category} (${components.length} components)`);
266
+ for (const name of components) {
267
+ console.log(` ${name}`);
268
+ }
269
+ console.log();
270
+ }
271
+ if (components.length === 0) {
272
+ const registry = await loadRegistry();
273
+ if (!registry) {
274
+ log.error("Could not load the Substrate registry.");
275
+ log.info("Usage: substrate add design-canvas toolbar panel");
276
+ process.exit(1);
277
+ }
278
+ if (!process.stdin.isTTY) {
279
+ log.error("Interactive mode requires a terminal. Specify components: substrate add design-canvas toolbar");
280
+ process.exit(1);
281
+ }
282
+ components = await interactivePicker(registry);
283
+ if (components.length === 0) {
284
+ log.info("No components selected.");
285
+ return;
286
+ }
287
+ }
288
+ const registry = await loadRegistry();
289
+ log.title("Adding Substrate components");
290
+ let installed = 0;
291
+ for (const component of components) {
292
+ const url = `${REGISTRY_BASE}/${component}`;
293
+ log.step(`Installing ${component}`);
294
+ try {
295
+ exec(`npx shadcn@latest add ${url}`, { cwd });
296
+ log.success(`Installed ${component}`);
297
+ installed++;
298
+ if (registry) {
299
+ const item = registry.items.find((i) => i.name === component);
300
+ if (item)
301
+ printThemeHint(item);
302
+ }
303
+ }
304
+ catch {
305
+ log.error(`Failed to install ${component}`);
306
+ }
307
+ }
308
+ log.blank();
309
+ log.info(`Added ${installed} component${installed === 1 ? "" : "s"} from substrate.georgedrury.co.uk`);
310
+ }
311
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function browse(component?: string): void;
2
+ //# sourceMappingURL=browse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browse.d.ts","sourceRoot":"","sources":["../../src/commands/browse.ts"],"names":[],"mappings":"AAKA,wBAAgB,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAiB/C"}
@@ -0,0 +1,25 @@
1
+ import { execSync } from "node:child_process";
2
+ import { log } from "../utils/logger.js";
3
+ const DOCS_BASE = "https://substrate.georgedrury.co.uk/docs/components";
4
+ export function browse(component) {
5
+ const url = component
6
+ ? `${DOCS_BASE}/${component}`
7
+ : "https://substrate.georgedrury.co.uk/docs";
8
+ log.info(`Opening ${url}`);
9
+ try {
10
+ const platform = process.platform;
11
+ if (platform === "darwin") {
12
+ execSync(`open "${url}"`);
13
+ }
14
+ else if (platform === "win32") {
15
+ execSync(`start "${url}"`);
16
+ }
17
+ else {
18
+ execSync(`xdg-open "${url}"`);
19
+ }
20
+ }
21
+ catch {
22
+ log.error(`Could not open browser. Visit: ${url}`);
23
+ }
24
+ }
25
+ //# sourceMappingURL=browse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browse.js","sourceRoot":"","sources":["../../src/commands/browse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AAExC,MAAM,SAAS,GAAG,qDAAqD,CAAA;AAEvE,MAAM,UAAU,MAAM,CAAC,SAAkB;IACxC,MAAM,GAAG,GAAG,SAAS;QACpB,CAAC,CAAC,GAAG,SAAS,IAAI,SAAS,EAAE;QAC7B,CAAC,CAAC,0CAA0C,CAAA;IAC7C,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,CAAA;IAC1B,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;QACjC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC3B,QAAQ,CAAC,SAAS,GAAG,GAAG,CAAC,CAAA;QAC1B,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC,CAAA;QAC3B,CAAC;aAAM,CAAC;YACP,QAAQ,CAAC,aAAa,GAAG,GAAG,CAAC,CAAA;QAC9B,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,GAAG,CAAC,KAAK,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAA;IACnD,CAAC;AACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type PackageManager } from "../utils/detect-pm.js";
2
+ export interface CreateOptions {
3
+ surface?: string;
4
+ skipInstall?: boolean;
5
+ skipGit?: boolean;
6
+ packageManager?: PackageManager;
7
+ }
8
+ export declare function create(projectName: string, options?: CreateOptions): Promise<void>;
9
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAKA,OAAO,EAGN,KAAK,cAAc,EACnB,MAAM,uBAAuB,CAAA;AA4B9B,MAAM,WAAW,aAAa;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,cAAc,CAAA;CAC/B;AAED,wBAAsB,MAAM,CAC3B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,aAAkB,GACzB,OAAO,CAAC,IAAI,CAAC,CAoGf"}