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.14"
"version": "0.3.15"
},
"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.14",
"version": "0.3.15",
"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.14",
"version": "0.3.15",
"author": { "name": "Cloudglue", "url": "https://cloudglue.dev" },
"homepage": "https://tinycloud.sh",
"repository": "https://github.com/cloudglue/tinycloud",
Expand Down
35 changes: 29 additions & 6 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.14 bash scripts/smoke-test.sh
TINYCLOUD_CMD=/path/to/tinycloud EXPECTED_VERSION=0.3.15 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.14 --port 8787
node test/fixtures/make-fixture-cdn.mjs --tarball <path>.tar.gz --version 0.3.15 --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.14 --from-cdn # build manifest + .sha256 sidecars
node scripts/generate-manifest.mjs --check --version 0.3.14 # verify live CDN matches manifest
node scripts/generate-manifest.mjs --version 0.3.15 --from-cdn # build manifest + .sha256 sidecars
node scripts/generate-manifest.mjs --check --version 0.3.15 # 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.14 there are 16 verbs: `see`
of 0.3.15 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 @@ -162,7 +162,30 @@ first. Flipping the setting on an existing site is a settings PATCH with no
re-upload, reported as the new `settings-only` publish action. Because the
skill teaches the flags, the floor was raised to 0.3.14 (the 0.3.12
floor-raise pattern — the dist PR merges only after CDN `channels.stable` =
0.3.14). The host-level `profile` verb and the leading global flags `--home`/`--profile`
0.3.14). 0.3.15 picks up SDK 0.7.21 (spec v0.7.11) — **Iconik connector,
metadata collections, and source-metadata search** (features 34→38, verbs
stay 16): Iconik becomes the seventh metadata-bearing provider
(`iconik://asset/<id>` URIs on `connectors sync`/`inspect`, `--from/--to` on
asset date_created and `--title-search` on `connectors files`, custom
metadata-view fields under `source_metadata.iconik_metadata.<Field>`;
feature `library.connectors.iconik.v1`); `library collections create --type
metadata` makes a metadata collection that indexes connector source_metadata
+ user metadata (new `collections add --metadata '<json|file.json>'`) into
file-level search documents WITHOUT processing media — free to index, no
processing configs (create rejects `--prompt`/`--schema`), queried via
`probe --scope file`/`ask` (feature `library.collections.metadata.v1`);
`probe --filter "<path[op]value>"` (repeatable, ANDed, collection scopes
only; ops `=` `!=` `>` `<` `~=` LIKE `*=` contains-any `&=` contains-all
`^=` in; path prefixes route to source_metadata/metadata/video_info/file
buckets, `video_info.*`/`file.*` stripped to the bare field the schema
enums) filters before semantic
ranking (feature `probe.filters.v1`); and `library connectors refresh
<file-id|uri>` re-fetches an existing file's source_metadata from its
connector and re-indexes its metadata collections — free (feature
`library.connectors.refresh.v1`; refresh takes a SOURCE, unlike
inspect/sync which take `[connector-id] <uri>`). Because the skill teaches
the new flags/subcommands, the floor was raised to 0.3.15 (same
merge-after-CDN gate). 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
concerns, not video operations.
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.14` always runs tinycloud 0.3.14. It also adds two
`npx @cloudglue/tinycloud@0.3.15` always runs tinycloud 0.3.15. It also adds two
wrapper commands:

```bash
tinycloud install --version 0.3.14 # pre-download a version
tinycloud install --version 0.3.15 # 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.14",
"version": "0.3.15",
"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
15 changes: 14 additions & 1 deletion skills/tinycloud/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ tinycloud caption ./demo.mp4 --format srt --transcript -o ./tinycloud-output/cap
# Find things: local keyword search vs cloud semantic search vs Q&A
tinycloud search "pricing" --in ./demo.mp4 --json
tinycloud probe "product demo moments" --in collection:col_123 --scope segment --limit 5 --json
tinycloud probe "renewal call" --in collection:col_123 --scope file \
--filter "source_metadata.parties.email~=%@acme.com" --json # filter by stored fields (0.3.15+)
tinycloud ask "What objections came up?" --in ./demo.mp4 --json

# Local editing (free, ffmpeg-backed)
Expand All @@ -110,16 +112,23 @@ tinycloud jobs wait <job-id> --timeout 120s --json
# Collections (0.3.4+) — turn videos into a reusable, queryable knowledge base.
# Lifecycle (every --type): create → add → poll show → query → delete.
tinycloud library collections list --json
tinycloud library collections create my-desc --type media-descriptions --json # types: media-descriptions | face-analysis | entities (--prompt) | rich-transcripts
tinycloud library collections create my-desc --type media-descriptions --json # types: media-descriptions | face-analysis | entities (--prompt) | rich-transcripts | metadata (0.3.15+)
tinycloud library collections add ./demo.mp4 --to col_desc --json # uploads a local source first; enrichment is async (pending)
tinycloud library collections show col_desc --json # poll files[].status until completed, then query —
# the collection's --type decides the read verb (each line below is a DIFFERENT, matching-type collection):
tinycloud ask "what's discussed?" --in collection:col_desc --json # media-descriptions → ask / probe / search
tinycloud face search ./person.jpg --in collection:col_faces --json # face-analysis → face list / face search
tinycloud library collections entities col_ents ./demo.mp4 --json # entities → collections entities
tinycloud probe "kickoff" --in collection:col_meta --scope file --json # metadata (free, no processing) → probe --scope file / ask
tinycloud library collections remove cloudglue://files/<id> --from col_desc --json
tinycloud library collections delete col_desc --json

# Metadata collections (0.3.15+) — index connector source_metadata + user
# metadata into file-level search docs WITHOUT processing media (free):
tinycloud library collections create meetings --type metadata --json
tinycloud library collections add zoom://uuid/<uuid> --to col_meta --metadata '{"deal":"acme"}' --json
tinycloud library connectors refresh cloudglue://files/<id> --json # re-fetch stale source_metadata, re-index (free)

# Publish an HTML artifact to Cloudglue Sites (manage with list / unpublish)
tinycloud publish ./tinycloud-output/html/report.html --name report --visibility private --json
tinycloud publish list --json
Expand Down Expand Up @@ -186,6 +195,10 @@ Authoring your own recipes: [reference/workflow-authoring.md](reference/workflow
added to collections. Local `search` can match cached `see` results.
- Do not pass `--background` to `ask`; background jobs exist only for tracked
async ops (`watch`, `see`, `extract`).
- `probe --filter` works only with a collection scope (`--in
collection:col_…`), and a `metadata` collection is file-level — probe it
with `--scope file` (segment scope errors). `source_metadata.*` filters are
file-level facts too, so pair them with `--scope file`.
- `workflow status` / `workflow resume` are not implemented in 0.3.x; treat
`paused`/`partial` as terminal and surface `resume` metadata to the user.
- `--no-upload` / `--no-download` make commands refuse cloud upload / local
Expand Down
27 changes: 22 additions & 5 deletions skills/tinycloud/reference/glossary.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,36 @@ connector?" or an envelope field needs explaining.
sales calls". Verbs scope to one with `--in collection:col_…`. Collection
ids are stable; display names are not. A collection has a type that decides
which verb reads it: `media-descriptions` (default) backs `ask`/`probe`/`search`,
`face-analysis` backs `face list`/`face search`, and `entities` (created with
`--prompt`/`--schema`) backs `library collections entities` (`rich-transcripts`
`face-analysis` backs `face list`/`face search`, `entities` (created with
`--prompt`/`--schema`) backs `library collections entities`, and `metadata`
(0.3.15+) backs `probe --scope file`/`ask` (`rich-transcripts`
also exists). Manage them with `library collections create|add|remove|delete`
(0.3.4+); every type follows `create → add → poll show → query → delete`. `add`
enriches each file asynchronously and returns `pending` — poll
`library collections show <col>` until every `files[].status` is `completed`
before querying.
- **Metadata collection (0.3.15+)** — a `--type metadata` collection that
indexes connector `source_metadata` plus user metadata (`collections add
--metadata '<json>'`) into file-level search documents WITHOUT downloading
or processing the media — free to index, no processing configs. Query with
`probe --scope file` (optionally `--filter` on `source_metadata.*` /
`metadata.*` paths) or `ask`; feature id `library.collections.metadata.v1`.
- **Source metadata** — the provider-supplied fields a connector attaches to
a synced file (`source_metadata`: title, participants, dates, tags, AI
summary; Iconik adds `iconik_metadata.<Field>` custom fields). Peek it
without creating a file (`connectors inspect`), re-fetch it for an existing
file (`connectors refresh`, 0.3.15+ — also re-indexes metadata
collections), and filter searches on it (`probe --filter
"source_metadata.…"`, 0.3.15+).
- **Data connector** — a linked external source of recordings (Zoom, Grain,
Gong, Recall, Google Drive, Dropbox, S3/GCS). `tinycloud library connectors …`
Gong, Recall, Google Drive, Dropbox, Iconik (0.3.15+), S3/GCS).
`tinycloud library connectors …`
lists, browses (`files`, with provider-specific filters; rows carry provider
metadata on 0.3.11+), peeks one item's provider metadata without syncing
(`inspect`, 0.3.11+), and syncs individual items by URI
(e.g. `grain://recording/<id>`) so they become Cloudglue files.
(`inspect`, 0.3.11+), re-fetches an existing file's stored metadata
(`refresh`, 0.3.15+), and syncs individual items by URI
(e.g. `grain://recording/<id>`, `iconik://asset/<id>`) so they become
Cloudglue files.
- **Source** — anything a verb accepts as input: a local path, URL,
`cloudglue://files/<id>` URI, connector URI, collection, or a bare file-id
UUID (normalized to `cloudglue://files/<id>`; an existing local path of the
Expand Down
Loading
Loading