reelkit-cli 0.12.5 → 0.12.6

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/CHANGELOG.md CHANGED
@@ -3,6 +3,10 @@
3
3
  What changed in each published version of `reelkit-cli`, newest first. A push to `main` publishes the version in
4
4
  `package.json` when it is not on npm yet, and it must have an entry here.
5
5
 
6
+ ## 0.12.6 - 2026-10-10
7
+
8
+ - `reelkit template push` leaves out `.remotion` (the browser an older project rendered with) and `.cache`, and when a project is still over the limit it names the largest folders.
9
+
6
10
  ## 0.12.5 - 2026-10-09
7
11
 
8
12
  - The skill builds a film from component files instead of one long `Video.tsx`: every drawn part that could appear in another film is its own file in `src/`, so it can be reused and shows as a part of a template.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reelkit-cli",
3
- "version": "0.12.5",
3
+ "version": "0.12.6",
4
4
  "description": "CLI and Claude skill for making short-form video with a shared asset library.",
5
5
  "license": "MIT",
6
6
  "author": "Daniel Livshin",
package/skill/SKILL.md CHANGED
@@ -15,7 +15,7 @@ For image or video cutouts, editable Blender product shots, custom 3D materials,
15
15
 
16
16
  To implement a chosen style, read its row in `reference/style-recipes.md` for action, timing, sound and proof. `reference/style-components.md` maps the shared components and built-in kit to shot roles; inspect the selected source before using its props.
17
17
 
18
- This skill targets `reelkit-cli` 0.12.5 and its HyperFrames kit. Check the installed version with `reelkit --version`; in a source checkout, invoke its `bin/reelkit.mjs` with Node. Use the matching CLI before authoring with `reelkit/frame`.
18
+ This skill targets `reelkit-cli` 0.12.6 and its HyperFrames kit. Check the installed version with `reelkit --version`; in a source checkout, invoke its `bin/reelkit.mjs` with Node. Use the matching CLI before authoring with `reelkit/frame`.
19
19
 
20
20
  ## What decides whether the film is accepted
21
21
 
@@ -21,7 +21,8 @@ const sh = promisify(execFile);
21
21
  // What is sent: the project folder as one archive (the plan, the composition, and every file under assets/, including the user's own
22
22
  // pictures, footage and the recorded voice), the rendered video when there is one, and a small picture of each scene. What is left on
23
23
  // this machine: out/ (renders and previews), refs/ (reference videos), caches and node_modules.
24
- export const TEMPLATE_SKIP = ["out", "refs", ".reelkit", "node_modules", ".git", ".DS_Store"];
24
+ // .remotion is where a project made before 0.10 kept the browser it rendered with: hundreds of megabytes that are not the project.
25
+ export const TEMPLATE_SKIP = ["out", "refs", ".reelkit", ".remotion", ".cache", "node_modules", ".git", ".DS_Store"];
25
26
  const VIDEO = "out/video.mp4";
26
27
  // Where a project remembers the template it was cloned from, and the last one it was pushed as. Never part of a bundle.
27
28
  const LINK = ".reelkit/template.json";
@@ -156,6 +157,13 @@ export function filesOf(dir: string): { files: TemplateFile[]; sources: Uint8Arr
156
157
  return { files, sources: sources && sources.length <= MAX_TEMPLATE_SOURCES_BYTES ? sources : undefined };
157
158
  }
158
159
 
160
+ // The three largest things at the top of the project, for the message that says a project is too large to push.
161
+ function largest(dir: string): string {
162
+ const size = (path: string): number => { try { const st = statSync(path); return st.isDirectory() ? readdirSync(path).reduce((sum, name) => sum + size(join(path, name)), 0) : st.size; } catch { return 0; } };
163
+ const top = readdirSync(dir).filter((name) => !TEMPLATE_SKIP.includes(name)).map((name) => ({ name, bytes: size(join(dir, name)) })).sort((a, b) => b.bytes - a.bytes).slice(0, 3).filter((x) => x.bytes > 1_000_000);
164
+ return top.length ? `The largest parts: ${top.map((x) => `${x.name} (${mb(x.bytes)})`).join(", ")}. ` : "";
165
+ }
166
+
159
167
  const readLink = (project: Project): { id?: string; from?: string } => { try { return project.readJsonOr<{ id?: string; from?: string }>(LINK, {}); } catch { return {}; } };
160
168
 
161
169
  export async function templatePush(ctx: Ctx, opts: { name?: string }): Promise<Result> {
@@ -171,7 +179,7 @@ export async function templatePush(ctx: Ctx, opts: { name?: string }): Promise<R
171
179
  ctx.log("Packing the project.");
172
180
  await sh("tar", ["-czf", bundle, ...TEMPLATE_SKIP.flatMap((x) => ["--exclude", `./${x}`]), "-C", project.dir, "."], { maxBuffer: 1 << 24 });
173
181
  const bundleBytes = statSync(bundle).size;
174
- if (bundleBytes > MAX_UPLOAD_BYTES) return { ok: false, summary: `The project packs to ${mb(bundleBytes)}, over the ${mb(MAX_UPLOAD_BYTES)} a template may be. Remove large files under assets/ that the video does not use and push again.` };
182
+ if (bundleBytes > MAX_UPLOAD_BYTES) return { ok: false, summary: `The project packs to ${mb(bundleBytes)}, over the ${mb(MAX_UPLOAD_BYTES)} a template may be. ${largest(project.dir)}Move out what the video does not use and push again.` };
175
183
  const video = project.exists(VIDEO) ? project.path(VIDEO) : undefined;
176
184
  const videoBytes = video ? statSync(video).size : 0;
177
185
  if (videoBytes > MAX_UPLOAD_BYTES) return { ok: false, summary: `The rendered video is ${mb(videoBytes)}, over the ${mb(MAX_UPLOAD_BYTES)} limit. Export a smaller one with \`reelkit export\` or push without a render.` };