@bitmagic/cli 0.1.52-dev.0 → 0.1.52-dev.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +178 -6
- package/dist/assets/add.d.ts +40 -0
- package/dist/assets/add.js +229 -0
- package/dist/assets/add.js.map +1 -0
- package/dist/assets/entry.d.ts +44 -0
- package/dist/assets/entry.js +71 -0
- package/dist/assets/entry.js.map +1 -0
- package/dist/assets/file-kind.d.ts +61 -0
- package/dist/assets/file-kind.js +195 -0
- package/dist/assets/file-kind.js.map +1 -0
- package/dist/assets/list.d.ts +27 -0
- package/dist/assets/list.js +50 -0
- package/dist/assets/list.js.map +1 -0
- package/dist/assets/remove.d.ts +50 -0
- package/dist/assets/remove.js +91 -0
- package/dist/assets/remove.js.map +1 -0
- package/dist/assets/voxelize-glb.d.ts +37 -0
- package/dist/assets/voxelize-glb.js +65 -0
- package/dist/assets/voxelize-glb.js.map +1 -0
- package/dist/assets/vxl-summary.d.ts +32 -0
- package/dist/assets/vxl-summary.js +118 -0
- package/dist/assets/vxl-summary.js.map +1 -0
- package/dist/bin.js +25 -0
- package/dist/bin.js.map +1 -1
- package/dist/browser-gl.d.ts +46 -8
- package/dist/browser-gl.js +54 -26
- package/dist/browser-gl.js.map +1 -1
- package/dist/cli.d.ts +22 -0
- package/dist/cli.js +17 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/assets.d.ts +56 -0
- package/dist/commands/assets.js +328 -0
- package/dist/commands/assets.js.map +1 -0
- package/dist/commands/cover.js +2 -3
- package/dist/commands/cover.js.map +1 -1
- package/dist/commands/forge.d.ts +7 -9
- package/dist/commands/forge.js +12 -14
- package/dist/commands/forge.js.map +1 -1
- package/dist/commands/generate.d.ts +41 -9
- package/dist/commands/generate.js +234 -54
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.js +19 -12
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/judge.d.ts +36 -0
- package/dist/commands/judge.js +216 -0
- package/dist/commands/judge.js.map +1 -0
- package/dist/commands/levels.d.ts +33 -0
- package/dist/commands/levels.js +241 -0
- package/dist/commands/levels.js.map +1 -0
- package/dist/commands/number-flag.d.ts +7 -0
- package/dist/commands/number-flag.js +38 -0
- package/dist/commands/number-flag.js.map +1 -0
- package/dist/commands/publish.js +13 -0
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/reset-account.js +2 -8
- package/dist/commands/reset-account.js.map +1 -1
- package/dist/commands/run-deps.d.ts +27 -0
- package/dist/commands/run-deps.js +43 -0
- package/dist/commands/run-deps.js.map +1 -0
- package/dist/commands/verify.js +3 -3
- package/dist/commands/verify.js.map +1 -1
- package/dist/editor/journal.d.ts +48 -1
- package/dist/editor/journal.js +44 -0
- package/dist/editor/journal.js.map +1 -1
- package/dist/editor/previews.d.ts +6 -0
- package/dist/editor/previews.js +16 -0
- package/dist/editor/previews.js.map +1 -1
- package/dist/editor/server.js +228 -53
- package/dist/editor/server.js.map +1 -1
- package/dist/editor/shell-page.js +221 -116
- package/dist/editor/shell-page.js.map +1 -1
- package/dist/editor/voxel-save.d.ts +47 -0
- package/dist/editor/voxel-save.js +49 -0
- package/dist/editor/voxel-save.js.map +1 -0
- package/dist/errors.d.ts +10 -0
- package/dist/errors.js +16 -0
- package/dist/errors.js.map +1 -1
- package/dist/forge/apply-modifications.d.ts +18 -1
- package/dist/forge/apply-modifications.js +15 -32
- package/dist/forge/apply-modifications.js.map +1 -1
- package/dist/forge/browser-host.js +9 -4
- package/dist/forge/browser-host.js.map +1 -1
- package/dist/forge/voxelize-session.d.ts +61 -0
- package/dist/forge/voxelize-session.js +137 -0
- package/dist/forge/voxelize-session.js.map +1 -0
- package/dist/generate/model.d.ts +36 -0
- package/dist/generate/model.js +90 -0
- package/dist/generate/model.js.map +1 -0
- package/dist/generate/prop.d.ts +52 -4
- package/dist/generate/prop.js +169 -102
- package/dist/generate/prop.js.map +1 -1
- package/dist/generate/stream.d.ts +7 -0
- package/dist/generate/stream.js +2 -1
- package/dist/generate/stream.js.map +1 -1
- package/dist/generate/vehicle.js +5 -85
- package/dist/generate/vehicle.js.map +1 -1
- package/dist/http/signed-upload.d.ts +55 -0
- package/dist/http/signed-upload.js +168 -0
- package/dist/http/signed-upload.js.map +1 -0
- package/dist/judge/facts.d.ts +18 -0
- package/dist/judge/facts.js +180 -0
- package/dist/judge/facts.js.map +1 -0
- package/dist/judge/record.d.ts +16 -0
- package/dist/judge/record.js +55 -0
- package/dist/judge/record.js.map +1 -0
- package/dist/judge/stream.d.ts +36 -0
- package/dist/judge/stream.js +122 -0
- package/dist/judge/stream.js.map +1 -0
- package/dist/levels/registry.d.ts +88 -0
- package/dist/levels/registry.js +309 -0
- package/dist/levels/registry.js.map +1 -0
- package/dist/messages/check.d.ts +30 -0
- package/dist/messages/check.js +119 -0
- package/dist/messages/check.js.map +1 -0
- package/dist/messages/notice.d.ts +58 -0
- package/dist/messages/notice.js +54 -0
- package/dist/messages/notice.js.map +1 -0
- package/dist/messages/refresh.d.ts +19 -0
- package/dist/messages/refresh.js +42 -0
- package/dist/messages/refresh.js.map +1 -0
- package/dist/project/jobs.d.ts +1 -1
- package/dist/project/jobs.js.map +1 -1
- package/dist/publish/client.d.ts +13 -0
- package/dist/publish/client.js +13 -34
- package/dist/publish/client.js.map +1 -1
- package/dist/publish/platform.d.ts +46 -0
- package/dist/publish/platform.js +92 -0
- package/dist/publish/platform.js.map +1 -0
- package/dist/scaffold/project-files.d.ts +8 -0
- package/dist/scaffold/project-files.js +192 -34
- package/dist/scaffold/project-files.js.map +1 -1
- package/dist/scaffold/project.js +2 -1
- package/dist/scaffold/project.js.map +1 -1
- package/dist/verify/browser.d.ts +11 -6
- package/dist/verify/browser.js +31 -15
- package/dist/verify/browser.js.map +1 -1
- package/dist/verify/iterate.js +3 -3
- package/dist/verify/iterate.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { aliasSourceDir } from '../scaffold/aliases.js';
|
|
4
|
+
/**
|
|
5
|
+
* The platform indicators a publish syncs from the project's own work copy: which platform the
|
|
6
|
+
* game is FOR (`primaryPlatform`, top level of game.json) and, for a phone game that only makes
|
|
7
|
+
* sense one way up, `worldProfileData.mobileOrientation`.
|
|
8
|
+
*
|
|
9
|
+
* The project files are the source of truth, exactly as they are in the web lane — the columns
|
|
10
|
+
* are "indicators synced from game.json at publish, like `genre`" (migration 048). So a value
|
|
11
|
+
* changed anywhere else is reverted by the creator's next publish, and the way to make a game
|
|
12
|
+
* mobile is to edit `src/work/game.json`.
|
|
13
|
+
*
|
|
14
|
+
* Two asymmetries that are deliberate:
|
|
15
|
+
*
|
|
16
|
+
* - An ABSENT or unrecognised `primaryPlatform` omits the key rather than defaulting to
|
|
17
|
+
* 'desktop'. Both columns are sticky at the `upsertGame` layer (an absent key preserves the
|
|
18
|
+
* stored value), so "the project says nothing" and "the project says desktop" must not
|
|
19
|
+
* collapse into the same wire message.
|
|
20
|
+
* - A readable work copy that declares no orientation sends an explicit `null`, which CLEARS
|
|
21
|
+
* the column. That is what makes deleting the field from world.json take effect; omitting
|
|
22
|
+
* the key instead would make an orientation impossible to remove from here. Only a work copy
|
|
23
|
+
* neither of whose files can be read omits the key.
|
|
24
|
+
*
|
|
25
|
+
* world.json wins over game.json for the orientation, matching the web lane's own resolution
|
|
26
|
+
* (`game-storage-backend.ts`'s `getListingFieldsSync`). Note this is the OPPOSITE order to
|
|
27
|
+
* `readFaviconOverride` in favicon.ts, which reads game.json first — the favicon override's home
|
|
28
|
+
* is game.json, the orientation's is world.json, and neither order is a house style.
|
|
29
|
+
*
|
|
30
|
+
* The legacy `mainPlatform` spelling is NOT honoured: it predates the CLI lane entirely, so no
|
|
31
|
+
* project this reads can carry it.
|
|
32
|
+
*
|
|
33
|
+
* Best effort throughout, like `readFaviconOverride`: a missing, unreadable or malformed file
|
|
34
|
+
* means "the project declares nothing", never an error. A catalog indicator must not be able to
|
|
35
|
+
* fail a publish whose bundle is already uploaded.
|
|
36
|
+
*/
|
|
37
|
+
export function readPlatformIndicators(root) {
|
|
38
|
+
const workDir = path.join(root, aliasSourceDir('work'));
|
|
39
|
+
const game = readJsonObject(path.join(workDir, 'game.json'));
|
|
40
|
+
const world = readJsonObject(path.join(workDir, 'world.json'));
|
|
41
|
+
const fields = {};
|
|
42
|
+
const notes = [];
|
|
43
|
+
const declared = game?.primaryPlatform;
|
|
44
|
+
if (declared === 'desktop' || declared === 'mobile') {
|
|
45
|
+
fields.primaryPlatform = declared;
|
|
46
|
+
}
|
|
47
|
+
else if (declared !== undefined) {
|
|
48
|
+
notes.push(`game.json primaryPlatform ${JSON.stringify(declared)} is not "desktop" or "mobile" — ` +
|
|
49
|
+
'leaving the stored platform alone.');
|
|
50
|
+
}
|
|
51
|
+
if (world !== null || game !== null) {
|
|
52
|
+
const orientation = worldProfileValue(world, 'mobileOrientation') ?? worldProfileValue(game, 'mobileOrientation');
|
|
53
|
+
if (orientation === 'portrait' || orientation === 'landscape') {
|
|
54
|
+
fields.mobileOrientation = orientation;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
if (orientation !== undefined) {
|
|
58
|
+
notes.push(`worldProfileData.mobileOrientation ${JSON.stringify(orientation)} is not "portrait" ` +
|
|
59
|
+
'or "landscape" — publishing with no orientation lock.');
|
|
60
|
+
}
|
|
61
|
+
fields.mobileOrientation = null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (fields.primaryPlatform === 'mobile') {
|
|
65
|
+
notes.push(fields.mobileOrientation
|
|
66
|
+
? `Cataloged as a mobile game, locked to ${fields.mobileOrientation}.`
|
|
67
|
+
: 'Cataloged as a mobile game.');
|
|
68
|
+
}
|
|
69
|
+
return { fields, notes };
|
|
70
|
+
}
|
|
71
|
+
/** Parse one work-copy JSON file, or null when it is missing, unreadable or not an object. */
|
|
72
|
+
function readJsonObject(filePath) {
|
|
73
|
+
let parsed;
|
|
74
|
+
try {
|
|
75
|
+
if (!fs.existsSync(filePath))
|
|
76
|
+
return null;
|
|
77
|
+
parsed = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)
|
|
83
|
+
? parsed
|
|
84
|
+
: null;
|
|
85
|
+
}
|
|
86
|
+
function worldProfileValue(source, key) {
|
|
87
|
+
const profile = source?.worldProfileData;
|
|
88
|
+
if (typeof profile !== 'object' || profile === null || Array.isArray(profile))
|
|
89
|
+
return undefined;
|
|
90
|
+
return profile[key];
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/publish/platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -125,6 +125,14 @@ export declare function renderGenerateSkill(): string;
|
|
|
125
125
|
* check first can say "this will take most of what is left" before it burns it.
|
|
126
126
|
*/
|
|
127
127
|
export declare function renderUsageSkill(): string;
|
|
128
|
+
/**
|
|
129
|
+
* `.claude/skills/judging-quality/SKILL.md` — when and how to run `bitmagic judge`.
|
|
130
|
+
*
|
|
131
|
+
* The point the skill has to land is the discipline, not the mechanics: judge after milestones,
|
|
132
|
+
* fix the findings, confirm once, stop. An agent that loops on the judge is spending the
|
|
133
|
+
* creator's sparks on reassurance.
|
|
134
|
+
*/
|
|
135
|
+
export declare function renderJudgeSkill(): string;
|
|
128
136
|
/**
|
|
129
137
|
* `GAME-DESIGN.md` — the project's design document, and the input `bitmagic cover` builds its
|
|
130
138
|
* image prompt from. The web lane's Planning Mode writes a file of the same name for the same
|
|
@@ -83,12 +83,23 @@ function esmUrl(name) {
|
|
|
83
83
|
return `https://esm.sh/${name}@${pinnedVersion(name)}`;
|
|
84
84
|
}
|
|
85
85
|
/**
|
|
86
|
-
* The three.js
|
|
87
|
-
* the entries
|
|
86
|
+
* The three.js CDN base every `three*` import map entry below is built from. Named once because
|
|
87
|
+
* the entries restate it a dozen times over, four of them inside the `three` shim, and a bump
|
|
88
88
|
* that updates some copies but not others splits the engine across two module instances — the
|
|
89
89
|
* exact failure the comments below describe.
|
|
90
90
|
*/
|
|
91
|
-
const
|
|
91
|
+
const THREE_CDN = esmUrl('three');
|
|
92
|
+
/**
|
|
93
|
+
* esm.sh's `*` build of the same release. Only the addon entries use it — the note on them in
|
|
94
|
+
* `CDN_IMPORTS` says why, and why nothing else may.
|
|
95
|
+
*/
|
|
96
|
+
const THREE_CDN_EXTERNAL = `https://esm.sh/*three@${pinnedVersion('three')}`;
|
|
97
|
+
/**
|
|
98
|
+
* The ONE webgpu build both `three` (through the shim) and `three/webgpu` resolve to. Derived
|
|
99
|
+
* from a single constant rather than written twice, because the two being byte-identical is what
|
|
100
|
+
* keeps them one module instance — see the shim below.
|
|
101
|
+
*/
|
|
102
|
+
const THREE_WEBGPU = `${THREE_CDN}/webgpu`;
|
|
92
103
|
/**
|
|
93
104
|
* `three` resolves to a shim, not straight to the webgpu build. r185's three.webgpu.js exports
|
|
94
105
|
* neither `UniformsUtils` (which every classic postprocessing pass imports from `three`) nor
|
|
@@ -101,10 +112,10 @@ const THREE_VERSION = pinnedVersion('three');
|
|
|
101
112
|
*/
|
|
102
113
|
const THREE_SHIM = [
|
|
103
114
|
'data:text/javascript,',
|
|
104
|
-
`export*from'
|
|
105
|
-
`export{UniformsUtils}from'
|
|
106
|
-
`export{ShaderLib}from'
|
|
107
|
-
`export{UniformsLib}from'
|
|
115
|
+
`export*from'${THREE_WEBGPU}';`,
|
|
116
|
+
`export{UniformsUtils}from'${THREE_CDN}/src/renderers/shaders/UniformsUtils.js';`,
|
|
117
|
+
`export{ShaderLib}from'${THREE_CDN}/src/renderers/shaders/ShaderLib.js';`,
|
|
118
|
+
`export{UniformsLib}from'${THREE_CDN}/src/renderers/shaders/UniformsLib.js'`,
|
|
108
119
|
].join('');
|
|
109
120
|
/**
|
|
110
121
|
* Resolved in the browser from a CDN, not from node_modules — see the design's import-map note.
|
|
@@ -117,17 +128,17 @@ export const CDN_IMPORTS = {
|
|
|
117
128
|
// builds (core + webgpu) they are two, and r185's LightsNode then fails to recognise lights
|
|
118
129
|
// built by the other instance — the scene renders unlit. Keep in step with game/index.html.
|
|
119
130
|
three: THREE_SHIM,
|
|
120
|
-
'three/webgpu':
|
|
121
|
-
'three/tsl':
|
|
131
|
+
'three/webgpu': THREE_WEBGPU,
|
|
132
|
+
'three/tsl': `${THREE_CDN}/tsl`,
|
|
122
133
|
// The addon entries use esm.sh's `*` build, which keeps `three` a BARE specifier so addons
|
|
123
134
|
// resolve back through this map. Plain esm.sh inlines its own copy of three, which shares no
|
|
124
135
|
// module with the webgpu build: GLTFLoader then hands back Meshes from a second Mesh class and
|
|
125
136
|
// the engine's `instanceof THREE.Mesh` scans find nothing. Same one-instance rule as above.
|
|
126
137
|
// The classic WebGL addons are not excepted — the shim, not a pinned inlined-three build, is
|
|
127
138
|
// what gives them the UniformsUtils / ShaderLib / UniformsLib they import from bare `three`.
|
|
128
|
-
'three/addons/':
|
|
129
|
-
'three/examples/jsm/':
|
|
130
|
-
'three/':
|
|
139
|
+
'three/addons/': `${THREE_CDN_EXTERNAL}/addons/`,
|
|
140
|
+
'three/examples/jsm/': `${THREE_CDN_EXTERNAL}/examples/jsm/`,
|
|
141
|
+
'three/': `${THREE_CDN}/`,
|
|
131
142
|
'@dimforge/rapier3d-compat': esmUrl('@dimforge/rapier3d-compat'),
|
|
132
143
|
'@dimforge/rapier2d-compat': esmUrl('@dimforge/rapier2d-compat'),
|
|
133
144
|
i18next: esmUrl('i18next'),
|
|
@@ -622,12 +633,35 @@ from its artwork.
|
|
|
622
633
|
Read \`engine/agent-docs/coordinate-system.md\`. Gameplay faces **+Z** while cameras face **−Z**, and
|
|
623
634
|
the two yaw conventions differ. Guessing produces code that compiles and moves the wrong way.
|
|
624
635
|
|
|
636
|
+
## Every control must work on a phone
|
|
637
|
+
|
|
638
|
+
Published games are played on phones whichever platform they were built for, and touch controls
|
|
639
|
+
are configured in **code** — there is no panel for them.
|
|
640
|
+
|
|
641
|
+
- **Bind an action once, for both platforms.** \`playerController.registerCustomAction({ action,
|
|
642
|
+
desktop: { keys: ['KeyR'] }, mobile: { label: 'LOAD', behavior: 'tap' } })\` binds the desktop
|
|
643
|
+
key AND creates the mobile button in one call, and throws if you leave \`mobile\` out. To declare
|
|
644
|
+
a genre's buttons up front instead, return them from \`declareMobileActions()\`. Read both flags
|
|
645
|
+
the same way afterwards: \`this.keys.reload\`.
|
|
646
|
+
- **Never** \`desktopControls.registerKeyHandler()\` or a raw \`document.addEventListener('keydown',
|
|
647
|
+
…)\` for a gameplay action. The first strands phone players and the engine logs a
|
|
648
|
+
\`[mobile-parity]\` error on game start; the raw listener strands them **silently** — the parity
|
|
649
|
+
check cannot see a listener that never went through the engine.
|
|
650
|
+
- **Say which platform the game is for.** \`"primaryPlatform": "mobile"\` at the top level of
|
|
651
|
+
\`src/work/game.json\` is what bitmagic.ai catalogs it as, and \`bitmagic publish\` sends it —
|
|
652
|
+
editing that file is the only way to set it. For a game that only works one way up, add
|
|
653
|
+
\`"mobileOrientation": "portrait"\` (or \`"landscape"\`) to \`worldProfileData\` in
|
|
654
|
+
\`src/work/world.json\`; published mobile builds lock to it.
|
|
655
|
+
|
|
656
|
+
Details — button slots, icons, the joystick, the parity check: \`engine/agent-docs/control-system.md\`.
|
|
657
|
+
|
|
625
658
|
## Checking your work
|
|
626
659
|
|
|
627
660
|
\`\`\`
|
|
628
661
|
bitmagic check # typecheck against the vendored engine
|
|
629
662
|
bitmagic reload # tell the open browser you have finished a round of edits
|
|
630
663
|
bitmagic verify # boot the game in a real browser and report what broke
|
|
664
|
+
bitmagic judge # grade the verify screenshot against a quality rubric (paid, cheap)
|
|
631
665
|
\`\`\`
|
|
632
666
|
|
|
633
667
|
(\`bitmagic dev\` belongs at the START of the session — see the top of this file.)
|
|
@@ -646,6 +680,12 @@ compile that dies on load — a missing asset, a bad \`world.json\` value, a nul
|
|
|
646
680
|
\`bitmagic verify\` after a change you cannot eyeball: it loads the game in a headless browser and
|
|
647
681
|
fails with what actually broke, leaving a console log and a screenshot in \`.bitmagic/verify/\`.
|
|
648
682
|
|
|
683
|
+
**\`verify\` passing does not mean the game is good.** You built this game, so you are the wrong
|
|
684
|
+
judge of it. After each milestone run \`bitmagic verify\` (not \`--fast\`), then \`bitmagic judge\`:
|
|
685
|
+
a separate vision model grades the screenshot against \`GAME-DESIGN.md\` and prints at most three
|
|
686
|
+
concrete findings (also written to \`.bitmagic/judge.json\`). Fix the ones worth fixing, confirm
|
|
687
|
+
with one re-run, then move on — **never loop on the judge**. See the \`judging-quality/\` skill.
|
|
688
|
+
|
|
649
689
|
## The human may be moving objects too
|
|
650
690
|
|
|
651
691
|
\`bitmagic dev\` serves one page with two tabs — **Game**, where the owner plays, and **Editor**,
|
|
@@ -775,13 +815,16 @@ are developing, when rebuilding is cheap, rather than being blocked at the momen
|
|
|
775
815
|
You can create game content from here — no web editor needed:
|
|
776
816
|
|
|
777
817
|
\`\`\`
|
|
778
|
-
bitmagic generate skybox
|
|
779
|
-
bitmagic generate
|
|
780
|
-
bitmagic generate
|
|
781
|
-
bitmagic generate
|
|
782
|
-
bitmagic generate
|
|
783
|
-
bitmagic generate
|
|
784
|
-
bitmagic generate
|
|
818
|
+
bitmagic generate skybox --description "a stormy alien sky with two moons"
|
|
819
|
+
bitmagic generate background --description "layered pine forest at dusk"
|
|
820
|
+
bitmagic generate block-type --name mossy_brick --description "damp green moss on red brick"
|
|
821
|
+
bitmagic generate sound --prompt "heavy wooden door slamming" [--duration 3] [--loop]
|
|
822
|
+
bitmagic generate image --name hero-portrait --prompt "..." [--width 512] [--height 512]
|
|
823
|
+
bitmagic generate character --name guard --prompt "..." [--apply-to-player]
|
|
824
|
+
bitmagic generate animation --family gait --name LimpStride --based-on walk [--dial limpSide=right]
|
|
825
|
+
bitmagic generate animation --spec clip.json # melee and oneShot clips: a spec file
|
|
826
|
+
bitmagic generate model --prompt "a mossy stone arch" [--height 3]
|
|
827
|
+
bitmagic generate vehicle --prompt "a rusty orange pickup" | --preset VAN
|
|
785
828
|
\`\`\`
|
|
786
829
|
|
|
787
830
|
Run \`bitmagic generate <type> --help\` for the full flags of any one.
|
|
@@ -801,10 +844,9 @@ Four things worth knowing before you use these:
|
|
|
801
844
|
4. **A running \`bitmagic dev\` picks the new asset up on its own.** It reloads the browser once
|
|
802
845
|
the write settles; \`bitmagic reload\` forces it if you want it now.
|
|
803
846
|
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
will fail to load it.
|
|
847
|
+
Three lanes make a 3D object, and the wrong one wastes a generation: \`generate model\` mints a NEW
|
|
848
|
+
asset, \`generate prop --asset <id>\` UPGRADES a placeholder, \`assets add <file>\` uploads your own.
|
|
849
|
+
Splats, video and \`.vox\`/\`.fbx\` still need the web editor; never reference an asset you did not make.
|
|
808
850
|
|
|
809
851
|
## Forging a whole level
|
|
810
852
|
|
|
@@ -813,7 +855,9 @@ bitmagic forge --prompt "a ruined desert temple with a central courtyard"
|
|
|
813
855
|
\`\`\`
|
|
814
856
|
|
|
815
857
|
This designs a scene, builds its geometry, bakes it to voxels and writes the finished level —
|
|
816
|
-
terrain, props, spawn points — into \`src/work/world.json\`.
|
|
858
|
+
terrain, props, spawn points — into \`src/work/world.json\`. \`bitmagic levels list | add | rename
|
|
859
|
+
| set-start | remove\` manages them afterwards (free, local); \`set-start\` is how you change which
|
|
860
|
+
level the game boots into, and it moves the legacy mirror fields with it. Add \`--city\`, \`--dungeon\`,
|
|
817
861
|
\`--platformer\` or \`--freeform\` (at most one) for a different kind of place; omit them all for
|
|
818
862
|
natural terrain.
|
|
819
863
|
|
|
@@ -931,6 +975,7 @@ the engine, already wired** — and hand-building a worse version of it is the m
|
|
|
931
975
|
| Save points, checkpoints, persistence | Persistence system | \`persistence-system.md\` |
|
|
932
976
|
| Multiple levels or arenas | \`levels[]\` registry + \`engine.loadLevel()\` | \`level-system.md\` |
|
|
933
977
|
| Voice input, speaking to NPCs | \`engine.enablePushToTalk()\` | \`voice-input.md\` |
|
|
978
|
+
| A key for a new action — shoot, reload, boost, throw | \`registerCustomAction()\` / \`declareMobileActions()\` — one call binds the desktop key AND the phone button | \`control-system.md\` |
|
|
934
979
|
| The default player and its animation set | Already there | — |
|
|
935
980
|
|
|
936
981
|
A built-in still covers the request when the human names a style ("a katana" → the built-in katana).
|
|
@@ -958,11 +1003,16 @@ from GAME-DESIGN.md").
|
|
|
958
1003
|
Camera mode. Is the player an embodied walking character? Terrain form. Anything the recipe fixes
|
|
959
1004
|
that I would otherwise have defaulted differently.
|
|
960
1005
|
|
|
1006
|
+
## Platform
|
|
1007
|
+
\`primaryPlatform\` in \`game.json\` — \`desktop\` or \`mobile\`. Plus \`worldProfileData.mobileOrientation\`
|
|
1008
|
+
in \`world.json\` when the game only works one way up.
|
|
1009
|
+
|
|
961
1010
|
## Slice 1 — the smallest playable thing
|
|
962
1011
|
- Core verb: the ONE thing the player does
|
|
963
1012
|
- Win: fires, even if the number is wrong
|
|
964
1013
|
- Lose:
|
|
965
1014
|
- On-screen feedback: score / timer / health
|
|
1015
|
+
- Controls: every action as desktop key + phone button, bound in one call
|
|
966
1016
|
- Engine systems: one line each, naming the doc — \`engine/agent-docs/…\`
|
|
967
1017
|
- Assets to generate: name them. A skybox and the cover usually earn their place in slice 1.
|
|
968
1018
|
- Level: procedural baseline terrain, unless the terrain IS the mechanic
|
|
@@ -1008,8 +1058,9 @@ forge is backlog item 1, run once the loop is proven.
|
|
|
1008
1058
|
|
|
1009
1059
|
Short, concrete, and honest. Three parts:
|
|
1010
1060
|
|
|
1011
|
-
- **Playable now** — one sentence, plus the literal control. "You can drive the
|
|
1012
|
-
lap. It is already reloaded in your browser — W to accelerate, A/D to steer
|
|
1061
|
+
- **Playable now** — one sentence, plus the literal control on both platforms. "You can drive the
|
|
1062
|
+
kart and complete a lap. It is already reloaded in your browser — W to accelerate, A/D to steer,
|
|
1063
|
+
and the same on a phone from the joystick and the GAS button."
|
|
1013
1064
|
- **Not in yet, on purpose** — three to five items from the backlog, so they know it is a choice and
|
|
1014
1065
|
not a bug.
|
|
1015
1066
|
- **Next I would do** — two or three, numbered, in order. Then ask which.
|
|
@@ -1153,11 +1204,30 @@ These docs are shared with Bitmagic's hosted agent, so two things read oddly her
|
|
|
1153
1204
|
|---|---|
|
|
1154
1205
|
| \`configure_game\`, \`manage-achievements\`, \`manage-levels\`, \`spawnpoint upsert\` | edit \`src/work/world.json\` directly |
|
|
1155
1206
|
| \`node bin/voxel.mjs\` / \`bin/world-edit.mjs\` | edit \`src/work/world.json\` directly |
|
|
1156
|
-
| \`generate_character\`, \`design-vehicle\`, skybox/sound/image/animation generation | \`bitmagic generate <type>\` |
|
|
1207
|
+
| \`generate_character\`, \`design-vehicle\`, \`generateBlockTypeTool\`, \`backgroundImageGenerationTool\`, skybox/sound/image/animation generation | \`bitmagic generate <type>\` |
|
|
1157
1208
|
| \`runWorldForger\` / \`run-world-forger\` | \`bitmagic forge\` |
|
|
1158
1209
|
|
|
1159
1210
|
Everything else in the doc — the engine APIs, the world.json shape, the gotchas — still applies.
|
|
1160
1211
|
|
|
1212
|
+
## Controls: one API, both platforms
|
|
1213
|
+
|
|
1214
|
+
The one lookup worth doing before you write any input code, because getting it wrong compiles,
|
|
1215
|
+
runs, and ships a control no phone can reach.
|
|
1216
|
+
|
|
1217
|
+
- \`PlayerController.registerCustomAction({ action, desktop: { keys }, mobile: { label, behavior } })\`
|
|
1218
|
+
— binds the desktop key and creates the mobile button atomically. **Throws** without \`mobile\`.
|
|
1219
|
+
- \`declareMobileActions(): MobileActionSpec[]\` on the genre's Game class — the declarative form,
|
|
1220
|
+
run before game systems initialize. \`MobileActionSpec\` (\`engine/MobileActionSpec.js\`):
|
|
1221
|
+
\`action\`, \`desktopKeys\`, \`iconKey\`, \`label\`, \`behavior: 'tap' | 'continuous'\`, \`preferredSlot\`.
|
|
1222
|
+
- Both write \`playerController.keys.<action>\`, so the gameplay code reads one flag either way.
|
|
1223
|
+
- \`playerController.verifyMobileParity()\` runs at game start and reports gaps as a
|
|
1224
|
+
\`[mobile-parity]\` console error. It only sees keys registered through the engine — a raw
|
|
1225
|
+
\`document.addEventListener('keydown', …)\` is invisible to it, which is why that pattern and
|
|
1226
|
+
\`desktopControls.registerKeyHandler()\` are both banned for gameplay actions.
|
|
1227
|
+
|
|
1228
|
+
Full reference, including the nine button slots and the built-in icon keys:
|
|
1229
|
+
\`engine/agent-docs/control-system.md\`.
|
|
1230
|
+
|
|
1161
1231
|
## The two rules that keep this cheap
|
|
1162
1232
|
|
|
1163
1233
|
**Stop searching, start writing.** Do not pre-verify every API you plan to touch. Once you know
|
|
@@ -1185,20 +1255,23 @@ you work. Re-read it before editing it.
|
|
|
1185
1255
|
export function renderGenerateSkill() {
|
|
1186
1256
|
return `---
|
|
1187
1257
|
name: generating-assets
|
|
1188
|
-
description: Use when this Bitmagic game needs a new skybox, sound effect, image, character, animation or drivable vehicle — anything that would otherwise require the web editor.
|
|
1258
|
+
description: Use when this Bitmagic game needs a new skybox, 2D background, custom block type, sound effect, image, character, animation or drivable vehicle, or when the creator has a model, sound, image or .vxl file of their own to add — anything that would otherwise require the web editor.
|
|
1189
1259
|
---
|
|
1190
1260
|
|
|
1191
1261
|
# Generating game assets
|
|
1192
1262
|
|
|
1193
|
-
The \`bitmagic\` CLI generates content directly into this project.
|
|
1263
|
+
The \`bitmagic\` CLI generates content directly into this project. Nine types work today:
|
|
1194
1264
|
|
|
1195
1265
|
| Command | Makes | Lands in |
|
|
1196
1266
|
|---|---|---|
|
|
1197
1267
|
| \`bitmagic generate skybox --description "..."\` | a 360° environment | \`worldProfileData.skyboxUrl\` |
|
|
1268
|
+
| \`bitmagic generate background --description "..."\` | a flat 2D backdrop | \`worldProfileData.skyboxUrl\` |
|
|
1269
|
+
| \`bitmagic generate block-type --name <id> --description "..."\` | a custom voxel block | \`worldProfileData.customBlockTypes[]\` |
|
|
1198
1270
|
| \`bitmagic generate sound --prompt "..."\` | a sound effect | \`assets[]\` |
|
|
1199
1271
|
| \`bitmagic generate image --name <id> --prompt "..."\` | a 2D image | \`assets[]\` |
|
|
1200
1272
|
| \`bitmagic generate character --name <id> --prompt "..."\` | a rigged character | \`assets[]\` |
|
|
1201
1273
|
| \`bitmagic generate animation --family gait ...\` or \`--spec <file>\` | an animation clip | \`assets[]\` |
|
|
1274
|
+
| \`bitmagic generate model --prompt "..."\` | a new 3D model | \`assets[]\` |
|
|
1202
1275
|
| \`bitmagic generate vehicle --prompt "..."\` | a drivable vehicle | \`assets[]\` |
|
|
1203
1276
|
|
|
1204
1277
|
\`--help\` on any subcommand lists its full flags.
|
|
@@ -1208,6 +1281,13 @@ spec in one of three families — \`gait\` (the only one with a flag form), \`me
|
|
|
1208
1281
|
(lists of key poses, so they come from a \`--spec\` file). It is also the cheapest, one spark a
|
|
1209
1282
|
clip, because it is solved locally rather than generated by a model.
|
|
1210
1283
|
|
|
1284
|
+
\`model\` is the one to reach for when the game needs an object that does not exist yet — a new
|
|
1285
|
+
asset from a sentence. It needs Chrome and a free port between 3000 and 3199, because only the
|
|
1286
|
+
engine can voxelize. \`--height\` scales it (interiors fill solid below 6 m and stay hollow above,
|
|
1287
|
+
so a building is not baked as a solid block), and \`--name\` sets what game code places by. Do not
|
|
1288
|
+
confuse it with \`prop\`, which REPLACES an existing placeholder and changes every instance already
|
|
1289
|
+
placed.
|
|
1290
|
+
|
|
1211
1291
|
\`vehicle\` is the one that needs more than a prompt to be useful. It creates a NEW asset (it does
|
|
1212
1292
|
not upgrade an existing one), it needs Chrome and a free port between 3000 and 3199 because only
|
|
1213
1293
|
the engine can voxelize, and \`--preset VAN\` builds a standard vehicle without calling the designer
|
|
@@ -1220,6 +1300,21 @@ engine.getVehicleSpawner().spawnAndEnterFromAsset({ x: 0, z: 0 }, '<assetName>',
|
|
|
1220
1300
|
|
|
1221
1301
|
Headlights, taillights and beacons are built and lit automatically — never ask for them.
|
|
1222
1302
|
|
|
1303
|
+
\`background\` and \`skybox\` write the **same field**. Pick one: \`skybox\` for a 360° panorama a
|
|
1304
|
+
free-look camera can turn in, \`background\` for a flat layered backdrop behind a fixed sidescroller
|
|
1305
|
+
or top-down camera. The engine wraps either onto the sky sphere, so a flat backdrop reads as a
|
|
1306
|
+
distant painted horizon rather than a full-screen image — and running one after the other replaces
|
|
1307
|
+
the first, silently.
|
|
1308
|
+
|
|
1309
|
+
\`block-type\` registers a block **before** anything can use it: \`--name\` is what
|
|
1310
|
+
\`create-voxel-asset\`, \`groundConfig.surfaceBlockType\` and building code refer to, and an
|
|
1311
|
+
unrecognised name falls back to flat vertex colour instead of failing. Names are lowercase
|
|
1312
|
+
snake_case, are compared case-insensitively, and cannot shadow a built-in (\`wood\`, \`leaves\`,
|
|
1313
|
+
\`stone\`, \`grass\`, \`sand\`, \`dirt\`, \`ice\`, \`asphalt\`, \`water\`, \`lava\`, \`marble\`, or the
|
|
1314
|
+
aliases \`trunk\`, \`foliage\`, \`rock\`, \`road\`). Re-running with the same \`--name\` **replaces**
|
|
1315
|
+
the entry rather than adding a second one. \`--side-description\` gives the side faces their own
|
|
1316
|
+
texture and generates a second one.
|
|
1317
|
+
|
|
1223
1318
|
Cover art is the one generation that is **not** a \`generate\` subcommand:
|
|
1224
1319
|
|
|
1225
1320
|
| Command | Makes | Lands in |
|
|
@@ -1263,11 +1358,22 @@ just a worse game. Two things to settle first:
|
|
|
1263
1358
|
Every failure before the asset arrives leaves \`world.json\` unchanged, and the command says so
|
|
1264
1359
|
explicitly. You never need to guess whether a failed generation half-applied.
|
|
1265
1360
|
|
|
1361
|
+
## Adding a file the creator already has
|
|
1362
|
+
|
|
1363
|
+
Not a generation, but the same registry: \`bitmagic assets add <file>\` uploads a \`.glb\`
|
|
1364
|
+
(voxelized in a headless browser — Chrome and a free port in 3000–3199, like \`vehicle\`), a
|
|
1365
|
+
\`.vxl\`, an image (\`.png/.jpg/.webp\`), audio (\`.opus/.ogg/.m4a/.mp3\`) or a config \`.json\`
|
|
1366
|
+
into \`assets[]\` and prints the id. \`--keep-glb\` registers a \`.glb\` as a polygon mesh instead;
|
|
1367
|
+
\`--voxel-size\`, \`--height\` and \`--hollow\` tune the bake. It costs no sparks. \`bitmagic
|
|
1368
|
+
assets list\` shows what is there; \`bitmagic assets remove <id>\` takes one out of \`world.json\`
|
|
1369
|
+
(the file stays in storage) and refuses while something in \`world.json\` still references it.
|
|
1370
|
+
|
|
1266
1371
|
## What is not available
|
|
1267
1372
|
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1373
|
+
Gaussian splats, video, and the import formats \`assets add\` refuses (\`.gltf\`, \`.vox\`, \`.qb\`,
|
|
1374
|
+
\`.fbx\`, \`.spz\`, \`.ply\`, \`.sog\`, \`.mp4\`) still need the web editor's Assets tab. Do not
|
|
1375
|
+
hand-edit \`world.json\` to reference an asset you have neither generated nor added; the game will
|
|
1376
|
+
fail to load it.
|
|
1271
1377
|
`;
|
|
1272
1378
|
}
|
|
1273
1379
|
/**
|
|
@@ -1343,6 +1449,56 @@ game or prompt — the ledger records what was charged, not which change asked f
|
|
|
1343
1449
|
per-invoice view, the plan page on the web is the source of truth.
|
|
1344
1450
|
`;
|
|
1345
1451
|
}
|
|
1452
|
+
/**
|
|
1453
|
+
* `.claude/skills/judging-quality/SKILL.md` — when and how to run `bitmagic judge`.
|
|
1454
|
+
*
|
|
1455
|
+
* The point the skill has to land is the discipline, not the mechanics: judge after milestones,
|
|
1456
|
+
* fix the findings, confirm once, stop. An agent that loops on the judge is spending the
|
|
1457
|
+
* creator's sparks on reassurance.
|
|
1458
|
+
*/
|
|
1459
|
+
export function renderJudgeSkill() {
|
|
1460
|
+
return `---
|
|
1461
|
+
name: judging-quality
|
|
1462
|
+
description: Use after finishing a milestone — a mechanics-plan slice shipped, a level forged, a visual pass done — to get an independent quality verdict on the running game, or when asked whether the game looks good, what to polish next, or to review the game's quality.
|
|
1463
|
+
---
|
|
1464
|
+
|
|
1465
|
+
# Judging the game's quality
|
|
1466
|
+
|
|
1467
|
+
\`\`\`bash
|
|
1468
|
+
bitmagic verify # first: captures the screenshot the judge grades (no --fast)
|
|
1469
|
+
bitmagic judge # one vision-model call; prints a scorecard, exits 0
|
|
1470
|
+
bitmagic judge --genre platformer # sharpen the rubric: platformer, racing, shooter, combat, driving, tower-defense
|
|
1471
|
+
bitmagic judge --min-score 7 # exit 4 when the overall score is below the bar
|
|
1472
|
+
bitmagic judge --json # the scorecard as one JSON document on stdout
|
|
1473
|
+
\`\`\`
|
|
1474
|
+
|
|
1475
|
+
You built this game, so you are the wrong judge of it. \`bitmagic judge\` sends the screenshot
|
|
1476
|
+
\`bitmagic verify\` captured, plus a rubric built from \`GAME-DESIGN.md\`, to a separate vision
|
|
1477
|
+
model and prints back four dimension scores (visual-quality, readability, design-fidelity, polish)
|
|
1478
|
+
and at most three findings — each naming what to change, most severe first. The scorecard is also
|
|
1479
|
+
written to \`.bitmagic/judge.json\`.
|
|
1480
|
+
|
|
1481
|
+
It is paid (sparks, roughly the cost of one small model call) and deliberate — which is why it is
|
|
1482
|
+
a command you run, not something verify does for you.
|
|
1483
|
+
|
|
1484
|
+
## The loop, and where it stops
|
|
1485
|
+
|
|
1486
|
+
1. Finish the milestone. Run \`bitmagic verify\` — the judge grades verify's screenshot, so a
|
|
1487
|
+
stale one gets you a verdict on the game you had yesterday (the command warns when so).
|
|
1488
|
+
2. Run \`bitmagic judge\`. Read the findings.
|
|
1489
|
+
3. Fix the ones worth fixing — they name the object or region and the change.
|
|
1490
|
+
4. Re-run \`verify\`, then \`judge\` once to confirm the fixes landed.
|
|
1491
|
+
5. **Stop.** Whatever the score now says, move on to the next milestone. Never run the judge a
|
|
1492
|
+
third time on the same milestone, and never chase a number — the findings are the product, the
|
|
1493
|
+
score is context.
|
|
1494
|
+
|
|
1495
|
+
## When it refuses
|
|
1496
|
+
|
|
1497
|
+
- **No screenshot** — run \`bitmagic verify\` first, without \`--fast\` (which skips screenshots).
|
|
1498
|
+
- **Not enough sparks / spending not approved** — report it to the creator; see the
|
|
1499
|
+
\`checking-usage\` skill. Never enable spending yourself.
|
|
1500
|
+
`;
|
|
1501
|
+
}
|
|
1346
1502
|
/**
|
|
1347
1503
|
* `GAME-DESIGN.md` — the project's design document, and the input `bitmagic cover` builds its
|
|
1348
1504
|
* image prompt from. The web lane's Planning Mode writes a file of the same name for the same
|
|
@@ -1394,7 +1550,8 @@ project root for the guidance an agent should read before editing this game.
|
|
|
1394
1550
|
|
|
1395
1551
|
## Which of these are yours
|
|
1396
1552
|
|
|
1397
|
-
\`planning-a-game/\`, \`finding-engine-apis/\`, \`generating-assets/\`, \`checking-usage
|
|
1553
|
+
\`planning-a-game/\`, \`finding-engine-apis/\`, \`generating-assets/\`, \`checking-usage/\`,
|
|
1554
|
+
\`judging-quality/\` — and
|
|
1398
1555
|
this README — are shipped by the Bitmagic CLI and **re-rendered by \`bitmagic upgrade\`**. They
|
|
1399
1556
|
describe what the CLI and the engine can do, so they have to stay current with both; edits to them
|
|
1400
1557
|
are lost on the next upgrade.
|
|
@@ -1403,8 +1560,9 @@ are lost on the next upgrade.
|
|
|
1403
1560
|
|---|---|
|
|
1404
1561
|
| \`planning-a-game/\` | starting a game, a genre, or anything touching more than one gameplay feature — scoping the first playable slice and writing \`mechanics-plan.md\` |
|
|
1405
1562
|
| \`finding-engine-apis/\` | you need an engine API and do not know its name or signature, or \`bitmagic check\` cannot resolve a symbol |
|
|
1406
|
-
| \`generating-assets/\` | the game needs a skybox, sound, image, character, animation or vehicle |
|
|
1563
|
+
| \`generating-assets/\` | the game needs a skybox, a background, a custom block type, sound, image, character, animation or vehicle |
|
|
1407
1564
|
| \`checking-usage/\` | asked what sparks were spent on, how much Pro allowance is left, or whether there is enough left to keep generating |
|
|
1565
|
+
| \`judging-quality/\` | a milestone is done and the game deserves an independent quality verdict — \`bitmagic judge\` |
|
|
1408
1566
|
|
|
1409
1567
|
Every other directory here is yours. \`upgrade\` never opens a skill it does not ship, and never
|
|
1410
1568
|
deletes anything under \`.claude/\`. Put project-specific guidance in a skill of your own, or in
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-files.js","sourceRoot":"","sources":["../../src/scaffold/project-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAKjF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;IAkBnC,CAAC;AAEL;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,2BAA2B,EAAE,SAAS;IACtC,2BAA2B,EAAE,SAAS;IACtC,kBAAkB,EAAE,QAAQ;IAC5B,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,kCAAkC,EAAE,QAAQ;IAC5C,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,UAAU;IACjB,4FAA4F;IAC5F,6FAA6F;IAC7F,4CAA4C;CACZ,CAAC;AAEnC,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACtD,aAAa,EAAE,UAAU;IACzB,cAAc,EAAE,UAAU;IAC1B,8FAA8F;IAC9F,cAAc,EAAE,QAAQ;IACxB,4FAA4F;IAC5F,mFAAmF;IACnF,eAAe,EAAE,SAAS;IAC1B,UAAU,EAAE,QAAQ;IACpB,IAAI,EAAE,QAAQ;IACd,wBAAwB,EAAE,QAAQ;CACnC,CAAC;AAEF,qEAAqE;AACrE,SAAS,aAAa,CAAC,IAA+B;IACpD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,SAAS,MAAM,CAAC,IAA+B;IAC7C,OAAO,kBAAkB,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;AACzD,CAAC;AAED;;;;;GAKG;AACH,MAAM,
|
|
1
|
+
{"version":3,"file":"project-files.js","sourceRoot":"","sources":["../../src/scaffold/project-files.ts"],"names":[],"mappings":"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"}
|
package/dist/scaffold/project.js
CHANGED
|
@@ -2,7 +2,7 @@ import * as fs from 'fs';
|
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import { CliError } from '../errors.js';
|
|
4
4
|
import { aliasSourceDir } from './aliases.js';
|
|
5
|
-
import { renderPackageJson, renderTsconfig, renderIndexHtml, renderViteConfig, renderVitePublishConfig, renderGitignore, renderBitmagicJson, renderAgentsMd, renderGameDesignMd, renderClaudeMd, renderSkillsReadme, renderGenerateSkill, renderPlanningSkill, renderEngineApiSkill, renderUsageSkill, } from './project-files.js';
|
|
5
|
+
import { renderPackageJson, renderTsconfig, renderIndexHtml, renderViteConfig, renderVitePublishConfig, renderGitignore, renderBitmagicJson, renderAgentsMd, renderGameDesignMd, renderClaudeMd, renderJudgeSkill, renderSkillsReadme, renderGenerateSkill, renderPlanningSkill, renderEngineApiSkill, renderUsageSkill, } from './project-files.js';
|
|
6
6
|
import { hashAgentsMd } from './agents-md.js';
|
|
7
7
|
import { CLAUDE_SETTINGS_FILE, renderClaudeSettings } from './claude-settings.js';
|
|
8
8
|
/**
|
|
@@ -160,6 +160,7 @@ export const PLATFORM_GENERATED_FILES = [
|
|
|
160
160
|
['.claude/skills/planning-a-game/SKILL.md', renderPlanningSkill],
|
|
161
161
|
['.claude/skills/finding-engine-apis/SKILL.md', renderEngineApiSkill],
|
|
162
162
|
['.claude/skills/checking-usage/SKILL.md', renderUsageSkill],
|
|
163
|
+
['.claude/skills/judging-quality/SKILL.md', renderJudgeSkill],
|
|
163
164
|
];
|
|
164
165
|
/**
|
|
165
166
|
* Every template the downloaded bundle carries, in index order.
|
|
@@ -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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"}
|