Skip to main content

Token-optimized TOON output wrapper for any CLI

Project description

cartoon

Token-optimized output for any CLI. Prefix cartoon onto a command and its output becomes TOON — a compact structured format built for LLM agents. Same exit codes, same behavior, ~70%+ fewer tokens on test runs.

A cartoon is a compressed rendering of reality. So is this.

Why

Agents (Claude Code, Cursor, Codex, ...) read CLI output formatted for humans: banners, progress noise, hundreds of PASSED lines. You pay for every token. cartoon keeps what the agent needs — counts, failures, tracebacks — and drops the rest.

Install

uv tool install cartoon        # or: pipx install cartoon
npm install -g cartoon-wrap    # installs the `cartoon` binary
cargo install cartoon

For agents (Claude Code, Codex, Copilot, Cursor, …)

Teach your agent to use cartoon automatically — and to install it when missing — with the skills shipped in this repo:

# Claude Code (plugin)
/plugin marketplace add abhijitbansal/cartoon
/plugin install cartoon@cartoon
# Everything else (skills.sh CLI auto-detects 40+ agents)
npx skills add abhijitbansal/cartoon

Copy-paste blocks for AGENTS.md / copilot-instructions.md and the full integration matrix: docs/agents.md.

Use

cartoon pytest                 # asymmetric test report in TOON
cartoon jest src/              # same for jest
cartoon python -m unittest     # same for unittest
cartoon aws ec2 describe-instances --output json   # any JSON CLI → TOON
cartoon --heuristic make       # lossy compression for plain text (opt-in)
cartoon --raw pytest           # escape hatch: no transformation
cartoon stats --since 7d       # how many tokens you've saved
cartoon adapters               # list built-in adapters
cartoon --tag api pytest       # tag the archived run
cartoon logs                   # list archived raw logs
cartoon logs --last --stdout   # full raw output of the newest run
cartoon --fast pytest          # opt-in: parallel via pytest-xdist (-n auto)

Failing test run, before (pytest, ~4800 tokens) vs after (~300 tokens):

runner: pytest
summary:
  total: 48
  passed: 45
  failed: 2
  skipped: 1
  duration_s: 3.2
failures[2]{id,loc,msg}:
  "tests/test_auth.py::test_expiry","tests/test_auth.py:42",assert exp < now
  "tests/test_user.py::test_create","tests/test_user.py:88","KeyError: 'email'"
traces:
  "tests/test_auth.py::test_expiry"[2]: "tests/test_auth.py:42 in test_expiry",assert token.exp < now()

Guarantees

  • Exit codes always mirrored — cartoon pytest && deploy behaves like pytest && deploy.
  • If parsing fails, the original output passes through untouched (one warning on stderr). Information is never silently lost.
  • Heuristic (lossy) mode is off unless you ask for it.

Raw log archive

Every wrapped run keeps its full raw output under ~/.local/state/cartoon/runs/<run-id>/ (stdout.log, stderr.log, meta.json). Transformed output ends with a raw_log: line pointing at the archive — if the TOON summary dropped something you need, fetch the original with cat or cartoon logs <id> instead of rerunning. Passthrough and --raw output stay byte-identical (no footer) but are still archived. Retention is capped (keep_runs, default 50; max_archive_mb, default 50); keep_runs = 0 disables archiving.

Fast mode

cartoon --fast pytest appends -n auto so pytest-xdist runs the suite in parallel. Strictly opt-in — parallel execution is NOT "same behavior" (test order changes; shared-state tests can flake), so cartoon never enables it on its own and always discloses it with a fast: "-n auto" line in the report. Failures under --fast? Rerun without it before debugging. If pytest-xdist isn't installed, cartoon retries serially once and notes it on stderr. Other runners: no-op (jest is already parallel; unittest has no parallel runner).

Config

~/.config/cartoon/config.toml:

heuristic = false    # default for lossy fallback
tokenizer = "o200k"  # or "approx" (bytes/4) for zero-cost estimates
trace_lines = 20     # per-failure traceback cap
keep_runs = 50       # archived raw logs to keep (0 disables)
max_archive_mb = 50  # max total archive size

Stats live in ~/.local/state/cartoon/stats.jsonl.

Adapters

Adapter Trigger Source
pytest pytest, python -m pytest injected --junit-xml
unittest python -m unittest stderr text parse
jest jest, npx jest injected --json

No adapter match → JSON auto-detection → optional heuristic → passthrough.

Want another runner (cargo test, go test, vitest, rspec)? See CONTRIBUTING.md — adapters are one trait impl + fixtures.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

cartoon-0.1.0-py3-none-win_amd64.whl (3.2 MB view details)

Uploaded Python 3Windows x86-64

cartoon-0.1.0-py3-none-manylinux_2_39_x86_64.whl (3.6 MB view details)

Uploaded Python 3manylinux: glibc 2.39+ x86-64

cartoon-0.1.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

cartoon-0.1.0-py3-none-macosx_11_0_arm64.whl (3.4 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

cartoon-0.1.0-py3-none-macosx_10_12_x86_64.whl (3.4 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file cartoon-0.1.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: cartoon-0.1.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 3.2 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cartoon-0.1.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 c3f3c3b827542c5caf3bbfa349ef16b42a6235ecb7c680911ea03a5452d060b1
MD5 4225971c8e8778c58cdbd2c0541519a4
BLAKE2b-256 b6d5c9f2d16ec1b0295cc7c6b22ed615ef3f5335b94eeeb30f3ebbf5dde1ab88

See more details on using hashes here.

Provenance

The following attestation bundles were made for cartoon-0.1.0-py3-none-win_amd64.whl:

Publisher: release.yml on abhijitbansal/cartoon

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cartoon-0.1.0-py3-none-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for cartoon-0.1.0-py3-none-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 0c5f19bbeddd555aee8faca5f6111d2bb49ddb2bdf349de7a47da899ecc13336
MD5 0df40971739617b57710c155405f35fd
BLAKE2b-256 8a08e06ef2f7d1c97660091dc3692c16e1df2e87d19d206df1f07008686757e4

See more details on using hashes here.

Provenance

The following attestation bundles were made for cartoon-0.1.0-py3-none-manylinux_2_39_x86_64.whl:

Publisher: release.yml on abhijitbansal/cartoon

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cartoon-0.1.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for cartoon-0.1.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9a03ee022d89a46cb25656581dc12eaf058bbac9f891cabe3e77367e29b4765b
MD5 2fe4a2ec806fb2b955095f0d8b831516
BLAKE2b-256 b6d1f85387ac2887787daa2aa3c9c74be80e004e7b885b15a90b22b9abe640cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for cartoon-0.1.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on abhijitbansal/cartoon

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cartoon-0.1.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cartoon-0.1.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7848c137c9f8d149162c1df4edf2b4649e7ffe5099340db7a82e714bae6837b7
MD5 4807aef2bc656f814e3278a6c9f4e8df
BLAKE2b-256 66c86718a9e2287f4fbcd1d682e6ba19837d2e0c444f10d7dd7d619bcdfc970f

See more details on using hashes here.

Provenance

The following attestation bundles were made for cartoon-0.1.0-py3-none-macosx_11_0_arm64.whl:

Publisher: release.yml on abhijitbansal/cartoon

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cartoon-0.1.0-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for cartoon-0.1.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 def60830974c240cce66ea14b0a213fa9f01e88aab95027205b7b31191381f4a
MD5 56577594d5248c71680315b2908839cc
BLAKE2b-256 ae798bd515b4fdb86386275cbfbf7d258d62eccb17527c30e43f3a613463ff91

See more details on using hashes here.

Provenance

The following attestation bundles were made for cartoon-0.1.0-py3-none-macosx_10_12_x86_64.whl:

Publisher: release.yml on abhijitbansal/cartoon

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page