diff --git a/content/docs/cli.md b/content/docs/cli.md index 120a2ba..68f28ed 100644 --- a/content/docs/cli.md +++ b/content/docs/cli.md @@ -1,9 +1,21 @@ --- title: Overview -description: Use Sume CLI as an agent-first shell wrapper over the Sume Public API. +description: Use Sume CLI as an agent-first shell wrapper over the Sume Public API, MCP tools, and Sume skill packs. --- -Sume CLI is a thin wrapper over the Sume Public API. It works for humans in a terminal and for agents through normal shell commands. +Sume CLI is the local command-line interface for Sume. It is built for humans, +automation scripts, and agents that need a structured way to call Sume without +using internal services. + +The CLI is intentionally thin: + +- It calls Sume Public API v1. +- It uses the API-key workspace resolved by Sume. +- It supports human output and stable `--json` output. +- It can start a local MCP stdio server from the same binary. +- It can install Sume agent skill packs into local projects. +- It does not connect to Sume databases, Railway services, provider APIs, or + internal routes. Default API base: @@ -11,29 +23,25 @@ Default API base: https://www.sume.so/api/v1 ``` -## Why use the CLI +## What the CLI is for -- Human output is concise. -- `--json` returns structured output for automation. -- Commands map to public API endpoints. -- It does not connect to Sume databases, queues, provider APIs, deployment services, or internal routes. -- It can download safe public media URLs returned by Sume without exposing raw provider details. +Use the CLI when you want to: -## Install +- check account, workspace, and credit state; +- list jobs and fetch job results; +- search Asset Library scenes; +- create image, video, Paid Ads, Face Swap, or Reference Analysis jobs; +- upload videos into Asset Library or Face Swap flows; +- expose Sume tools to MCP clients; +- install Sume skill guidance into coding-agent projects. -macOS and Linux: +## Quick install ```bash curl https://cli.sume.so/install -fsS | bash ``` -Windows PowerShell: - -```powershell -irm https://cli.sume.so/install.ps1 | iex -``` - -Then authenticate: +Then authenticate and verify: ```bash sume login @@ -41,20 +49,31 @@ sume me sume credits ``` -## Common read-only commands +Remote, SSH, Hermes, Modal, and other headless terminals should use the device +flow instead: ```bash +sume login --no-browser --timeout 600 +``` + +See [Authentication](/cli/authentication) for the full remote-agent pattern. + +## Common read-only workflow + +```bash +sume --version sume auth status sume me --json sume credits --json sume jobs list --limit 5 --json -sume assets search "product demo hook" --limit 5 --json -sume assets get --json +sume assets search "product demo hook" --source-type generated --limit 5 --json ``` -## Common create commands +Read-only commands are safe starting points for agents. They still may return +media metadata or public media URLs, so redact full URLs and private identifiers +when copying results into chat or logs. -Generation commands may spend credits. Confirm user intent before running them from an agent. +## Common generation workflow ```bash sume images generate \ @@ -67,16 +86,41 @@ sume videos generate \ --duration 4 \ --resolution 480p \ --json - -sume reference-analysis create \ - --url "https://www.tiktok.com/@brand/video/1234567890" \ - --locale ko \ - --json ``` +Generation commands can spend credits or create provider work. Agents should +confirm user intent before running them. + +## CLI docs + +| Page | Use it for | +|---|---| +| [Install and update](/cli/install-login) | Installer, version checks, binary updates, and release behavior. | +| [Authentication](/cli/authentication) | Browser login, remote/headless login, API keys, and logout. | +| [Configuration](/cli/configuration) | Config files, environment variables, update settings, and API base overrides. | +| [Command reference](/cli/commands) | Top-level commands and safe command examples. | +| [Jobs and assets](/cli/jobs-assets) | Async job polling, result download, Asset Library search, uploads, and finalize. | +| [Generation workflows](/cli/generation-workflows) | Image, video, Paid Ads, Face Swap, and Reference Analysis workflows. | +| [MCP server](/cli/mcp) | `sume mcp`, toolsets, write/paid gates, and MCP-only helpers. | +| [Agent skills](/cli/agent-skills) | `sume init`, `sume skills`, skill packs, and agent guidance. | +| [Troubleshooting](/cli/troubleshooting) | Missing keys, remote login, downloads, updates, jobs, and MCP startup. | +| [Security](/cli/security) | Secrets, signed URLs, paid calls, and automation safety rules. | + +## Public API relationship + +CLI commands map to the [Public API](/public-api). Use the CLI for shell and +agent workflows. Use the Public API directly for server integrations that need +their own HTTP client, retry policy, or deployment environment. + +For exact API shapes, see: + +- [API reference](/api/reference) +- [API cookbook](/api/cookbook) +- [`/api/openapi.json`](/api/openapi.json) + ## Agent mode -Use `--json` whenever another program will parse output. +Use `--json` whenever another program will parse output: ```bash sume tools list --json @@ -84,20 +128,18 @@ sume tools schema assets.search --json sume assets search "woman looking at camera hook" --source-type generated --limit 5 --json ``` -Agents should summarize output and redact full URLs, request ids, user emails, workspace ids, API key ids, and large raw payloads. +Agents should summarize output and redact: -## Local configuration +- API keys; +- login URLs and temporary user codes; +- signed upload URLs; +- storage object keys; +- full private or signed media URLs; +- user, workspace, and API key ids unless strictly needed for debugging. -Environment variables override local config: +## Release note -```bash -export SUME_API_KEY="sume_live_..." -export SUME_API_BASE_URL="https://www.sume.so/api/v1" -``` - -Manual setup: - -```bash -sume setup --api-key "$SUME_API_KEY" -sume setup --base-url "https://www.sume.so/api/v1" -``` +These docs describe the current `SumeLabs/sume-cli` release line around +`v0.1.11` and the merged source on `main`. If a command appears in source but +your installed binary does not recognize it, run `sume update --check` and see +[Install and update](/cli/install-login). diff --git a/content/docs/cli/agent-skills.md b/content/docs/cli/agent-skills.md new file mode 100644 index 0000000..4b6877d --- /dev/null +++ b/content/docs/cli/agent-skills.md @@ -0,0 +1,130 @@ +--- +title: Agent skills +description: Install Sume skill packs and project instructions for Claude, Cursor, AGENTS.md, and other agent workflows. +--- + +Sume CLI ships agent guidance in two forms: + +- `sume init` installs the default project instructions. +- `sume skills` installs focused Sume skill packs from the public registry. + +Both are designed to route agents toward CLI/MCP schemas instead of copying +large static API schemas into prompts. + +## Install default project instructions + +```bash +sume init +sume init --target all +sume init --target claude,cursor,agents-md +sume init --force +``` + +Targets: + +| Target | Output | +|---|---| +| `claude` | `.agents/skills/sume/SKILL.md` when `.agents/` exists, otherwise `.claude/skills/sume/SKILL.md`. | +| `cursor` | `.cursor/rules/sume.mdc`. | +| `agents-md` | Managed `` block in `AGENTS.md`. | +| `all` | All supported targets. | + +In a blank project, create an agent root first: + +```bash +mkdir -p .agents +sume init --target claude +``` + +## Skill registry + +List available skills: + +```bash +sume skills list +sume skills list generation +``` + +Install a skill: + +```bash +sume skills install sume +sume skills install sume-assets +``` + +Update installed skills: + +```bash +sume skills update +sume skills update sume-generation +``` + +Remove a skill: + +```bash +sume skills remove sume +``` + +The default registry is: + +```text +https://cli.sume.so/skills/registry +``` + +The CLI verifies registry file checksums before writing installed skill files. + +## Available Sume skill packs + +| Skill | Use for | +|---|---| +| `sume` | Top-level setup, auth, safety, update, and workflow routing. | +| `sume-assets` | Asset Library search, uploads, downloads, and scene clip semantics. | +| `sume-brand` | Brand DNA read/analyze workflows and reference image handling. | +| `sume-generation` | Image/video generation, async jobs, polling, results, and downloads. | +| `sume-ads` | Paid Ads video, avatars, Face Swap, and source-video boundaries. | +| `sume-reference-analysis` | Public Reel/TikTok reference analysis and result summaries. | +| `sume-tools` | MCP setup, schema discovery, skill refresh, and tool routing. | + +## What skills should tell agents + +Sume skills should instruct agents to: + +- start read-only with `sume --version`, `sume me --json`, and `sume credits --json`; +- use `sume login --no-browser --timeout 600` in remote/headless terminals; +- inspect `sume tools list --json` and `sume tools schema --json`; +- ask before running paid/provider generation; +- avoid printing secrets, signed URLs, full private media URLs, provider + payloads, user ids, workspace ids, and raw emails; +- prefer CLI/MCP schemas as the source of truth for exact parameters. + +## Hermes, Modal, and remote terminals + +When an agent is running in a remote terminal, it should not run plain +`sume login` and assume a local browser exists. Use: + +```bash +sume login --no-browser --timeout 600 +``` + +For agent-controlled terminals, use the background login pattern from +[Authentication](/cli/authentication), show the URL/code only to the requesting +user, then verify with: + +```bash +sume auth status --json +sume me --json +``` + +Do not ask the user to paste API keys into chat unless the user explicitly +chooses that credential path. + +## Registry overrides + +Use overrides only for local registry testing: + +```bash +export SUME_SKILLS_URL="https://cli.sume.so/skills/registry" +export SUME_SKILLS_API_URL="https://cli.sume.so/skills" +``` + +Production users should use the defaults. diff --git a/content/docs/cli/agent-usage.md b/content/docs/cli/agent-usage.md index 64a704e..23b4ff6 100644 --- a/content/docs/cli/agent-usage.md +++ b/content/docs/cli/agent-usage.md @@ -3,18 +3,44 @@ title: Agent usage description: Use Sume CLI safely from coding agents and automation scripts. --- -Agents should use Sume CLI through explicit shell commands and parse `--json` output. +This page is kept for existing links. For current agent guidance, use: + +- [Authentication](/cli/authentication) +- [MCP server](/cli/mcp) +- [Agent skills](/cli/agent-skills) +- [Security](/cli/security) + +Agents should use Sume CLI through explicit shell commands and parse `--json` +output. ## JSON-first workflow ```bash +sume --version +sume auth status sume me --json sume credits --json sume jobs list --limit 5 --json sume assets search "product demo hook" --source-type generated --limit 5 --json -sume images generate --prompt "clean product photo" --wait --json ``` +Generation commands such as `images generate`, `videos generate`, `ads videos +create`, `face-swap create`, and `reference-analysis create` can spend credits. +Agents should ask for explicit user approval before running them. + +## Remote login + +In Hermes, Modal, SSH, Telegram-mediated terminals, or other remote/headless +contexts, use: + +```bash +sume login --no-browser --timeout 600 +``` + +Do not ask the user to paste API keys into chat unless the user explicitly +chooses that credential path. Treat login URLs/codes as temporary sensitive auth +material. + ## Install project instructions ```bash @@ -28,7 +54,9 @@ sume init --target claude,cursor,agents-md ## Safety rules - Do not echo API keys. +- Do not echo login URLs, user codes, signed upload URLs, or storage object keys. - Do not paste private URLs or signed query strings into prompts. - Use read-only commands before generation commands. - Treat generation as a credit-spending action. - Prefer fetching one asset by id after search rather than dumping large result sets. +- Inspect `sume tools list --json` and `sume tools schema --json` before constructing unfamiliar commands. diff --git a/content/docs/cli/authentication.md b/content/docs/cli/authentication.md new file mode 100644 index 0000000..86ffa47 --- /dev/null +++ b/content/docs/cli/authentication.md @@ -0,0 +1,140 @@ +--- +title: Authentication +description: Authenticate Sume CLI with browser login, remote device login, or API keys. +--- + +Sume CLI needs a Sume API key before it can call the Public API. Use browser +login for local terminals, device login for remote/headless terminals, and +environment variables for CI. + +## Check auth state + +Start every agent workflow with: + +```bash +sume --version +sume auth status +sume me --json +``` + +If no key is configured, the CLI returns a missing-key error with a hint for +local, remote/headless, and environment-variable setup. + +## Browser login + +For a normal local terminal: + +```bash +sume login +``` + +The CLI starts a device authorization request, opens a browser approval page +when possible, waits for approval, then stores a scoped API key in the local +Sume config file. + +Do not copy the printed login URL or code into shared logs. Treat them as +temporary sensitive auth material. + +## Remote and headless login + +Use this in SSH sessions, remote containers, Modal sandboxes, Hermes terminals, +Telegram-mediated terminals, or any environment where a browser cannot open +locally: + +```bash +sume login --no-browser --timeout 600 +``` + +Aliases: + +```bash +sume login --device --timeout 600 +sume login --device-auth --timeout 600 +``` + +The CLI prints a URL/code and polls until the user approves in a local browser. +After approval, verify: + +```bash +sume auth status --json +sume me --json +``` + +## Agent-safe remote login pattern + +In an agent-controlled remote terminal, avoid blocking the terminal for ten +minutes with a foreground login command. Start the waiter in the background, +show the URL/code only to the requesting user, then wait after the user +approves: + +```bash +login_log="$(mktemp -t sume-login.XXXXXX.log)" +(sume login --device --timeout 600 >"$login_log" 2>&1; echo $? >"$login_log.status") & +login_pid=$! + +sleep 4 +sed -n '1,80p' "$login_log" + +# After the user approves locally: +wait "$login_pid" +sume auth status --json +sume me --json +rm -f "$login_log" "$login_log.status" +``` + +Do not paste API keys into agent chat unless the user explicitly chooses that +credential path. Prefer the device login flow or a secret manager. + +## API keys and CI + +Environment variables override local config: + +```bash +export SUME_API_KEY="" +export SUME_API_BASE_URL="https://www.sume.so/api/v1" +``` + +Use `SUME_API_KEY` for CI, scheduled jobs, and non-interactive scripts. Avoid +checking keys into repository files. + +Manual local setup is also available: + +```bash +sume setup --api-key "$SUME_API_KEY" +sume setup --base-url "https://www.sume.so/api/v1" +``` + +## Logout + +Remove the locally stored API key: + +```bash +sume logout +``` + +If a sandbox image or Modal snapshot has captured a config file, run `sume +logout` before snapshotting or use an isolated `SUME_CONFIG_DIR` for throwaway +auth. + +## What is stored + +The CLI stores local config under `~/.sume/config.json` by default. The API key +is encrypted with a machine-derived key when saved by `sume login` or `sume +setup`, and the file is written with owner-only permissions on platforms that +support them. + +Set a separate config directory for disposable environments: + +```bash +export SUME_CONFIG_DIR="$(mktemp -d)" +``` + +## Common failures + +| Symptom | Fix | +|---|---| +| `No Sume API key found` | Run `sume login`, run `sume login --no-browser --timeout 600`, or set `SUME_API_KEY`. | +| Browser did not open | Re-run with `--no-browser`, `--device`, or `--device-auth`. | +| Login timed out | Re-run with a fresh URL/code. Device codes expire. | +| Wrong account/workspace | Run `sume logout`, then authenticate again. | +| CI hangs at login | Do not use interactive login in CI; set `SUME_API_KEY`. | diff --git a/content/docs/cli/commands.md b/content/docs/cli/commands.md index bd7fb43..a48f308 100644 --- a/content/docs/cli/commands.md +++ b/content/docs/cli/commands.md @@ -1,10 +1,34 @@ --- -title: Commands -description: Sume CLI commands for auth, account context, jobs, assets, generation, Reference Analysis, tools, and agent setup. +title: Command reference +description: Sume CLI command groups, safety boundaries, and common examples. --- +Use this page as a map of command groups. Use `sume --help` and +`sume tools schema --json` for exact local arguments. + Use `--json` on any command whose output will be parsed by an agent or script. +## Command groups + +| Command | Purpose | Safety | +|---|---|---| +| `setup` | Save local API base/key/update configuration. | Writes local config. | +| `login` / `logout` / `auth status` | Authenticate or inspect auth. | Writes/removes local config for login/logout. | +| `me` / `credits` | Read account, workspace, plan, credits, and concurrency. | Read-only. | +| `brand` | Read or analyze Brand DNA profiles. | `brand analyze` mutates workspace Brand state. | +| `avatars` | List and inspect avatars. | Read-only, returns media metadata. | +| `jobs` | List jobs, inspect status, fetch/download results. | Read-only except local downloads. | +| `assets` | Search/get Asset Library scenes; finalize uploads. | Search/get read; finalize starts processing. | +| `uploads` | Create temporary upload URLs. | Mutating; returns sensitive signed upload URL. | +| `images` / `videos` | Create generation jobs. | Paid/provider mutation. | +| `ads` | Create Paid Ads video jobs. | Paid/provider mutation. | +| `face-swap` | Create Face Swap jobs from uploaded source video. | Paid/provider mutation. | +| `reference-analysis` | Analyze public TikTok/Instagram Reel URLs. | Paid/provider mutation. | +| `mcp` | Start local MCP stdio server. | Default read-only; write/paid toolsets require flags. | +| `tools` | Inspect CLI and MCP tool schemas. | Read-only local discovery. | +| `skills` / `init` | Install Sume agent skill instructions. | Writes local project files. | +| `version` / `update` | Inspect and update the binary. | `update` writes the local binary. | + ## Auth and setup ```bash @@ -14,9 +38,17 @@ sume auth status sume logout sume setup --api-key "$SUME_API_KEY" sume setup --base-url "https://www.sume.so/api/v1" +sume setup --no-auto-update +``` + +Remote/headless terminals should use: + +```bash +sume login --no-browser --timeout 600 +sume login --device --timeout 600 ``` -`sume login` opens a Sume approval page and stores a scoped local API key. On CI, prefer `SUME_API_KEY`. +On CI, prefer `SUME_API_KEY`. ## Account and credits @@ -29,6 +61,22 @@ sume credits --json Use these before generation to confirm the CLI is pointed at the expected account/workspace and has available credits. +## Brand and avatars + +```bash +sume brand current --json +sume brand list --limit 5 --domain example.com --json +sume brand get example.com --detail full --json +sume brand analyze https://example.com --json + +sume avatars list --limit 5 --json +sume avatars list --locale en --limit 5 --json +sume avatars get --json +``` + +`brand analyze` starts or refreshes workspace Brand DNA analysis for a public +website URL. `avatars` is read-only. + ## Jobs ```bash @@ -50,7 +98,9 @@ Options: | `--status ` | Filter jobs by status. | | `--download [path]` | On `jobs result`, download safe public media URLs from the result. | -## Assets +See [Jobs and assets](/cli/jobs-assets) for the full workflow. + +## Assets and uploads ```bash sume assets list --limit 5 --json @@ -59,6 +109,9 @@ sume assets search "mask application" --source-type generated --limit 5 --json sume assets search "camera hook" --brand ASARAI --tag "application demo" --max-duration 15 --sort relevance --json sume assets get --json sume assets get --download ./assets/ + +sume uploads presign --purpose asset_library_video --file-name source.mp4 --content-type video/mp4 --size-bytes 12000000 --json +sume assets finalize --object-key --file-name source.mp4 --content-type video/mp4 --size-bytes 12000000 ``` Search options: @@ -81,25 +134,42 @@ Search options: | `--sort ` | `relevance`, `created_at_desc`, `created_at_asc`, or `duration_desc`. | | `--download [path]` | On `assets get`, download safe public media URLs. | -## Images +`uploads presign` returns a temporary signed upload URL. Treat it as sensitive +and do not send the Sume API `Authorization` header to storage. + +## Images and videos ```bash sume images generate --prompt "Clean product photo of a white ceramic mug" sume images generate --prompt "Clean product photo" --aspect-ratio 1:1 --n 1 --wait --json sume images generate --prompt "Clean product photo" --wait --download ./outputs/ + +sume videos generate --prompt "Four-second product video of a white ceramic mug" +sume videos generate --prompt "Short product video" --duration 4 --resolution 480p --wait --json +sume videos generate --prompt "Short product video" --generate-audio --wait ``` -Options include `--prompt`, `--aspect-ratio`, `--n`, `--model`, `--resolution`, `--quality`, `--wait`, `--timeout`, and `--download`. +Generation commands may spend credits. Confirm explicit user intent before +running them from an agent. + +Key options: -## Videos +| Command | Key options | +|---|---| +| `images generate` | `--prompt`, `--aspect-ratio`, `--n`, `--resolution`, `--quality`, `--reference-image-url`, `--wait`, `--timeout`, `--download` | +| `videos generate` | `--prompt`, `--aspect-ratio`, `--duration`, `--resolution`, `--generate-audio`, `--wait`, `--timeout`, `--download` | + +## Paid Ads and Face Swap ```bash -sume videos generate --prompt "Four-second product video of a white ceramic mug" -sume videos generate --prompt "Short product video" --duration 4 --resolution 480p --wait --json -sume videos generate --prompt "Short product video" --generate-audio --wait +sume ads videos create --script "Introduce the product in one sentence" --ad-format talking_heads --avatar-slug --json +sume ads videos create --script "UGC hook and product demo" --ad-format ugc_ads --avatar-id --reference-image-url "https://media.sume.so/example.jpg" --wait + +sume uploads presign --purpose face_swap_source_video --file-name source.mp4 --content-type video/mp4 --size-bytes 12000000 --json +sume face-swap create --source-video-url "https://media.sume.so/example-source.mp4" --avatar-id --duration 6 --wait ``` -Options include `--prompt`, `--aspect-ratio`, `--duration`, `--resolution`, `--generate-audio`, `--model`, `--wait`, `--timeout`, and `--download`. +Both command groups create async jobs. Read status and results through `jobs`. ## Reference Analysis @@ -115,7 +185,7 @@ sume jobs get --json sume jobs result --json ``` -## Tool schemas +## Tools and MCP ```bash sume tools list --json @@ -125,17 +195,25 @@ sume tools schema jobs.list --json sume tools schema assets.search --json sume tools schema images.generate --json sume tools schema videos.generate --json +sume tools schema jobs.wait --json +sume mcp +sume mcp --toolsets generation --allow-paid ``` -Tool schemas are local descriptions of the public API operations the CLI wraps. Agents should inspect schemas before constructing create commands. +Tool schemas are local descriptions of CLI and MCP operations. Agents should +inspect schemas before constructing create commands. -## Init agent instructions +## Skills and init ```bash sume init sume init --target all sume init --target claude,cursor,agents-md sume init --force + +sume skills list +sume skills install sume +sume skills update ``` Targets: @@ -146,3 +224,11 @@ Targets: | `cursor` | `.cursor/rules/sume.mdc`. | | `agents-md` | A managed `` block in `AGENTS.md`. | | `all` | All supported targets. | + +If a blank project does not have `.agents/` or `.claude/`, create one before +installing Claude-style skills: + +```bash +mkdir -p .agents +sume skills install sume +``` diff --git a/content/docs/cli/configuration.md b/content/docs/cli/configuration.md new file mode 100644 index 0000000..2d2b16b --- /dev/null +++ b/content/docs/cli/configuration.md @@ -0,0 +1,107 @@ +--- +title: Configuration +description: Configure Sume CLI API keys, base URLs, update behavior, and JSON output. +--- + +Sume CLI reads configuration from environment variables first, then from the +local config file. + +## Configuration precedence + +1. Environment variables. +2. Local config in `SUME_CONFIG_DIR` or `~/.sume/config.json`. +3. Built-in defaults. + +The default Public API base is: + +```text +https://www.sume.so/api/v1 +``` + +## Environment variables + +| Variable | Use | +|---|---| +| `SUME_API_KEY` | API key for Public API calls. Preferred for CI and secret managers. | +| `SUME_API_BASE_URL` | Optional API base URL override. Defaults to `https://www.sume.so/api/v1`. | +| `SUME_CONFIG_DIR` | Optional directory for local CLI config. Useful for sandboxes and tests. | +| `SUME_NO_UPDATE` | Set to `1` to disable background binary update checks. | +| `SUME_SKILLS_URL` | Optional skills registry override. Defaults to `https://cli.sume.so/skills/registry`. | +| `SUME_SKILLS_API_URL` | Optional skills search API override. Defaults to `https://cli.sume.so/skills`. | + +Example: + +```bash +export SUME_API_KEY="" +export SUME_API_BASE_URL="https://www.sume.so/api/v1" +sume me --json +``` + +## Local setup + +Store local defaults: + +```bash +sume setup --api-key "$SUME_API_KEY" +sume setup --base-url "https://www.sume.so/api/v1" +``` + +Configure update behavior: + +```bash +sume setup --auto-update +sume setup --no-auto-update +``` + +Inspect auth and context: + +```bash +sume auth status +sume me --json +sume credits --json +``` + +## JSON output + +Use the global `--json` flag whenever another process will parse the result: + +```bash +sume me --json +sume jobs list --limit 5 --json +sume tools schema assets.search --json +``` + +JSON errors are also structured when `--json` is present. Agents should prefer +JSON for command execution and keep human output for local debugging. + +## API base overrides + +Most users should keep the default production Public API base. Override +`SUME_API_BASE_URL` only when you are intentionally testing another public API +environment: + +```bash +SUME_API_BASE_URL="https://www.sume.so/api/v1" sume me --json +``` + +Do not point the CLI at internal app, database, Railway, or provider URLs. The +CLI is a Public API client. + +## Disposable sandboxes + +For Modal, CI, or temporary agent sandboxes: + +```bash +export SUME_CONFIG_DIR="$(mktemp -d)" +sume login --no-browser --timeout 600 +sume me --json +``` + +Clean up when finished: + +```bash +sume logout +rm -rf "$SUME_CONFIG_DIR" +``` + +Do not bake personal API keys into reusable sandbox snapshots. diff --git a/content/docs/cli/generation-workflows.md b/content/docs/cli/generation-workflows.md new file mode 100644 index 0000000..10a56ba --- /dev/null +++ b/content/docs/cli/generation-workflows.md @@ -0,0 +1,210 @@ +--- +title: Generation workflows +description: Create image, video, Paid Ads, Face Swap, and Reference Analysis jobs from the Sume CLI. +--- + +Generation and analysis commands create async jobs through the Sume Public API. +They can spend credits or create provider work. Agents should confirm explicit +user intent before running them. + +Start with: + +```bash +sume me --json +sume credits --json +``` + +## Image generation + +Create a job: + +```bash +sume images generate \ + --prompt "Clean product photo of a white ceramic mug" \ + --aspect-ratio 1:1 \ + --n 1 \ + --json +``` + +Wait and download: + +```bash +sume images generate \ + --prompt "Clean product photo on a white bathroom counter." \ + --wait \ + --download ./outputs/ \ + --json +``` + +Use Brand reference images returned by Sume: + +```bash +sume brand current --detail full --json +sume images generate \ + --prompt "Premium product ad using the brand reference" \ + --reference-image-url "https://media.sume.so/example-reference.jpg" \ + --wait \ + --json +``` + +Image options: + +| Option | Notes | +|---|---| +| `--prompt ` | Required. | +| `--aspect-ratio ` | `1:1`, `4:5`, or `9:16`. | +| `--n ` | Currently `1` reliable output per job. | +| `--resolution ` | Sume-supported image resolution. | +| `--quality ` | Sume-supported image quality. | +| `--reference-image-url ` | HTTPS image reference URL. Repeat for multiple references. | +| `--wait` / `--timeout ` | Poll until terminal. Default timeout: 600 seconds. | +| `--download [path]` | Wait and download safe public output URLs. | + +## Video generation + +```bash +sume videos generate \ + --prompt "Four-second product video of a white ceramic mug" \ + --duration 4 \ + --resolution 480p \ + --json +``` + +```bash +sume videos generate \ + --prompt "Short vertical product demo" \ + --duration 4 \ + --resolution 720p \ + --generate-audio \ + --wait \ + --json +``` + +Video duration is validated by the CLI: 4 to 15 seconds. + +Video options: + +| Option | Notes | +|---|---| +| `--prompt ` | Required. | +| `--aspect-ratio ` | For example `9:16`. | +| `--duration ` | 4 to 15 seconds. | +| `--resolution ` | `480p` or `720p`. | +| `--generate-audio` | Ask Sume to generate audio if supported. | +| `--wait` / `--timeout ` | Poll until terminal. Default timeout: 1800 seconds. | +| `--download [path]` | Wait and download safe public output URLs. | + +## Paid Ads video + +Use avatars from `sume avatars list`: + +```bash +sume avatars list --limit 5 --json +``` + +Create a talking-head style ad job: + +```bash +sume ads videos create \ + --script "Introduce the product in one sentence." \ + --ad-format talking_heads \ + --avatar-slug \ + --wait \ + --json +``` + +Create a UGC-style ad with references: + +```bash +sume ads videos create \ + --script "Hook, product benefit, and call to action." \ + --ad-format ugc_ads \ + --avatar-id \ + --reference-image-url "https://media.sume.so/example-reference.jpg" \ + --duration 8 \ + --resolution 720p \ + --json +``` + +Paid Ads jobs are async. Read results with `jobs`. + +## Face Swap + +Face Swap requires an uploaded Sume media URL with purpose +`face_swap_source_video`. + +1. Presign the upload: + +```bash +sume uploads presign \ + --purpose face_swap_source_video \ + --file-name source.mp4 \ + --content-type video/mp4 \ + --size-bytes 12000000 \ + --json +``` + +2. Upload bytes to the returned signed `upload_url` with only + `required_headers`. + +3. Create the Face Swap job: + +```bash +sume face-swap create \ + --source-video-url "https://media.sume.so/example-source.mp4" \ + --avatar-id \ + --duration 6 \ + --aspect-ratio 9:16 \ + --wait \ + --json +``` + +Face Swap can accept repeated `--avatar-id` values. The CLI waits on the +primary returned job when `--wait` is set. + +## Reference Analysis + +Reference Analysis accepts public TikTok or Instagram Reel URLs: + +```bash +sume reference-analysis create \ + --url "https://www.tiktok.com/@example/video/123" \ + --locale en \ + --json +``` + +Wait for the result: + +```bash +sume reference-analysis create \ + --url "https://www.instagram.com/reel/example/" \ + --locale en \ + --wait \ + --json +``` + +Reference Analysis jobs can take longer than image generation. If an agent +cannot wait safely, create the job, store the job id, and poll with `jobs`. + +## Recommended polling pattern + +For long-running jobs: + +```bash +sume jobs get --json +sume jobs result --json +``` + +For MCP clients, use `jobs.wait` when the host has exposed the default read +toolset. + +## Safety checklist + +Before running any create command from an agent: + +- confirm the user asked for generation or analysis; +- check `sume credits --json`; +- use placeholders in examples, not real private media URLs; +- prefer `--json` and summarize results; +- do not log full provider payloads or signed upload URLs; +- stop on clear API errors instead of retrying paid work blindly. diff --git a/content/docs/cli/install-login.md b/content/docs/cli/install-login.md index 57e2da0..f9ddd02 100644 --- a/content/docs/cli/install-login.md +++ b/content/docs/cli/install-login.md @@ -1,48 +1,106 @@ --- -title: Install and login -description: Install Sume CLI and authenticate with browser login or an API key. +title: Install and update +description: Install Sume CLI, verify the binary, and keep it current. --- -## Install +Sume CLI is distributed as release binaries from the `SumeLabs/sume-cli` +repository. The installer downloads the latest supported binary for your +platform and verifies it by running `sume --version`. -For Linux and macOS: +## macOS and Linux + +Install the latest release: ```bash curl https://cli.sume.so/install -fsS | bash ``` -For Windows PowerShell: +Install a specific release: + +```bash +SUME_VERSION=0.1.11 curl https://cli.sume.so/install -fsS | bash +``` + +After installation, verify: + +```bash +sume --version +sume version +``` + +## Windows PowerShell ```powershell irm https://cli.sume.so/install.ps1 | iex ``` -Then start with: +Then verify: + +```powershell +sume --version +``` + +## First run ```bash sume login sume me +sume credits +``` + +Use `sume login --no-browser --timeout 600` instead of plain `sume login` in +remote/headless terminals. See [Authentication](/cli/authentication). + +## Updates + +Check for an update without installing it: + +```bash +sume update --check ``` -## Browser login +Install an available update: ```bash -sume login +sume update ``` -The CLI opens a browser approval page. After approval, it stores a scoped Sume API key in `~/.sume/config.json` with owner-only file permissions. +Inspect the installed version and any known update: + +```bash +sume version +``` -For remote terminals: +Installed interactive binaries may also perform background update checks. Disable +background checks when you need deterministic automation: ```bash -sume login --no-browser +sume setup --no-auto-update +export SUME_NO_UPDATE=1 ``` -## Environment variables +Manual `sume update` still works when background checks are disabled. -Environment variables override local config and are preferred for CI. +## Package behavior + +The CLI uses a local configuration directory, defaulting to: + +```text +~/.sume/config.json +``` + +Set `SUME_CONFIG_DIR` when a sandbox or CI job should use an isolated config: ```bash -export SUME_API_KEY="sume_live_..." -export SUME_API_BASE_URL="https://www.sume.so/api/v1" +export SUME_CONFIG_DIR="$(mktemp -d)" +sume auth status ``` + +For CI and other non-interactive environments, prefer `SUME_API_KEY` over an +interactive login flow. + +## Related pages + +- [Authentication](/cli/authentication) +- [Configuration](/cli/configuration) +- [Troubleshooting](/cli/troubleshooting) diff --git a/content/docs/cli/jobs-assets.md b/content/docs/cli/jobs-assets.md new file mode 100644 index 0000000..550ba91 --- /dev/null +++ b/content/docs/cli/jobs-assets.md @@ -0,0 +1,167 @@ +--- +title: Jobs and assets +description: Work with async Sume jobs, result downloads, Asset Library search, uploads, and asset finalize. +--- + +Most Sume create operations return before processing is complete. Store the +returned job id, poll status, then fetch the result. + +```text +create command -> job id -> jobs get -> jobs result -> optional download +``` + +## List and inspect jobs + +```bash +sume jobs list --limit 5 --json +sume jobs list --status completed --limit 5 --json +sume jobs list --type video_generation --limit 5 --json +sume jobs get --json +``` + +Supported public job types: + +```text +audio_generation +face_swap +generation +image_generation +reference_analysis +video_generation +``` + +## Fetch results + +```bash +sume jobs result --json +sume jobs result --download ./outputs/ +``` + +`--download` downloads safe public media URLs returned by Sume into a local +directory. It does not make provider calls. Do not paste full media URLs or +private identifiers into reports. + +## Inline wait + +For short jobs, create and wait in one command: + +```bash +sume images generate \ + --prompt "Clean product photo on a white bathroom counter." \ + --wait \ + --download ./outputs/ \ + --json +``` + +For longer jobs, avoid holding an agent turn open indefinitely: + +```bash +sume videos generate \ + --prompt "Four-second vertical product demo." \ + --duration 4 \ + --resolution 480p \ + --json + +sume jobs get --json +sume jobs result --json +``` + +## Asset Library search + +Asset Library stores searchable scene-level assets scoped to the API-key +workspace. + +```bash +sume assets list --limit 5 --json +sume assets list --query "product demo" --limit 5 --json +sume assets search "good hook videos" --source-type generated --limit 5 --json +sume assets search "product demo" --brand ASARAI --tag "application demo" --max-duration 15 --sort relevance --json +``` + +Search first, then fetch one scene: + +```bash +sume assets get --query "good hook videos" --search-mode text --json +sume assets get --download ./assets/ +``` + +Preserve search context with `--query` and `--search-mode`. Include +`--search-score ` only when the search result score is non-null; do not +send `0` as a placeholder. + +## Asset search filters + +| Option | Use | +|---|---| +| `--limit ` / `--cursor ` | Page through results. | +| `--search-mode ` | Choose search mode. `assets search` defaults to text. | +| `--source-type ` | Filter by source video type, such as generated or upload. | +| `--segment-type ` | Filter by indexed scene segment type. | +| `--brand ` / `--product ` | Filter by indexed brand/product mentions. | +| `--tag ` / `--keyword ` | Filter by tags or keywords. | +| `--cta-present ` | Filter by CTA presence. | +| `--min-duration ` / `--max-duration ` | Filter by scene duration. | +| `--created-after ` / `--created-before ` | Filter by creation time. | +| `--sort ` | `relevance`, `created_at_desc`, `created_at_asc`, or `duration_desc`. | + +## Scene media fields + +Asset responses can distinguish scene media from source media: + +- `clip_url` is a scene-specific playable clip when materialized. +- `source_media_url` is the original source video. +- scene timestamps identify where the scene appears in the source. + +Prefer `clip_url` when present. If a scene clip is missing, only use the source +video plus timestamps in workflows that can trim safely. + +## Upload a video to Asset Library + +Create a temporary upload target: + +```bash +sume uploads presign \ + --purpose asset_library_video \ + --file-name source.mp4 \ + --content-type video/mp4 \ + --size-bytes 12000000 \ + --json +``` + +The response includes: + +- `upload_url`: temporary signed storage URL; treat as sensitive. +- `required_headers`: headers to send to storage. +- `object_key`: storage object key for finalize. +- `media_url`: Sume media URL when available. + +Upload file bytes to `upload_url` with only `required_headers`. Do not send the +Sume API `Authorization` header to the storage URL. + +Then finalize: + +```bash +sume assets finalize \ + --object-key \ + --file-name source.mp4 \ + --content-type video/mp4 \ + --size-bytes 12000000 +``` + +Finalizing starts Asset Library processing. Search or list assets after ingest +completes. + +## Face Swap upload purpose + +Face Swap source videos use a different upload purpose: + +```bash +sume uploads presign \ + --purpose face_swap_source_video \ + --file-name source.mp4 \ + --content-type video/mp4 \ + --size-bytes 12000000 \ + --json +``` + +Use the resulting Sume media URL with `sume face-swap create`. diff --git a/content/docs/cli/mcp.md b/content/docs/cli/mcp.md new file mode 100644 index 0000000..1a1bd52 --- /dev/null +++ b/content/docs/cli/mcp.md @@ -0,0 +1,159 @@ +--- +title: MCP server +description: Run the Sume MCP stdio server, choose toolsets, and understand write and paid gates. +--- + +`sume mcp` starts a local stdio MCP server from the same Sume CLI binary. It +uses the same auth/config as the CLI: `SUME_API_KEY`, `SUME_API_BASE_URL`, or a +key saved by `sume login`. + +## Start the default server + +```bash +sume mcp +``` + +Default MCP is read-only. It exposes account, brand read, avatar read, jobs, +assets, and schema tools. + +## Default read tools + +The default toolsets are: + +```text +account +brand +avatars +jobs +assets +schemas +``` + +Common default tools include: + +- `account.me` +- `credits.get` +- `brand.list`, `brand.current`, `brand.get` +- `avatars.list`, `avatars.get` +- `jobs.list`, `jobs.get`, `jobs.result`, `jobs.wait` +- `assets.search`, `assets.get` +- `tools.list`, `tools.schema` + +Use schema discovery before calling tools: + +```bash +sume tools list --json +sume tools schema assets.search --json +sume tools schema jobs.wait --json +``` + +## Toolsets + +Select toolsets explicitly: + +```bash +sume mcp --toolsets account,brand,avatars,jobs,assets,schemas +sume mcp --toolsets read +``` + +`read` expands to the default read toolsets. + +## Non-paid write tools + +Mutating non-paid tools are hidden unless the selected toolset is enabled with +`--allow-write`: + +```bash +sume mcp --toolsets brand --allow-write +sume mcp --toolsets uploads --allow-write +sume mcp --toolsets downloads --allow-write +``` + +These gates expose selected tools such as: + +- `brand.analyze` +- `uploads.asset_video` +- `jobs.download` + +`uploads.asset_video` reads exactly one supplied local video path, presigns, +uploads bytes internally, finalizes Asset Library upload, and returns a +sanitized summary. It does not return the signed upload URL, upload headers, or +storage object key. + +`jobs.download` downloads safe public media URLs from an existing job result to +an explicit local output directory. It returns local basenames/relative paths, +not remote URLs. + +## Paid/provider tools + +Paid/provider tools are hidden unless the selected toolset is enabled with +`--allow-paid`: + +```bash +sume mcp --toolsets generation --allow-paid +sume mcp --toolsets ads,face-swap --allow-paid +``` + +`generation` exposes: + +- `images.generate` +- `videos.generate` +- `reference-analysis.create` + +`ads,face-swap` exposes: + +- `ads.videos.create` +- `face-swap.create` + +Only expose paid toolsets inside MCP hosts that have a clear human approval +model. Do not enable paid tools just for read-only browsing or planning. + +## MCP client configuration + +Local stdio example: + +```json +{ + "mcpServers": { + "sume": { + "command": "sume", + "args": ["mcp"], + "env": { + "SUME_API_KEY": "" + } + } + } +} +``` + +Do not pass API keys as command-line arguments. Prefer environment variables or +local Sume config. + +## Schema metadata + +`sume tools list --json` and `sume tools schema --json` include safety +metadata: + +- read-only vs mutating; +- paid/provider call status; +- sensitive URL behavior; +- MCP executable status; +- MCP toolset; +- required `--allow-write` or `--allow-paid` gate. + +Agents should use this metadata to decide whether to ask for confirmation. + +## Result sanitization + +MCP outputs are designed for agent use. They should not expose: + +- API keys; +- raw signed upload URLs; +- upload headers; +- storage object keys; +- full private media URLs; +- raw provider internals; +- user/workspace ids or emails unless required by the public API response. + +Still treat all job, media, and account outputs as user data. Summarize instead +of pasting large raw payloads into chat. diff --git a/content/docs/cli/security.md b/content/docs/cli/security.md new file mode 100644 index 0000000..9452724 --- /dev/null +++ b/content/docs/cli/security.md @@ -0,0 +1,133 @@ +--- +title: Security +description: Handle Sume CLI secrets, signed URLs, media outputs, paid calls, and agent automation safely. +--- + +Sume CLI is designed for agent use, but CLI output can still contain sensitive +or user-owned data. Treat all auth, upload, job, and media output carefully. + +## Secrets + +Never print or commit: + +- `SUME_API_KEY`; +- local `~/.sume/config.json`; +- login URLs or user codes; +- signed upload URLs; +- storage object keys; +- upload headers; +- raw provider payloads. + +Use environment variables or secret managers for automation: + +```bash +export SUME_API_KEY="" +sume me --json +``` + +## Local config + +The default config file is: + +```text +~/.sume/config.json +``` + +Use an isolated config directory for disposable environments: + +```bash +export SUME_CONFIG_DIR="$(mktemp -d)" +``` + +Before snapshotting a reusable sandbox: + +```bash +sume logout +``` + +## Signed upload URLs + +`sume uploads presign` returns a temporary storage `upload_url`. Treat it as a +secret-like value. + +When uploading bytes: + +- send only the returned `required_headers`; +- do not send the Sume API `Authorization` header to storage; +- do not log the full `upload_url`; +- do not log `object_key` unless engineering specifically asks for it. + +## Media URLs + +Sume job and asset results may include public media URLs scoped to Sume output. +They are still user data. + +When reporting results: + +- summarize media counts and file types; +- use local downloaded filenames rather than full remote URLs; +- redact query strings and private identifiers; +- avoid dumping large raw result payloads. + +## Paid/provider operations + +These commands can spend credits or create provider work: + +- `sume images generate` +- `sume videos generate` +- `sume ads videos create` +- `sume face-swap create` +- `sume reference-analysis create` +- `sume assets finalize` when it starts Asset Library processing + +Agents should: + +1. confirm user intent; +2. check `sume credits --json`; +3. run one bounded job first when testing; +4. stop on API/provider errors instead of retrying blindly; +5. report job ids and sanitized error codes, not raw provider payloads. + +## MCP gates + +Default MCP is read-only: + +```bash +sume mcp +``` + +Mutating non-paid tools require: + +```bash +sume mcp --toolsets uploads --allow-write +``` + +Paid/provider tools require: + +```bash +sume mcp --toolsets generation --allow-paid +``` + +Only enable write or paid gates in MCP hosts that have an explicit human approval +model. + +## Agent reporting rules + +Agent final reports should include: + +- what command was run; +- whether it was read-only, write, or paid/provider; +- sanitized status/result summary; +- job ids only when useful for follow-up; +- local output paths if files were downloaded. + +Agent final reports should not include: + +- API keys; +- live login URLs/codes; +- signed upload URLs; +- storage object keys; +- raw emails; +- workspace/user ids; +- full private media URLs; +- raw provider payloads. diff --git a/content/docs/cli/troubleshooting.md b/content/docs/cli/troubleshooting.md new file mode 100644 index 0000000..a6b72f6 --- /dev/null +++ b/content/docs/cli/troubleshooting.md @@ -0,0 +1,190 @@ +--- +title: Troubleshooting +description: Debug common Sume CLI login, config, job, upload, MCP, and update issues. +--- + +Start with the smallest read-only checks: + +```bash +sume --version +sume auth status +sume me --json +sume credits --json +``` + +## Missing API key + +Symptom: + +```text +No Sume API key found. +``` + +Fix locally: + +```bash +sume login +``` + +Fix in a remote/headless terminal: + +```bash +sume login --no-browser --timeout 600 +``` + +Fix in CI: + +```bash +export SUME_API_KEY="" +``` + +## Browser did not open + +If `sume login` cannot open a browser, re-run with a device flow: + +```bash +sume login --device --timeout 600 +``` + +Open the printed URL/code locally, approve, then verify: + +```bash +sume me --json +``` + +## Wrong account or workspace + +Check the configured context: + +```bash +sume auth status --json +sume me --json +``` + +Then reset local auth if needed: + +```bash +sume logout +sume login +``` + +If `SUME_API_KEY` is set, it overrides local config. Unset it when testing local +browser login: + +```bash +unset SUME_API_KEY +``` + +## Job created but no result yet + +Jobs are async. Poll status: + +```bash +sume jobs get --json +``` + +Fetch the result only after terminal status: + +```bash +sume jobs result --json +``` + +For long video jobs, avoid tight polling loops. The CLI's `--wait` helpers use +bounded intervals; agents can also use `jobs.wait` through MCP. + +## Generation command timed out + +A CLI wait timeout does not necessarily mean the job failed. Inspect the job: + +```bash +sume jobs get --json +sume jobs result --json +``` + +If the job is still running, continue polling at a longer interval. If it +failed, report the sanitized error code/message and job id. + +## Upload failed + +For `uploads presign` flows: + +1. Request a presign with an explicit `--purpose`. +2. PUT bytes to `upload_url` with only `required_headers`. +3. Do not send the Sume API `Authorization` header to the storage URL. +4. Use `assets finalize` for `asset_library_video`. +5. Use the returned Sume media URL for `face_swap_source_video`. + +Never paste `upload_url`, `object_key`, or upload headers into public logs. + +## Download failed + +`jobs result --download` and `assets get --download` download safe public media +URLs returned by Sume. + +If a download fails: + +- confirm the job or asset has media output; +- retry once if the network failed; +- use `--json` to inspect the result shape; +- avoid printing full media URLs in bug reports. + +## MCP tool missing + +Check discovery: + +```bash +sume tools list --json +sume tools schema --json +``` + +Then check the MCP gates: + +| Tool class | Required server flags | +|---|---| +| Default read tools | `sume mcp` | +| Brand analyze / uploads / downloads | `--toolsets --allow-write` | +| Image/video/reference generation | `--toolsets generation --allow-paid` | +| Ads / Face Swap | `--toolsets ads,face-swap --allow-paid` | + +If a tool is available in schema discovery but not in the MCP client, restart the +MCP server with the required toolset and gate. + +## CLI appears outdated + +Check version and updates: + +```bash +sume version +sume update --check +``` + +Install: + +```bash +sume update +``` + +If the installed release does not include a command documented here, verify the +release tag. These docs track the current `SumeLabs/sume-cli` release line and +merged source; users may need the next CLI release for newly merged behavior. + +## What to include in a bug report + +Include: + +- command name and flags, with secrets redacted; +- `sume --version`; +- sanitized error code/message; +- request id if present; +- job id if the issue is job-specific; +- whether auth came from env or local config. + +Do not include: + +- API keys; +- login URLs or user codes; +- signed upload URLs; +- storage object keys; +- full private media URLs; +- raw provider payloads; +- user/workspace ids unless engineering specifically asks for them. diff --git a/src/data/sidebar.ts b/src/data/sidebar.ts index 70efa3c..d463ec3 100644 --- a/src/data/sidebar.ts +++ b/src/data/sidebar.ts @@ -54,9 +54,16 @@ export const sidebarContent: ISidebarContent = [ defaultExpanded: true, content: [ makePage("Overview", "/cli"), - makePage("Install and login", "/cli/install-login"), - makePage("Commands", "/cli/commands"), - makePage("Agent usage", "/cli/agent-usage"), + makePage("Install and update", "/cli/install-login"), + makePage("Authentication", "/cli/authentication"), + makePage("Configuration", "/cli/configuration"), + makePage("Command reference", "/cli/commands"), + makePage("Jobs and assets", "/cli/jobs-assets"), + makePage("Generation workflows", "/cli/generation-workflows"), + makePage("MCP server", "/cli/mcp"), + makePage("Agent skills", "/cli/agent-skills"), + makePage("Troubleshooting", "/cli/troubleshooting"), + makePage("Security", "/cli/security"), ], }, { diff --git a/src/layouts/docs-layout.tsx b/src/layouts/docs-layout.tsx index ef46ac4..29a1aa5 100644 --- a/src/layouts/docs-layout.tsx +++ b/src/layouts/docs-layout.tsx @@ -136,11 +136,11 @@ export const DocsLayout: React.FC> = ({ /> -
+
{/* Two-column layout */} -
+
-
+
{breadcrumbs.map((crumb, index) => ( diff --git a/src/styles/prose.css b/src/styles/prose.css index bcf0bfe..81a4f3c 100644 --- a/src/styles/prose.css +++ b/src/styles/prose.css @@ -235,7 +235,7 @@ /* Tables */ .prose table { - @apply my-6 w-full caption-bottom overflow-hidden rounded-lg border border-muted text-sm; + @apply my-6 block w-full overflow-x-auto rounded-lg border border-muted text-sm; border-collapse: separate; border-spacing: 0; }