@bitmagic/cli 0.1.61 → 0.1.62-dev.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 (85) hide show
  1. package/README.md +27 -3
  2. package/assets/unity-import/README.md +13 -0
  3. package/assets/unity-import/blender_build.py +462 -0
  4. package/assets/unity-import/build_parts.py +263 -0
  5. package/assets/unity-import/convert_assets.py +193 -0
  6. package/assets/unity-import/fbx_ascii.py +156 -0
  7. package/assets/unity-import/fbx_axis.py +174 -0
  8. package/assets/unity-import/fbx_bounds.py +202 -0
  9. package/assets/unity-import/import_config.py +86 -0
  10. package/assets/unity-import/level_patches.example.json +23 -0
  11. package/assets/unity-import/mesh_walls.py +78 -0
  12. package/assets/unity-import/render_topdown.py +33 -0
  13. package/assets/unity-import/unity-import.example.json +27 -0
  14. package/assets/unity-import/unity_assets.py +114 -0
  15. package/assets/unity-import/unity_colliders2d.py +127 -0
  16. package/assets/unity-import/unity_extract.py +774 -0
  17. package/assets/unity-import/unity_markers.py +249 -0
  18. package/assets/unity-import/unity_renderers.py +279 -0
  19. package/assets/unity-import/write_arena_data.py +198 -0
  20. package/dist/cli.d.ts +12 -0
  21. package/dist/commands/check.js +2 -2
  22. package/dist/commands/check.js.map +1 -1
  23. package/dist/commands/dev.js +4 -4
  24. package/dist/commands/dev.js.map +1 -1
  25. package/dist/commands/forge.js +4 -3
  26. package/dist/commands/forge.js.map +1 -1
  27. package/dist/commands/import.d.ts +4 -0
  28. package/dist/commands/import.js +5 -0
  29. package/dist/commands/import.js.map +1 -1
  30. package/dist/commands/init.d.ts +4 -0
  31. package/dist/commands/init.js +20 -0
  32. package/dist/commands/init.js.map +1 -1
  33. package/dist/commands/upgrade.d.ts +4 -0
  34. package/dist/commands/upgrade.js +31 -5
  35. package/dist/commands/upgrade.js.map +1 -1
  36. package/dist/commands/verify.js +5 -4
  37. package/dist/commands/verify.js.map +1 -1
  38. package/dist/editor/server.js +3 -3
  39. package/dist/editor/shell-page.js +16 -1
  40. package/dist/editor/shell-page.js.map +1 -1
  41. package/dist/editor/watch.d.ts +1 -1
  42. package/dist/editor/watch.js +2 -21
  43. package/dist/editor/watch.js.map +1 -1
  44. package/dist/forge/voxelize-session.d.ts +1 -1
  45. package/dist/forge/voxelize-session.js +4 -32
  46. package/dist/forge/voxelize-session.js.map +1 -1
  47. package/dist/project/context.d.ts +14 -1
  48. package/dist/project/context.js +17 -4
  49. package/dist/project/context.js.map +1 -1
  50. package/dist/project/package-manager.js +2 -2
  51. package/dist/project/package-manager.js.map +1 -1
  52. package/dist/project/spawn-bin.d.ts +69 -0
  53. package/dist/project/spawn-bin.js +96 -0
  54. package/dist/project/spawn-bin.js.map +1 -0
  55. package/dist/publish/bundle.js +3 -3
  56. package/dist/publish/bundle.js.map +1 -1
  57. package/dist/scaffold/agent-targets.d.ts +126 -0
  58. package/dist/scaffold/agent-targets.js +180 -0
  59. package/dist/scaffold/agent-targets.js.map +1 -0
  60. package/dist/scaffold/agents-md.d.ts +4 -1
  61. package/dist/scaffold/agents-md.js +6 -2
  62. package/dist/scaffold/agents-md.js.map +1 -1
  63. package/dist/scaffold/project-files.d.ts +40 -5
  64. package/dist/scaffold/project-files.js +67 -25
  65. package/dist/scaffold/project-files.js.map +1 -1
  66. package/dist/scaffold/project.d.ts +42 -15
  67. package/dist/scaffold/project.js +100 -38
  68. package/dist/scaffold/project.js.map +1 -1
  69. package/dist/scaffold/reference-guidance.d.ts +1 -1
  70. package/dist/scaffold/reference-guidance.js +2 -1
  71. package/dist/scaffold/reference-guidance.js.map +1 -1
  72. package/dist/scaffold/scaffold-run.js +2 -2
  73. package/dist/scaffold/scaffold-run.js.map +1 -1
  74. package/dist/scaffold/skill-files.d.ts +32 -9
  75. package/dist/scaffold/skill-files.js +71 -15
  76. package/dist/scaffold/skill-files.js.map +1 -1
  77. package/dist/scaffold/unity-skill-files.d.ts +30 -0
  78. package/dist/scaffold/unity-skill-files.js +474 -0
  79. package/dist/scaffold/unity-skill-files.js.map +1 -0
  80. package/dist/scaffold/upgrade-project.d.ts +31 -11
  81. package/dist/scaffold/upgrade-project.js +35 -23
  82. package/dist/scaffold/upgrade-project.js.map +1 -1
  83. package/dist/verify/iterate.js +2 -1
  84. package/dist/verify/iterate.js.map +1 -1
  85. package/package.json +4 -4
@@ -1,4 +1,5 @@
1
- import { type ProjectMetadata } from './project-files.js';
1
+ import { type ProjectMetadata, type SkillRenderer } from './project-files.js';
2
+ import { type AgentId } from './agent-targets.js';
2
3
  export interface TemplateEntry {
3
4
  id: string;
4
5
  genre: string;
@@ -68,6 +69,17 @@ export declare const OPTIONAL_VENDORED_DIRS: string[];
68
69
  * there as soon as the project moves to a version that ships it. See docs/engine-license.md.
69
70
  */
70
71
  export declare const OPTIONAL_VENDORED_FILES: string[];
72
+ /**
73
+ * Throws unless the extracted tree carries every VENDORED_DIRS entry.
74
+ *
75
+ * Shared by `vendorEngine` and `upgradeProject` so the two cannot come to disagree on what counts
76
+ * as a complete tarball, or word the same failure two ways. Both run it as a pass of its own,
77
+ * BEFORE anything is written: for `upgradeProject` that ordering is load-bearing — it clears a
78
+ * live project's engine/ before copying, so validating inside the copy loop would demolish the
79
+ * tree and then fail partway through repopulating it — and for a brand new project it costs
80
+ * nothing.
81
+ */
82
+ export declare function assertEngineBundleComplete(extractedEngineDir: string): void;
71
83
  /**
72
84
  * Copies every OPTIONAL_VENDORED_DIRS / OPTIONAL_VENDORED_FILES entry the extracted tree happens
73
85
  * to carry into the project's `engine/`, and silently skips the ones it does not.
@@ -92,18 +104,14 @@ export declare function copyServiceWorker(extractedEngineDir: string, root: stri
92
104
  /**
93
105
  * Writes one file into a project, creating its parent directories first.
94
106
  *
95
- * The mkdir is load-bearing for the nested entries — `.claude/skills/<name>/SKILL.md` — in a
107
+ * The mkdir is load-bearing for the nested entries — `<skills dir>/<name>/SKILL.md` — in a
96
108
  * project that predates them: without it `writeFileSync` ENOENTs, and in `upgradeProject` it does
97
109
  * so AFTER `engine/` has been replaced, leaving the project half-upgraded. mkdir on an existing
98
110
  * directory is a no-op, so the top-level entries pay nothing for it.
99
111
  */
100
112
  export declare function writeProjectFile(root: string, relativePath: string, contents: string): void;
101
113
  /**
102
- * The subset of the generated files that are pure platform output: regenerated byte-for-byte
103
- * from these renderers with no creator content ever entering them. `bitmagic upgrade` overwrites
104
- * exactly this list (plus bitmagic.json, handled separately since only its engineVersion field is
105
- * platform-owned, and engine/ + sw-cache-buster.js, handled separately since they are copied, not
106
- * rendered).
114
+ * Every skill this CLI deploys, ONCE, as a path relative to a skills directory.
107
115
  *
108
116
  * **Every skill this CLI deploys belongs here.** A skill documents what the CLI can do — not the
109
117
  * creator's game — so a project stuck on the version that shipped with its scaffold is a project
@@ -112,21 +120,40 @@ export declare function writeProjectFile(root: string, relativePath: string, con
112
120
  * commands was written once at init and never revisited. Whatever we add next would repeat it.
113
121
  * Add a new skill to this list and existing projects receive it on their next `bitmagic upgrade`.
114
122
  *
115
- * Only the paths named here are rewritten; anything else under `.claude/` — a skill the creator
116
- * wrote themselves — is never opened. The trade is deliberate and one-directional: an edit to one
117
- * of OUR skill files is lost on upgrade, which is the price of those files staying current.
123
+ * Relative rather than rooted because a project holds more than one copy: agents do not agree on
124
+ * where project skills live, and `agent-targets.ts` argues why every one of them gets a real copy
125
+ * rather than a symlink or a single directory nobody all reads. The bodies are agent-independent —
126
+ * only `renderSkillsReadme` differs per directory, which is why the renderer signature takes the
127
+ * directory rather than each renderer being written twice.
128
+ */
129
+ export declare const SHIPPED_SKILLS: Array<[string, SkillRenderer]>;
130
+ /**
131
+ * The platform-generated files that are not skills, and so sit at one fixed path whatever agents
132
+ * the project is set up for.
133
+ */
134
+ export declare const PLATFORM_CONFIG_FILES: Array<[string, () => string]>;
135
+ /**
136
+ * The generated files that are pure platform output: regenerated byte-for-byte from these
137
+ * renderers with no creator content ever entering them. `bitmagic upgrade` overwrites exactly this
138
+ * list (plus bitmagic.json, handled separately since only its engineVersion field is
139
+ * platform-owned, and engine/ + sw-cache-buster.js, handled separately since they are copied, not
140
+ * rendered).
141
+ *
142
+ * Only the paths named here are rewritten; anything else under a skills directory — a skill the
143
+ * creator wrote themselves — is never opened. The trade is deliberate and one-directional: an edit
144
+ * to one of OUR skill files is lost on upgrade, which is the price of those files staying current.
118
145
  *
119
146
  * Deliberately excludes package.json (creators add dependencies to it), AGENTS.md/CLAUDE.md and
120
147
  * GAME-DESIGN.md (the creator's own guidance and design — ours to seed once, theirs to own), and
121
148
  * .gitignore (same reasoning) — those are generated once by `scaffoldProject` but are creator-owned
122
149
  * from that point on.
123
150
  *
124
- * Exported so `scaffoldProject` and `upgradeProject` share one definition instead of two lists
125
- * that can drift — the exact failure that motivated this: `vite.publish.config.js` was added
126
- * to init's inline list with no equivalent path for existing projects to ever receive it, because
127
- * `upgrade` didn't exist yet.
151
+ * A function rather than a constant so `scaffoldProject` and `upgradeProject` still share one
152
+ * definition instead of two lists that can drift — the exact failure that motivated the constant it
153
+ * replaced: `vite.publish.config.js` was added to init's inline list with no equivalent path for
154
+ * existing projects to ever receive it, because `upgrade` didn't exist yet.
128
155
  */
129
- export declare const PLATFORM_GENERATED_FILES: Array<[string, () => string]>;
156
+ export declare function platformGeneratedFiles(agents?: readonly AgentId[]): Array<[string, () => string]>;
130
157
  /**
131
158
  * Every template the downloaded bundle carries, in index order.
132
159
  *
@@ -3,7 +3,9 @@ import * as path from 'path';
3
3
  import { CliError } from '../errors.js';
4
4
  import { aliasSourceDir } from './aliases.js';
5
5
  import { renderPackageJson, renderTsconfig, renderIndexHtml, renderViteConfig, renderVitePublishConfig, renderVitePublishStandaloneConfig, renderGitignore, renderBitmagicJson, renderAgentsMd, renderGameDesignMd, renderClaudeMd, renderJudgeSkill, renderThemingSkill, renderGenerateSkill, renderPlanningSkill, renderEngineApiSkill, renderUsageSkill, } from './project-files.js';
6
- import { renderCreatorCollaborationSkill, renderPublishingSkill, renderSkillsReadme, renderTrailerSkill, } from './skill-files.js';
6
+ import { renderCreatorCollaborationSkill, renderPublishingSkill, renderKiroSteering, renderSkillsReadme, renderTrailerSkill, } from './skill-files.js';
7
+ import { renderUnityLevelsSkill, renderUnityLevelsTrapsReference, renderUnityLevelsFbxReference, renderUnityLevelsPhysicsReference, renderUnityLevelsVerificationReference, } from './unity-skill-files.js';
8
+ import { ALWAYS_AGENTS, dedupeAgents, skillDirsFor } from './agent-targets.js';
7
9
  import { hashAgentsMd } from './agents-md.js';
8
10
  import { CLAUDE_SETTINGS_FILE, renderClaudeSettings } from './claude-settings.js';
9
11
  /**
@@ -76,6 +78,24 @@ export const OPTIONAL_VENDORED_DIRS = ['agent-docs'];
76
78
  * there as soon as the project moves to a version that ships it. See docs/engine-license.md.
77
79
  */
78
80
  export const OPTIONAL_VENDORED_FILES = ['LICENSE.md', 'THIRD-PARTY-NOTICES.md'];
81
+ /**
82
+ * Throws unless the extracted tree carries every VENDORED_DIRS entry.
83
+ *
84
+ * Shared by `vendorEngine` and `upgradeProject` so the two cannot come to disagree on what counts
85
+ * as a complete tarball, or word the same failure two ways. Both run it as a pass of its own,
86
+ * BEFORE anything is written: for `upgradeProject` that ordering is load-bearing — it clears a
87
+ * live project's engine/ before copying, so validating inside the copy loop would demolish the
88
+ * tree and then fail partway through repopulating it — and for a brand new project it costs
89
+ * nothing.
90
+ */
91
+ export function assertEngineBundleComplete(extractedEngineDir) {
92
+ for (const dir of VENDORED_DIRS) {
93
+ const source = path.join(extractedEngineDir, dir);
94
+ if (!fs.existsSync(source)) {
95
+ throw new CliError(`The engine bundle has no "${dir}" directory at ${source}. The tarball is incomplete or corrupt.`);
96
+ }
97
+ }
98
+ }
79
99
  /**
80
100
  * Copies every OPTIONAL_VENDORED_DIRS / OPTIONAL_VENDORED_FILES entry the extracted tree happens
81
101
  * to carry into the project's `engine/`, and silently skips the ones it does not.
@@ -113,7 +133,7 @@ export function copyServiceWorker(extractedEngineDir, root) {
113
133
  /**
114
134
  * Writes one file into a project, creating its parent directories first.
115
135
  *
116
- * The mkdir is load-bearing for the nested entries — `.claude/skills/<name>/SKILL.md` — in a
136
+ * The mkdir is load-bearing for the nested entries — `<skills dir>/<name>/SKILL.md` — in a
117
137
  * project that predates them: without it `writeFileSync` ENOENTs, and in `upgradeProject` it does
118
138
  * so AFTER `engine/` has been replaced, leaving the project half-upgraded. mkdir on an existing
119
139
  * directory is a no-op, so the top-level entries pay nothing for it.
@@ -124,11 +144,7 @@ export function writeProjectFile(root, relativePath, contents) {
124
144
  fs.writeFileSync(filePath, contents);
125
145
  }
126
146
  /**
127
- * The subset of the generated files that are pure platform output: regenerated byte-for-byte
128
- * from these renderers with no creator content ever entering them. `bitmagic upgrade` overwrites
129
- * exactly this list (plus bitmagic.json, handled separately since only its engineVersion field is
130
- * platform-owned, and engine/ + sw-cache-buster.js, handled separately since they are copied, not
131
- * rendered).
147
+ * Every skill this CLI deploys, ONCE, as a path relative to a skills directory.
132
148
  *
133
149
  * **Every skill this CLI deploys belongs here.** A skill documents what the CLI can do — not the
134
150
  * creator's game — so a project stuck on the version that shipped with its scaffold is a project
@@ -137,37 +153,83 @@ export function writeProjectFile(root, relativePath, contents) {
137
153
  * commands was written once at init and never revisited. Whatever we add next would repeat it.
138
154
  * Add a new skill to this list and existing projects receive it on their next `bitmagic upgrade`.
139
155
  *
140
- * Only the paths named here are rewritten; anything else under `.claude/` — a skill the creator
141
- * wrote themselves — is never opened. The trade is deliberate and one-directional: an edit to one
142
- * of OUR skill files is lost on upgrade, which is the price of those files staying current.
143
- *
144
- * Deliberately excludes package.json (creators add dependencies to it), AGENTS.md/CLAUDE.md and
145
- * GAME-DESIGN.md (the creator's own guidance and design — ours to seed once, theirs to own), and
146
- * .gitignore (same reasoning) — those are generated once by `scaffoldProject` but are creator-owned
147
- * from that point on.
156
+ * Relative rather than rooted because a project holds more than one copy: agents do not agree on
157
+ * where project skills live, and `agent-targets.ts` argues why every one of them gets a real copy
158
+ * rather than a symlink or a single directory nobody all reads. The bodies are agent-independent —
159
+ * only `renderSkillsReadme` differs per directory, which is why the renderer signature takes the
160
+ * directory rather than each renderer being written twice.
161
+ */
162
+ export const SHIPPED_SKILLS = [
163
+ ['README.md', renderSkillsReadme],
164
+ ['generating-assets/SKILL.md', renderGenerateSkill],
165
+ ['planning-a-game/SKILL.md', renderPlanningSkill],
166
+ ['finding-engine-apis/SKILL.md', renderEngineApiSkill],
167
+ ['checking-usage/SKILL.md', renderUsageSkill],
168
+ ['judging-quality/SKILL.md', renderJudgeSkill],
169
+ ['theming-the-hud/SKILL.md', renderThemingSkill],
170
+ ['making-a-trailer/SKILL.md', renderTrailerSkill],
171
+ ['publishing-a-game/SKILL.md', renderPublishingSkill],
172
+ ['working-with-the-creator/SKILL.md', renderCreatorCollaborationSkill],
173
+ ['converting-unity-levels/SKILL.md', renderUnityLevelsSkill],
174
+ ['converting-unity-levels/references/unity-scene-traps.md', renderUnityLevelsTrapsReference],
175
+ ['converting-unity-levels/references/fbx-conversion.md', renderUnityLevelsFbxReference],
176
+ ['converting-unity-levels/references/physics-and-shadows.md', renderUnityLevelsPhysicsReference],
177
+ ['converting-unity-levels/references/verification.md', renderUnityLevelsVerificationReference],
178
+ ];
179
+ /**
180
+ * Files a particular agent needs that are not skills, written only for a project that named it.
148
181
  *
149
- * Exported so `scaffoldProject` and `upgradeProject` share one definition instead of two lists
150
- * that can drift — the exact failure that motivated this: `vite.publish.config.js` was added
151
- * to init's inline list with no equivalent path for existing projects to ever receive it, because
152
- * `upgrade` didn't exist yet.
182
+ * Claude Code's two extras — `CLAUDE.md` and `.claude/settings.json` — are deliberately NOT here:
183
+ * one is creator-owned after seeding and the other is merged rather than overwritten, so both are
184
+ * handled by `writeProjectFiles` and `upgradeProject` directly. This table is for extras that are
185
+ * pure platform output, and Kiro's steering file is the only one so far.
153
186
  */
154
- export const PLATFORM_GENERATED_FILES = [
187
+ const AGENT_EXTRA_FILES = {
188
+ kiro: [['.kiro/steering/bitmagic.md', renderKiroSteering]],
189
+ };
190
+ /**
191
+ * The platform-generated files that are not skills, and so sit at one fixed path whatever agents
192
+ * the project is set up for.
193
+ */
194
+ export const PLATFORM_CONFIG_FILES = [
155
195
  ['tsconfig.json', renderTsconfig],
156
196
  ['vite.config.js', renderViteConfig],
157
197
  ['vite.publish.config.js', renderVitePublishConfig],
158
198
  ['vite.publish-standalone.config.js', renderVitePublishStandaloneConfig],
159
199
  ['index.html', renderIndexHtml],
160
- ['.claude/skills/README.md', renderSkillsReadme],
161
- ['.claude/skills/generating-assets/SKILL.md', renderGenerateSkill],
162
- ['.claude/skills/planning-a-game/SKILL.md', renderPlanningSkill],
163
- ['.claude/skills/finding-engine-apis/SKILL.md', renderEngineApiSkill],
164
- ['.claude/skills/checking-usage/SKILL.md', renderUsageSkill],
165
- ['.claude/skills/judging-quality/SKILL.md', renderJudgeSkill],
166
- ['.claude/skills/theming-the-hud/SKILL.md', renderThemingSkill],
167
- ['.claude/skills/making-a-trailer/SKILL.md', renderTrailerSkill],
168
- ['.claude/skills/publishing-a-game/SKILL.md', renderPublishingSkill],
169
- ['.claude/skills/working-with-the-creator/SKILL.md', renderCreatorCollaborationSkill],
170
200
  ];
201
+ /**
202
+ * The generated files that are pure platform output: regenerated byte-for-byte from these
203
+ * renderers with no creator content ever entering them. `bitmagic upgrade` overwrites exactly this
204
+ * list (plus bitmagic.json, handled separately since only its engineVersion field is
205
+ * platform-owned, and engine/ + sw-cache-buster.js, handled separately since they are copied, not
206
+ * rendered).
207
+ *
208
+ * Only the paths named here are rewritten; anything else under a skills directory — a skill the
209
+ * creator wrote themselves — is never opened. The trade is deliberate and one-directional: an edit
210
+ * to one of OUR skill files is lost on upgrade, which is the price of those files staying current.
211
+ *
212
+ * Deliberately excludes package.json (creators add dependencies to it), AGENTS.md/CLAUDE.md and
213
+ * GAME-DESIGN.md (the creator's own guidance and design — ours to seed once, theirs to own), and
214
+ * .gitignore (same reasoning) — those are generated once by `scaffoldProject` but are creator-owned
215
+ * from that point on.
216
+ *
217
+ * A function rather than a constant so `scaffoldProject` and `upgradeProject` still share one
218
+ * definition instead of two lists that can drift — the exact failure that motivated the constant it
219
+ * replaced: `vite.publish.config.js` was added to init's inline list with no equivalent path for
220
+ * existing projects to ever receive it, because `upgrade` didn't exist yet.
221
+ */
222
+ export function platformGeneratedFiles(agents = ALWAYS_AGENTS) {
223
+ const skillDirs = skillDirsFor(agents);
224
+ return [
225
+ ...PLATFORM_CONFIG_FILES,
226
+ ...dedupeAgents([...ALWAYS_AGENTS, ...agents]).flatMap((id) => AGENT_EXTRA_FILES[id] ?? []),
227
+ ...skillDirs.flatMap((dir) => SHIPPED_SKILLS.map(([relativePath, render]) => [
228
+ `${dir}/${relativePath}`,
229
+ () => render({ skillsDir: dir, skillDirs }),
230
+ ])),
231
+ ];
232
+ }
171
233
  /**
172
234
  * Every template the downloaded bundle carries, in index order.
173
235
  *
@@ -223,14 +285,11 @@ function copyContents(source, dest) {
223
285
  * second place for that distinction to be got wrong.
224
286
  */
225
287
  export function vendorEngine(extractedEngineDir, targetDir) {
288
+ assertEngineBundleComplete(extractedEngineDir);
226
289
  const engineDir = path.join(targetDir, 'engine');
227
290
  fs.mkdirSync(engineDir, { recursive: true });
228
291
  for (const dir of VENDORED_DIRS) {
229
- const source = path.join(extractedEngineDir, dir);
230
- if (!fs.existsSync(source)) {
231
- throw new CliError(`The engine bundle has no "${dir}" directory at ${source}. The tarball is incomplete or corrupt.`);
232
- }
233
- fs.cpSync(source, path.join(engineDir, dir), { recursive: true });
292
+ fs.cpSync(path.join(extractedEngineDir, dir), path.join(engineDir, dir), { recursive: true });
234
293
  }
235
294
  copyOptionalEngineEntries(extractedEngineDir, engineDir);
236
295
  copyServiceWorker(extractedEngineDir, targetDir);
@@ -245,14 +304,17 @@ export function vendorEngine(extractedEngineDir, targetDir) {
245
304
  */
246
305
  export function writeProjectFiles(options) {
247
306
  const { targetDir, metadata, projectName, idea, gameDesign = 'render' } = options;
307
+ // The project's own declaration, so `bitmagic.json` and the file set on disk cannot disagree.
308
+ const agents = metadata.agents ?? ALWAYS_AGENTS;
248
309
  // Stamped as it is written, so a later `bitmagic upgrade` can tell whether the creator has
249
310
  // edited it since — see scaffold/agents-md.ts for what that decides. The pin goes in because the
250
311
  // file tells the agent which npm line this project's CLI comes from, and that is the environment's
251
- // answer, not a choice to put to the creator.
252
- const agentsMd = renderAgentsMd(metadata.environment);
312
+ // answer, not a choice to put to the creator. The directory list goes in for the same reason: the
313
+ // file has to name the paths this project actually holds, not the ones the default would.
314
+ const agentsMd = renderAgentsMd(metadata.environment, skillDirsFor(agents));
253
315
  const files = [
254
316
  ['package.json', renderPackageJson(projectName)],
255
- ...PLATFORM_GENERATED_FILES.map(([name, render]) => [name, render()]),
317
+ ...platformGeneratedFiles(agents).map(([name, render]) => [name, render()]),
256
318
  ['bitmagic.json', renderBitmagicJson({ ...metadata, agentsMdHash: hashAgentsMd(agentsMd) })],
257
319
  ['AGENTS.md', agentsMd],
258
320
  // Creator-owned from here on (see PLATFORM_GENERATED_FILES): the agent rewrites it as the
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/scaffold/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/scaffold/project.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@
9
9
  * markdown, so backticks are escaped exactly as project-files.ts escapes them.
10
10
  */
11
11
  /** The `## Reference image` section of the scaffolded AGENTS.md, placed before the cover section. */
12
- export declare const AGENTS_MD_REFERENCE_SECTION = "## Reference image \u2014 offer it when the idea has a strong setting\n\nWhen the idea names a **place or a look** \u2014 a tropical island, a neon city \u2014 offer to make a\nconcept image of the world before generating anything else:\n\n```\nbitmagic reference make # a candidate lands in .bitmagic/reference/\nbitmagic reference make --from <id> --prompt \"same island, but at dusk\"\nbitmagic reference accept <id> # the human's call, never yours\n```\n\nShow the human each image file and let THEM iterate and accept. Once accepted, it is the default\nstyle reference for `generate skybox|background|block-type|image`, `bitmagic cover` and\n`bitmagic forge` (whose designer literally sees the picture) \u2014 one look across the whole game;\n`--no-reference` exempts a call, and a picture the human hands you for ONE request rides that\ncall as `--reference-image <file>` instead. Accepting prints a durable URL: paste it into\n`GAME-DESIGN.md`'s world/look section, since `.bitmagic/` is not committed and\n`bitmagic reference accept <url>` is how a fresh clone gets it back. Details are in\n`.claude/skills/generating-assets/SKILL.md`; skip the offer when the idea has no visual identity\nyet.\n\n";
12
+ export declare const AGENTS_MD_REFERENCE_SECTION = "## Reference image \u2014 offer it when the idea has a strong setting\n\nWhen the idea names a **place or a look** \u2014 a tropical island, a neon city \u2014 offer to make a\nconcept image of the world before generating anything else:\n\n```\nbitmagic reference make # a candidate lands in .bitmagic/reference/\nbitmagic reference make --from <id> --prompt \"same island, but at dusk\"\nbitmagic reference accept <id> # the human's call, never yours\n```\n\nShow the human each image file and let THEM iterate and accept. Once accepted, it is the default\nstyle reference for `generate skybox|background|block-type|image`, `bitmagic cover` and\n`bitmagic forge` (whose designer literally sees the picture) \u2014 one look across the whole game;\n`--no-reference` exempts a call, and a picture the human hands you for ONE request rides that\ncall as `--reference-image <file>` instead. Accepting prints a durable URL: paste it into\n`GAME-DESIGN.md`'s world/look section, since `.bitmagic/` is not committed and\n`bitmagic reference accept <url>` is how a fresh clone gets it back. Details are in\n`.agents/skills/generating-assets/SKILL.md`; skip the offer when the idea has no visual identity\nyet.\n\n";
13
13
  /** The planning skill's step-1 paragraph on offering a reference image. */
14
14
  export declare const PLANNING_SKILL_REFERENCE_STEP1 = "If the idea describes a **place** \u2014 an island, a city, a specific look \u2014 offer a reference image\nbefore anything else is generated: `bitmagic reference make`, show the human the file it prints,\niterate with `--from <id>`, and run `accept` only when they choose one. Every skybox, block,\ncover and forge after that inherits the accepted image, so it is worth settling first \u2014 and worth\nskipping when the idea has no visual identity yet.\n\n";
15
15
  /** The planning skill's step-4 list entry (rendered between the design-doc and cover steps). */
@@ -8,6 +8,7 @@
8
8
  * same as there — these strings land inside template literals ultimately emitted into scaffolded
9
9
  * markdown, so backticks are escaped exactly as project-files.ts escapes them.
10
10
  */
11
+ import { PRIMARY_SKILLS_DIR } from './agent-targets.js';
11
12
  /** The `## Reference image` section of the scaffolded AGENTS.md, placed before the cover section. */
12
13
  export const AGENTS_MD_REFERENCE_SECTION = `## Reference image — offer it when the idea has a strong setting
13
14
 
@@ -27,7 +28,7 @@ style reference for \`generate skybox|background|block-type|image\`, \`bitmagic
27
28
  call as \`--reference-image <file>\` instead. Accepting prints a durable URL: paste it into
28
29
  \`GAME-DESIGN.md\`'s world/look section, since \`.bitmagic/\` is not committed and
29
30
  \`bitmagic reference accept <url>\` is how a fresh clone gets it back. Details are in
30
- \`.claude/skills/generating-assets/SKILL.md\`; skip the offer when the idea has no visual identity
31
+ \`${PRIMARY_SKILLS_DIR}/generating-assets/SKILL.md\`; skip the offer when the idea has no visual identity
31
32
  yet.
32
33
 
33
34
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"reference-guidance.js","sourceRoot":"","sources":["../../src/scaffold/reference-guidance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,qGAAqG;AACrG,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;CAqB1C,CAAC;AAEF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,8BAA8B,GAAG;;;;;;CAM7C,CAAC;AAEF,gGAAgG;AAChG,MAAM,CAAC,MAAM,8BAA8B,GAAG;;CAE7C,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gCAAgC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8B/C,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,0BAA0B,GACrC,6HAA6H,CAAC"}
1
+ {"version":3,"file":"reference-guidance.js","sourceRoot":"","sources":["../../src/scaffold/reference-guidance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,qGAAqG;AACrG,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;IAkBvC,kBAAkB;;;CAGrB,CAAC;AAEF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,8BAA8B,GAAG;;;;;;CAM7C,CAAC;AAEF,gGAAgG;AAChG,MAAM,CAAC,MAAM,8BAA8B,GAAG;;CAE7C,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gCAAgC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8B/C,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,0BAA0B,GACrC,6HAA6H,CAAC"}
@@ -8,9 +8,9 @@
8
8
  * failed scaffold — a second copy of either would eventually disagree with this one.
9
9
  */
10
10
  import * as fs from 'fs';
11
- import { spawnSync } from 'child_process';
12
11
  import { CliError } from '../errors.js';
13
12
  import { installAllCommand } from '../project/package-manager.js';
13
+ import { spawnPathCommandSync } from '../project/spawn-bin.js';
14
14
  /** Throws a CliError naming the directory if it exists, is non-empty, and `force` was not given. */
15
15
  export function assertScaffoldable(dir, force) {
16
16
  if (force)
@@ -45,7 +45,7 @@ export function assertScaffoldable(dir, force) {
45
45
  */
46
46
  export function installDependencies(output, dir, manager) {
47
47
  output.info(`Installing dependencies with ${manager}.`);
48
- const result = spawnSync(manager, ['install'], { cwd: dir, stdio: 'inherit' });
48
+ const result = spawnPathCommandSync(manager, ['install'], { cwd: dir, stdio: 'inherit' });
49
49
  if (result.error || result.status !== 0) {
50
50
  const command = installAllCommand(manager);
51
51
  output.info(`Warning: \`${command}\` failed. The project was scaffolded successfully — only its ` +
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold-run.js","sourceRoot":"","sources":["../../src/scaffold/scaffold-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,EAAE,iBAAiB,EAAuB,MAAM,+BAA+B,CAAC;AAEvF,oGAAoG;AACpG,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,KAAc;IAC5D,IAAI,KAAK;QAAE,OAAO;IAClB,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAAyB,CAAC,IAAI,CAAC;QAC7C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,2DAA2D;YAC3D,OAAO;QACT,CAAC;QACD,MAAM,IAAI,QAAQ,CAAC,yBAAyB,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,QAAQ,CAChB,GAAG,GAAG,4EAA4E,CACnF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,GAAW,EAAE,OAAuB;IACtF,MAAM,CAAC,IAAI,CAAC,gCAAgC,OAAO,GAAG,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/E,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CACT,cAAc,OAAO,gEAAgE;YACnF,qCAAqC,GAAG,cAAc,OAAO,cAAc,CAC9E,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"scaffold-run.js","sourceRoot":"","sources":["../../src/scaffold/scaffold-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,EAAE,iBAAiB,EAAuB,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,oGAAoG;AACpG,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,KAAc;IAC5D,IAAI,KAAK;QAAE,OAAO;IAClB,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAAyB,CAAC,IAAI,CAAC;QAC7C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,2DAA2D;YAC3D,OAAO;QACT,CAAC;QACD,MAAM,IAAI,QAAQ,CAAC,yBAAyB,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,QAAQ,CAChB,GAAG,GAAG,4EAA4E,CACnF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,GAAW,EAAE,OAAuB;IACtF,MAAM,CAAC,IAAI,CAAC,gCAAgC,OAAO,GAAG,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1F,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CACT,cAAc,OAAO,gEAAgE;YACnF,qCAAqC,GAAG,cAAc,OAAO,cAAc,CAC9E,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -6,15 +6,38 @@
6
6
  * those were 116 lines of loud facts riding in every request's context).
7
7
  *
8
8
  * Same contract as the renderers there: each is a pure function returning the file's contents,
9
- * registered in `PLATFORM_GENERATED_FILES` (project.ts) so `bitmagic init` writes it and
10
- * `bitmagic upgrade` refreshes it — the only path by which an existing project learns about a new
11
- * capability. `project-files.test.ts` enforces the frontmatter (name == directory) and that
12
- * AGENTS.md names every shipped skill. The same template-literal rule applies: the markdown is
13
- * full of backticks, so every one inside is escaped as \` and the test checks the rendered output.
9
+ * registered in `SHIPPED_SKILLS` (project.ts) so `bitmagic init` writes it and `bitmagic upgrade`
10
+ * refreshes it — the only path by which an existing project learns about a new capability.
11
+ * `project-files.test.ts` enforces the frontmatter (name == directory) and that AGENTS.md names
12
+ * every shipped skill. The same template-literal rule applies: the markdown is full of backticks,
13
+ * so every one inside is escaped as \` and the test checks the rendered output.
14
14
  */
15
- export declare function renderSkillsReadme(): string;
15
+ import type { SkillRenderContext } from './project-files.js';
16
16
  /**
17
- * `.claude/skills/making-a-trailer/SKILL.md` — the whole trailer flow, and the craft that makes a
17
+ * `.kiro/steering/bitmagic.md` — Kiro's startup instructions, and the only per-agent extra file
18
+ * this scaffold writes besides Claude Code's.
19
+ *
20
+ * Kiro is the one supported agent that does not read the root `AGENTS.md` on its own: its
21
+ * convention is `.kiro/steering/*.md`, markdown loaded into context by an `inclusion` mode declared
22
+ * in YAML front matter that must start at byte zero (`inclusion: always` loads it into every
23
+ * interaction, and a file with no front matter at all is treated as always). That much is
24
+ * documented; what Kiro does with a root `AGENTS.md` is not, which is exactly why this file is a
25
+ * POINTER and not a second copy of the guidance. A copy would be another thing to keep current, and
26
+ * `agent-targets.ts` explains why nothing here may depend on an unverified integration point:
27
+ * worst case, Kiro ignores this file and its creator is no worse off than before it existed.
28
+ *
29
+ * The two commands are repeated rather than left to AGENTS.md because they are what a cold start
30
+ * gets wrong — an agent that has not yet opened AGENTS.md still needs `bitmagic dev` running and
31
+ * still needs to reload when it stops.
32
+ */
33
+ export declare function renderKiroSteering(): string;
34
+ /**
35
+ * The one shipped skill whose text is directory-specific, and so the one that reads its render
36
+ * context: it names the directory it is sitting in, and the sibling copies it is not.
37
+ */
38
+ export declare function renderSkillsReadme({ skillsDir, skillDirs }: SkillRenderContext): string;
39
+ /**
40
+ * `<skills dir>/making-a-trailer/SKILL.md` — the whole trailer flow, and the craft that makes a
18
41
  * cut watchable.
19
42
  *
20
43
  * Two kinds of knowledge live here on purpose. The FLOW (record → make → look → publish) is plain
@@ -25,7 +48,7 @@ export declare function renderSkillsReadme(): string;
25
48
  */
26
49
  export declare function renderTrailerSkill(): string;
27
50
  /**
28
- * `.claude/skills/publishing-a-game/SKILL.md` — the whole ship-it path, and every way it refuses.
51
+ * `<skills dir>/publishing-a-game/SKILL.md` — the whole ship-it path, and every way it refuses.
29
52
  *
30
53
  * This is the largest block that came out of AGENTS.md, and it is the clearest case for the split:
31
54
  * an agent about to publish KNOWS it is publishing, and an agent staring at a non-zero exit code
@@ -37,7 +60,7 @@ export declare function renderTrailerSkill(): string;
37
60
  */
38
61
  export declare function renderPublishingSkill(): string;
39
62
  /**
40
- * `.claude/skills/working-with-the-creator/SKILL.md` — the dev view as a two-way channel.
63
+ * `<skills dir>/working-with-the-creator/SKILL.md` — the dev view as a two-way channel.
41
64
  *
42
65
  * The creator is not only watching: they drag gizmos into `world.json`, they paste frames from
43
66
  * their running game, and one editor action (`hq.requested`) is a job handed to the agent. Reading
@@ -6,23 +6,78 @@
6
6
  * those were 116 lines of loud facts riding in every request's context).
7
7
  *
8
8
  * Same contract as the renderers there: each is a pure function returning the file's contents,
9
- * registered in `PLATFORM_GENERATED_FILES` (project.ts) so `bitmagic init` writes it and
10
- * `bitmagic upgrade` refreshes it — the only path by which an existing project learns about a new
11
- * capability. `project-files.test.ts` enforces the frontmatter (name == directory) and that
12
- * AGENTS.md names every shipped skill. The same template-literal rule applies: the markdown is
13
- * full of backticks, so every one inside is escaped as \` and the test checks the rendered output.
9
+ * registered in `SHIPPED_SKILLS` (project.ts) so `bitmagic init` writes it and `bitmagic upgrade`
10
+ * refreshes it — the only path by which an existing project learns about a new capability.
11
+ * `project-files.test.ts` enforces the frontmatter (name == directory) and that AGENTS.md names
12
+ * every shipped skill. The same template-literal rule applies: the markdown is full of backticks,
13
+ * so every one inside is escaped as \` and the test checks the rendered output.
14
14
  */
15
- export function renderSkillsReadme() {
16
- return `# Claude Code skills
15
+ import { describeSkillsDir } from './agent-targets.js';
16
+ /**
17
+ * `.kiro/steering/bitmagic.md` — Kiro's startup instructions, and the only per-agent extra file
18
+ * this scaffold writes besides Claude Code's.
19
+ *
20
+ * Kiro is the one supported agent that does not read the root `AGENTS.md` on its own: its
21
+ * convention is `.kiro/steering/*.md`, markdown loaded into context by an `inclusion` mode declared
22
+ * in YAML front matter that must start at byte zero (`inclusion: always` loads it into every
23
+ * interaction, and a file with no front matter at all is treated as always). That much is
24
+ * documented; what Kiro does with a root `AGENTS.md` is not, which is exactly why this file is a
25
+ * POINTER and not a second copy of the guidance. A copy would be another thing to keep current, and
26
+ * `agent-targets.ts` explains why nothing here may depend on an unverified integration point:
27
+ * worst case, Kiro ignores this file and its creator is no worse off than before it existed.
28
+ *
29
+ * The two commands are repeated rather than left to AGENTS.md because they are what a cold start
30
+ * gets wrong — an agent that has not yet opened AGENTS.md still needs `bitmagic dev` running and
31
+ * still needs to reload when it stops.
32
+ */
33
+ export function renderKiroSteering() {
34
+ return `---
35
+ inclusion: always
36
+ ---
37
+
38
+ # Bitmagic
17
39
 
18
- Claude Code skills placed in this directory apply to this project. See \`AGENTS.md\` at the
19
- project root for the guidance an agent should read before editing this game.
40
+ This is a Bitmagic game project.
20
41
 
42
+ **Read \`AGENTS.md\` at the project root before editing anything here.** It describes this engine
43
+ and this version of the GDK, \`bitmagic upgrade\` keeps it current, and it outranks anything you
44
+ remember about Bitmagic. Your own copy of the skills it names is in \`.kiro/skills/\`.
45
+
46
+ Two things it will tell you that are worth having before you have read it:
47
+
48
+ - **Start \`bitmagic dev\` in the background and leave it running**, before you build anything. It
49
+ serves the game and the editor so the person you are building for can watch and steer.
50
+ - **Run \`bitmagic reload\` when you finish a turn**, so their browser shows the finished work
51
+ rather than a frame from the middle of it. It exits 0 and does nothing when no dev server is up.
52
+ `;
53
+ }
54
+ /**
55
+ * The one shipped skill whose text is directory-specific, and so the one that reads its render
56
+ * context: it names the directory it is sitting in, and the sibling copies it is not.
57
+ */
58
+ export function renderSkillsReadme({ skillsDir, skillDirs }) {
59
+ // Built outside the literal because nesting a template literal inside `${}` of a file that
60
+ // escapes every backtick is the one place that escaping reliably goes wrong.
61
+ const siblings = skillDirs.filter((dir) => dir !== skillsDir).map((dir) => '`' + dir + '/`');
62
+ // A bullet list rather than a sentence: the directory names are substituted, so any sentence
63
+ // long enough to hold two of them wraps at a width this file cannot know.
64
+ const alsoWritten = siblings.length === 0
65
+ ? ''
66
+ : '\nAgents do not agree on where project skills live, so the shipped set below is written into' +
67
+ "\nevery directory this project's agents read — this one, and:\n\n" +
68
+ siblings.map((dir) => `- ${dir}`).join('\n') +
69
+ '\n\nThey hold the same guidance, and `bitmagic upgrade` refreshes every copy.\n';
70
+ return `# Agent skills for this Bitmagic game
71
+
72
+ This directory is \`${skillsDir}/\` — ${describeSkillsDir(skillsDir)}.
73
+
74
+ See \`AGENTS.md\` at the project root for the guidance an agent should read before editing this game.
75
+ ${alsoWritten}
21
76
  ## Which of these are yours
22
77
 
23
78
  \`planning-a-game/\`, \`finding-engine-apis/\`, \`generating-assets/\`, \`checking-usage/\`,
24
79
  \`judging-quality/\`, \`theming-the-hud/\`, \`making-a-trailer/\`, \`publishing-a-game/\`,
25
- \`working-with-the-creator/\` — and
80
+ \`working-with-the-creator/\`, \`converting-unity-levels/\` — and
26
81
  this README — are shipped by the Bitmagic CLI and **re-rendered by \`bitmagic upgrade\`**. They
27
82
  describe what the CLI and the engine can do, so they have to stay current with both; edits to them
28
83
  are lost on the next upgrade.
@@ -38,14 +93,15 @@ are lost on the next upgrade.
38
93
  | \`making-a-trailer/\` | asked for a trailer, a highlight reel, a gameplay video, or to record gameplay — \`bitmagic trailer\` from recording to a CDN link, and how to tune the cut from prompts |
39
94
  | \`publishing-a-game/\` | shipping the game to bitmagic.ai — the verify gate, public vs private, thumbnails, category tags, and every way \`bitmagic publish\` can refuse |
40
95
  | \`working-with-the-creator/\` | they are editing alongside you — gizmo drags into \`world.json\`, a pasted frame from their game, \`.bitmagic/edit/events.jsonl\`, their phone |
96
+ | \`converting-unity-levels/\` | a creator wants a Unity scene or game ported, replicated or "brought over" — reusing its prefabs, FBX models and colliders — or a converted level has pieces rotated, mis-scaled, walls that do not collide, an empty corner |
41
97
 
42
98
  Every other directory here is yours. \`upgrade\` never opens a skill it does not ship, and never
43
- deletes anything under \`.claude/\`. Put project-specific guidance in a skill of your own, or in
44
- \`AGENTS.md\` — both are left alone.
99
+ deletes anything under a skills directory. Put project-specific guidance in a skill of your own, or
100
+ in \`AGENTS.md\` — both are left alone.
45
101
  `;
46
102
  }
47
103
  /**
48
- * `.claude/skills/making-a-trailer/SKILL.md` — the whole trailer flow, and the craft that makes a
104
+ * `<skills dir>/making-a-trailer/SKILL.md` — the whole trailer flow, and the craft that makes a
49
105
  * cut watchable.
50
106
  *
51
107
  * Two kinds of knowledge live here on purpose. The FLOW (record → make → look → publish) is plain
@@ -208,7 +264,7 @@ from the changed region, compare with the previous \`-rN\`, deliver the URL.
208
264
  `;
209
265
  }
210
266
  /**
211
- * `.claude/skills/publishing-a-game/SKILL.md` — the whole ship-it path, and every way it refuses.
267
+ * `<skills dir>/publishing-a-game/SKILL.md` — the whole ship-it path, and every way it refuses.
212
268
  *
213
269
  * This is the largest block that came out of AGENTS.md, and it is the clearest case for the split:
214
270
  * an agent about to publish KNOWS it is publishing, and an agent staring at a non-zero exit code
@@ -332,7 +388,7 @@ blocked at the moment you ship.
332
388
  `;
333
389
  }
334
390
  /**
335
- * `.claude/skills/working-with-the-creator/SKILL.md` — the dev view as a two-way channel.
391
+ * `<skills dir>/working-with-the-creator/SKILL.md` — the dev view as a two-way channel.
336
392
  *
337
393
  * The creator is not only watching: they drag gizmos into `world.json`, they paste frames from
338
394
  * their running game, and one editor action (`hq.requested`) is a job handed to the agent. Reading
@@ -1 +1 @@
1
- {"version":3,"file":"skill-files.js","sourceRoot":"","sources":["../../src/scaffold/skill-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BR,CAAC;AACF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsJR,CAAC;AACF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8GR,CAAC;AACF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,+BAA+B;IAC7C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkER,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"skill-files.js","sourceRoot":"","sources":["../../src/scaffold/skill-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;CAkBR,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAsB;IAC7E,2FAA2F;IAC3F,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;IAC7F,6FAA6F;IAC7F,0EAA0E;IAC1E,MAAM,WAAW,GACf,QAAQ,CAAC,MAAM,KAAK,CAAC;QACnB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,8FAA8F;YAC9F,mEAAmE;YACnE,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5C,iFAAiF,CAAC;IAExF,OAAO;;sBAEa,SAAS,SAAS,iBAAiB,CAAC,SAAS,CAAC;;;EAGlE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BZ,CAAC;AACF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsJR,CAAC;AACF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8GR,CAAC;AACF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,+BAA+B;IAC7C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkER,CAAC;AACF,CAAC"}