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.10"
"version": "0.3.11"
},
"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.10",
"version": "0.3.11",
"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.10",
"version": "0.3.11",
"author": { "name": "Cloudglue", "url": "https://cloudglue.dev" },
"homepage": "https://tinycloud.sh",
"repository": "https://github.com/cloudglue/tinycloud",
Expand Down
24 changes: 15 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.10 bash scripts/smoke-test.sh
TINYCLOUD_CMD=/path/to/tinycloud EXPECTED_VERSION=0.3.11 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.10 --port 8787
node test/fixtures/make-fixture-cdn.mjs --tarball <path>.tar.gz --version 0.3.11 --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.10 --from-cdn # build manifest + .sha256 sidecars
node scripts/generate-manifest.mjs --check --version 0.3.10 # verify live CDN matches manifest
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

# 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.10 there are 16 verbs: `see`
of 0.3.11 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 All @@ -117,7 +117,13 @@ touches stdout/envelopes/logs). Unlike the host-level `profile` verb, `login`
IS a normal command **present in `commands --json`** (cost class `network`,
`requires_auth: false`) — it is excluded only from the LLM agent's tool set
(it blocks on a ~10-min interactive flow). Paste-key + `$CLOUDGLUE_API_KEY`
remain fully supported. The
remain fully supported. 0.3.11 bumps the bundled Cloudglue SDK to 0.7.19
(connector source metadata for all six metadata-bearing providers — Grain,
Zoom, Recall, Google Drive, Dropbox, Gong) and adds `library connectors
inspect <uri>` (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
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 @@ -170,9 +176,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.10 (latest aliases + v-prefixed pinned tarballs
for 0.3.0 through 0.3.10, with `manifest.json` + `.sha256`
sidecars; `channels.stable` = 0.3.10); all smoke legs are required.
- The live CDN serves 0.3.11 (latest aliases + v-prefixed pinned tarballs
for 0.3.0 through 0.3.11, with `manifest.json` + `.sha256`
sidecars; `channels.stable` = 0.3.11); 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.10` always runs tinycloud 0.3.10. It also adds two
`npx @cloudglue/tinycloud@0.3.11` always runs tinycloud 0.3.11. It also adds two
wrapper commands:

```bash
tinycloud install --version 0.3.10 # pre-download a version
tinycloud install --version 0.3.11 # 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.10",
"version": "0.3.11",
"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
9 changes: 5 additions & 4 deletions skills/tinycloud/reference/glossary.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,11 @@ connector?" or an envelope field needs explaining.
`library collections show <col>` until every `files[].status` is `completed`
before querying.
- **Data connector** — a linked external source of recordings (Zoom, Grain,
Google Drive, Dropbox, Loom, S3/GCS). `tinycloud library connectors …`
lists, browses (`files`, with provider-specific filters), and syncs
individual items by URI (e.g. `grain://recording/<id>`) so they become
Cloudglue files.
Gong, Recall, Google Drive, Dropbox, 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.
- **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
24 changes: 20 additions & 4 deletions skills/tinycloud/reference/verbs.md
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@ tinycloud library collections delete <col_id> --json
tinycloud library collections entities <col_id> <source> [--limit <n>] [--offset <n>] --json # read a video's entities
tinycloud library connectors list --json
tinycloud library connectors files <connector-id> [--limit 25] [--page-token <t>] --json
tinycloud library connectors inspect [<connector-id>] <uri-or-share-link> --json # metadata peek, no file created (0.3.11+)
tinycloud library connectors sync [<connector-id>] <uri-share-link-or-public-url> --json
```

Expand Down Expand Up @@ -250,17 +251,32 @@ Dropbox file share links sync server-side via the connector's OAuth
(including login-gated links); `zoom.us/rec/share` links resolve best-effort
(Zoom mints a new token per copy — the recording-detail link is the reliable
form). Link warnings are advisory and surface in `data.warnings` rather than
blocking the sync. Non-connector public URLs (direct media URLs, TikTok,
blocking the sync. Synced files carry provider `source_metadata` (title,
participants, summary) for Grain, Zoom, Recall, Google Drive, Dropbox, and
Gong. Non-connector public URLs (direct media URLs, TikTok,
Loom, public Dropbox links without a connector) sync into a standalone
Cloudglue file via direct URL ingestion — same command, no connector needed.
YouTube URLs cannot sync; use `tinycloud grab` instead.

`connectors files` also takes provider-specific filters: `--from`/`--to`
(Zoom, Grain dates), `--folder-id` (Google Drive), `--path` (Dropbox),
`--bucket`/`--prefix` (S3/GCS), `--title-search`/`--team`/`--meeting-type`
(Grain). Collection IDs (`col_…`) are stable; collection names are
(dates — every provider except S3/GCS; Zoom and Gong default to the last
6 months), `--folder-id` (Google Drive), `--path` (Dropbox),
`--bucket`/`--prefix` (S3/GCS — bucket required), `--title-search` (Grain,
Zoom, Google Drive, Dropbox, Gong), `--team`/`--meeting-type` (Grain).
Filters a provider can't honor are ignored, and filtered pages can come back
short or even empty while more remain — keep paging until `next_page_token`
is null. On 0.3.11+ each row also carries provider `metadata` (participants,
host, duration, AI summary) when the source exposes it — use it to pick files
before syncing. Collection IDs (`col_…`) are stable; collection names are
display-only.

`connectors inspect <uri>` (0.3.11+, feature `library.connectors.inspect.v1`)
returns one item's provider `source_metadata` WITHOUT materializing a file —
same URI/share-link forms as sync, connector id optional. S3/GCS objects have
nothing richer to inspect. On older binaries it fails with an unknown-command
error — fall back to `connectors sync` (idempotent) and read
`source_metadata` from the sync envelope instead.

### jobs — async work

```bash
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.10",
"skill_version": "0.3.11",
"tinycloud": {
"min_version": "0.3.7",
"supported_range": ">=0.3.7 <0.4.0",
Expand Down
Loading