WolfSDKWolfXLWolfPPTWolfDocxWolfRender

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 PyPI

Commercial 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 GitHub

Install WolfXL Commercial and Wolf Runtime in agents and CI

Install Commercial from https://packages.wolfxl.com/simple/ with the username and secret shown on your checkout success page or evaluation confirmation page. Save the secret when it is shown; it is not emailed. Use /recover to replace credentials for an existing purchase. Install WolfXL and defusedxml from that index, and other packages from PyPI. Install Wolf Runtime through npm from https://packages.wolfxl.com/wolf/npm/ with the same username and secret when your evaluation or Order covers Wolf Runtime. Follow the recipes below to keep the secret out of commands, URLs, shell history, and logs.

Supported Python and platforms

Commercial 2.1.0 artifact proofs cover CPython 3.10 through 3.13 on Linux x86_64/aarch64 (glibc 2.28+), macOS arm64 (11+) and x86_64 (10.12+), and Windows x86_64. For 2.2.0, release notes announce Python 3.14 wheels on Linux, macOS, and Windows; the full Python range and exact platform floors remain unqualified here. Commercial 2.3.0 source metadata declares CPython >=3.11,<3.15; published wheel and platform coverage remain unqualified without authenticated artifact access. Check the version-specific prerequisites and provenance at https://wolfxl.com/docs/getting-started/install/#python-and-platform-prerequisites before any recipe. An anonymous 401 is not proof of incompatibility.

WolfXL Community 2.0.10 on PyPI is MIT-licensed and requires Python 3.9 or later. Published wheels cover CPython 3.9 through 3.14 on Linux, macOS, and Windows, CPython 3.15 preview on Linux x86_64 and Windows x86_64, and PyPy 3.11 on Linux, plus a source distribution. See https://pypi.org/pypi/wolfxl/2.0.10/json for version-specific metadata.

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.

Before installing, check the release-specific Python and platform prerequisites. On Python 3.10, install the public compatibility dependencies before the private-index step, as shown below.

~/.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 -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.

Before installing, check the release-specific Python and platform prerequisites. On Python 3.10, install the public compatibility dependencies before the private-index step, as shown below.

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"
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 from PyPI.

Before installing, check the release-specific Python and platform prerequisites. On Python 3.10, install the public compatibility dependencies before the private-index step, as shown below.

pyproject.toml
[project]
name = "my-app"
version = "0.1.0"
requires-python = ">=3.11"
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.

Before installing, check the release-specific Python and platform prerequisites. On Python 3.10, install the public compatibility dependencies before the private-index step, as shown below.

.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"
          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.

Before installing, check the release-specific Python and platform prerequisites. On Python 3.10, install the public compatibility dependencies before the private-index step, as shown below.

Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.12-slim
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.

Before installing, check the release-specific Python and platform prerequisites. On Python 3.10, install the public compatibility dependencies before the private-index step, as shown below.

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"
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.

Wolf Runtime with npx

Wolf Runtime ships as the @wolfsdk/wolf npm package for Node.js 18 or later. Only the launcher and the native package for your platform are installed (macOS arm64 or x86_64, Linux arm64 or x86_64, Windows x86_64), with no install scripts. Use a credential from a Runtime evaluation or an Order naming Wolf Runtime. WolfXL-only credentials are refused with HTTP 401.

Before installing, check the release-specific Python and platform prerequisites. On Python 3.10, install the public compatibility dependencies before the private-index step, as shown below.

Encode the credential for npm. Type both values at the prompts to keep the secret out of shell history
python -c "import base64, getpass; u = input('Username: '); s = getpass.getpass('Secret: '); print(base64.b64encode((u + ':' + s).encode()).decode())"
~/.npmrc on macOS or Linux (then run chmod 600 ~/.npmrc), or %USERPROFILE%\.npmrc on Windows
@wolfsdk:registry=https://packages.wolfxl.com/wolf/npm/
//packages.wolfxl.com/wolf/npm/:_auth=<encoded credential>
Run
npx --yes @wolfsdk/wolf --version
CI or agent sandbox
# WOLFXL_INDEX_USERNAME and WOLFXL_INDEX_PASSWORD come from your secret store.
NPM_CONFIG_USERCONFIG="$(mktemp)"
export NPM_CONFIG_USERCONFIG
trap 'rm -f "$NPM_CONFIG_USERCONFIG"' EXIT
printf '%s\n' "@wolfsdk:registry=https://packages.wolfxl.com/wolf/npm/" "//packages.wolfxl.com/wolf/npm/:_auth=$(printf '%s:%s' "$WOLFXL_INDEX_USERNAME" "$WOLFXL_INDEX_PASSWORD" | base64 | tr -d '\n')" > "$NPM_CONFIG_USERCONFIG"
npx --yes @wolfsdk/wolf --version

The credential is sent only to packages.wolfxl.com/wolf/npm/. The encoded value is reversible, so protect it like the secret. Do not run the CI step with shell tracing (set -x). In a sandbox that limits outbound network access, allow packages.wolfxl.com.

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.