@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.
- package/README.md +27 -3
- package/assets/unity-import/README.md +13 -0
- package/assets/unity-import/blender_build.py +462 -0
- package/assets/unity-import/build_parts.py +263 -0
- package/assets/unity-import/convert_assets.py +193 -0
- package/assets/unity-import/fbx_ascii.py +156 -0
- package/assets/unity-import/fbx_axis.py +174 -0
- package/assets/unity-import/fbx_bounds.py +202 -0
- package/assets/unity-import/import_config.py +86 -0
- package/assets/unity-import/level_patches.example.json +23 -0
- package/assets/unity-import/mesh_walls.py +78 -0
- package/assets/unity-import/render_topdown.py +33 -0
- package/assets/unity-import/unity-import.example.json +27 -0
- package/assets/unity-import/unity_assets.py +114 -0
- package/assets/unity-import/unity_colliders2d.py +127 -0
- package/assets/unity-import/unity_extract.py +774 -0
- package/assets/unity-import/unity_markers.py +249 -0
- package/assets/unity-import/unity_renderers.py +279 -0
- package/assets/unity-import/write_arena_data.py +198 -0
- package/dist/cli.d.ts +12 -0
- package/dist/commands/check.js +2 -2
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/dev.js +4 -4
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/forge.js +4 -3
- package/dist/commands/forge.js.map +1 -1
- package/dist/commands/import.d.ts +4 -0
- package/dist/commands/import.js +5 -0
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.js +20 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/upgrade.d.ts +4 -0
- package/dist/commands/upgrade.js +31 -5
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/commands/verify.js +5 -4
- package/dist/commands/verify.js.map +1 -1
- package/dist/editor/server.js +3 -3
- package/dist/editor/shell-page.js +16 -1
- package/dist/editor/shell-page.js.map +1 -1
- package/dist/editor/watch.d.ts +1 -1
- package/dist/editor/watch.js +2 -21
- package/dist/editor/watch.js.map +1 -1
- package/dist/forge/voxelize-session.d.ts +1 -1
- package/dist/forge/voxelize-session.js +4 -32
- package/dist/forge/voxelize-session.js.map +1 -1
- package/dist/project/context.d.ts +14 -1
- package/dist/project/context.js +17 -4
- package/dist/project/context.js.map +1 -1
- package/dist/project/package-manager.js +2 -2
- package/dist/project/package-manager.js.map +1 -1
- package/dist/project/spawn-bin.d.ts +69 -0
- package/dist/project/spawn-bin.js +96 -0
- package/dist/project/spawn-bin.js.map +1 -0
- package/dist/publish/bundle.js +3 -3
- package/dist/publish/bundle.js.map +1 -1
- package/dist/scaffold/agent-targets.d.ts +126 -0
- package/dist/scaffold/agent-targets.js +180 -0
- package/dist/scaffold/agent-targets.js.map +1 -0
- package/dist/scaffold/agents-md.d.ts +4 -1
- package/dist/scaffold/agents-md.js +6 -2
- package/dist/scaffold/agents-md.js.map +1 -1
- package/dist/scaffold/project-files.d.ts +40 -5
- package/dist/scaffold/project-files.js +67 -25
- package/dist/scaffold/project-files.js.map +1 -1
- package/dist/scaffold/project.d.ts +42 -15
- package/dist/scaffold/project.js +100 -38
- package/dist/scaffold/project.js.map +1 -1
- package/dist/scaffold/reference-guidance.d.ts +1 -1
- package/dist/scaffold/reference-guidance.js +2 -1
- package/dist/scaffold/reference-guidance.js.map +1 -1
- package/dist/scaffold/scaffold-run.js +2 -2
- package/dist/scaffold/scaffold-run.js.map +1 -1
- package/dist/scaffold/skill-files.d.ts +32 -9
- package/dist/scaffold/skill-files.js +71 -15
- package/dist/scaffold/skill-files.js.map +1 -1
- package/dist/scaffold/unity-skill-files.d.ts +30 -0
- package/dist/scaffold/unity-skill-files.js +474 -0
- package/dist/scaffold/unity-skill-files.js.map +1 -0
- package/dist/scaffold/upgrade-project.d.ts +31 -11
- package/dist/scaffold/upgrade-project.js +35 -23
- package/dist/scaffold/upgrade-project.js.map +1 -1
- package/dist/verify/iterate.js +2 -1
- package/dist/verify/iterate.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which agent tools a project is set up for, and where each one looks for its skills.
|
|
3
|
+
*
|
|
4
|
+
* The GDK is a bring-your-own-agent product, but for most of its life the scaffold wrote to
|
|
5
|
+
* `.claude/skills/` and nothing else — so a creator on Cursor, Codex or Kiro received a directory of
|
|
6
|
+
* skill files their agent never opened, and `bitmagic upgrade`, the only route by which an existing
|
|
7
|
+
* project learns about a new CLI capability, kept refreshing files nobody read.
|
|
8
|
+
*
|
|
9
|
+
* ── Why `.agents/skills/` is unconditional ───────────────────────────────────────────────────────
|
|
10
|
+
*
|
|
11
|
+
* Cursor, Codex, GitHub Copilot, Cline and OpenCode all load `.agents/skills/` by themselves, and
|
|
12
|
+
* all of them read the root `AGENTS.md` this scaffold already writes. So writing that one directory
|
|
13
|
+
* into every project supports five agents with no flag to pass and no environment to sniff — which
|
|
14
|
+
* is the whole point, because neither of the alternatives survives contact:
|
|
15
|
+
*
|
|
16
|
+
* - Detection cannot be built honestly. `../telemetry/command-context.ts` states the policy —
|
|
17
|
+
* an agent gets a marker here only once that marker is verified against the real thing, because
|
|
18
|
+
* a guessed variable never fires and misleads whoever reads the table next — and `CLAUDECODE` is
|
|
19
|
+
* the only marker anyone has verified. An `init` run by Cursor's agent proves nothing, so
|
|
20
|
+
* detection-as-default would silently produce a Cursor-less project.
|
|
21
|
+
* - A required flag cannot be relied on either. The GDK bootstrap that runs `bitmagic init` is
|
|
22
|
+
* read BY the agent, so it could pass its own id — but nothing upgrades an installed copy of
|
|
23
|
+
* that bootstrap (see `agent-plugin/README.md`), so a creator on last month's copy would get
|
|
24
|
+
* nothing, and the failure is silent.
|
|
25
|
+
*
|
|
26
|
+
* What is left for this table is therefore narrow: agents that read a VENDOR directory and nothing
|
|
27
|
+
* else. Claude Code (`.claude/skills/`) is one, and it is unconditional too — every project on disk
|
|
28
|
+
* today has that directory, and an upgrade that stopped writing it would be the first destructive
|
|
29
|
+
* thing the command has ever done. Kiro (`.kiro/skills/`) is the other, and it is the only reason
|
|
30
|
+
* `--agent` exists: an unasked-for `.kiro/` is pure noise in a project that does not use Kiro.
|
|
31
|
+
*
|
|
32
|
+
* ── Why the directory, not the agent, is the unit ────────────────────────────────────────────────
|
|
33
|
+
*
|
|
34
|
+
* Four agents map onto three directories, so every caller works in terms of the deduped set of
|
|
35
|
+
* DIRECTORIES (`skillDirsFor`). Writing per agent instead would put the same files into
|
|
36
|
+
* `.agents/skills/` twice for a creator who named both Cursor and Codex.
|
|
37
|
+
*/
|
|
38
|
+
import { CliError } from '../errors.js';
|
|
39
|
+
/**
|
|
40
|
+
* The directory every agent following the AGENTS.md / agent-skills convention reads by itself.
|
|
41
|
+
* Written into every project whatever agent scaffolded it — see the file header.
|
|
42
|
+
*/
|
|
43
|
+
export const SHARED_SKILLS_DIR = '.agents/skills';
|
|
44
|
+
/**
|
|
45
|
+
* Declaration order is output order, so the file set a project receives is a function of WHICH
|
|
46
|
+
* agents were selected and not of how they were typed.
|
|
47
|
+
*/
|
|
48
|
+
export const AGENT_TARGETS = [
|
|
49
|
+
{
|
|
50
|
+
id: 'claude-code',
|
|
51
|
+
label: 'Claude Code',
|
|
52
|
+
// Claude Code does NOT read `.agents/skills/`; `.claude/skills/` is its only project path.
|
|
53
|
+
skillsDir: '.claude/skills',
|
|
54
|
+
instructions: 'CLAUDE.md, which imports AGENTS.md',
|
|
55
|
+
},
|
|
56
|
+
{ id: 'cursor', label: 'Cursor', instructions: 'AGENTS.md' },
|
|
57
|
+
{ id: 'codex', label: 'Codex', instructions: 'AGENTS.md' },
|
|
58
|
+
{ id: 'kiro', label: 'Kiro', skillsDir: '.kiro/skills', instructions: '.kiro/steering/*.md' },
|
|
59
|
+
];
|
|
60
|
+
export const AGENT_IDS = AGENT_TARGETS.map((target) => target.id);
|
|
61
|
+
/**
|
|
62
|
+
* In every project's set, and not removable.
|
|
63
|
+
*
|
|
64
|
+
* `--agent` adds; it never takes away. Both of the unconditional directories are already on disk in
|
|
65
|
+
* every existing project (`.claude/skills/`) or are what makes five agents work for free
|
|
66
|
+
* (`.agents/skills/`), and `upgrade` has never deleted a file under a skills directory.
|
|
67
|
+
*/
|
|
68
|
+
export const ALWAYS_AGENTS = ['claude-code'];
|
|
69
|
+
/**
|
|
70
|
+
* `--agent`'s help text, shared by `init` and `upgrade` so the two cannot describe the same flag
|
|
71
|
+
* differently. It names what the flag is FOR, because the honest answer is "usually nothing": the
|
|
72
|
+
* default already covers every agent but Kiro.
|
|
73
|
+
*/
|
|
74
|
+
export const AGENT_FLAG_DESCRIPTION = `Agent tools to write skills for, comma-separated (${AGENT_IDS.join(', ')}). ` +
|
|
75
|
+
`Adds to what a project already has; never removes. Only needed for kiro — ` +
|
|
76
|
+
`${SHARED_SKILLS_DIR}/ and .claude/skills/ are always written, which covers the rest.`;
|
|
77
|
+
export function isAgentId(value) {
|
|
78
|
+
return typeof value === 'string' && AGENT_IDS.includes(value);
|
|
79
|
+
}
|
|
80
|
+
export function agentTarget(id) {
|
|
81
|
+
// Non-null by construction: AgentId is derived from this same table.
|
|
82
|
+
return AGENT_TARGETS.find((target) => target.id === id);
|
|
83
|
+
}
|
|
84
|
+
/** In table order, each agent once. */
|
|
85
|
+
export function dedupeAgents(agents) {
|
|
86
|
+
return AGENT_IDS.filter((id) => agents.includes(id));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* "Cursor", "Cursor and Codex", "Cursor, Codex and Kiro" — for a sentence a creator reads, not a
|
|
90
|
+
* list a parser does. Exported because the scaffolded AGENTS.md joins its skills directories the
|
|
91
|
+
* same way, and two hand-written copies of this join is how the two come to punctuate differently.
|
|
92
|
+
*/
|
|
93
|
+
export function joinWithAnd(items) {
|
|
94
|
+
if (items.length <= 1)
|
|
95
|
+
return items[0] ?? '';
|
|
96
|
+
return `${items.slice(0, -1).join(', ')} and ${items[items.length - 1]}`;
|
|
97
|
+
}
|
|
98
|
+
/** The agents named, in table order, as a clause for a sentence a creator reads. */
|
|
99
|
+
export function agentLabels(agents) {
|
|
100
|
+
return joinWithAnd(dedupeAgents(agents).map((id) => agentTarget(id).label));
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* `--agent kiro,cursor` → `['cursor', 'kiro']`, unioned with the always-present set.
|
|
104
|
+
*
|
|
105
|
+
* Comma-separated rather than a repeatable flag because citty's string args are single-valued. An
|
|
106
|
+
* unknown id is a hard error naming the valid ones: a typo that silently scaffolded the default set
|
|
107
|
+
* would look like the flag working, and the creator would find out when their agent loaded nothing.
|
|
108
|
+
*/
|
|
109
|
+
export function parseAgentFlag(raw) {
|
|
110
|
+
if (raw === undefined)
|
|
111
|
+
return dedupeAgents(ALWAYS_AGENTS);
|
|
112
|
+
const requested = raw
|
|
113
|
+
.split(',')
|
|
114
|
+
.map((part) => part.trim().toLowerCase())
|
|
115
|
+
.filter((part) => part !== '');
|
|
116
|
+
if (requested.length === 0) {
|
|
117
|
+
throw new CliError(`--agent needs at least one agent. Valid values: ${AGENT_IDS.join(', ')}.`);
|
|
118
|
+
}
|
|
119
|
+
const unknown = requested.filter((part) => !isAgentId(part));
|
|
120
|
+
if (unknown.length > 0) {
|
|
121
|
+
throw new CliError(`Unknown agent${unknown.length > 1 ? 's' : ''} ${unknown.map((u) => `"${u}"`).join(', ')}. ` +
|
|
122
|
+
`Valid values: ${AGENT_IDS.join(', ')}.`);
|
|
123
|
+
}
|
|
124
|
+
return dedupeAgents([...ALWAYS_AGENTS, ...requested]);
|
|
125
|
+
}
|
|
126
|
+
/** The `agents` field of a `bitmagic.json`, keeping only ids this CLI recognises. */
|
|
127
|
+
export function readRecordedAgents(value) {
|
|
128
|
+
if (!Array.isArray(value))
|
|
129
|
+
return [];
|
|
130
|
+
return dedupeAgents(value.filter(isAgentId));
|
|
131
|
+
}
|
|
132
|
+
/** Values in a project's `agents` field that this CLI does not recognise — reported, never fatal. */
|
|
133
|
+
export function unrecognisedAgents(value) {
|
|
134
|
+
if (!Array.isArray(value))
|
|
135
|
+
return [];
|
|
136
|
+
return value.filter((entry) => typeof entry === 'string' && !isAgentId(entry));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* The directories to write, deduped and in a stable order, always starting with the shared one.
|
|
140
|
+
*
|
|
141
|
+
* A duplicate here would double-write a file and list its path twice in `UpgradeResult.replaced`,
|
|
142
|
+
* so the dedupe is load-bearing rather than tidiness: `--agent cursor,codex` names two agents that
|
|
143
|
+
* share a directory.
|
|
144
|
+
*/
|
|
145
|
+
export function skillDirsFor(agents) {
|
|
146
|
+
const dirs = [SHARED_SKILLS_DIR];
|
|
147
|
+
for (const id of dedupeAgents([...ALWAYS_AGENTS, ...agents])) {
|
|
148
|
+
const dir = agentTarget(id).skillsDir;
|
|
149
|
+
if (dir !== undefined && !dirs.includes(dir))
|
|
150
|
+
dirs.push(dir);
|
|
151
|
+
}
|
|
152
|
+
return dirs;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* The directory `AGENTS.md` names when it cross-references a skill.
|
|
156
|
+
*
|
|
157
|
+
* Every project has more than one copy of the shipped skills, but `AGENTS.md` is ONE file at the
|
|
158
|
+
* root read by every agent in the project, so it has to name a single path — and the only honest
|
|
159
|
+
* choice is the one that exists in every project and that most agents load from. Its Layout section
|
|
160
|
+
* names the other copies, so a Claude Code reader still learns where its own loader looks.
|
|
161
|
+
*/
|
|
162
|
+
export const PRIMARY_SKILLS_DIR = SHARED_SKILLS_DIR;
|
|
163
|
+
/**
|
|
164
|
+
* The agents named by `--agent` that this scaffold writes nothing extra for, because the directory
|
|
165
|
+
* and the instructions file they read are already unconditional.
|
|
166
|
+
*
|
|
167
|
+
* Accepting such a flag and explaining it beats refusing one a creator reasonably typed.
|
|
168
|
+
*/
|
|
169
|
+
export function noOpAgents(agents) {
|
|
170
|
+
return dedupeAgents(agents).filter((id) => agentTarget(id).skillsDir === undefined);
|
|
171
|
+
}
|
|
172
|
+
/** Which agents load a given skills directory, as a clause for a sentence the creator reads. */
|
|
173
|
+
export function describeSkillsDir(dir) {
|
|
174
|
+
if (dir === SHARED_SKILLS_DIR) {
|
|
175
|
+
return 'read by Cursor, Codex and every agent that follows the AGENTS.md convention';
|
|
176
|
+
}
|
|
177
|
+
const owner = AGENT_TARGETS.find((target) => target.skillsDir === dir);
|
|
178
|
+
return owner === undefined ? 'read by your agent' : `where ${owner.label} looks`;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=agent-targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-targets.js","sourceRoot":"","sources":["../../src/scaffold/agent-targets.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,5 +48,8 @@ export interface AgentsMdOutcome {
|
|
|
48
48
|
*
|
|
49
49
|
* `storedHash` is `bitmagic.json`'s `agentsMdHash` — absent for any project scaffolded before this
|
|
50
50
|
* existed, which is exactly the population that most needs the suggestion path.
|
|
51
|
+
*
|
|
52
|
+
* `skillDirs` is passed for the same reason `environment` is: the template names the skills
|
|
53
|
+
* directories the project actually holds, so a Kiro project's copy differs from a default one's.
|
|
51
54
|
*/
|
|
52
|
-
export declare function reconcileAgentsMd(root: string, storedHash: string | undefined, environment: EnvironmentName | undefined): AgentsMdOutcome;
|
|
55
|
+
export declare function reconcileAgentsMd(root: string, storedHash: string | undefined, environment: EnvironmentName | undefined, skillDirs?: readonly string[]): AgentsMdOutcome;
|
|
@@ -29,6 +29,7 @@ import { createHash } from 'crypto';
|
|
|
29
29
|
import * as fs from 'fs';
|
|
30
30
|
import * as path from 'path';
|
|
31
31
|
import { renderAgentsMd } from './project-files.js';
|
|
32
|
+
import { ALWAYS_AGENTS, skillDirsFor } from './agent-targets.js';
|
|
32
33
|
export const AGENTS_MD_FILE = 'AGENTS.md';
|
|
33
34
|
/**
|
|
34
35
|
* Where the current template is written when the creator's own file is kept. Under `.bitmagic/`
|
|
@@ -70,10 +71,13 @@ export function missingSections(theirs, ours) {
|
|
|
70
71
|
*
|
|
71
72
|
* `storedHash` is `bitmagic.json`'s `agentsMdHash` — absent for any project scaffolded before this
|
|
72
73
|
* existed, which is exactly the population that most needs the suggestion path.
|
|
74
|
+
*
|
|
75
|
+
* `skillDirs` is passed for the same reason `environment` is: the template names the skills
|
|
76
|
+
* directories the project actually holds, so a Kiro project's copy differs from a default one's.
|
|
73
77
|
*/
|
|
74
|
-
export function reconcileAgentsMd(root, storedHash, environment) {
|
|
78
|
+
export function reconcileAgentsMd(root, storedHash, environment, skillDirs = skillDirsFor(ALWAYS_AGENTS)) {
|
|
75
79
|
const target = path.join(root, AGENTS_MD_FILE);
|
|
76
|
-
const current = renderAgentsMd(environment);
|
|
80
|
+
const current = renderAgentsMd(environment, skillDirs);
|
|
77
81
|
const currentHash = hashAgentsMd(current);
|
|
78
82
|
let existing;
|
|
79
83
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents-md.js","sourceRoot":"","sources":["../../src/scaffold/agents-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"agents-md.js","sourceRoot":"","sources":["../../src/scaffold/agents-md.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type AgentId } from './agent-targets.js';
|
|
1
2
|
import type { EnvironmentName } from '../config/environments.js';
|
|
2
3
|
/**
|
|
3
4
|
* The legal notice stamped into every game this project publishes.
|
|
@@ -93,11 +94,35 @@ export declare function renderVitePublishConfig(): string;
|
|
|
93
94
|
*/
|
|
94
95
|
export declare function renderVitePublishStandaloneConfig(): string;
|
|
95
96
|
export declare function renderGitignore(): string;
|
|
97
|
+
/**
|
|
98
|
+
* What a shipped skill's renderer is handed.
|
|
99
|
+
*
|
|
100
|
+
* Only `renderSkillsReadme` reads it today — every other body is agent-independent, and
|
|
101
|
+
* assigning a `() => string` to this type is legal TypeScript, so they need no parameter at all.
|
|
102
|
+
* The type exists so a renderer that DOES need to name its own directory can, without the
|
|
103
|
+
* `SHIPPED_SKILLS` table growing two shapes.
|
|
104
|
+
*/
|
|
105
|
+
export interface SkillRenderContext {
|
|
106
|
+
/** The directory this copy is being written into, relative to the project root. */
|
|
107
|
+
skillsDir: string;
|
|
108
|
+
/** Every skills directory this project holds, so a renderer can name the sibling copies. */
|
|
109
|
+
skillDirs: readonly string[];
|
|
110
|
+
}
|
|
111
|
+
export type SkillRenderer = (context: SkillRenderContext) => string;
|
|
96
112
|
export interface ProjectMetadata {
|
|
97
113
|
gameId: string;
|
|
98
114
|
engineVersion: string;
|
|
99
115
|
genre: string;
|
|
100
116
|
template: string;
|
|
117
|
+
/**
|
|
118
|
+
* Which agent tools this project is set up for, deciding which skills directories `init` writes
|
|
119
|
+
* and `upgrade` refreshes. See `agent-targets.ts`: the entry that matters is Kiro, since the
|
|
120
|
+
* shared and Claude Code directories are written unconditionally.
|
|
121
|
+
*
|
|
122
|
+
* Optional: every project scaffolded before this existed has none, which reads as the
|
|
123
|
+
* always-present set — exactly what those projects have on disk.
|
|
124
|
+
*/
|
|
125
|
+
agents?: AgentId[];
|
|
101
126
|
/**
|
|
102
127
|
* sha256 of the AGENTS.md the CLI last wrote, so `bitmagic upgrade` can tell an untouched file
|
|
103
128
|
* (safe to refresh) from one the creator edited (never overwritten — see scaffold/agents-md.ts).
|
|
@@ -120,9 +145,19 @@ export interface ProjectMetadata {
|
|
|
120
145
|
environment?: EnvironmentName;
|
|
121
146
|
}
|
|
122
147
|
export declare function renderBitmagicJson(metadata: ProjectMetadata): string;
|
|
123
|
-
export declare function renderAgentsMd(environment: EnvironmentName | undefined): string;
|
|
124
148
|
/**
|
|
125
|
-
*
|
|
149
|
+
* `skillDirs` is every skills directory this project holds, in `skillDirsFor` order. It is a
|
|
150
|
+
* parameter for the same reason `environment` is (see `agents-md.ts`): this file has to describe
|
|
151
|
+
* the project it is written into, and a Kiro project holds a directory a default one does not.
|
|
152
|
+
*
|
|
153
|
+
* Cross-references name `PRIMARY_SKILLS_DIR` rather than the reader's own directory, because this
|
|
154
|
+
* is ONE file read by every agent in the project and it has to pick a path that exists in all of
|
|
155
|
+
* them. The Layout section names the rest, so a Claude Code reader still learns where its own
|
|
156
|
+
* loader looks.
|
|
157
|
+
*/
|
|
158
|
+
export declare function renderAgentsMd(environment: EnvironmentName | undefined, skillDirs?: readonly string[]): string;
|
|
159
|
+
/**
|
|
160
|
+
* `<skills dir>/planning-a-game/SKILL.md` — the slice contract and the mechanic-recipe routing.
|
|
126
161
|
*
|
|
127
162
|
* These are one skill rather than two on purpose: you route to a recipe *in order to* scope slice
|
|
128
163
|
* 1, and slice 1 is the first section of the plan file the recipe tells you to write. Split, the
|
|
@@ -138,7 +173,7 @@ export declare function renderAgentsMd(environment: EnvironmentName | undefined)
|
|
|
138
173
|
*/
|
|
139
174
|
export declare function renderPlanningSkill(): string;
|
|
140
175
|
/**
|
|
141
|
-
*
|
|
176
|
+
* `<skills dir>/finding-engine-apis/SKILL.md` — the discovery protocol in full.
|
|
142
177
|
*
|
|
143
178
|
* The problem this exists to solve is measured, not hypothetical. game-play-agent's
|
|
144
179
|
* engine-api-digest.ts opens with it: session analysis showed the hosted coding agent spending most
|
|
@@ -150,7 +185,7 @@ export declare function renderPlanningSkill(): string;
|
|
|
150
185
|
export declare function renderEngineApiSkill(): string;
|
|
151
186
|
export declare function renderGenerateSkill(): string;
|
|
152
187
|
/**
|
|
153
|
-
*
|
|
188
|
+
* `<skills dir>/checking-usage/SKILL.md` — what the creator's sparks bought.
|
|
154
189
|
*
|
|
155
190
|
* Exists because the agent is what spends the money and the human is what pays
|
|
156
191
|
* for it. Before this, the only way to learn a balance was to be REFUSED one:
|
|
@@ -159,7 +194,7 @@ export declare function renderGenerateSkill(): string;
|
|
|
159
194
|
*/
|
|
160
195
|
export declare function renderUsageSkill(): string;
|
|
161
196
|
/**
|
|
162
|
-
*
|
|
197
|
+
* `<skills dir>/judging-quality/SKILL.md` — when and how to run `bitmagic judge`.
|
|
163
198
|
*
|
|
164
199
|
* The point the skill has to land is the discipline, not the mechanics: judge after milestones,
|
|
165
200
|
* fix the findings, confirm once, stop. An agent that loops on the judge is spending the
|
|
@@ -2,6 +2,7 @@ import { FAVICON_LINK_ID } from '@bitmagic/asset-core/favicon';
|
|
|
2
2
|
import { tsconfigPaths, importMapEntries, viteAliasEntries } from './aliases.js';
|
|
3
3
|
import { currentPortLane } from '../port-lane.js';
|
|
4
4
|
import { AGENTS_MD_REFERENCE_SECTION, GAME_DESIGN_REFERENCE_HINT, GENERATE_SKILL_REFERENCE_SECTION, PLANNING_SKILL_REFERENCE_STEP1, PLANNING_SKILL_REFERENCE_STEP4, } from './reference-guidance.js';
|
|
5
|
+
import { ALWAYS_AGENTS, PRIMARY_SKILLS_DIR, joinWithAnd, skillDirsFor, } from './agent-targets.js';
|
|
5
6
|
/**
|
|
6
7
|
* The legal notice stamped into every game this project publishes.
|
|
7
8
|
*
|
|
@@ -325,8 +326,28 @@ ${renderAliasEntries()}
|
|
|
325
326
|
}
|
|
326
327
|
},
|
|
327
328
|
server: {
|
|
328
|
-
port: 3001
|
|
329
|
-
|
|
329
|
+
port: 3001,
|
|
330
|
+
watch: {
|
|
331
|
+
// Vite leaves build.outDir out of its file watcher, but this project SERVES its outDir:
|
|
332
|
+
// every module the browser loads is a tsc emit under dist/. Unwatched, Vite's transform
|
|
333
|
+
// cache keeps serving the PREVIOUS emit after a rebuild until the dev server restarts —
|
|
334
|
+
// edits look like they did nothing. A negated pattern beats Vite's built-in ignore.
|
|
335
|
+
ignored: ['!**/dist/**']
|
|
336
|
+
}
|
|
337
|
+
},
|
|
338
|
+
plugins: [
|
|
339
|
+
{
|
|
340
|
+
// Watching dist/ makes each emit invalidate the stale transform (see server.watch above),
|
|
341
|
+
// but it would also have Vite full-reload the page on the FIRST emitted file of a compile
|
|
342
|
+
// — mid-emit, half the build still old. bitmagic dev reloads the browser itself once the
|
|
343
|
+
// compile lands clean, so Vite's own reaction is swallowed here. The invalidation is not:
|
|
344
|
+
// the module graph is told about the change before this hook runs.
|
|
345
|
+
name: 'bitmagic:defer-dist-reloads',
|
|
346
|
+
handleHotUpdate(context) {
|
|
347
|
+
if (context.file.includes('/dist/')) return [];
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
]
|
|
330
351
|
});
|
|
331
352
|
`;
|
|
332
353
|
}
|
|
@@ -652,10 +673,27 @@ rather than version warnings — so run \`self-update\` before debugging a comma
|
|
|
652
673
|
strangely. If \`bitmagic.json\` ever disagrees with this paragraph, the file is right. The engine is a
|
|
653
674
|
separate command: \`bitmagic upgrade\`.`;
|
|
654
675
|
}
|
|
655
|
-
|
|
676
|
+
/**
|
|
677
|
+
* `skillDirs` is every skills directory this project holds, in `skillDirsFor` order. It is a
|
|
678
|
+
* parameter for the same reason `environment` is (see `agents-md.ts`): this file has to describe
|
|
679
|
+
* the project it is written into, and a Kiro project holds a directory a default one does not.
|
|
680
|
+
*
|
|
681
|
+
* Cross-references name `PRIMARY_SKILLS_DIR` rather than the reader's own directory, because this
|
|
682
|
+
* is ONE file read by every agent in the project and it has to pick a path that exists in all of
|
|
683
|
+
* them. The Layout section names the rest, so a Claude Code reader still learns where its own
|
|
684
|
+
* loader looks.
|
|
685
|
+
*/
|
|
686
|
+
export function renderAgentsMd(environment, skillDirs = skillDirsFor(ALWAYS_AGENTS)) {
|
|
656
687
|
// The port this CLI would bind, so the doc it writes into the project matches the CLI that wrote
|
|
657
688
|
// it. A dev-line and a release-line install serve the shell on different numbers (port-lane.ts).
|
|
658
689
|
const editorPort = currentPortLane().editorPort;
|
|
690
|
+
// Built outside the literal: a nested template literal inside `${}` in a file that escapes every
|
|
691
|
+
// backtick is the one place that escaping reliably goes wrong.
|
|
692
|
+
const mirrors = skillDirs.filter((dir) => dir !== PRIMARY_SKILLS_DIR).map((dir) => '`' + dir + '/`');
|
|
693
|
+
const mirrorClause = mirrors.length === 0
|
|
694
|
+
? ''
|
|
695
|
+
: '\n Agents disagree on where project skills live, so the same files are also written to' +
|
|
696
|
+
`\n ${joinWithAnd(mirrors)}; cite the path above and every agent can open it.`;
|
|
659
697
|
return `# Working on this Bitmagic game
|
|
660
698
|
|
|
661
699
|
## Start \`bitmagic dev\` before you build anything
|
|
@@ -678,7 +716,7 @@ lists each generation with your prompt and progress, and they can move objects i
|
|
|
678
716
|
and screenshot a problem straight to you. Started at the end, all of that is a server nobody
|
|
679
717
|
needed — a game that appeared in one silent hour is worth less than a rough one they watched
|
|
680
718
|
arrive, because they could not steer the first. If they ask about their phone, restart with
|
|
681
|
-
\`--mobile\` (
|
|
719
|
+
\`--mobile\` (\`${PRIMARY_SKILLS_DIR}/working-with-the-creator/SKILL.md\` has the QR and the certificate
|
|
682
720
|
warning).
|
|
683
721
|
|
|
684
722
|
If you are unsure whether one is already running, \`bitmagic reload\` says so and costs nothing.
|
|
@@ -705,15 +743,19 @@ If you are unsure whether one is already running, \`bitmagic reload\` says so an
|
|
|
705
743
|
in what order.** Both yours to write and rewrite; \`bitmagic cover\` reads the first. Both are
|
|
706
744
|
excluded from the publish fingerprint, so revising them never invalidates a passing
|
|
707
745
|
\`bitmagic verify\`.
|
|
708
|
-
-
|
|
709
|
-
current with it. Every one is plain markdown at
|
|
710
|
-
whether or not your harness loads skills by
|
|
711
|
-
\`finding-engine-apis/\` (engine docs),
|
|
712
|
-
\`
|
|
713
|
-
\`
|
|
714
|
-
-
|
|
715
|
-
|
|
716
|
-
|
|
746
|
+
- \`${PRIMARY_SKILLS_DIR}/\` — **shipped by the CLI and re-rendered by \`bitmagic upgrade\`**, so
|
|
747
|
+
they stay current with it. Every one is plain markdown at
|
|
748
|
+
\`${PRIMARY_SKILLS_DIR}/<name>/SKILL.md\`, readable whether or not your harness loads skills by
|
|
749
|
+
itself: \`planning-a-game/\` (what to build first), \`finding-engine-apis/\` (engine docs),
|
|
750
|
+
\`generating-assets/\`, \`working-with-the-creator/\`, \`theming-the-hud/\`,
|
|
751
|
+
\`publishing-a-game/\`, \`judging-quality/\`, \`checking-usage/\`, \`making-a-trailer/\`,
|
|
752
|
+
\`converting-unity-levels/\`.${mirrorClause}
|
|
753
|
+
\`upgrade\` rewrites every copy, so edits to them are lost; skills you add yourself are never
|
|
754
|
+
touched.
|
|
755
|
+
- \`.claude/settings.json\` — **Claude Code only, and yours**: seeded with one Stop hook that runs
|
|
756
|
+
\`bitmagic reload\` so the owner's browser refreshes when you finish a turn. \`upgrade\` adds that
|
|
757
|
+
hook if it is missing and changes nothing else, so your permissions and your own hooks are safe
|
|
758
|
+
here. No other agent has a verified equivalent, so on those you run \`bitmagic reload\` yourself.
|
|
717
759
|
- \`AGENTS.md\` — this file. Yours to edit; \`upgrade\` refreshes it only while it is byte-identical
|
|
718
760
|
to what the CLI wrote, and otherwise keeps yours and drops the current template in
|
|
719
761
|
\`.bitmagic/AGENTS.md.latest\`. **If you edit this file, diff that after an upgrade** — new CLI
|
|
@@ -755,7 +797,7 @@ things you would do next, in order. Let them choose. Do not publish unless they
|
|
|
755
797
|
|
|
756
798
|
The full contract — what counts as a core verb, what the engine already ships so you never build it,
|
|
757
799
|
the \`mechanics-plan.md\` skeleton, and the loop after slice 1 — is in
|
|
758
|
-
|
|
800
|
+
\`${PRIMARY_SKILLS_DIR}/planning-a-game/SKILL.md\`.
|
|
759
801
|
|
|
760
802
|
## Finding an engine API
|
|
761
803
|
|
|
@@ -768,7 +810,7 @@ and read the group doc it lands in, with \`engine-api.md\` indexing the 45 group
|
|
|
768
810
|
**\`engine/\` source**, last resort. \`@docs foo.md\` in those docs means
|
|
769
811
|
\`engine/agent-docs/foo.md\` — just read the file.
|
|
770
812
|
|
|
771
|
-
|
|
813
|
+
\`${PRIMARY_SKILLS_DIR}/finding-engine-apis/SKILL.md\` carries the feature-to-doc table (use it instead of
|
|
772
814
|
guessing filenames) and translates the hosted-agent tools those shared docs name, none of which
|
|
773
815
|
exist here.
|
|
774
816
|
|
|
@@ -882,7 +924,7 @@ judge of it. After each milestone run \`bitmagic verify\` (not \`--fast\`), then
|
|
|
882
924
|
a separate vision model grades the screenshot against \`GAME-DESIGN.md\` and prints at most three
|
|
883
925
|
concrete findings (also written to \`.bitmagic/judge.json\`). Fix the ones worth fixing, confirm
|
|
884
926
|
with one re-run, then move on — **never loop on the judge**. See
|
|
885
|
-
|
|
927
|
+
\`${PRIMARY_SKILLS_DIR}/judging-quality/SKILL.md\`.
|
|
886
928
|
|
|
887
929
|
## The human may be moving objects too
|
|
888
930
|
|
|
@@ -905,7 +947,7 @@ where they click an object and drag a gizmo. A drag writes the new transform str
|
|
|
905
947
|
\`bitmagic generate prop\` command to run on their behalf.
|
|
906
948
|
|
|
907
949
|
The event shapes, the rest of the editor protocol and \`bitmagic dev --mobile\` are in
|
|
908
|
-
|
|
950
|
+
\`${PRIMARY_SKILLS_DIR}/working-with-the-creator/SKILL.md\`.
|
|
909
951
|
|
|
910
952
|
## Publishing
|
|
911
953
|
|
|
@@ -936,7 +978,7 @@ unguessable) URL.** Credential-shaped files (\`.env*\`, \`*.pem\`, \`*.key\`, \`
|
|
|
936
978
|
service-account JSON) are excluded and named in the output, but that list cannot be exhaustive —
|
|
937
979
|
so never keep a secret in this directory.
|
|
938
980
|
|
|
939
|
-
|
|
981
|
+
\`${PRIMARY_SKILLS_DIR}/publishing-a-game/SKILL.md\` has the rest, and you want it before you publish:
|
|
940
982
|
what the thumbnail comes from, category tags, \`--force\` and the one-shot \`--name\`/
|
|
941
983
|
\`--description\`, the post-publish render smoke test, and the exit-code table to branch on when
|
|
942
984
|
publish exits non-zero rather than parsing its message.
|
|
@@ -948,7 +990,7 @@ value: \`worldProfileData.hud.theme\` in \`src/work/world.json\`. **Never restyl
|
|
|
948
990
|
game code to satisfy a look request** ("rounder buttons", "orange UI", "neon glow"); use
|
|
949
991
|
\`bitmagic theme patch\` / \`set\` / \`show\` / \`check\` and read
|
|
950
992
|
\`engine/agent-docs/HUD_THEMES.md\` — its Common-asks table has a copyable patch for every frequent
|
|
951
|
-
request.
|
|
993
|
+
request. \`${PRIMARY_SKILLS_DIR}/theming-the-hud/SKILL.md\` covers the loop, including verifying with
|
|
952
994
|
\`.bitmagic/verify/screenshot.png\`.
|
|
953
995
|
|
|
954
996
|
## Generating assets
|
|
@@ -985,7 +1027,7 @@ Two things before you use them:
|
|
|
985
1027
|
Three lanes make a 3D object, and the wrong one wastes a generation: \`generate model\` mints a NEW
|
|
986
1028
|
asset, \`generate prop --asset <id>\` UPGRADES a placeholder, \`assets add <file>\` uploads your own.
|
|
987
1029
|
Splats, video and \`.vox\`/\`.fbx\` still need the web editor; never reference an asset you did not
|
|
988
|
-
make.
|
|
1030
|
+
make. \`${PRIMARY_SKILLS_DIR}/generating-assets/SKILL.md\` has the flags, the reference-image rules, what
|
|
989
1031
|
to do after a generation, and every way one refuses.
|
|
990
1032
|
|
|
991
1033
|
## Forging a whole level
|
|
@@ -1024,7 +1066,7 @@ ${renderCliUpdateSection(environment)}
|
|
|
1024
1066
|
`;
|
|
1025
1067
|
}
|
|
1026
1068
|
/**
|
|
1027
|
-
*
|
|
1069
|
+
* `<skills dir>/planning-a-game/SKILL.md` — the slice contract and the mechanic-recipe routing.
|
|
1028
1070
|
*
|
|
1029
1071
|
* These are one skill rather than two on purpose: you route to a recipe *in order to* scope slice
|
|
1030
1072
|
* 1, and slice 1 is the first section of the plan file the recipe tells you to write. Split, the
|
|
@@ -1183,7 +1225,7 @@ ${PLANNING_SKILL_REFERENCE_STEP4}4. \`bitmagic cover\` — **now**, not later. I
|
|
|
1183
1225
|
6. Write the code. Look up APIs with the \`finding-engine-apis\` skill; do not read engine source to
|
|
1184
1226
|
find out what exists.
|
|
1185
1227
|
7. \`bitmagic check\` until green.
|
|
1186
|
-
8. \`bitmagic reload\` (the Stop hook in \`.claude/settings.json\` does this for you).
|
|
1228
|
+
8. \`bitmagic reload\` (in Claude Code the Stop hook in \`.claude/settings.json\` does this for you).
|
|
1187
1229
|
9. \`bitmagic verify\` — it boots the game in a real browser and clicks Play. A clean \`check\` is
|
|
1188
1230
|
not evidence the game runs.
|
|
1189
1231
|
10. Report (below). Publish only if they ask.
|
|
@@ -1225,7 +1267,7 @@ code.
|
|
|
1225
1267
|
`;
|
|
1226
1268
|
}
|
|
1227
1269
|
/**
|
|
1228
|
-
*
|
|
1270
|
+
* `<skills dir>/finding-engine-apis/SKILL.md` — the discovery protocol in full.
|
|
1229
1271
|
*
|
|
1230
1272
|
* The problem this exists to solve is measured, not hypothetical. game-play-agent's
|
|
1231
1273
|
* engine-api-digest.ts opens with it: session analysis showed the hosted coding agent spending most
|
|
@@ -1529,7 +1571,7 @@ fail to load it.
|
|
|
1529
1571
|
`;
|
|
1530
1572
|
}
|
|
1531
1573
|
/**
|
|
1532
|
-
*
|
|
1574
|
+
* `<skills dir>/checking-usage/SKILL.md` — what the creator's sparks bought.
|
|
1533
1575
|
*
|
|
1534
1576
|
* Exists because the agent is what spends the money and the human is what pays
|
|
1535
1577
|
* for it. Before this, the only way to learn a balance was to be REFUSED one:
|
|
@@ -1602,7 +1644,7 @@ per-invoice view, the plan page on the web is the source of truth.
|
|
|
1602
1644
|
`;
|
|
1603
1645
|
}
|
|
1604
1646
|
/**
|
|
1605
|
-
*
|
|
1647
|
+
* `<skills dir>/judging-quality/SKILL.md` — when and how to run `bitmagic judge`.
|
|
1606
1648
|
*
|
|
1607
1649
|
* The point the skill has to land is the discipline, not the mechanics: judge after milestones,
|
|
1608
1650
|
* fix the findings, confirm once, stop. An agent that loops on the judge is spending the
|
|
@@ -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;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,gCAAgC,EAChC,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"project-files.js","sourceRoot":"","sources":["../../src/scaffold/project-files.ts"],"names":[],"mappings":"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"}
|