@bitmagic/cli 0.1.64-dev.2 → 0.1.64-dev.4

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 (49) hide show
  1. package/README.md +37 -1
  2. package/assets/blender-level/README.md +25 -0
  3. package/assets/blender-level/audit.py +232 -0
  4. package/assets/blender-level/bmlevel/__init__.py +294 -0
  5. package/assets/blender-level/bmlevel/core.py +438 -0
  6. package/assets/blender-level/bmlevel/scene_bpy.py +186 -0
  7. package/assets/blender-level/bmlevel/scene_null.py +44 -0
  8. package/assets/blender-level/example_level.py +80 -0
  9. package/assets/blender-level/find_blender.py +62 -0
  10. package/assets/blender-level/review.py +117 -0
  11. package/assets/blender-level/sync_world.py +85 -0
  12. package/assets/blender-level/tests/test_core.py +189 -0
  13. package/dist/cli.d.ts +1 -0
  14. package/dist/cli.js +2 -0
  15. package/dist/cli.js.map +1 -1
  16. package/dist/commands/generate.d.ts +43 -1
  17. package/dist/commands/generate.js +210 -12
  18. package/dist/commands/generate.js.map +1 -1
  19. package/dist/commands/tools.d.ts +1 -0
  20. package/dist/commands/tools.js +73 -0
  21. package/dist/commands/tools.js.map +1 -0
  22. package/dist/generate/animation-from-video.d.ts +11 -3
  23. package/dist/generate/animation-from-video.js +12 -2
  24. package/dist/generate/animation-from-video.js.map +1 -1
  25. package/dist/generate/video-review.d.ts +28 -0
  26. package/dist/generate/video-review.js +120 -0
  27. package/dist/generate/video-review.js.map +1 -0
  28. package/dist/scaffold/blender-level-skill-files.d.ts +26 -0
  29. package/dist/scaffold/blender-level-skill-files.js +548 -0
  30. package/dist/scaffold/blender-level-skill-files.js.map +1 -0
  31. package/dist/scaffold/claude-settings.js +2 -0
  32. package/dist/scaffold/claude-settings.js.map +1 -1
  33. package/dist/scaffold/project-files.js +18 -7
  34. package/dist/scaffold/project-files.js.map +1 -1
  35. package/dist/scaffold/project.js +6 -0
  36. package/dist/scaffold/project.js.map +1 -1
  37. package/dist/scaffold/skill-files.js +2 -1
  38. package/dist/scaffold/skill-files.js.map +1 -1
  39. package/dist/scaffold/unity-skill-files.js +1 -2
  40. package/dist/scaffold/unity-skill-files.js.map +1 -1
  41. package/dist/tools/bundles.d.ts +21 -0
  42. package/dist/tools/bundles.js +67 -0
  43. package/dist/tools/bundles.js.map +1 -0
  44. package/dist/trailer/ffmpeg.d.ts +10 -0
  45. package/dist/trailer/ffmpeg.js +51 -6
  46. package/dist/trailer/ffmpeg.js.map +1 -1
  47. package/dist/trailer/music-beats.js +4 -39
  48. package/dist/trailer/music-beats.js.map +1 -1
  49. package/package.json +4 -4
@@ -0,0 +1,73 @@
1
+ /**
2
+ * `bitmagic tools` — the script bundles the CLI ships for skills that drive external programs.
3
+ *
4
+ * bitmagic tools list what ships, and which skill uses each
5
+ * bitmagic tools path [<bundle>] where the bundle lives in this CLI install
6
+ * bitmagic tools install <bundle> copy it into this project's tools/ (overwrites the
7
+ * bundle's own files, never touches anything else)
8
+ *
9
+ * Local, no network, no sparks. Why a command rather than a `cp` in the skill: see tools/bundles.ts.
10
+ */
11
+ import { defineCommand } from 'citty';
12
+ import path from 'node:path';
13
+ import { CliError } from '../errors.js';
14
+ import { createOutput } from '../output.js';
15
+ import { loadProjectContext } from '../project/context.js';
16
+ import { TOOL_BUNDLES, copyBundle, findBundle, packageAssetsDir, planBundleCopy } from '../tools/bundles.js';
17
+ const JSON_ARG = {
18
+ json: { type: 'boolean', description: 'Print the result as JSON on stdout; all progress goes to stderr.' },
19
+ };
20
+ const listCommand = defineCommand({
21
+ meta: { name: 'list', description: 'List the tool bundles this CLI ships.' },
22
+ args: JSON_ARG,
23
+ run({ args }) {
24
+ const output = createOutput(args.json === true);
25
+ for (const b of TOOL_BUNDLES)
26
+ output.info(`${b.name.padEnd(16)} -> ${b.target}/ (skill: ${b.skill})`);
27
+ output.result({ bundles: TOOL_BUNDLES.map((b) => ({ name: b.name, target: b.target, skill: b.skill })) });
28
+ },
29
+ });
30
+ const pathCommand = defineCommand({
31
+ meta: { name: 'path', description: 'Print where a bundle (or all of them) lives in this CLI install.' },
32
+ args: { ...JSON_ARG, bundle: { type: 'positional', required: false, description: 'Bundle name; omit for the assets directory.' } },
33
+ run({ args }) {
34
+ const output = createOutput(args.json === true);
35
+ const dir = args.bundle ? path.join(packageAssetsDir(), findBundleOrFail(args.bundle).name) : packageAssetsDir();
36
+ output.info(dir);
37
+ output.result({ path: dir });
38
+ },
39
+ });
40
+ const installCommand = defineCommand({
41
+ meta: { name: 'install', description: "Copy a bundle into this project's tools/ directory." },
42
+ args: { ...JSON_ARG, bundle: { type: 'positional', required: true, description: 'Bundle name (see `bitmagic tools list`).' } },
43
+ async run({ args }) {
44
+ const output = createOutput(args.json === true);
45
+ const bundle = findBundleOrFail(args.bundle);
46
+ const { root } = loadProjectContext();
47
+ const copies = await planBundleCopy(bundle, packageAssetsDir(), root);
48
+ if (copies.length === 0)
49
+ throw new CliError(`bundle "${bundle.name}" is empty in this install — reinstall the CLI.`, 1, 'tools_bundle_empty');
50
+ await copyBundle(copies);
51
+ const target = path.join(root, bundle.target);
52
+ const readme = copies.find((c) => path.basename(c.to) === 'README.md');
53
+ const hint = readme ? ` — read ${path.relative(root, readme.to)} first` : '';
54
+ output.info(`Installed ${bundle.name}: ${copies.length} files under ${path.relative(root, target) || '.'}/${hint}.`);
55
+ output.result({ bundle: bundle.name, target, files: copies.map((c) => path.relative(root, c.to)) });
56
+ },
57
+ });
58
+ function findBundleOrFail(name) {
59
+ try {
60
+ return findBundle(name);
61
+ }
62
+ catch (error) {
63
+ throw new CliError(error.message, 1, 'tools_unknown_bundle');
64
+ }
65
+ }
66
+ export const toolsCommand = defineCommand({
67
+ meta: {
68
+ name: 'tools',
69
+ description: 'Script bundles shipped with the CLI for skills that drive Blender or Python: list, path, install.',
70
+ },
71
+ subCommands: { list: listCommand, path: pathCommand, install: installCommand },
72
+ });
73
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/commands/tools.ts"],"names":[],"mappings":"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"}
@@ -6,10 +6,12 @@ import type { ProjectContext } from '../project/context.js';
6
6
  export declare const MAX_VIDEO_BYTES: number;
7
7
  export declare const JOBS_PATH = "/api/cli/v1/assets/animation-from-video/jobs";
8
8
  export interface AnimationFromVideoRun {
9
- videoPath: string;
9
+ /** Local file to upload. Omitted when the clip is already at a URL. */
10
+ videoPath?: string;
10
11
  /**
11
- * Already-uploaded source URL (the sidecar's trim-analysis step uploads
12
- * first). When set, the file at videoPath is not read or uploaded again.
12
+ * Already-uploaded source URL: the sidecar's trim-analysis step uploads
13
+ * first, `--video <url>` is given one, and the prompt lane generates one.
14
+ * When set, the file at videoPath is not read or uploaded again.
13
15
  */
14
16
  videoUrl?: string;
15
17
  /** Asset display name; defaults to the file's stem. */
@@ -54,6 +56,12 @@ export declare function isLocomotionState(value: unknown): value is LocomotionSt
54
56
  export declare function isVideoToMotionModel(value: unknown): value is VideoToMotionModel;
55
57
  /** The creator-facing sentence for a failed job — `error.kind` decides it, never the raw JSON. */
56
58
  export declare function describeJobFailure(error: JobStatus['error']): string;
59
+ /**
60
+ * The clip's display name when `--name` is absent. A local file names itself
61
+ * from its stem; a URL-sourced clip has no meaningful stem (the uploaded object
62
+ * is `motion-<timestamp>-…`), so it falls back to a plain label.
63
+ */
64
+ export declare function defaultName(videoPath?: string): string;
57
65
  export declare function generateAndInstallAnimationFromVideo(options: {
58
66
  context: ProjectContext;
59
67
  environment: Environment;
@@ -79,7 +79,14 @@ function readVideo(videoPath) {
79
79
  const stem = path.basename(videoPath, path.extname(videoPath)).replace(/[^A-Za-z0-9_-]+/g, '_') || 'motion';
80
80
  return { bytes, contentType, filename: `motion-${Date.now()}-${stem}.${extension}` };
81
81
  }
82
- function defaultName(videoPath) {
82
+ /**
83
+ * The clip's display name when `--name` is absent. A local file names itself
84
+ * from its stem; a URL-sourced clip has no meaningful stem (the uploaded object
85
+ * is `motion-<timestamp>-…`), so it falls back to a plain label.
86
+ */
87
+ export function defaultName(videoPath) {
88
+ if (videoPath === undefined)
89
+ return 'Recorded motion';
83
90
  const stem = path.basename(videoPath, path.extname(videoPath)).replace(/[_-]+/g, ' ').trim();
84
91
  return stem.length > 0 ? stem.slice(0, 80) : 'Recorded motion';
85
92
  }
@@ -97,7 +104,7 @@ export async function generateAndInstallAnimationFromVideo(options) {
97
104
  if (run.videoUrl !== undefined) {
98
105
  videoUrl = run.videoUrl;
99
106
  }
100
- else {
107
+ else if (run.videoPath !== undefined) {
101
108
  const video = readVideo(run.videoPath);
102
109
  deps.log(`Uploading ${path.basename(run.videoPath)} (${Math.round(video.bytes.byteLength / 1024)} KB)…`);
103
110
  const uploaded = await uploadProjectFile(environment, token, {
@@ -105,6 +112,9 @@ export async function generateAndInstallAnimationFromVideo(options) {
105
112
  }, deps);
106
113
  videoUrl = uploaded.url;
107
114
  }
115
+ else {
116
+ throw new CliError('No video to work from: pass a file or a URL.');
117
+ }
108
118
  const params = {
109
119
  videoUrl,
110
120
  name: run.name ?? defaultName(run.videoPath),
@@ -1 +1 @@
1
- {"version":3,"file":"animation-from-video.js","sourceRoot":"","sources":["../../src/generate/animation-from-video.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"animation-from-video.js","sourceRoot":"","sources":["../../src/generate/animation-from-video.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /** Where a reviewed clip's frames land. Gitignored, and outside the publish fingerprint. */
2
+ export declare function contactSheetPath(root: string, assetId: string): string;
3
+ export interface ClipReview {
4
+ /** The written sheet, or null when no sheet could be made. */
5
+ sheetPath: string | null;
6
+ /** Whether the clip carries an audio track; null when it could not be determined. */
7
+ hasAudioTrack: boolean | null;
8
+ /** Why a step was skipped — printed as-is, one line each. Empty when everything worked. */
9
+ notes: string[];
10
+ }
11
+ export type FetchLike = (url: string) => Promise<{
12
+ ok: boolean;
13
+ status: number;
14
+ arrayBuffer(): Promise<ArrayBuffer>;
15
+ }>;
16
+ /**
17
+ * Download the clip, tile frames from it, and report whether it has sound.
18
+ *
19
+ * The mp4 itself is deliberately not kept: it is several MB per generation, the URL is printed
20
+ * beside the sheet, and the dev view plays the clip when a creator wants to watch it move.
21
+ */
22
+ export declare function reviewGeneratedClip(options: {
23
+ root: string;
24
+ assetId: string;
25
+ videoUrl: string;
26
+ durationSeconds: number;
27
+ fetch: FetchLike;
28
+ }): Promise<ClipReview>;
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Looking at the clip `bitmagic generate video` just paid for.
3
+ *
4
+ * A generated clip was the one asset the CLI could produce but not show: the command printed a URL,
5
+ * and checking whether the rider actually jumps meant a curl and a hand-written ffmpeg tile filter.
6
+ * Both facts that decide whether a clip is usable are cheap to read off the file, so both are read
7
+ * here and printed with the result:
8
+ *
9
+ * - a contact sheet, 8 frames spread across the clip, written into `.bitmagic/` as a PNG the
10
+ * agent (or the creator) can open;
11
+ * - whether the file carries an audio track, which is what decides if the cutscene needs a music
12
+ * bed under it. Today's generator produces silent clips, but that is the generator's property,
13
+ * not a promise — so it is probed, never assumed.
14
+ *
15
+ * Every step is best-effort by design, exactly as `cover.ts` downloads its image: the clip is
16
+ * generated, billed and already in world.json by the time this runs, so nothing here may turn a
17
+ * successful generation into a failed command. ffmpeg is not a dependency of this CLI's core lane
18
+ * either, so its absence is one note, not an error.
19
+ */
20
+ import * as fs from 'fs';
21
+ import * as path from 'path';
22
+ import { captureFfmpegTool, missingFfmpegTool, runFfmpeg } from '../trailer/ffmpeg.js';
23
+ /** Frames in the sheet, and the grid they are tiled into. 4x2 fits a 16:9 clip on one screen. */
24
+ const SHEET_COLUMNS = 4;
25
+ const SHEET_ROWS = 2;
26
+ const SHEET_FRAMES = SHEET_COLUMNS * SHEET_ROWS;
27
+ /** Per-frame width in the sheet. 4 across is ~1280px total — readable, and a small PNG. */
28
+ const FRAME_WIDTH = 320;
29
+ /** Where a reviewed clip's frames land. Gitignored, and outside the publish fingerprint. */
30
+ export function contactSheetPath(root, assetId) {
31
+ return path.join(root, '.bitmagic', 'videos', `${safeFileStem(assetId)}.png`);
32
+ }
33
+ /** Asset ids come from `--asset-id` too, so they are not trusted to be a safe filename. */
34
+ function safeFileStem(assetId) {
35
+ const cleaned = assetId.replace(/[^A-Za-z0-9_-]/g, '-').slice(0, 96);
36
+ return cleaned.length > 0 ? cleaned : 'clip';
37
+ }
38
+ /**
39
+ * Download the clip, tile frames from it, and report whether it has sound.
40
+ *
41
+ * The mp4 itself is deliberately not kept: it is several MB per generation, the URL is printed
42
+ * beside the sheet, and the dev view plays the clip when a creator wants to watch it move.
43
+ */
44
+ export async function reviewGeneratedClip(options) {
45
+ const missing = missingFfmpegTool(['ffmpeg', 'ffprobe']);
46
+ if (missing !== null) {
47
+ return {
48
+ sheetPath: null,
49
+ hasAudioTrack: null,
50
+ notes: [`${missing} is not on PATH, so no frames were grabbed (macOS: brew install ffmpeg).`],
51
+ };
52
+ }
53
+ const sheetPath = contactSheetPath(options.root, options.assetId);
54
+ const clipPath = `${sheetPath}.download`;
55
+ fs.mkdirSync(path.dirname(sheetPath), { recursive: true });
56
+ try {
57
+ const response = await options.fetch(options.videoUrl);
58
+ if (!response.ok) {
59
+ return { sheetPath: null, hasAudioTrack: null, notes: [`could not download the clip to look at it (HTTP ${response.status}).`] };
60
+ }
61
+ fs.writeFileSync(clipPath, Buffer.from(await response.arrayBuffer()));
62
+ const notes = [];
63
+ const hasAudioTrack = await probeHasAudioTrack(clipPath).catch((error) => {
64
+ notes.push(`could not read the clip's streams: ${messageOf(error)}`);
65
+ return null;
66
+ });
67
+ const written = await writeContactSheet(clipPath, sheetPath, options.durationSeconds)
68
+ .then(() => true)
69
+ .catch((error) => {
70
+ notes.push(`could not grab frames from the clip: ${messageOf(error)}`);
71
+ return false;
72
+ });
73
+ return { sheetPath: written ? sheetPath : null, hasAudioTrack, notes };
74
+ }
75
+ catch (error) {
76
+ return { sheetPath: null, hasAudioTrack: null, notes: [`could not download the clip to look at it: ${messageOf(error)}`] };
77
+ }
78
+ finally {
79
+ try {
80
+ fs.rmSync(clipPath, { force: true });
81
+ }
82
+ catch {
83
+ // A leftover download in .bitmagic/ is not worth a word to the creator.
84
+ }
85
+ }
86
+ }
87
+ /** True when the container holds at least one audio stream. Empty ffprobe output means none. */
88
+ async function probeHasAudioTrack(clipPath) {
89
+ const stdout = await captureFfmpegTool('ffprobe', [
90
+ '-v', 'error',
91
+ '-select_streams', 'a',
92
+ '-show_entries', 'stream=codec_type',
93
+ '-of', 'csv=p=0',
94
+ clipPath,
95
+ ]);
96
+ return stdout.toString('utf-8').trim().length > 0;
97
+ }
98
+ /**
99
+ * Tile `SHEET_FRAMES` frames spread evenly across the clip into one PNG.
100
+ *
101
+ * `fps` rather than `select='not(mod(n,N))'`: the sample rate follows the clip's length, so a 3 s
102
+ * and a 10 s clip both come back as a full grid instead of one dense row and one sparse one.
103
+ */
104
+ async function writeContactSheet(clipPath, sheetPath, durationSeconds) {
105
+ const seconds = Math.max(durationSeconds, 0.5);
106
+ const fps = (SHEET_FRAMES / seconds).toFixed(6);
107
+ await runFfmpeg([
108
+ '-v', 'error',
109
+ '-nostdin',
110
+ '-y',
111
+ '-i', clipPath,
112
+ '-vf', `fps=${fps},scale=${FRAME_WIDTH}:-1,tile=${SHEET_COLUMNS}x${SHEET_ROWS}`,
113
+ '-frames:v', '1',
114
+ sheetPath,
115
+ ]);
116
+ }
117
+ function messageOf(error) {
118
+ return error instanceof Error ? error.message : String(error);
119
+ }
120
+ //# sourceMappingURL=video-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-review.js","sourceRoot":"","sources":["../../src/generate/video-review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The `building-levels-in-blender` skill: a hand-designed low-poly world written as a Python script
3
+ * against the shipped `bmlevel` library, built by Blender into one GLB plus the collider / door /
4
+ * light / landmark JSON, audited with ray casts, reviewed from rendered stills, and loaded by the
5
+ * engine's `MeshLevel`. Distilled from a creator's space-station game whose agent installed Blender
6
+ * and hand-rolled every part of this — the build vocabulary, the audits, the review renders, the
7
+ * level loader — and hit the two failures the skill now names up front (a GLB fetched from a local
8
+ * path that 404s after publish; NPC spawns routed into an absent voxel grid).
9
+ *
10
+ * Same contract as `unity-skill-files.ts`: pure functions returning file contents, registered in
11
+ * `SHIPPED_SKILLS` (project.ts). The Python and Blender scripts ship in the package's
12
+ * `assets/blender-level/` (see `files` in package.json) rather than being rendered into every
13
+ * project; the skill's step 1 copies them into `tools/blender-level/`.
14
+ *
15
+ * The skill's first section is the gate: the path is for frontier models with Blender available,
16
+ * and everything else goes to `bitmagic forge`. The CLI cannot tell which model drives it, so the
17
+ * gate is the agent's own call — stated once, plainly, where the planning skill sends it.
18
+ *
19
+ * Backticks and `${` are escaped for the template literal; `project-files.test.ts` checks the
20
+ * rendered frontmatter and that no escape leaks into the output.
21
+ */
22
+ export declare function renderBlenderLevelsSkill(): string;
23
+ export declare function renderBlenderConventionsReference(): string;
24
+ export declare function renderBlenderAuditsReference(): string;
25
+ export declare function renderBlenderPassesReference(): string;
26
+ export declare function renderBlenderEngineHandoffReference(): string;