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'

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.

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.7.1-py3-none-win_arm64.whl (8.4 MB view details)

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

witan-0.7.1-py3-none-musllinux_1_2_x86_64.whl (8.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

witan-0.7.1-py3-none-manylinux_2_17_x86_64.whl (8.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

witan-0.7.1-py3-none-macosx_11_0_arm64.whl (8.4 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

witan-0.7.1-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.7.1-py3-none-win_arm64.whl.

File metadata

  • Download URL: witan-0.7.1-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.7

File hashes

Hashes for witan-0.7.1-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 89663b006cd920ce49b3a1c530d77125519df956944bdf03ba2a7b4da1c568bc
MD5 f41ed46ac849c522a9f1f5d0f82df69b
BLAKE2b-256 41a9eddeb67d04c76f8d7b4399450dc0fa9485197767ce466dbe7a7148f2236a

See more details on using hashes here.

Provenance

The following attestation bundles were made for witan-0.7.1-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.7.1-py3-none-win_amd64.whl.

File metadata

  • Download URL: witan-0.7.1-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.7

File hashes

Hashes for witan-0.7.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 505e2a4be6508a3439a148ec0d41744b40e5b15795b258f81d3c4a02a5b67eb6
MD5 7ee2f338e3f3c59ed3f4192749b1828d
BLAKE2b-256 a25b2dbb8ad6ef464409b1f8b539bbff5fb9f169824a31cb6d175b718417b572

See more details on using hashes here.

Provenance

The following attestation bundles were made for witan-0.7.1-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.7.1-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for witan-0.7.1-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 8c61d31562f68c86fc3353531786972abce2a6836942cfc7d9577d1a185620aa
MD5 213c2714dfab6f7fef8a06a9d66e73c3
BLAKE2b-256 dedfd9f03057f02e2c18c1448584999647f01a80e96d664fcb54b31dbace95b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for witan-0.7.1-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.7.1-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for witan-0.7.1-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7f57d7ada0c3ed6811be9491147a883f07e1086b0ffedc51dc41d03efbd3ecb3
MD5 883e83f6bcbf7805fd150380960c77e9
BLAKE2b-256 711d0066cbd059649d38c8855b503472501414d6d9c8ed93ed44855e4c7e7716

See more details on using hashes here.

Provenance

The following attestation bundles were made for witan-0.7.1-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.7.1-py3-none-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for witan-0.7.1-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 f48f07c6bff23db2fbcf3177d96619c95fee488fbc3e12211e0dd250e08e1951
MD5 4a495ceb7816453e6717320633ad6696
BLAKE2b-256 646442525e7647cae8b029dd8639e9b26e1c09d6c1229bffbab3f2084230bae9

See more details on using hashes here.

Provenance

The following attestation bundles were made for witan-0.7.1-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.7.1-py3-none-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for witan-0.7.1-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 dee6e085f1455dcdbcf8821ff27d77398ca1d333faaf1bf3f6fdd2d7b95b3878
MD5 c0a2caebbf44582b097cb50de45ebc7a
BLAKE2b-256 77fc421c2a278d19ded4793337221ec03ea24adffbdfcc335e4340ed46b5158c

See more details on using hashes here.

Provenance

The following attestation bundles were made for witan-0.7.1-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.7.1-py3-none-macosx_11_0_arm64.whl.

File metadata

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

File hashes

Hashes for witan-0.7.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6e8955e2e55604ceb29a888fef0d7ce69b9dcbcd6e095d486bb56cf4991d2c8e
MD5 6208fa4d5c88674f770e7de15560449d
BLAKE2b-256 a787205dc9934eac9c8ba48cb7aec6bdf27306bade3cddae88811052a681c4cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for witan-0.7.1-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.7.1-py3-none-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for witan-0.7.1-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0eaa60d350ffb5b4dc889fb2217a2cde918201b5b59d729bf88a6ab18ec1ac1f
MD5 303b7ebcb893b6684cba60a3f49a720d
BLAKE2b-256 c9fbe1ebba305daada1af4db2f6aa2122dead99940f96be12b43fa122ee51bdf

See more details on using hashes here.

Provenance

The following attestation bundles were made for witan-0.7.1-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