reelkit-cli 0.10.3 → 0.10.5

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 ADDED
@@ -0,0 +1,97 @@
1
+ # Changelog
2
+
3
+ What changed in each published version of `reelkit-cli`, newest first. A push to `main` publishes the version in
4
+ `package.json` when it is not on npm yet, and it must have an entry here.
5
+
6
+ ## 0.10.5 - 2026-10-09
7
+
8
+ - Fixes 0.10.4, which was published without the `reelkit` command. Use this version instead.
9
+
10
+ ## 0.10.4 - 2026-10-09
11
+
12
+ - The public library listing can be sorted by when items were added: `sort=new` or `sort=old`.
13
+ - This changelog ships with the package, and a push to `main` publishes a new version to npm.
14
+
15
+ ## 0.10.3 - 2026-10-07
16
+
17
+ - The library has a new kind, `prompt`: prompts people used to make motion videos, kept as references. Search and pull them with `--kind prompt`.
18
+
19
+ ## 0.10.2 - 2026-10-07
20
+
21
+ - The skill carries a studio pane for Claude Code: a live view of the project's timeline and player beside the conversation.
22
+
23
+ ## 0.10.0 - 2026-10-06
24
+
25
+ - Videos are built and rendered with HyperFrames. Remotion is gone; compositions import from `reelkit/frame`.
26
+ - Fifteen art styles, each with its own components and an example film, from flat vector and line art to synthwave, pixel and collage.
27
+ - 3D: `Assemble3D`, `Particles3D`, `Hero3D`, `Screen3D`, `Warp3D`, scene moods, and branded 3D transforms. 3D now fits the frame with true camera numbers.
28
+ - Pictures in layers: `reelkit assets layers` cuts the subject out of a picture, and `ImageLayers` and `TextOnImage` use the result.
29
+ - Product-surface components: `PromptBox`, `TerminalLog`, `NamedCursor`, `GlassPanel`, `ChapterFrame`, `Headline`, `CounterRoll`, `HudOverlay`, `BrowserFrame`.
30
+ - Five more transitions: `color-push`, `rgb-whip`, `flash`, `ring`, `flip`.
31
+ - Sound: `cuesFor` places cues on interface events, music holds steady under narration, and `reelkit sound` measures the voice against the music.
32
+ - Timing: word anchors (`wordFrame`, `onWord`, `onWordBeat`, `sceneById`), tighter gaps between narrated scenes, and a real length estimate in `plan check`.
33
+ - Preview writes a labelled contact sheet and shows the frame after each word.
34
+ - `reelkit init --private` keeps generated images, clips and graphics out of the shared library.
35
+ - Three narrator voices to choose from.
36
+
37
+ ## 0.8.0 - 2026-10-06
38
+
39
+ - Videos with no voice: `voice: none` in the plan, scenes timed in seconds on a beat grid, and `SoundCues` in the kit.
40
+ - A 3D layer on three.js, scene transitions, camera punches and `zoomTo`.
41
+ - Moving grounds, background assets and generated SVG graphics (`reelkit assets gen svg`).
42
+ - `reelkit sound` measures the sound of a finished film, and music can dip.
43
+ - `reelkit ref download` handles Instagram and other links whose length is not known in advance.
44
+ - A component that carries any of the video's own words, or a written-in sentence, is not shared.
45
+ - A second slash command for the voiceless launch film.
46
+
47
+ ## 0.6.0 - 2026-10-05
48
+
49
+ - New components the agent writes are shared with the library for review, by default. Say no with `reelkit init --private`, `reelkit render --no-share` or `REELKIT_NO_SHARE=1`.
50
+ - Music: a track, scene changes on its beat, a `Music` component and beat helpers.
51
+ - Captions are a choice: none, a word at a time, or phrases grouped as they are spoken.
52
+ - Every pulled sound is levelled and the render is mastered to -14 LUFS.
53
+
54
+ ## 0.5.0 - 2026-10-05
55
+
56
+ - `Carry` and `Camera` in the kit hold one element or one camera through several scenes.
57
+ - `reelkit ref analyze` measures how still a video is and how uneven its shots are.
58
+ - `plan check` says when the scenes are all about the same length, and preview reports which scene changes carry something across.
59
+ - The skill teaches continuity, rhythm and script writing, and offers three concepts before a plan.
60
+
61
+ ## 0.4.0 - 2026-10-05
62
+
63
+ - Reference videos: `reelkit ref download`, `audio`, `analyze` and `list`, with a transcript and a local beat and tempo analysis.
64
+ - A plan can name its reference, and `plan check` looks at it.
65
+ - A generated green-screen clip that is too dull to key is cut out on the server instead.
66
+
67
+ ## 0.3.1 - 2026-10-05
68
+
69
+ - The CLI talks to reelkit.cc by default.
70
+
71
+ ## 0.3.0 - 2026-10-05
72
+
73
+ - Cut the subject out of any video on the server: `reelkit assets upload --cutout` and `reelkit assets gen clip --cutout`.
74
+ - Key your own green-screen footage; the key colour is read from the frame.
75
+
76
+ ## 0.2.0 - 2026-10-05
77
+
78
+ - Generated clips: `reelkit assets gen clip`, with green-screen keying, clip scenes in the plan, and the `ClipLayer` and `KeyedClip` components.
79
+
80
+ ## 0.1.3 - 2026-10-05
81
+
82
+ - The looks catalogue is rebuilt around the kit and the shared library.
83
+ - The skill chooses a look, handles Hebrew on screen and applies what editing real footage teaches.
84
+
85
+ ## 0.1.2 - 2026-10-05
86
+
87
+ - `reelkit --version`.
88
+ - Preview shows two frames per scene, and `plan check` always reports the estimated length.
89
+ - The first preview or render says when the rendering browser is being downloaded.
90
+
91
+ ## 0.1.1 - 2026-10-05
92
+
93
+ - Node 22.12 or later is required.
94
+
95
+ ## 0.1.0 - 2026-10-05
96
+
97
+ - First release: `reelkit init`, `plan check`, asset upload, search and pull, voiceover and image generation, `check`, `preview` and `render`, device login, and the skill for coding agents.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reelkit-cli",
3
- "version": "0.10.3",
3
+ "version": "0.10.5",
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",
@@ -18,7 +18,7 @@
18
18
  ],
19
19
  "type": "module",
20
20
  "bin": {
21
- "reelkit": "./bin/reelkit.mjs"
21
+ "reelkit": "bin/reelkit.mjs"
22
22
  },
23
23
  "exports": {
24
24
  ".": "./src/contract/index.ts",
@@ -39,7 +39,8 @@
39
39
  "files": [
40
40
  "bin",
41
41
  "src",
42
- "skill"
42
+ "skill",
43
+ "CHANGELOG.md"
43
44
  ],
44
45
  "engines": {
45
46
  "node": ">=22.12"
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.10.3 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.10.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`.
19
19
 
20
20
  Every command takes `--json` for machine-readable output and exits non-zero with a one-line reason when something is wrong. Read the reason and act on it.
21
21
 
@@ -259,7 +259,9 @@ export const routes = {
259
259
  z.object({ id: ItemId }),
260
260
  z.object({ id: z.string(), text: z.string(), language: z.string().optional(), segments: z.array(TranscriptSegmentSchema), durationSec: z.number().positive() })),
261
261
  publicLibrary: route("GET", "/public/library", false,
262
- z.object({ q: text(200).optional(), kind: LibraryKindSchema.optional(), page: z.coerce.number().int().min(1).max(10000).optional() }),
262
+ // `sort` orders a listing without words by when each item was added: "new" is newest first, "old" is oldest first. Without it the
263
+ // server chooses (newest first within a kind; the kinds take turns when none is named). It does not reorder a search by words.
264
+ z.object({ q: text(200).optional(), kind: LibraryKindSchema.optional(), page: z.coerce.number().int().min(1).max(10000).optional(), sort: z.enum(["new", "old"]).optional() }),
263
265
  // With `q` the items are the best matches by meaning, best first, each with `match` (0..1), in one page (`hasMore` false). Under heavy
264
266
  // use, or when ranking fails, the server answers the plain text listing instead (no `match`), so a client must accept both.
265
267
  z.object({ items: z.array(LibraryItemSchema.extend({ previewUrl: z.string().optional(), match: z.number().min(0).max(1).optional() })), page: z.number(), hasMore: z.boolean() })),
@@ -323,14 +323,14 @@ export async function startFakeApi(opts: { voiceoverCharLimit?: number; imageLim
323
323
  };
324
324
  return job.result;
325
325
  },
326
- publicLibrary: ({ q, kind, page }) => {
327
- // Published items only. Newest first; with a query, best match first and equal matches newest first.
326
+ publicLibrary: ({ q, kind, page, sort }) => {
327
+ // Published items only. Newest first, or oldest first when asked; with a query, best match first and equal matches newest first.
328
328
  const want = q ? words(q) : undefined;
329
329
  const score = (i: LibraryItem) => (want ? [...want].filter((w) => words(`${i.title} ${i.description} ${i.tags.join(" ")}`).has(w)).length : 0);
330
330
  const all = [...store.values()]
331
331
  .map((s, order) => ({ s, order, score: score(s.item) }))
332
332
  .filter((x) => x.s.item.visibility === "published" && (!kind || x.s.item.kind === kind) && (!want || x.score > 0))
333
- .sort((a, b) => b.score - a.score || b.order - a.order).map((x) => x.s);
333
+ .sort((a, b) => b.score - a.score || (sort === "old" && !want ? a.order - b.order : b.order - a.order)).map((x) => x.s);
334
334
  const p = page ?? 1, size = 24;
335
335
  const items = all.slice((p - 1) * size, p * size).map((s) => (s.file && (PREVIEW_OF_ORIGINAL.includes(s.item.kind) || shortClip(s.item)) ? { ...s.item, previewUrl: fileUrl(s.file) } : s.item));
336
336
  return { items, page: p, hasMore: all.length > p * size };