@hraness/slopcamera 3.8.1 → 3.9.0

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/NOTICE.md CHANGED
@@ -52,3 +52,17 @@ The complete local workflow host uses
52
52
  License (Copyright 2023 Effectful Technologies Inc). It remains a separately
53
53
  installed runtime dependency and is not relicensed by this project. Portable
54
54
  workflow authoring and graph compilation do not load this runtime.
55
+
56
+ Icon scene composition and rendering use
57
+ [`@hraness/iconplace`](https://github.com/hraness/iconplace) 0.1.0, the
58
+ icon.place library, and soundtrack scores and beat grids use
59
+ [`@hraness/soundfish`](https://github.com/hraness/soundfish) 0.7.0. Both are
60
+ distributed under the MIT License and remain separately installed runtime
61
+ dependencies pinned to exact versions; neither is relicensed by this project.
62
+ The letterform outline data in `@hraness/iconplace/scene` and
63
+ `@hraness/iconplace/collections` is derived from Cormorant Garamond and
64
+ UnifrakturMaguntia and stays under the SIL Open Font License 1.1, as that
65
+ package's `THIRD_PARTY_NOTICES.md` and `licenses/` record.
66
+ Slopcamera imports their library entry points only and never runs their
67
+ commands. The Soundfish Agent Skill ships with `@hraness/soundfish`, not with
68
+ Slopcamera.
package/README.md CHANGED
@@ -23,7 +23,9 @@ file and a new render.
23
23
  is a JSON file of boxes and arrows, a title animation is an HTML scaffold
24
24
  for one of seven profiles, and a 3D shot is scene JSON with a named camera.
25
25
  The renderer, frame timing, encoding, and export formats are already
26
- installed. No benchmark of token use has been published yet.
26
+ installed. This does not make it cheaper in tokens: in our
27
+ [benchmark](https://slopcamera.com/docs/explanation/token-benchmark), the median cost with
28
+ SlopCamera installed was higher than without it on all four tasks.
27
29
  - **Revisions change the source, not the whole result.** Change one label,
28
30
  camera, or cut and render again. Every export comes from the same source, so
29
31
  light and dark versions, or 16:9 and 9:16 cuts, stay in step.
@@ -41,11 +43,11 @@ file and a new render.
41
43
  ## Install SlopCamera
42
44
 
43
45
  Install [Bun 1.3.14 or newer](https://bun.sh), then install the
44
- [SlopCamera v3.8.0 release](https://github.com/hraness/slopcamera/releases/tag/v3.8.0)
46
+ [SlopCamera v3.8.1 release](https://github.com/hraness/slopcamera/releases/tag/v3.8.1)
45
47
  and its matching Agent Skill:
46
48
 
47
49
  ```sh
48
- bun add --global https://github.com/hraness/slopcamera/releases/download/v3.8.0/hraness-slopcamera-3.8.0.tgz
50
+ bun add --global https://github.com/hraness/slopcamera/releases/download/v3.8.1/hraness-slopcamera-3.8.1.tgz
49
51
  slopcamera skill install --target agents
50
52
  ```
51
53
 
@@ -192,6 +194,10 @@ them all with their requirements.
192
194
  | Explainer video | A Manim scene, captions, and a presenter | A lesson video with typeset math | [Geometry lesson](https://slopcamera.com/docs/how-to/educational-video#inspect-the-finished-example) |
193
195
  | Footage edits | Cuts, captions, reframes, and color as project decisions | 16:9, 9:16, 1:1, and 4:5 exports from one edit | [Four formats](https://slopcamera.com/docs/how-to/edit-video#landscape-delivery) |
194
196
 
197
+ SlopCamera also composes vector icon scenes with the bundled icon.place library
198
+ and reads Soundfish scores or MIDI files into beat grids for music-timed scenes,
199
+ both locally and without a model. Neither renders audio.
200
+
195
201
  Model-backed generation of images, video, and speech is available through your
196
202
  own provider access, and cinematic effects, particles, and character
197
203
  performance can be planned from source. The gallery has no rendered examples
@@ -319,9 +325,11 @@ or [Why SlopCamera](https://slopcamera.com/docs/explanation/why-slopcamera).
319
325
  identical output elsewhere.
320
326
  - **Trusted code is not sandboxed.** Native Python and your own Bun workflows
321
327
  run with the current user's access.
322
- - **MCP is a subset.** Its 17 fixed tools check and render diagrams, plan and
323
- audit scenes, and run six operation codes. It does not expose every CLI
324
- command and never changes project state.
328
+ - **MCP is a subset.** Current source has 21 fixed tools that check and render diagrams, plan and
329
+ audit scenes, compose icon scenes and soundtrack beat grids, and run ten
330
+ operation codes. It does not expose every CLI command and never changes
331
+ project state. The verified v3.8.1 archive has a 17-tool subset and six
332
+ registered operations; icon and soundtrack composition require a later source build.
325
333
 
326
334
  ## Design and trust
327
335
 
@@ -4,7 +4,7 @@ import type { z } from "zod";
4
4
 
5
5
  import type { ApplicationContext } from "./context";
6
6
 
7
- export const SLOPCAMERA_APPLICATION_TOOL_VERSION = "slopcamera-3.8.1" as const;
7
+ export const SLOPCAMERA_APPLICATION_TOOL_VERSION = "slopcamera-3.9.0" as const;
8
8
 
9
9
  export const OPERATION_KINDS = [
10
10
  "scene.audit",
@@ -127,8 +127,12 @@ const capabilityModules = Object.freeze([
127
127
  { effect: "local-read", name: "diagram sheets check" },
128
128
  { effect: "local-derived-write", name: "diagram sheets render" },
129
129
  { effect: "local-derived-write", name: "image vectorize" },
130
+ { effect: "local-derived-write", name: "image icon compose" },
131
+ { effect: "local-derived-write", name: "image icon render" },
132
+ { effect: "local-derived-write", name: "media soundtrack compose" },
133
+ { effect: "local-derived-write", name: "media soundtrack grid" },
130
134
  ],
131
- description: "Portable diagrams, CLI/SDK drawing sheets, local vectorization, and the bounded semantic operation projection.",
135
+ description: "Portable diagrams, CLI/SDK drawing sheets, local vectorization, deterministic icon scenes and soundtrack beat grids, and the bounded semantic operation projection.",
132
136
  moduleId: "slopcamera.capability.diagram-image",
133
137
  operationKeys: diagramImageOperations,
134
138
  profiles: [{
@@ -139,7 +143,16 @@ const capabilityModules = Object.freeze([
139
143
  }],
140
144
  stability: "stable",
141
145
  title: "Diagrams and images",
142
- toolNames: ["check_diagram", "execute_slopcamera", "render_diagram", "search_slopcamera"],
146
+ toolNames: [
147
+ "check_diagram",
148
+ "compose_icon",
149
+ "compose_soundtrack",
150
+ "derive_soundtrack_grid",
151
+ "execute_slopcamera",
152
+ "render_diagram",
153
+ "render_icon",
154
+ "search_slopcamera",
155
+ ],
143
156
  trust: "portable",
144
157
  version: 1,
145
158
  workflowKeys: [],
@@ -365,7 +365,7 @@ import {
365
365
  workflowRunStore,
366
366
  } from "./workflow-runs";
367
367
 
368
- export const SLOPCAMERA_VERSION = "3.8.1";
368
+ export const SLOPCAMERA_VERSION = "3.9.0";
369
369
 
370
370
  // Legacy direct renders predate per-target output contracts. Keep them
371
371
  // bounded generously enough for long-form production while preventing one
@@ -37,7 +37,7 @@ Commands:
37
37
  Discover and run Vercel AI Gateway media models
38
38
  credits status|topup|wait|forget
39
39
  Buy and inspect hosted generation credits
40
- media audio|color Apply local non-destructive audio and video effects
40
+ media audio|color|soundtrack Apply local audio and video effects; derive soundtrack beat grids
41
41
  outputs Print the agent outputs directory
42
42
  outputs list|open|reveal List the newest outputs or open one on this Mac
43
43
  status What Slopcamera is doing, credits and newest outputs
@@ -293,6 +293,10 @@ compliance. Drawing sheets are exposed through this CLI and the root SDK, not co
293
293
  slopcamera image icon --set <file.json> --output-dir <directory>
294
294
  [--context <card|hero|inline>] [--candidates <1-4>]
295
295
  [--set-rounds <1-4>] [--keep-raster] [--json]
296
+ slopcamera image icon compose <source.json> [--output <file.json>] [--json]
297
+ slopcamera image icon render <source.json> --output <file.svg> [--recipe <file.json>]
298
+ [--size <16-1024>] [--background] [--palette <original|ink|earth|night>]
299
+ [--language <language>] [--json]
296
300
 
297
301
  Explicit --output file commands delegate to @hraness/slopcamera. Vectorization is local,
298
302
  bounded, checksum-pinned, and emits inert SVG. File generation uses Vercel AI Gateway with the
@@ -308,7 +312,13 @@ variation axes or an explicit candidate list — keeps every candidate with its
308
312
  composes a labelled contact sheet plus receipt for agent review. Texture cells repeat the
309
313
  candidate 2×2 so seams are inspectable (--tile/--no-tile overrides). It never replaces existing
310
314
  outputs and never promotes a candidate into authored source; review the sheet and select
311
- explicitly.`,
315
+ explicitly.
316
+
317
+ Icon compose and render are local and deterministic, with no model or network. They solve and
318
+ draw icon.place scenes, collections, construction programs, and recipes into inert SVG; a recipe
319
+ replays only when its recorded digests match. Construction-program languages: outline, sketch,
320
+ pen, crosshatch, engraving, stipple, halftone, glyph, flat, shaded, figure, cutpaper, woodcut,
321
+ offset.`,
312
322
  style: `Usage:
313
323
  slopcamera style list [--json]
314
324
  slopcamera style show <id> [--json]
@@ -616,6 +626,15 @@ argv, receipts, or logs. When a configured wallet runs out, paid calls fail with
616
626
  [--output <relative-path>] [--json]
617
627
  slopcamera media color <video-path> [grade] [--video-stream <index>]
618
628
  [--output <relative-path>] [--json]
629
+ slopcamera media soundtrack compose <score> [--output <file.json>]
630
+ [--format <compose|song|json|midi>] [--json]
631
+ slopcamera media soundtrack grid <score> [--output <file.json>] [--start-us <n>]
632
+ [--format <compose|song|json|midi>] [--json]
633
+
634
+ Soundtrack verbs delegate to @hraness/slopcamera. They verify a Soundfish loop or song (compose
635
+ text, song text, score JSON, or a Standard MIDI file) and derive the {bpm, beatOffsetUs,
636
+ beatsPerBar} music timing that HTML scene requests accept, plus section cue times. They render
637
+ no audio; pair the grid with the track you mix.
619
638
 
620
639
  Audio effects may be combined in one deterministic chain:
621
640
  --volume-db <-60..24>
@@ -725,7 +744,7 @@ export function completions(words: readonly string[]): readonly string[] {
725
744
  if (command === "diagram") return words[1] === "sheets"
726
745
  ? ["init", "check", "render"]
727
746
  : ["init", "check", "render", "sheets"];
728
- if (command === "image") return ["vectorize", "generate", "gallery", "icon"];
747
+ if (command === "image") return words[1] === "icon" ? ["compose", "render"] : ["vectorize", "generate", "gallery", "icon"];
729
748
  if (command === "workflows") return ["list", "show", "plan", "run"];
730
749
  if (command === "code") return ["init", "check", "plan", "run"];
731
750
  if (command === "runs") return ["list", "show", "resume", "approve", "cancel"];
@@ -748,7 +767,7 @@ export function completions(words: readonly string[]): readonly string[] {
748
767
  if (command === "fillers") return ["list", "apply"];
749
768
  if (command === "ai") return ["models", "provider-options", "image", "video", "speech", "transcribe"];
750
769
  if (command === "credits") return ["status", "topup", "wait", "forget"];
751
- if (command === "media") return ["audio", "color"];
770
+ if (command === "media") return words[1] === "soundtrack" ? ["compose", "grid"] : ["audio", "color", "soundtrack"];
752
771
  if (command === "render") return ["plan", "run"];
753
772
  if (command === "assets") return ["emoji"];
754
773
  if (command === "outputs") return ["list", "open", "reveal"];
@@ -289,6 +289,7 @@ export async function runPortableSurface(
289
289
  argv[0] === "code"
290
290
  && (argv[1] === "search" || argv[1] === "execute")
291
291
  )
292
+ || (argv[0] === "media" && argv[1] === "soundtrack")
292
293
  || (
293
294
  argv[0] === "image"
294
295
  && (
@@ -96,6 +96,8 @@ export const CLI_VERBS: readonly VerbRow[] = [
96
96
  row("image generate", "operate", "Generate an image with Vercel AI Gateway"),
97
97
  row("image gallery", "operate", "Generate a review gallery of image candidates"),
98
98
  row("image icon", "operate", "Generate a line-art SVG icon"),
99
+ row("image icon compose", "operate", "Solve a vector icon scene and report its digests"),
100
+ row("image icon render", "operate", "Draw a vector icon scene or recipe to inert SVG"),
99
101
 
100
102
  row("html catalog", "read", "List HTML scene profiles"),
101
103
  row("html scaffold", "operate", "Write a new HTML scene"),
@@ -138,6 +140,8 @@ export const CLI_VERBS: readonly VerbRow[] = [
138
140
 
139
141
  row("media audio", "operate", "Apply audio effects into a new file"),
140
142
  row("media color", "operate", "Apply a color grade into a new file"),
143
+ row("media soundtrack compose", "operate", "Verify a loop or song score"),
144
+ row("media soundtrack grid", "operate", "Derive music timing and section cues from a score"),
141
145
 
142
146
  row("outputs", "read", "Print the outputs folder"),
143
147
  row("outputs list", "read", "List the files in the outputs folder, newest first"),