diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index fa751c4..f90c627 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -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.11" + "version": "0.3.12" }, "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.11", + "version": "0.3.12", "author": { "name": "Cloudglue" }, "homepage": "https://tinycloud.sh", "repository": "https://github.com/cloudglue/tinycloud", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index c7dcb4f..58fa98d 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -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.11", + "version": "0.3.12", "author": { "name": "Cloudglue", "url": "https://cloudglue.dev" }, "homepage": "https://tinycloud.sh", "repository": "https://github.com/cloudglue/tinycloud", diff --git a/CLAUDE.md b/CLAUDE.md index 5d707b1..532ffa7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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.11 bash scripts/smoke-test.sh +TINYCLOUD_CMD=/path/to/tinycloud EXPECTED_VERSION=0.3.12 bash scripts/smoke-test.sh # Serve a tarball as a fake CDN (modes: --corrupt, --no-manifest) -node test/fixtures/make-fixture-cdn.mjs --tarball .tar.gz --version 0.3.11 --port 8787 +node test/fixtures/make-fixture-cdn.mjs --tarball .tar.gz --version 0.3.12 --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.11 --from-cdn # build manifest + .sha256 sidecars -node scripts/generate-manifest.mjs --check --version 0.3.11 # verify live CDN matches manifest +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 # Plugin metadata validation claude plugin validate . @@ -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.11 there are 16 verbs: `see` +of 0.3.12 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 @@ -123,7 +123,21 @@ Zoom, Recall, Google Drive, Dropbox, Gong) and adds `library connectors inspect ` (feature `library.connectors.inspect.v1`) — a provider-metadata peek that never creates a file — plus per-file provider `metadata` on `connectors files` rows; verbs stay 16 (inspect is a `library` subcommand, -not a verb), features 31→32. The +not a verb), features 31→32. 0.3.12 fixes the critical watch speech gap: +`watch --speech-only`/audio sources returned `segments: []` — segments (and +embedded shots) now inline their overlapping utterances as `speech: string[]`, +sources with speech but no visual segmentation synthesize uniform 20s +segments (`segmentation: "uniform:20"`), pre-0.3.12 caches heal automatically +(persisted on watch cache hits; in-memory during search scans), and +`search --field speech` works over cached watches (feature `watch.speech.v1`, +features 32→33, verbs stay 16). It also wires the previously +declared-but-no-op `watch --transcript` (speaker-labeled `data.transcript`; +derived per run, never persisted, excluded from the cache key) and +`--content` (full describe markdown as `data.content`; served on cache hits), +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 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 @@ -176,9 +190,9 @@ of printing JSON. Any script invoking the binary must redirect `/`), verifies its checksum, and execs the real binary. The package version pins the binary version, so -`npx @cloudglue/tinycloud@0.3.11` always runs tinycloud 0.3.11. It also adds two +`npx @cloudglue/tinycloud@0.3.12` always runs tinycloud 0.3.12. It also adds two wrapper commands: ```bash -tinycloud install --version 0.3.11 # pre-download a version +tinycloud install --version 0.3.12 # pre-download a version tinycloud install --latest # install latest stable and pin to it tinycloud update # move to latest stable, prune old versions ``` diff --git a/package.json b/package.json index c68bdf5..cf1d5fc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@cloudglue/tinycloud", - "version": "0.3.11", + "version": "0.3.12", "description": "Agent CLI for deep video and image work, by Cloudglue. Downloads the tinycloud binary on first run.", "bin": { "tinycloud": "bin/tinycloud.js" diff --git a/skills/tinycloud/reference/glossary.md b/skills/tinycloud/reference/glossary.md index 452580d..c7d8e1c 100644 --- a/skills/tinycloud/reference/glossary.md +++ b/skills/tinycloud/reference/glossary.md @@ -71,7 +71,8 @@ connector?" or an envelope field needs explaining. (`status`, `data`, `ref`, `meta`, `error`, …). The machine contract; see reference/envelope.md. - **Watch context / describe** — the reusable analysis `tinycloud watch` - produces (summary, segments, transcript-ish context). Cached locally and + produces (summary, segments with their spoken utterances inlined as + `speech[]`, transcript-ish context). Cached locally and mirrored in Cloudglue, so later `extract`/`ask`/`search` reuse it instead of re-analyzing. - **See / image describe (0.3.7+)** — the image counterpart of `watch`: diff --git a/skills/tinycloud/reference/verbs.md b/skills/tinycloud/reference/verbs.md index 433d678..37887e8 100644 --- a/skills/tinycloud/reference/verbs.md +++ b/skills/tinycloud/reference/verbs.md @@ -54,7 +54,7 @@ Flags shared by most verbs are listed once at the bottom. tinycloud watch [--segment uniform:20|chapters|shots|segments] [--shot-min-seconds ] [--shot-max-seconds ] [--profile default|light|custom] [--speech-only | --visual-only] - [--start ] [--end ] [--transcript] [--content] [--json-index] + [--start ] [--end ] [--transcript] [--content] [--background] ``` @@ -65,6 +65,20 @@ bounds are part of the cache key, so tuned and default shot passes never collide. `watch` is **video/audio only** — point it at an image and it errors ("watch analyzes video/audio; for an image use `tinycloud see`"). +Segments carry the spoken words (0.3.12+): each segment (and embedded shot) +inlines its overlapping utterances as `speech: string[]`. A source with +speech but no visual segmentation — an audio file, `--speech-only`, a very +short or windowed source — gets uniform 20s speech segments synthesized +(`"segmentation": "uniform:20"`) instead of an empty `segments` list. Caches +written by older versions heal automatically on the next watch or search. + +`--transcript` adds the full transcript as `data.transcript` (speaker-labeled +when more than one speaker); `--content` inlines the complete describe +markdown as `data.content`. Both are derived per invocation — they don't +change the cache key and are served on cache hits, so asking for them never +re-runs an analysis. `--json-index` was removed in 0.3.12 (it had long been a +no-op; passing it now errors as an unknown flag). + ### see — analyze an image (cloud, 0.3.7+) ```bash @@ -122,6 +136,9 @@ tinycloud search "" [--in ] Searches cached context locally, including cached `see` image results (0.3.7+), so a describe you've already run is greppable without another cloud call. +`--field speech` matches the utterances inlined on cached watch segments — +including speech-only/audio watches (0.3.12+; older cache entries heal in +place during the scan, nothing is re-billed). ### probe — semantic search (cloud) diff --git a/skills/tinycloud/scripts/preflight.sh b/skills/tinycloud/scripts/preflight.sh index 2fc7a11..eba4ba4 100755 --- a/skills/tinycloud/scripts/preflight.sh +++ b/skills/tinycloud/scripts/preflight.sh @@ -9,11 +9,11 @@ set -u # Mirror tinycloud-skill.json: min_version / supported_range upper bound # (CI diffs these against the manifest). -MIN_VERSION="0.3.7" +MIN_VERSION="0.3.12" MAX_VERSION_EXCLUSIVE="0.4.0" INSTALL_CMD='curl -fsSL https://app.cloudglue.dev/tinycloud.sh | bash' # Kept in sync with ../tinycloud-skill.json required_features (CI diffs them). -REQUIRED_FEATURES="envelope.v1 watch.v1 see.v1 extract.v1 extract.images.v1 caption.v1 search.v1 probe.v1 ask.v1 clip.v1 grab.v1 face.v1 jobs.v1 library.collections.v1 library.collections.create.v1 library.collections.mutate.v1 library.collections.entities.v1 library.sync.url.v1 workflow.v1 publish.v1 publish.manage.v1 publish.video.v1 setup.v1" +REQUIRED_FEATURES="envelope.v1 watch.v1 watch.speech.v1 see.v1 extract.v1 extract.images.v1 caption.v1 search.v1 probe.v1 ask.v1 clip.v1 grab.v1 face.v1 jobs.v1 library.collections.v1 library.collections.create.v1 library.collections.mutate.v1 library.collections.entities.v1 library.sync.url.v1 workflow.v1 publish.v1 publish.manage.v1 publish.video.v1 setup.v1" # 1) Binary present and responsive? if ! command -v tinycloud >/dev/null 2>&1; then diff --git a/skills/tinycloud/tinycloud-skill.json b/skills/tinycloud/tinycloud-skill.json index 52d09b8..b73ffb7 100644 --- a/skills/tinycloud/tinycloud-skill.json +++ b/skills/tinycloud/tinycloud-skill.json @@ -1,11 +1,12 @@ { - "skill_version": "0.3.11", + "skill_version": "0.3.12", "tinycloud": { - "min_version": "0.3.7", - "supported_range": ">=0.3.7 <0.4.0", + "min_version": "0.3.12", + "supported_range": ">=0.3.12 <0.4.0", "required_features": [ "envelope.v1", "watch.v1", + "watch.speech.v1", "see.v1", "extract.v1", "extract.images.v1",