Skip to main content

Witan spreadsheet CLI for coding agents

Project description

witan-cli

The spreadsheet toolkit for coding agents — edit, render, calculate, and lint Excel workbooks.

Documentation | How we built it

Install

Quick Install Script

curl -fsSL https://witanlabs.com/agents/install.sh | sh

From GitHub Releases

Download the latest artifacts from:

Example (macOS Apple Silicon):

curl -fsSL https://github.com/witanlabs/witan-cli/releases/latest/download/witan-darwin-arm64.tar.gz | tar -xz
install -m 0755 witan /usr/local/bin/witan

From PyPI

Install from PyPI (recommended for sandboxed agent environments):

# one-shot run without permanent install
uvx witan --help

# persistent install
pip install witan

From Source

Requires Go (version from go.mod):

go install github.com/witanlabs/witan-cli@latest

Quick Start

# Authenticate (recommended)
witan auth login

# Render a range
witan xlsx render report.xlsx -r "Sheet1!A1:F20"

# Recalculate formulas
witan xlsx calc report.xlsx

# Lint formulas
witan xlsx lint report.xlsx

# Run JS against workbook
witan xlsx exec report.xlsx --expr 'await xlsx.readCell(wb, "Summary!A1")'

# Create a new workbook from scratch
witan xlsx exec model.xlsx --create --save --code 'await xlsx.addSheet(wb, "Inputs"); return true'

# Author a ListObject table in one call
witan xlsx exec model.xlsx --save --stdin <<'WITAN'
await xlsx.addListObject(wb, "Sheet1", {
  name: "SalesTable",
  ref: "A1:C4",
  showTotalsRow: true,
  columns: [
    { name: "Region", totalsRowLabel: "Total" },
    { name: "Sales", totalsRowFunction: "sum" },
    { name: "DoubleSales", calculatedColumnFormula: "=B2*2" }
  ],
  rows: [
    [{ value: "North" }, { value: 10 }, {}],
    [{ value: "South" }, { value: 20 }, {}]
  ]
})
return await xlsx.readRange(wb, "SalesTable")
WITAN

# Author a What-If Data Table block
witan xlsx exec model.xlsx --save --stdin <<'WITAN'
await xlsx.addDataTable(wb, "Sheet1", {
  type: "oneVariableColumn",
  ref: "E1:F4",
  columnInputCell: "H1",
  inputValues: [5, 10, 15],
  formulas: ["=H1*2"]
})
return await xlsx.getDataTable(wb, "Sheet1!E1:F4")
WITAN

# Author a chart from workbook data
witan xlsx exec dashboard.xlsx --save --stdin <<'WITAN'
await xlsx.addChart(wb, "Summary", {
  name: "Revenue",
  position: { from: { cell: "F2" }, to: { cell: "N18" } },
  groups: [
    {
      type: "column",
      series: [
        {
          name: { ref: "Data!B1" },
          categories: "Data!A2:A9",
          values: "Data!B2:B9"
        }
      ]
    }
  ],
  title: { text: "Revenue" },
  legend: { position: "right" }
})
await xlsx.previewStyles(wb, "Summary!F2:N18")
WITAN

What This CLI Covers

witan-cli currently exposes four spreadsheet commands:

  • witan xlsx calc
  • witan xlsx exec
  • witan xlsx lint
  • witan xlsx render

The lower-level Witan spreadsheet runtime supports broader workbook operations; this CLI focuses on the four agent-facing workflows above.

Auth, Config, and Modes

Authentication can be done via witan auth login, --api-key, or WITAN_API_KEY. Use witan auth status to inspect the active credential, validation state, and selected organization.

Environment variables:

  • WITAN_API_KEY: API key (optional when using witan auth login)
  • WITAN_API_URL: API base URL override (default: https://api.witanlabs.com)
  • WITAN_STATELESS: set 1 or true to force stateless mode
  • WITAN_CONFIG_DIR: override config directory (default: ~/.config/witan)
  • WITAN_MANAGEMENT_API_URL: management API override for auth login/token exchange

Modes:

  • Stateful (default when authenticated): uploads workbook revisions and reuses them across commands
  • Stateless (--stateless or WITAN_STATELESS=1): sends workbook bytes on every request, no server-side file reuse

witan xlsx exec --create always uses the stateless exec endpoint and only supports new .xlsx targets.

Limits:

  • Workbook inputs must be <= 25MB.

Development

# build local binary
make build

# run test suite
make test

# static checks
make vet
make format-check

# build release artifacts into dist/
make dist VERSION=v0.1.0

# build PyPI wheels (stable tags only)
make pypi-wheels VERSION=v0.1.0

The local binary is written to ./witan.

Release Process

Releases are handled by GitHub Actions:

  • Publish workflow: .github/workflows/witan-cli-release.yml (triggered by pushing v* tags)
  • Artifacts:
    • witan-darwin-arm64.tar.gz
    • witan-darwin-amd64.tar.gz
    • witan-linux-amd64.tar.gz
    • witan-linux-arm64.tar.gz
    • witan-windows-amd64.zip
    • witan-windows-arm64.zip
    • witan-install.sh
    • witan-*.whl (PyPI wheels for supported platforms; stable tags only)
    • witan-checksums.txt

PyPI publishing:

  • Stable tags (vX.Y.Z) publish wheels to PyPI using GitHub OIDC trusted publishing.
  • Pre-release tags (for example v1.2.3-rc.1) skip PyPI publish.

GitHub release publishing:

  • The workflow uploads artifacts directly to the matching GitHub Release tag.
  • If the release already exists (for example, created in the GitHub UI), assets are attached with --clobber.

Cutting a release (UI-driven):

  1. Add release notes under ## Unreleased in CHANGELOG.md.
  2. Create a GitHub Release in the UI with a new tag vX.Y.Z (or prerelease tag vX.Y.Z-suffix).
  3. Tag push triggers Witan CLI Release.
  4. The workflow builds artifacts, attaches them to the GitHub Release, and publishes to PyPI for stable tags.
  5. On successful release, CI runs scripts/roll-changelog.sh, pushes the changelog update to a chore/changelog-release-X.Y.Z branch, and opens a PR into the default branch.
  6. For stable tags, verify witan==X.Y.Z on PyPI and witan --version.

Manual git tag ... && git push ... is equivalent to UI tag creation and triggers the same workflow.

CI

Go CI runs in .github/workflows/golang.yml on pushes to main and pull requests.

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.

witan-0.9.0-py3-none-win_arm64.whl (8.4 MB view details)

Uploaded Python 3Windows ARM64

witan-0.9.0-py3-none-win_amd64.whl (9.1 MB view details)

Uploaded Python 3Windows x86-64

witan-0.9.0-py3-none-musllinux_1_2_x86_64.whl (8.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

witan-0.9.0-py3-none-musllinux_1_2_aarch64.whl (8.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

witan-0.9.0-py3-none-manylinux_2_17_x86_64.whl (8.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

witan-0.9.0-py3-none-manylinux_2_17_aarch64.whl (8.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

witan-0.9.0-py3-none-macosx_11_0_arm64.whl (8.5 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

witan-0.9.0-py3-none-macosx_10_9_x86_64.whl (9.0 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

Details for the file witan-0.9.0-py3-none-win_arm64.whl.

File metadata

  • Download URL: witan-0.9.0-py3-none-win_arm64.whl
  • Upload date:
  • Size: 8.4 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for witan-0.9.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 f14cfcd354a5824f320c61712e9b0dbed07720f9dae8e3e2f5a3321ace8ad4fe
MD5 d0298017491d42623c0e9bc7998bac02
BLAKE2b-256 e42d13df7aae76b4a09b4db23608d60fba5b802274931bfc515776c7786b1024

See more details on using hashes here.

Provenance

The following attestation bundles were made for witan-0.9.0-py3-none-win_arm64.whl:

Publisher: witan-cli-release.yml on witanlabs/witan-cli

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

File details

Details for the file witan-0.9.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: witan-0.9.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 9.1 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 witan-0.9.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 fe13df7724755e242912d8e0de5cd2799f6616f02cdcca2f3a38b875cbfc9433
MD5 c6700999f64df4a473fa39246358ef8f
BLAKE2b-256 2c74a42edf1f4cdaa001e67e2e2148767e892e5c3d0a7715e189c91923758091

See more details on using hashes here.

Provenance

The following attestation bundles were made for witan-0.9.0-py3-none-win_amd64.whl:

Publisher: witan-cli-release.yml on witanlabs/witan-cli

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

File details

Details for the file witan-0.9.0-py3-none-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: witan-0.9.0-py3-none-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 8.9 MB
  • Tags: Python 3, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for witan-0.9.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7934534529572152babd2819b31e7548756e052428ed0344d902ceb18c86ca22
MD5 3eea8a92c8bbe636eca9f138acdb6776
BLAKE2b-256 f2598daf816f18dd1ddf7268d3947e915f1ab07a722c3f667eecc7d6f3cb0b92

See more details on using hashes here.

Provenance

The following attestation bundles were made for witan-0.9.0-py3-none-musllinux_1_2_x86_64.whl:

Publisher: witan-cli-release.yml on witanlabs/witan-cli

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

File details

Details for the file witan-0.9.0-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for witan-0.9.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 79ed65b2318033966d782e537b800e3b4198bca1d303156d901a97bbaef66f97
MD5 a0e284cbc63808c88fe4f21495a93fb6
BLAKE2b-256 2761549715a126fbcfd8fff6aa241a6094b6525fca7a12668a4fd742981780ec

See more details on using hashes here.

Provenance

The following attestation bundles were made for witan-0.9.0-py3-none-musllinux_1_2_aarch64.whl:

Publisher: witan-cli-release.yml on witanlabs/witan-cli

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

File details

Details for the file witan-0.9.0-py3-none-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for witan-0.9.0-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 1b55e88e157763e20df158bea68c020495aa2e9a92c05727535654765dc94e05
MD5 dcd52c7759802ba9a84743ee8001bac6
BLAKE2b-256 a3d7e8caba13d82392b7c6fbe6f69913fe923bff89696e39119353a51ee199d4

See more details on using hashes here.

Provenance

The following attestation bundles were made for witan-0.9.0-py3-none-manylinux_2_17_x86_64.whl:

Publisher: witan-cli-release.yml on witanlabs/witan-cli

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

File details

Details for the file witan-0.9.0-py3-none-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for witan-0.9.0-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 71db3c43a14c25245bbb7c7ca1e626bd7bffdff3a17f630d980999f1846e8f1a
MD5 92c5750cc245e4434d584fa54c2cfb69
BLAKE2b-256 fcb568f1afc5bf455bb14273367fa1bacea88ddd95378a575d71235c4a40b510

See more details on using hashes here.

Provenance

The following attestation bundles were made for witan-0.9.0-py3-none-manylinux_2_17_aarch64.whl:

Publisher: witan-cli-release.yml on witanlabs/witan-cli

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

File details

Details for the file witan-0.9.0-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: witan-0.9.0-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 8.5 MB
  • Tags: Python 3, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for witan-0.9.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b44e6cced2e660b239e65f2fd5d66a8d989c599808ba08a14b052c75de279eed
MD5 8e65175552ccac4035229b024f184b6e
BLAKE2b-256 354f7eb1636683d28a8f9db5f11476103b98b9b9bd6d50bc86c441a377500660

See more details on using hashes here.

Provenance

The following attestation bundles were made for witan-0.9.0-py3-none-macosx_11_0_arm64.whl:

Publisher: witan-cli-release.yml on witanlabs/witan-cli

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

File details

Details for the file witan-0.9.0-py3-none-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for witan-0.9.0-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e9589da58ee6d22fe2595afdb0dc716f6586975bc2a2349138b53ae6869afe38
MD5 ee9b25b98cdcbfa59a131d5458b51645
BLAKE2b-256 41c4923e928f65397ca11275d50d7738bcffd1633dfb337756014ab8d0ba6484

See more details on using hashes here.

Provenance

The following attestation bundles were made for witan-0.9.0-py3-none-macosx_10_9_x86_64.whl:

Publisher: witan-cli-release.yml on witanlabs/witan-cli

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