Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@
},
"metadata": {
"description": "Deep video and image work for coding agents: analyze, describe, search, caption, clip, detect faces, and publish via the tinycloud CLI.",
"version": "0.3.12"
"version": "0.3.13"
},
"plugins": [
{
"name": "tinycloud",
"source": "./",
"description": "Video and image understanding and editing via the tinycloud CLI (Cloudglue): watch/see/extract/search/ask/face over videos and images, captions, clips, collections, plus one-command workflows for sales coaching, blog posts, ad analysis, meeting breakdowns, and YouTube publishing.",
"version": "0.3.12",
"version": "0.3.13",
"author": { "name": "Cloudglue" },
"homepage": "https://tinycloud.sh",
"repository": "https://github.com/cloudglue/tinycloud",
Expand Down
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "tinycloud",
"displayName": "Tinycloud Video",
"description": "Video and image understanding and editing via the tinycloud CLI (Cloudglue): watch/see/extract/search/ask/face over videos and images, captions, clips, collections, and one-command video workflows.",
"version": "0.3.12",
"version": "0.3.13",
"author": { "name": "Cloudglue", "url": "https://cloudglue.dev" },
"homepage": "https://tinycloud.sh",
"repository": "https://github.com/cloudglue/tinycloud",
Expand Down
27 changes: 18 additions & 9 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,16 @@ node --test test/unit.test.mjs # just the unit suite
TINYCLOUD_TEST_TARBALL=~/Downloads/tinycloud-darwin-arm64.tar.gz npm test # e2e against a real dist tarball

# Contract smoke tests against an installed/extracted binary
TINYCLOUD_CMD=/path/to/tinycloud EXPECTED_VERSION=0.3.12 bash scripts/smoke-test.sh
TINYCLOUD_CMD=/path/to/tinycloud EXPECTED_VERSION=0.3.13 bash scripts/smoke-test.sh

# Serve a tarball as a fake CDN (modes: --corrupt, --no-manifest)
node test/fixtures/make-fixture-cdn.mjs --tarball <path>.tar.gz --version 0.3.12 --port 8787
node test/fixtures/make-fixture-cdn.mjs --tarball <path>.tar.gz --version 0.3.13 --port 8787
TINYCLOUD_DIST_URL=http://127.0.0.1:8787 TINYCLOUD_INSTALL_DIR=$(mktemp -d) node bin/tinycloud.js --version --json
TINYCLOUD_DIST_URL=http://127.0.0.1:8787 bash install.sh --install-dir $(mktemp -d)/bin

# Release manifest tooling (maintainer)
node scripts/generate-manifest.mjs --version 0.3.12 --from-cdn # build manifest + .sha256 sidecars
node scripts/generate-manifest.mjs --check --version 0.3.12 # verify live CDN matches manifest
node scripts/generate-manifest.mjs --version 0.3.13 --from-cdn # build manifest + .sha256 sidecars
node scripts/generate-manifest.mjs --check --version 0.3.13 # verify live CDN matches manifest

# Plugin metadata validation
claude plugin validate .
Expand Down Expand Up @@ -103,7 +103,7 @@ stdout (logs on stderr) with `status`:
→ exit codes 0/0/2/3/3/0/1. `tinycloud commands --json` is the authoritative
flag list — verify doc claims against it, not memory (a doc bug shipped once
because `--cached` only exists on watch/see/extract/caption/face/workflow). As
of 0.3.12 there are 16 verbs: `see`
of 0.3.13 there are 16 verbs: `see`
(0.3.7+) analyzes an **image** (file-level,
JPEG/PNG/WebP — the image counterpart of `watch`) and `extract` also takes
an image source (features `see.v1`, `extract.images.v1`); 0.3.8 adds
Expand Down Expand Up @@ -137,7 +137,16 @@ derived per run, never persisted, excluded from the cache key) and
and **removes `watch --json-index`** (breaking: now an unknown-flag error).
Because the speech fix is load-bearing, the skill floor was raised to 0.3.12
(`min_version`/preflight, the 0.3.7 floor-raise pattern — the dist PR merges
only after CDN `channels.stable` = 0.3.12). The
only after CDN `channels.stable` = 0.3.12). 0.3.13 is a docs/prompt parity
release for **sites embed v7 playback speeds**: every `<cg-video>` gets a
playback-speed menu at every player size (default rates `1 1.5 2`), authors
override the list with the space-separated `playbackrates` attribute, and the
JS API gains a `playbackRate` get/set (settable before mount; non-positive/
non-numeric ignored). The speed menu lives in the Cloudglue-served embed
script, not the binary — no new verbs, flags, or feature ids (verbs stay 16,
features stay 33), the skill floor stays 0.3.12, and already-published sites
pick it up without republishing; the binary's embed guidance (skill reference,
kitchen sink, system prompt, publish notes) moved from v6 to v7 wording. The
host-level `profile` verb and the leading global flags `--home`/`--profile`
(also `$TINYCLOUD_HOME`; 0.3.3+) relocate state and are intentionally absent
from `commands --json` — like the launcher's install/update, they're CLI/host
Expand Down Expand Up @@ -190,9 +199,9 @@ of printing JSON. Any script invoking the binary must redirect `</dev/null`
metadata sync) vs live-CDN jobs (`Install + smoke` matrix, npx-against-CDN)
which run only on push to main or manual dispatch — never on PRs, because a
CDN gap would fail every PR.
- The live CDN serves 0.3.12 (latest aliases + v-prefixed pinned tarballs
for 0.3.0 through 0.3.12, with `manifest.json` + `.sha256`
sidecars; `channels.stable` = 0.3.12); all smoke legs are required.
- The live CDN serves 0.3.13 (latest aliases + v-prefixed pinned tarballs
for 0.3.0 through 0.3.13, with `manifest.json` + `.sha256`
sidecars; `channels.stable` = 0.3.13); all smoke legs are required.
- `publish-npm.yml` (tag `v*`): asserts tag == package.json version → gates
on `generate-manifest.mjs --check` against the live CDN → publishes via
npm trusted publishing (OIDC, `id-token: write`, npm ≥ 11.5.1 — no token
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ The npm package is a small launcher: on first run it downloads the matching
platform distribution from Cloudglue's CDN (cached under
`~/.tinycloud/versions/<version>/`), verifies its checksum, and execs the real
binary. The package version pins the binary version, so
`npx @cloudglue/tinycloud@0.3.12` always runs tinycloud 0.3.12. It also adds two
`npx @cloudglue/tinycloud@0.3.13` always runs tinycloud 0.3.13. It also adds two
wrapper commands:

```bash
tinycloud install --version 0.3.12 # pre-download a version
tinycloud install --version 0.3.13 # pre-download a version
tinycloud install --latest # install latest stable and pin to it
tinycloud update # move to latest stable, prune old versions
```
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cloudglue/tinycloud",
"version": "0.3.12",
"version": "0.3.13",
"description": "Agent CLI for deep video and image work, by Cloudglue. Downloads the tinycloud binary on first run.",
"bin": {
"tinycloud": "bin/tinycloud.js"
Expand Down
4 changes: 3 additions & 1 deletion skills/tinycloud/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -206,9 +206,11 @@ Authoring your own recipes: [reference/workflow-authoring.md](reference/workflow
`data.embed_snippet` (`<cg-video>`), which only plays on a private site of
the same account. When writing HTML around an embed, use the component's
built-ins (`autoplay`+`muted`, `loop`, `start-time`, `exclusive`,
`playbackrates` — speed-menu rates, default `1 1.5 2`, shown at every
player size; embed v7 —
`clip-start`/`clip-end` to frame one "back to moment" clip — plus
`clip-only`, 0.3.8+, to play nothing but that window; JS
`playSegment(start, end?)`) and the container components
`playSegment(start, end?)`, `playbackRate` get/set) and the container components
(`<cg-playlist>`, `<cg-grid>`, `<cg-chapters>`) rather than hand-rolled
players, galleries, or segment-list JS — details in
[reference/verbs.md](reference/verbs.md).
Expand Down
6 changes: 4 additions & 2 deletions skills/tinycloud/reference/glossary.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,11 @@ connector?" or an envelope field needs explaining.
embed via the `data.embed_snippet` `<cg-video>` tag, which only plays on a
private published site of the same account. The embed has playback
attributes (`autoplay`+`muted`, `loop`, `start-time`, `poster`,
`accent-color`, `exclusive`, and `clip-start`/`clip-end` to frame a single
`accent-color`, `exclusive`, `playbackrates` — space-separated
playback-speed-menu rates, default `1 1.5 2`, shown at every player size
(sites embed v7) — and `clip-start`/`clip-end` to frame a single
"back to moment" clip — `clip-only`, 0.3.8+, plays nothing but that
window) and a JS API (`playSegment`, `seekTo`, media
window) and a JS API (`playSegment`, `seekTo`, `playbackRate` get/set, media
events re-dispatched on the element) for custom site HTML, and plays
standalone or inside the container components (`<cg-playlist>`,
`<cg-grid>`, `<cg-chapters>`) — see reference/verbs.md.
Expand Down
16 changes: 14 additions & 2 deletions skills/tinycloud/reference/verbs.md
Original file line number Diff line number Diff line change
Expand Up @@ -390,13 +390,25 @@ When generating custom site HTML around a `<cg-video>` embed, use the
component's built-ins instead of reinventing them. It defaults to a
responsive 16:9 dark placeholder (override with plain page CSS on the
`cg-video` selector); mount-time attributes: `autoplay` (pair with `muted` or
browsers block it), `loop`, `start-time`, `poster`, `accent-color`, and
browsers block it), `loop`, `start-time`, `poster`, `accent-color`,
`playbackrates` (speed menu — next paragraph), and
`exclusive` (put it on every player in a gallery so starting one pauses the
rest). Its JS API queues until ready — `playSegment(start, end?)`,
`seekTo()`, `play()`/`pause()` — and media events are re-dispatched on the
`seekTo()`, `play()`/`pause()`, `playbackRate` (get/set) — and media events
are re-dispatched on the
element (`timeupdate`, `ended`, `cg-ready`); prefer `playSegment` over
hand-rolled seek logic for "click a moment to play that segment" pages.

Playback speed (sites embed v7): every `<cg-video>` shows a playback-speed
menu at every player size — including narrow grid cells and phones — with
default rates `1 1.5 2`. Supply your own list with the space-separated
`playbackrates` attribute (e.g. `playbackrates="0.5 1 1.5 2"`), and get/set
the speed from page code via the `playbackRate` JS property (safe to set
before mount; non-positive and non-numeric values are ignored — the viewer
can always change it from the menu). The speed menu ships in the
Cloudglue-served embed script, so it is not gated on a tinycloud version and
already-published sites pick it up without republishing.

To frame a single moment inside the full recording — a cited highlight you
want to share on its own — add `clip-start`/`clip-end` (seconds) to a bare
`<cg-video>`: the player draws a clip-length badge, a clip-region strip with a
Expand Down
2 changes: 1 addition & 1 deletion skills/tinycloud/tinycloud-skill.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"skill_version": "0.3.12",
"skill_version": "0.3.13",
"tinycloud": {
"min_version": "0.3.12",
"supported_range": ">=0.3.12 <0.4.0",
Expand Down
Loading