WolfXL for AI agents and CI
AI agents that edit spreadsheets with openpyxl and then recalculate with LibreOffice can silently remove parts of a workbook. WolfXL changes the cells you name and writes the rest of the file back as it was.
In a measured run on 8 test workbooks, a one-cell formula edit through openpyxl and LibreOffice removed slicers, timelines, sparklines, or a Power Pivot data model from 4 of them. Every damaged file still opened in Excel without a warning. WolfXL modify mode with native calculation kept every part in all 8.1
Community is enough when
the agent changes values, formulas, or styles and the file does not need fresh formula results before someone opens it in Excel. Community is MIT-licensed, free on public PyPI, and needs no credential, so it installs in any sandbox that can reach PyPI.
pip install wolfxl
WolfXL Community on PyPICommercial is for agents that must recalculate
When a workflow needs up-to-date cached values, the usual step is LibreOffice recalculation, and that step rewrites the whole file. Commercial calculates supported formulas in the Python process instead, so the edit and the recalculation both leave untouched parts alone.
Commercial adds:
- Native recalculation
- Render, PDF, and image output
- Format conversion
- VBA and Power Query operations
- Production operations SDK
- Direct support with paid plans
Seats for agents and CI
AI agents, CI jobs, and other automated systems you run for your organization don't need their own seats. They run under the seat of the person who sets them up.
See the license and Order Terms and plans.
Agent skill
The public wolfxl-xlsx skill (MIT) tells an agent to edit existing workbooks through WolfXL modify mode, uses native calculation when Commercial is installed, and checks that the saved file kept its parts. It works with Community from PyPI and picks up Commercial automatically.
wolfxl-xlsx skill on GitHubInstall WolfXL Commercial in agents and CI
Commercial installs from https://packages.wolfxl.com/simple/ with the username and secret from your purchase or evaluation email. That index serves WolfXL and defusedxml only, so other packages come from PyPI. Each recipe keeps the secret out of commands, URLs, shell history, and logs.
pip on a workstation
Store the credential once in a netrc file. pip reads it for packages.wolfxl.com, so the secret never appears in a command.
~/.netrc on macOS or Linux (then run chmod 600 ~/.netrc), or %USERPROFILE%\_netrc on Windows
machine packages.wolfxl.com
login <username>
password <secret>
Install
# Python 3.10 needs two public dependencies from PyPI. On 3.11 and later this line installs nothing.
python -m pip install --index-url https://pypi.org/simple/ "tomli>=2,<3; python_version < '3.11'" "typing_extensions>=4,<5; python_version < '3.11'"
python -m pip install "wolfxl>=2.1" --index-url https://packages.wolfxl.com/simple/
pip in CI with environment variables
Expose the username and secret to the job as masked secrets. The script writes a private netrc file for this shell only and deletes it on exit.
Install step
# WOLFXL_INDEX_USERNAME and WOLFXL_INDEX_PASSWORD come from your secret store.
NETRC="$(mktemp)"
export NETRC
trap 'rm -f "$NETRC"' EXIT
printf 'machine packages.wolfxl.com\nlogin %s\npassword %s\n' "$WOLFXL_INDEX_USERNAME" "$WOLFXL_INDEX_PASSWORD" > "$NETRC"
# Python 3.10 needs two public dependencies from PyPI. On 3.11 and later this line installs nothing.
python -m pip install --index-url https://pypi.org/simple/ "tomli>=2,<3; python_version < '3.11'" "typing_extensions>=4,<5; python_version < '3.11'"
PIP_INDEX_URL=https://packages.wolfxl.com/simple/ python -m pip install --no-input "wolfxl>=2.1"
Do not run this step with shell tracing (set -x), which would print the expanded printf arguments.
uv project with a named index
Pin wolfxl to a named index. uv fetches only wolfxl from packages.wolfxl.com and everything else, including the Python 3.10 dependencies, from PyPI.
pyproject.toml
[project]
name = "my-app"
version = "0.1.0"
requires-python = ">=3.10"
dependencies = ["wolfxl>=2.1"]
[[tool.uv.index]]
name = "wolfxl"
url = "https://packages.wolfxl.com/simple/"
explicit = true
[tool.uv.sources]
wolfxl = { index = "wolfxl" }
Install
# UV_INDEX_WOLFXL_USERNAME and UV_INDEX_WOLFXL_PASSWORD come from your secret store.
# On a workstation, uv also reads the same ~/.netrc entry that pip uses.
uv sync
Without a project
uv pip install "wolfxl>=2.1" --index wolfxl=https://packages.wolfxl.com/simple/
uv.lock records the index URL and file hashes, never the credential.
GitHub Actions
Add WOLFXL_INDEX_USERNAME and WOLFXL_INDEX_PASSWORD as repository secrets. GitHub masks them in logs.
.github/workflows/test.yml (pip)
name: test
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install WolfXL Commercial
env:
WOLFXL_INDEX_USERNAME: ${{ secrets.WOLFXL_INDEX_USERNAME }}
WOLFXL_INDEX_PASSWORD: ${{ secrets.WOLFXL_INDEX_PASSWORD }}
run: |
# WOLFXL_INDEX_USERNAME and WOLFXL_INDEX_PASSWORD come from your secret store.
NETRC="$(mktemp)"
export NETRC
trap 'rm -f "$NETRC"' EXIT
printf 'machine packages.wolfxl.com\nlogin %s\npassword %s\n' "$WOLFXL_INDEX_USERNAME" "$WOLFXL_INDEX_PASSWORD" > "$NETRC"
# Python 3.10 needs two public dependencies from PyPI. On 3.11 and later this line installs nothing.
python -m pip install --index-url https://pypi.org/simple/ "tomli>=2,<3; python_version < '3.11'" "typing_extensions>=4,<5; python_version < '3.11'"
PIP_INDEX_URL=https://packages.wolfxl.com/simple/ python -m pip install --no-input "wolfxl>=2.1"
uv variant of the install step
- uses: astral-sh/setup-uv@v6
- name: Install dependencies
env:
UV_INDEX_WOLFXL_USERNAME: ${{ secrets.WOLFXL_INDEX_USERNAME }}
UV_INDEX_WOLFXL_PASSWORD: ${{ secrets.WOLFXL_INDEX_PASSWORD }}
run: uv sync
Docker with a BuildKit secret
Mount the netrc file only for the install step. It is never written to an image layer or the build history.
Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.12-slim
RUN python -m pip install --no-cache-dir --index-url https://pypi.org/simple/ "tomli>=2,<3; python_version < '3.11'" "typing_extensions>=4,<5; python_version < '3.11'"
RUN --mount=type=secret,id=wolfxl_netrc,target=/root/.netrc \
python -m pip install --no-cache-dir "wolfxl>=2.1" --index-url https://packages.wolfxl.com/simple/
Build
# wolfxl.netrc holds the three netrc lines. In CI, write it the same way as the pip recipe.
docker build --secret id=wolfxl_netrc,src=wolfxl.netrc -t my-app .
The mount target assumes the step runs as root. For another user, mount the secret at that user's home directory.
Hosted agent sandboxes
Add WOLFXL_INDEX_USERNAME and WOLFXL_INDEX_PASSWORD as secrets or environment variables in the sandbox's environment settings, then run the CI install script from the environment's setup script. Keep the credential out of prompts, chat messages, and committed files.
Setup script
# WOLFXL_INDEX_USERNAME and WOLFXL_INDEX_PASSWORD come from your secret store.
NETRC="$(mktemp)"
export NETRC
trap 'rm -f "$NETRC"' EXIT
printf 'machine packages.wolfxl.com\nlogin %s\npassword %s\n' "$WOLFXL_INDEX_USERNAME" "$WOLFXL_INDEX_PASSWORD" > "$NETRC"
# Python 3.10 needs two public dependencies from PyPI. On 3.11 and later this line installs nothing.
python -m pip install --index-url https://pypi.org/simple/ "tomli>=2,<3; python_version < '3.11'" "typing_extensions>=4,<5; python_version < '3.11'"
PIP_INDEX_URL=https://packages.wolfxl.com/simple/ python -m pip install --no-input "wolfxl>=2.1"
If the sandbox limits outbound network access, allow packages.wolfxl.com alongside PyPI. Sandboxes that can reach only PyPI can still run Community.
1. Measured on 2026-09-25 with openpyxl 3.1.5, LibreOffice recalculation, and WolfXL 2.1.0. Eight workbooks, one edit on one sheet. The run shows the failure exists on real Excel files; it does not estimate how often agents hit it.