create-substrate 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 (81) hide show
  1. package/dist/index.d.ts +3 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +27 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/prompts.d.ts +6 -0
  6. package/dist/prompts.d.ts.map +1 -0
  7. package/dist/prompts.js +127 -0
  8. package/dist/prompts.js.map +1 -0
  9. package/dist/scaffold.d.ts +10 -0
  10. package/dist/scaffold.d.ts.map +1 -0
  11. package/dist/scaffold.js +395 -0
  12. package/dist/scaffold.js.map +1 -0
  13. package/dist/surfaces/3d-scene.d.ts +3 -0
  14. package/dist/surfaces/3d-scene.d.ts.map +1 -0
  15. package/dist/surfaces/3d-scene.js +184 -0
  16. package/dist/surfaces/3d-scene.js.map +1 -0
  17. package/dist/surfaces/animation.d.ts +3 -0
  18. package/dist/surfaces/animation.d.ts.map +1 -0
  19. package/dist/surfaces/animation.js +211 -0
  20. package/dist/surfaces/animation.js.map +1 -0
  21. package/dist/surfaces/blank.d.ts +3 -0
  22. package/dist/surfaces/blank.d.ts.map +1 -0
  23. package/dist/surfaces/blank.js +72 -0
  24. package/dist/surfaces/blank.js.map +1 -0
  25. package/dist/surfaces/canvas-2d.d.ts +3 -0
  26. package/dist/surfaces/canvas-2d.d.ts.map +1 -0
  27. package/dist/surfaces/canvas-2d.js +139 -0
  28. package/dist/surfaces/canvas-2d.js.map +1 -0
  29. package/dist/surfaces/data-vis.d.ts +3 -0
  30. package/dist/surfaces/data-vis.d.ts.map +1 -0
  31. package/dist/surfaces/data-vis.js +175 -0
  32. package/dist/surfaces/data-vis.js.map +1 -0
  33. package/dist/surfaces/image-gen.d.ts +3 -0
  34. package/dist/surfaces/image-gen.d.ts.map +1 -0
  35. package/dist/surfaces/image-gen.js +193 -0
  36. package/dist/surfaces/image-gen.js.map +1 -0
  37. package/dist/surfaces/index.d.ts +4 -0
  38. package/dist/surfaces/index.d.ts.map +1 -0
  39. package/dist/surfaces/index.js +17 -0
  40. package/dist/surfaces/index.js.map +1 -0
  41. package/dist/surfaces/node-editor.d.ts +3 -0
  42. package/dist/surfaces/node-editor.d.ts.map +1 -0
  43. package/dist/surfaces/node-editor.js +211 -0
  44. package/dist/surfaces/node-editor.js.map +1 -0
  45. package/dist/surfaces/types.d.ts +22 -0
  46. package/dist/surfaces/types.d.ts.map +1 -0
  47. package/dist/surfaces/types.js +10 -0
  48. package/dist/surfaces/types.js.map +1 -0
  49. package/dist/utils/detect-pm.d.ts +5 -0
  50. package/dist/utils/detect-pm.d.ts.map +1 -0
  51. package/dist/utils/detect-pm.js +20 -0
  52. package/dist/utils/detect-pm.js.map +1 -0
  53. package/dist/utils/fs.d.ts +7 -0
  54. package/dist/utils/fs.d.ts.map +1 -0
  55. package/dist/utils/fs.js +52 -0
  56. package/dist/utils/fs.js.map +1 -0
  57. package/dist/utils/logger.d.ts +10 -0
  58. package/dist/utils/logger.d.ts.map +1 -0
  59. package/dist/utils/logger.js +15 -0
  60. package/dist/utils/logger.js.map +1 -0
  61. package/dist/utils/shell.d.ts +7 -0
  62. package/dist/utils/shell.d.ts.map +1 -0
  63. package/dist/utils/shell.js +28 -0
  64. package/dist/utils/shell.js.map +1 -0
  65. package/package.json +35 -0
  66. package/skills/3d-scene/SKILL.md +172 -0
  67. package/skills/animation/SKILL.md +194 -0
  68. package/skills/canvas-2d/SKILL.md +132 -0
  69. package/skills/composing-panels/SKILL.md +309 -0
  70. package/skills/create-custom-tool/SKILL.md +157 -0
  71. package/skills/data-visualisation/SKILL.md +228 -0
  72. package/skills/image-generation/SKILL.md +211 -0
  73. package/skills/scaffold-playground/SKILL.md +141 -0
  74. package/skills/substrate-canvas/SKILL.md +217 -0
  75. package/skills/substrate-controls/SKILL.md +242 -0
  76. package/skills/substrate-feedback/SKILL.md +219 -0
  77. package/skills/substrate-interaction/SKILL.md +286 -0
  78. package/skills/substrate-nodes/SKILL.md +208 -0
  79. package/skills/substrate-scaffold/SKILL.md +206 -0
  80. package/skills/theming/SKILL.md +117 -0
  81. package/skills/wire-interactions/SKILL.md +155 -0
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { scaffold } from "./scaffold.js";
4
+ import { promptName, promptSurface, promptPackageManager } from "./prompts.js";
5
+ const program = new Command();
6
+ program
7
+ .name("create-substrate")
8
+ .description("Scaffold a Substrate creative tool playground")
9
+ .version("0.1.0")
10
+ .argument("[project-name]", "Name for the new project")
11
+ .option("--surface <type>", "Surface type (canvas-2d, 3d-scene, animation, node-editor, data-vis, image-gen, blank)")
12
+ .option("--pm <manager>", "Package manager (npm, pnpm, bun)")
13
+ .option("--skip-install", "Skip dependency installation", false)
14
+ .option("--skip-git", "Don't initialise a git repository", false)
15
+ .action(async (projectName, options) => {
16
+ const name = projectName || await promptName();
17
+ const surface = options.surface || await promptSurface();
18
+ const pm = options.pm || await promptPackageManager();
19
+ await scaffold(name, {
20
+ surface,
21
+ packageManager: pm,
22
+ skipInstall: options.skipInstall,
23
+ skipGit: options.skipGit,
24
+ });
25
+ });
26
+ program.parse();
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAI9E,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,kBAAkB,CAAC;KACxB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,OAAO,CAAC,OAAO,CAAC;KAChB,QAAQ,CAAC,gBAAgB,EAAE,0BAA0B,CAAC;KACtD,MAAM,CAAC,kBAAkB,EAAE,wFAAwF,CAAC;KACpH,MAAM,CAAC,gBAAgB,EAAE,kCAAkC,CAAC;KAC5D,MAAM,CAAC,gBAAgB,EAAE,8BAA8B,EAAE,KAAK,CAAC;KAC/D,MAAM,CAAC,YAAY,EAAE,mCAAmC,EAAE,KAAK,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,WAA+B,EAAE,OAAO,EAAE,EAAE;IACzD,MAAM,IAAI,GAAG,WAAW,IAAI,MAAM,UAAU,EAAE,CAAA;IAC9C,MAAM,OAAO,GAAI,OAAO,CAAC,OAAuB,IAAI,MAAM,aAAa,EAAE,CAAA;IACzE,MAAM,EAAE,GAAI,OAAO,CAAC,EAAqB,IAAI,MAAM,oBAAoB,EAAE,CAAA;IAEzE,MAAM,QAAQ,CAAC,IAAI,EAAE;QACnB,OAAO;QACP,cAAc,EAAE,EAAE;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEJ,OAAO,CAAC,KAAK,EAAE,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { type SurfaceType } from "./surfaces/types.js";
2
+ import type { PackageManager } from "./utils/detect-pm.js";
3
+ export declare function promptName(): Promise<string>;
4
+ export declare function promptSurface(): Promise<SurfaceType>;
5
+ export declare function promptPackageManager(): Promise<PackageManager>;
6
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAM1D,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAalD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,WAAW,CAAC,CA4D1D;AAQD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,cAAc,CAAC,CA6CpE"}
@@ -0,0 +1,127 @@
1
+ import { createInterface } from "node:readline";
2
+ import chalk from "chalk";
3
+ import { SURFACE_OPTIONS } from "./surfaces/types.js";
4
+ function createRl() {
5
+ return createInterface({ input: process.stdin, output: process.stdout });
6
+ }
7
+ export async function promptName() {
8
+ const rl = createRl();
9
+ return new Promise((resolve) => {
10
+ rl.question(` ${chalk.bold("Project name:")} `, (answer) => {
11
+ rl.close();
12
+ const name = answer.trim();
13
+ if (!name) {
14
+ console.error(chalk.red(" Project name is required"));
15
+ process.exit(1);
16
+ }
17
+ resolve(name);
18
+ });
19
+ });
20
+ }
21
+ export async function promptSurface() {
22
+ const options = SURFACE_OPTIONS;
23
+ let cursor = 0;
24
+ return new Promise((resolve) => {
25
+ if (!process.stdin.isTTY) {
26
+ resolve("canvas-2d");
27
+ return;
28
+ }
29
+ process.stdin.setRawMode(true);
30
+ process.stdin.resume();
31
+ function render() {
32
+ // Move cursor up to clear previous render (except first time)
33
+ const lines = options.length + 2;
34
+ process.stdout.write(`\x1B[${lines}A\x1B[J`);
35
+ console.log(` ${chalk.bold("Surface type:")}`);
36
+ console.log();
37
+ for (let i = 0; i < options.length; i++) {
38
+ const opt = options[i];
39
+ const selected = i === cursor;
40
+ const bullet = selected ? chalk.cyan("●") : chalk.dim("○");
41
+ const label = selected ? chalk.bold(opt.label) : opt.label;
42
+ const desc = chalk.dim(opt.description);
43
+ console.log(` ${bullet} ${label.padEnd(20)} ${desc}`);
44
+ }
45
+ }
46
+ // Initial render — print blank lines first so the clear works
47
+ console.log(` ${chalk.bold("Surface type:")}`);
48
+ console.log();
49
+ for (const opt of options) {
50
+ const bullet = chalk.dim("○");
51
+ const desc = chalk.dim(opt.description);
52
+ console.log(` ${bullet} ${opt.label.padEnd(20)} ${desc}`);
53
+ }
54
+ render();
55
+ process.stdin.on("data", (data) => {
56
+ const key = data.toString();
57
+ if (key === "\x1B[A" || key === "k") {
58
+ cursor = Math.max(0, cursor - 1);
59
+ render();
60
+ }
61
+ else if (key === "\x1B[B" || key === "j") {
62
+ cursor = Math.min(options.length - 1, cursor + 1);
63
+ render();
64
+ }
65
+ else if (key === "\r" || key === "\n") {
66
+ process.stdin.setRawMode(false);
67
+ process.stdin.pause();
68
+ process.stdin.removeAllListeners("data");
69
+ console.log();
70
+ resolve(options[cursor].value);
71
+ }
72
+ else if (key === "\x03") {
73
+ process.stdin.setRawMode(false);
74
+ process.exit(0);
75
+ }
76
+ });
77
+ });
78
+ }
79
+ const PM_OPTIONS = [
80
+ { value: "npm", label: "npm" },
81
+ { value: "pnpm", label: "pnpm" },
82
+ { value: "bun", label: "bun" },
83
+ ];
84
+ export async function promptPackageManager() {
85
+ let cursor = 0;
86
+ return new Promise((resolve) => {
87
+ if (!process.stdin.isTTY) {
88
+ resolve("npm");
89
+ return;
90
+ }
91
+ process.stdin.setRawMode(true);
92
+ process.stdin.resume();
93
+ function render() {
94
+ process.stdout.write(`\x1B[1A\x1B[J`);
95
+ const items = PM_OPTIONS.map((opt, i) => {
96
+ const selected = i === cursor;
97
+ return selected ? chalk.cyan.bold(opt.label) : chalk.dim(opt.label);
98
+ }).join(" ");
99
+ console.log(` ${chalk.bold("Package manager:")} ${items}`);
100
+ }
101
+ console.log(` ${chalk.bold("Package manager:")} ${PM_OPTIONS.map((o) => chalk.dim(o.label)).join(" ")}`);
102
+ render();
103
+ process.stdin.on("data", (data) => {
104
+ const key = data.toString();
105
+ if (key === "\x1B[D" || key === "h") {
106
+ cursor = Math.max(0, cursor - 1);
107
+ render();
108
+ }
109
+ else if (key === "\x1B[C" || key === "l") {
110
+ cursor = Math.min(PM_OPTIONS.length - 1, cursor + 1);
111
+ render();
112
+ }
113
+ else if (key === "\r" || key === "\n") {
114
+ process.stdin.setRawMode(false);
115
+ process.stdin.pause();
116
+ process.stdin.removeAllListeners("data");
117
+ console.log();
118
+ resolve(PM_OPTIONS[cursor].value);
119
+ }
120
+ else if (key === "\x03") {
121
+ process.stdin.setRawMode(false);
122
+ process.exit(0);
123
+ }
124
+ });
125
+ });
126
+ }
127
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type PackageManager } from "./utils/detect-pm.js";
2
+ import { type SurfaceType } from "./surfaces/index.js";
3
+ export interface ScaffoldOptions {
4
+ surface: SurfaceType;
5
+ packageManager: PackageManager;
6
+ skipInstall?: boolean;
7
+ skipGit?: boolean;
8
+ }
9
+ export declare function scaffold(projectName: string, options: ScaffoldOptions): Promise<void>;
10
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAKA,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEhE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,WAAW,CAAA;IACpB,cAAc,EAAE,cAAc,CAAA;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAkBD,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAyGf"}
@@ -0,0 +1,395 @@
1
+ import { join } from "node:path";
2
+ import chalk from "chalk";
3
+ import { ensureDir, writeFile, exists, copyDir, listDirs, resolveSkillsDir } from "./utils/fs.js";
4
+ import { exec, execSilent } from "./utils/shell.js";
5
+ import { log } from "./utils/logger.js";
6
+ import { getInstallCommand } from "./utils/detect-pm.js";
7
+ import { surfaces } from "./surfaces/index.js";
8
+ const REGISTRY_BASE = "https://substrate.georgedrury.co.uk/r";
9
+ function printBanner() {
10
+ const banner = [
11
+ "┌──────────────────────────────────┐",
12
+ "│ ▓▓▓ substrate ▓▓▓ │",
13
+ "│ creative app framework │",
14
+ "└──────────────────────────────────┘",
15
+ ];
16
+ console.log();
17
+ for (const line of banner) {
18
+ console.log(chalk.bold(` ${line}`));
19
+ }
20
+ console.log();
21
+ }
22
+ export async function scaffold(projectName, options) {
23
+ const { surface, packageManager, skipInstall = false, skipGit = false } = options;
24
+ const projectDir = join(process.cwd(), projectName);
25
+ const config = surfaces[surface];
26
+ if (exists(projectDir)) {
27
+ log.error(`Directory "${projectName}" already exists`);
28
+ process.exit(1);
29
+ }
30
+ printBanner();
31
+ log.title(`Creating Substrate playground: ${projectName}`);
32
+ log.step(`Surface: ${surface}`);
33
+ log.step(`Package manager: ${packageManager}`);
34
+ log.blank();
35
+ // 1. Scaffold project files
36
+ ensureDir(projectDir);
37
+ log.step("Scaffolding project files...");
38
+ writeFile(join(projectDir, "package.json"), packageJson(projectName, config, options));
39
+ writeFile(join(projectDir, "tsconfig.json"), tsconfig());
40
+ writeFile(join(projectDir, "tsconfig.app.json"), tsconfigApp());
41
+ writeFile(join(projectDir, "vite.config.ts"), viteConfig());
42
+ writeFile(join(projectDir, "index.html"), indexHtml(projectName));
43
+ writeFile(join(projectDir, ".gitignore"), gitignore());
44
+ writeFile(join(projectDir, "src/main.tsx"), mainTsx());
45
+ writeFile(join(projectDir, "src/App.tsx"), config.app());
46
+ writeFile(join(projectDir, "src/globals.css"), globalsCss(config));
47
+ writeFile(join(projectDir, "src/lib/utils.ts"), utilsTs());
48
+ writeFile(join(projectDir, "src/vite-env.d.ts"), viteEnvDts());
49
+ // Write any extra surface-specific files
50
+ if (config.files) {
51
+ for (const [path, content] of Object.entries(config.files)) {
52
+ writeFile(join(projectDir, path), content());
53
+ }
54
+ }
55
+ log.success("Project files created");
56
+ // 2. Install dependencies
57
+ if (!skipInstall) {
58
+ log.step(`Installing dependencies with ${packageManager}...`);
59
+ exec(getInstallCommand(packageManager), { cwd: projectDir });
60
+ log.success("Dependencies installed");
61
+ // 3. Install Substrate components
62
+ log.step("Installing Substrate components...");
63
+ for (const component of config.components) {
64
+ const url = `${REGISTRY_BASE}/${component}`;
65
+ try {
66
+ exec(`npx shadcn@latest add ${url}`, { cwd: projectDir });
67
+ log.step(` ${component}`);
68
+ }
69
+ catch {
70
+ log.warn(` Failed to install ${component} — add later with: npx substrate-kit add ${component}`);
71
+ }
72
+ }
73
+ log.success("Substrate components installed");
74
+ }
75
+ else {
76
+ log.warn("Skipping dependency installation (--skip-install)");
77
+ }
78
+ // 4. Install skills
79
+ log.step("Installing skills...");
80
+ try {
81
+ const skillsSource = resolveSkillsDir();
82
+ const skillsDest = join(projectDir, ".claude", "skills");
83
+ const skillNames = listDirs(skillsSource);
84
+ for (const skillName of skillNames) {
85
+ copyDir(join(skillsSource, skillName), join(skillsDest, skillName));
86
+ }
87
+ log.success(`Installed ${skillNames.length} skills`);
88
+ }
89
+ catch {
90
+ log.warn("Could not install skills — run 'npx substrate-kit init' to add them later");
91
+ }
92
+ // 5. Write CLAUDE.md
93
+ writeFile(join(projectDir, "CLAUDE.md"), claudeMd());
94
+ log.success("Created CLAUDE.md");
95
+ // 6. Write components.json
96
+ writeFile(join(projectDir, "components.json"), componentsJson());
97
+ log.success("Created components.json");
98
+ // 7. Write .mcp.json
99
+ writeFile(join(projectDir, ".mcp.json"), mcpJson());
100
+ log.success("Created .mcp.json");
101
+ // 8. Initialise git
102
+ if (!skipGit) {
103
+ log.step("Initialising git repository...");
104
+ execSilent("git init", projectDir);
105
+ execSilent("git add -A", projectDir);
106
+ execSilent('git commit -m "Initial commit from create-substrate"', projectDir);
107
+ log.success("Git repository initialised");
108
+ }
109
+ // Done
110
+ log.title("Your Substrate playground is ready");
111
+ log.info(` cd ${projectName}`);
112
+ log.info(` ${packageManager === "npm" ? "npm run" : packageManager} dev`);
113
+ log.blank();
114
+ log.info("Open the project in Claude Code or Cowork to start building with Substrate skills.");
115
+ log.blank();
116
+ }
117
+ // --- Template functions ---
118
+ function packageJson(name, config, options) {
119
+ const deps = {
120
+ react: "^19.1.0",
121
+ "react-dom": "^19.1.0",
122
+ "class-variance-authority": "^0.7.1",
123
+ clsx: "^2.1.1",
124
+ "tailwind-merge": "^3.3.1",
125
+ "@remixicon/react": "^4.9.0",
126
+ "radix-ui": "^1.4.3",
127
+ zustand: "^5.0.12",
128
+ ...config.extraDeps,
129
+ };
130
+ const devDeps = {
131
+ typescript: "^5",
132
+ "@types/node": "^20",
133
+ "@types/react": "^19",
134
+ "@types/react-dom": "^19",
135
+ vite: "^6.3.0",
136
+ "@vitejs/plugin-react": "^4.4.0",
137
+ tailwindcss: "^4",
138
+ "@tailwindcss/vite": "^4",
139
+ ...config.extraDevDeps,
140
+ };
141
+ return JSON.stringify({
142
+ name,
143
+ version: "0.1.0",
144
+ private: true,
145
+ type: "module",
146
+ scripts: {
147
+ dev: "vite",
148
+ build: "tsc -b && vite build",
149
+ preview: "vite preview",
150
+ },
151
+ dependencies: deps,
152
+ devDependencies: devDeps,
153
+ }, null, 2);
154
+ }
155
+ function tsconfig() {
156
+ return JSON.stringify({
157
+ files: [],
158
+ references: [{ path: "./tsconfig.app.json" }],
159
+ }, null, 2);
160
+ }
161
+ function tsconfigApp() {
162
+ return JSON.stringify({
163
+ compilerOptions: {
164
+ target: "ES2020",
165
+ useDefineForClassFields: true,
166
+ lib: ["ES2020", "DOM", "DOM.Iterable"],
167
+ module: "ESNext",
168
+ skipLibCheck: true,
169
+ moduleResolution: "bundler",
170
+ allowImportingTsExtensions: true,
171
+ isolatedModules: true,
172
+ moduleDetection: "force",
173
+ noEmit: true,
174
+ jsx: "react-jsx",
175
+ strict: true,
176
+ noUnusedLocals: true,
177
+ noUnusedParameters: true,
178
+ noFallthroughCasesInSwitch: true,
179
+ noUncheckedSideEffectImports: true,
180
+ paths: {
181
+ "@/*": ["./src/*"],
182
+ },
183
+ },
184
+ include: ["src"],
185
+ }, null, 2);
186
+ }
187
+ function viteConfig() {
188
+ return `import { defineConfig } from "vite"
189
+ import react from "@vitejs/plugin-react"
190
+ import tailwindcss from "@tailwindcss/vite"
191
+ import path from "node:path"
192
+
193
+ export default defineConfig({
194
+ plugins: [react(), tailwindcss()],
195
+ resolve: {
196
+ alias: {
197
+ "@": path.resolve(__dirname, "./src"),
198
+ },
199
+ },
200
+ })
201
+ `;
202
+ }
203
+ function indexHtml(title) {
204
+ return `<!doctype html>
205
+ <html lang="en" class="dark">
206
+ <head>
207
+ <meta charset="UTF-8" />
208
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
209
+ <title>${title}</title>
210
+ </head>
211
+ <body class="antialiased">
212
+ <div id="root"></div>
213
+ <script type="module" src="/src/main.tsx"></script>
214
+ </body>
215
+ </html>
216
+ `;
217
+ }
218
+ function mainTsx() {
219
+ return `import { StrictMode } from "react"
220
+ import { createRoot } from "react-dom/client"
221
+ import App from "./App"
222
+ import "./globals.css"
223
+
224
+ createRoot(document.getElementById("root")!).render(
225
+ <StrictMode>
226
+ <App />
227
+ </StrictMode>,
228
+ )
229
+ `;
230
+ }
231
+ function globalsCss(config) {
232
+ const extra = config.cssVars ? `\n${config.cssVars}` : "";
233
+ return `@import "tailwindcss";
234
+
235
+ @theme inline {
236
+ --color-background: var(--background);
237
+ --color-foreground: var(--foreground);
238
+ --color-card: var(--card);
239
+ --color-card-foreground: var(--card-foreground);
240
+ --color-popover: var(--popover);
241
+ --color-popover-foreground: var(--popover-foreground);
242
+ --color-primary: var(--primary);
243
+ --color-primary-foreground: var(--primary-foreground);
244
+ --color-secondary: var(--secondary);
245
+ --color-secondary-foreground: var(--secondary-foreground);
246
+ --color-muted: var(--muted);
247
+ --color-muted-foreground: var(--muted-foreground);
248
+ --color-accent: var(--accent);
249
+ --color-accent-foreground: var(--accent-foreground);
250
+ --color-destructive: var(--destructive);
251
+ --color-border: var(--border);
252
+ --color-input: var(--input);
253
+ --color-ring: var(--ring);
254
+ --radius-sm: calc(var(--radius) - 4px);
255
+ --radius-md: calc(var(--radius) - 2px);
256
+ --radius-lg: var(--radius);
257
+ --radius-xl: calc(var(--radius) + 4px);
258
+ /* Substrate */
259
+ --color-canvas: var(--canvas, var(--color-background));
260
+ --color-canvas-foreground: var(--canvas-foreground, var(--color-foreground-muted));
261
+ --color-panel: var(--panel, var(--color-card));
262
+ --color-panel-foreground: var(--panel-foreground, var(--color-card-foreground));
263
+ }
264
+
265
+ :root {
266
+ --background: oklch(0.145 0 0);
267
+ --foreground: oklch(0.985 0 0);
268
+ --card: oklch(0.205 0 0);
269
+ --card-foreground: oklch(0.985 0 0);
270
+ --popover: oklch(0.205 0 0);
271
+ --popover-foreground: oklch(0.985 0 0);
272
+ --primary: oklch(0.985 0 0);
273
+ --primary-foreground: oklch(0.205 0 0);
274
+ --secondary: oklch(0.269 0 0);
275
+ --secondary-foreground: oklch(0.985 0 0);
276
+ --muted: oklch(0.269 0 0);
277
+ --muted-foreground: oklch(0.708 0 0);
278
+ --accent: oklch(0.269 0 0);
279
+ --accent-foreground: oklch(0.985 0 0);
280
+ --destructive: oklch(0.577 0.245 27.325);
281
+ --border: oklch(1 0 0 / 10%);
282
+ --input: oklch(1 0 0 / 15%);
283
+ --ring: oklch(0.556 0 0);
284
+ --radius: 0.625rem;
285
+ /* Substrate */
286
+ --canvas: oklch(17.764% 0.00002 271.152);
287
+ --canvas-foreground: oklch(0.708 0 0);
288
+ --panel: oklch(0.205 0 0);
289
+ --panel-foreground: oklch(0.985 0 0);${extra}
290
+ }
291
+
292
+ @layer base {
293
+ * {
294
+ @apply border-border;
295
+ }
296
+ body {
297
+ @apply bg-background text-foreground;
298
+ }
299
+ }
300
+ `;
301
+ }
302
+ function utilsTs() {
303
+ return `import { clsx, type ClassValue } from "clsx"
304
+ import { twMerge } from "tailwind-merge"
305
+
306
+ export function cn(...inputs: ClassValue[]) {
307
+ return twMerge(clsx(inputs))
308
+ }
309
+ `;
310
+ }
311
+ function gitignore() {
312
+ return `node_modules/
313
+ dist/
314
+ .DS_Store
315
+ *.pem
316
+ .env
317
+ .env*.local
318
+ *.tsbuildinfo
319
+ `;
320
+ }
321
+ function viteEnvDts() {
322
+ return `/// <reference types="vite/client" />
323
+ `;
324
+ }
325
+ function componentsJson() {
326
+ return JSON.stringify({
327
+ $schema: "https://ui.shadcn.com/schema.json",
328
+ style: "new-york",
329
+ rsc: false,
330
+ tsx: true,
331
+ tailwind: {
332
+ config: "",
333
+ css: "src/globals.css",
334
+ baseColor: "neutral",
335
+ cssVariables: true,
336
+ },
337
+ aliases: {
338
+ components: "@/components",
339
+ utils: "@/lib/utils",
340
+ ui: "@/components/ui",
341
+ lib: "@/lib",
342
+ hooks: "@/hooks",
343
+ },
344
+ }, null, 2);
345
+ }
346
+ function mcpJson() {
347
+ return JSON.stringify({
348
+ mcpServers: {
349
+ substrate: {
350
+ command: "npx",
351
+ args: ["-y", "@substrate-kit/cli", "mcp"],
352
+ },
353
+ },
354
+ }, null, 2) + "\n";
355
+ }
356
+ function claudeMd() {
357
+ return `# Substrate
358
+
359
+ This project uses [Substrate](https://substrate.georgedrury.co.uk) — a creative app framework that provides scaffold (toolbar, panels, panes, stores, shortcuts) around different surface types.
360
+
361
+ ## Skills
362
+
363
+ Substrate skills are installed in \`.claude/skills/\`. They are organised into two groups:
364
+
365
+ ### Surface guides (how to build)
366
+
367
+ - **scaffold-playground** — bootstrapping a new playground
368
+ - **canvas-2d** / **3d-scene** / **animation** / **image-generation** / **data-visualisation** — surface-specific architecture
369
+ - **composing-panels** / **wire-interactions** / **create-custom-tool** / **theming** — workflow guides
370
+
371
+ ### Component reference (what to use)
372
+
373
+ - **substrate-scaffold** — Toolbar, Panel, Pane, DocumentTabs, StatusBar, ZoomControls, Breadcrumbs, Resizer
374
+ - **substrate-controls** — NumberInput, Slider, NumberSlider, Select, Toggle, TextArea, ColourPicker, ActionControls
375
+ - **substrate-canvas** — useViewport, useSelection, useDragReorder, snap, boundingBox, hit testing
376
+ - **substrate-nodes** — Node cards, typed ports, port colour theming
377
+ - **substrate-feedback** — Toast, ProgressBar, Badge, EmptyState, CommandPalette, ContextMenu, ShortcutOverlay
378
+ - **substrate-interaction** — useUndoable, useClipboard, createKeyboardShortcuts, HistoryControls, LayerList, TreeList
379
+
380
+ ## Install components
381
+
382
+ \`\`\`bash
383
+ # Core scaffold
384
+ npx substrate-kit add design-canvas toolbar panel pane action slider
385
+
386
+ # Surface components
387
+ npx substrate-kit add surface timeline gallery colour-picker easing-curve-editor
388
+ \`\`\`
389
+
390
+ ## Registry
391
+
392
+ Components are installed from \`substrate.georgedrury.co.uk/r/\` via the shadcn CLI.
393
+ `;
394
+ }
395
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SurfaceConfig } from "./types.js";
2
+ export declare const scene3d: SurfaceConfig;
3
+ //# sourceMappingURL=3d-scene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"3d-scene.d.ts","sourceRoot":"","sources":["../../src/surfaces/3d-scene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,eAAO,MAAM,OAAO,EAAE,aAsLrB,CAAA"}