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 calcwitan xlsx execwitan xlsx lintwitan 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 usingwitan auth login)WITAN_API_URL: API base URL override (default:https://api.witanlabs.com)WITAN_STATELESS: set1ortrueto force stateless modeWITAN_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 (
--statelessorWITAN_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 pushingv*tags) - Artifacts:
witan-darwin-arm64.tar.gzwitan-darwin-amd64.tar.gzwitan-linux-amd64.tar.gzwitan-linux-arm64.tar.gzwitan-windows-amd64.zipwitan-windows-arm64.zipwitan-install.shwitan-*.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):
- Add release notes under
## UnreleasedinCHANGELOG.md. - Create a GitHub Release in the UI with a new tag
vX.Y.Z(or prerelease tagvX.Y.Z-suffix). - Tag push triggers
Witan CLI Release. - The workflow builds artifacts, attaches them to the GitHub Release, and publishes to PyPI for stable tags.
- On successful release, CI runs
scripts/roll-changelog.sh, pushes the changelog update to achore/changelog-release-X.Y.Zbranch, and opens a PR into the default branch. - For stable tags, verify
witan==X.Y.Zon PyPI andwitan --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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
89663b006cd920ce49b3a1c530d77125519df956944bdf03ba2a7b4da1c568bc
|
|
| MD5 |
f41ed46ac849c522a9f1f5d0f82df69b
|
|
| BLAKE2b-256 |
41a9eddeb67d04c76f8d7b4399450dc0fa9485197767ce466dbe7a7148f2236a
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
witan-0.7.1-py3-none-win_arm64.whl -
Subject digest:
89663b006cd920ce49b3a1c530d77125519df956944bdf03ba2a7b4da1c568bc - Sigstore transparency entry: 1206352998
- Sigstore integration time:
-
Permalink:
witanlabs/witan-cli@12f621c803acd0ec35325cf14a1555c8da5eef74 -
Branch / Tag:
refs/tags/v0.7.1 - Owner: https://github.com/witanlabs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
witan-cli-release.yml@12f621c803acd0ec35325cf14a1555c8da5eef74 -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
505e2a4be6508a3439a148ec0d41744b40e5b15795b258f81d3c4a02a5b67eb6
|
|
| MD5 |
7ee2f338e3f3c59ed3f4192749b1828d
|
|
| BLAKE2b-256 |
a25b2dbb8ad6ef464409b1f8b539bbff5fb9f169824a31cb6d175b718417b572
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
witan-0.7.1-py3-none-win_amd64.whl -
Subject digest:
505e2a4be6508a3439a148ec0d41744b40e5b15795b258f81d3c4a02a5b67eb6 - Sigstore transparency entry: 1206352933
- Sigstore integration time:
-
Permalink:
witanlabs/witan-cli@12f621c803acd0ec35325cf14a1555c8da5eef74 -
Branch / Tag:
refs/tags/v0.7.1 - Owner: https://github.com/witanlabs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
witan-cli-release.yml@12f621c803acd0ec35325cf14a1555c8da5eef74 -
Trigger Event:
push
-
Statement type:
File details
Details for the file witan-0.7.1-py3-none-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: witan-0.7.1-py3-none-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 8.8 MB
- Tags: Python 3, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c61d31562f68c86fc3353531786972abce2a6836942cfc7d9577d1a185620aa
|
|
| MD5 |
213c2714dfab6f7fef8a06a9d66e73c3
|
|
| BLAKE2b-256 |
dedfd9f03057f02e2c18c1448584999647f01a80e96d664fcb54b31dbace95b5
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
witan-0.7.1-py3-none-musllinux_1_2_x86_64.whl -
Subject digest:
8c61d31562f68c86fc3353531786972abce2a6836942cfc7d9577d1a185620aa - Sigstore transparency entry: 1206353067
- Sigstore integration time:
-
Permalink:
witanlabs/witan-cli@12f621c803acd0ec35325cf14a1555c8da5eef74 -
Branch / Tag:
refs/tags/v0.7.1 - Owner: https://github.com/witanlabs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
witan-cli-release.yml@12f621c803acd0ec35325cf14a1555c8da5eef74 -
Trigger Event:
push
-
Statement type:
File details
Details for the file witan-0.7.1-py3-none-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: witan-0.7.1-py3-none-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 8.3 MB
- Tags: Python 3, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7f57d7ada0c3ed6811be9491147a883f07e1086b0ffedc51dc41d03efbd3ecb3
|
|
| MD5 |
883e83f6bcbf7805fd150380960c77e9
|
|
| BLAKE2b-256 |
711d0066cbd059649d38c8855b503472501414d6d9c8ed93ed44855e4c7e7716
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
witan-0.7.1-py3-none-musllinux_1_2_aarch64.whl -
Subject digest:
7f57d7ada0c3ed6811be9491147a883f07e1086b0ffedc51dc41d03efbd3ecb3 - Sigstore transparency entry: 1206352967
- Sigstore integration time:
-
Permalink:
witanlabs/witan-cli@12f621c803acd0ec35325cf14a1555c8da5eef74 -
Branch / Tag:
refs/tags/v0.7.1 - Owner: https://github.com/witanlabs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
witan-cli-release.yml@12f621c803acd0ec35325cf14a1555c8da5eef74 -
Trigger Event:
push
-
Statement type:
File details
Details for the file witan-0.7.1-py3-none-manylinux_2_17_x86_64.whl.
File metadata
- Download URL: witan-0.7.1-py3-none-manylinux_2_17_x86_64.whl
- Upload date:
- Size: 8.8 MB
- Tags: Python 3, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f48f07c6bff23db2fbcf3177d96619c95fee488fbc3e12211e0dd250e08e1951
|
|
| MD5 |
4a495ceb7816453e6717320633ad6696
|
|
| BLAKE2b-256 |
646442525e7647cae8b029dd8639e9b26e1c09d6c1229bffbab3f2084230bae9
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
witan-0.7.1-py3-none-manylinux_2_17_x86_64.whl -
Subject digest:
f48f07c6bff23db2fbcf3177d96619c95fee488fbc3e12211e0dd250e08e1951 - Sigstore transparency entry: 1206352900
- Sigstore integration time:
-
Permalink:
witanlabs/witan-cli@12f621c803acd0ec35325cf14a1555c8da5eef74 -
Branch / Tag:
refs/tags/v0.7.1 - Owner: https://github.com/witanlabs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
witan-cli-release.yml@12f621c803acd0ec35325cf14a1555c8da5eef74 -
Trigger Event:
push
-
Statement type:
File details
Details for the file witan-0.7.1-py3-none-manylinux_2_17_aarch64.whl.
File metadata
- Download URL: witan-0.7.1-py3-none-manylinux_2_17_aarch64.whl
- Upload date:
- Size: 8.3 MB
- Tags: Python 3, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dee6e085f1455dcdbcf8821ff27d77398ca1d333faaf1bf3f6fdd2d7b95b3878
|
|
| MD5 |
c0a2caebbf44582b097cb50de45ebc7a
|
|
| BLAKE2b-256 |
77fc421c2a278d19ded4793337221ec03ea24adffbdfcc335e4340ed46b5158c
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
witan-0.7.1-py3-none-manylinux_2_17_aarch64.whl -
Subject digest:
dee6e085f1455dcdbcf8821ff27d77398ca1d333faaf1bf3f6fdd2d7b95b3878 - Sigstore transparency entry: 1206353117
- Sigstore integration time:
-
Permalink:
witanlabs/witan-cli@12f621c803acd0ec35325cf14a1555c8da5eef74 -
Branch / Tag:
refs/tags/v0.7.1 - Owner: https://github.com/witanlabs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
witan-cli-release.yml@12f621c803acd0ec35325cf14a1555c8da5eef74 -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6e8955e2e55604ceb29a888fef0d7ce69b9dcbcd6e095d486bb56cf4991d2c8e
|
|
| MD5 |
6208fa4d5c88674f770e7de15560449d
|
|
| BLAKE2b-256 |
a787205dc9934eac9c8ba48cb7aec6bdf27306bade3cddae88811052a681c4cf
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
witan-0.7.1-py3-none-macosx_11_0_arm64.whl -
Subject digest:
6e8955e2e55604ceb29a888fef0d7ce69b9dcbcd6e095d486bb56cf4991d2c8e - Sigstore transparency entry: 1206353033
- Sigstore integration time:
-
Permalink:
witanlabs/witan-cli@12f621c803acd0ec35325cf14a1555c8da5eef74 -
Branch / Tag:
refs/tags/v0.7.1 - Owner: https://github.com/witanlabs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
witan-cli-release.yml@12f621c803acd0ec35325cf14a1555c8da5eef74 -
Trigger Event:
push
-
Statement type:
File details
Details for the file witan-0.7.1-py3-none-macosx_10_9_x86_64.whl.
File metadata
- Download URL: witan-0.7.1-py3-none-macosx_10_9_x86_64.whl
- Upload date:
- Size: 9.0 MB
- Tags: Python 3, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0eaa60d350ffb5b4dc889fb2217a2cde918201b5b59d729bf88a6ab18ec1ac1f
|
|
| MD5 |
303b7ebcb893b6684cba60a3f49a720d
|
|
| BLAKE2b-256 |
c9fbe1ebba305daada1af4db2f6aa2122dead99940f96be12b43fa122ee51bdf
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
witan-0.7.1-py3-none-macosx_10_9_x86_64.whl -
Subject digest:
0eaa60d350ffb5b4dc889fb2217a2cde918201b5b59d729bf88a6ab18ec1ac1f - Sigstore transparency entry: 1206353090
- Sigstore integration time:
-
Permalink:
witanlabs/witan-cli@12f621c803acd0ec35325cf14a1555c8da5eef74 -
Branch / Tag:
refs/tags/v0.7.1 - Owner: https://github.com/witanlabs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
witan-cli-release.yml@12f621c803acd0ec35325cf14a1555c8da5eef74 -
Trigger Event:
push
-
Statement type: