Metadata-Version: 2.5
Name: workweaver
Version: 0.1.18
Summary: Workweaver turns a goal you state in plain language into finished work, with a receipt for every decision.
Project-URL: Homepage, https://workweaver.ai
Project-URL: Repository, https://github.com/bitfoundry-ai/workweaver
Project-URL: Documentation, https://workweaver.ai/docs
Author-email: Workweaver <hello@workweaver.ai>
License-Expression: AGPL-3.0-or-later
License-File: LICENSE
License-File: LICENSE-COMMERCIAL
Keywords: acp,agents,ai,edge-harness,workmemory
Classifier: Development Status :: 3 - Alpha
Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Requires-Python: >=3.10
Requires-Dist: a2a-sdk==1.1.1
Requires-Dist: agent-client-protocol>=0.10.1
Requires-Dist: aiohttp>=3.14.0
Requires-Dist: aiosqlite>=0.22.1
Requires-Dist: argon2-cffi>=23.1.0
Requires-Dist: bcrypt>=5.0.0
Requires-Dist: beautifulsoup4>=4.14
Requires-Dist: cbor2>=6.1.1
Requires-Dist: claude-agent-sdk<0.3,>=0.2.0
Requires-Dist: croniter>=6.2.2
Requires-Dist: cryptography>=48.0.0
Requires-Dist: email-validator>=2.2.0
Requires-Dist: eth-hash[pycryptodome]>=0.8.0
Requires-Dist: fastapi>=0.135.0
Requires-Dist: httpx>=0.28.0
Requires-Dist: jsonschema>=4.23
Requires-Dist: orjson>=3.11.0
Requires-Dist: prompt-toolkit>=3.0.52
Requires-Dist: pydantic-settings>=2.13.0
Requires-Dist: pydantic>=2.12.0
Requires-Dist: pyjwt>=2.8
Requires-Dist: python-dateutil>=2.9.0
Requires-Dist: python-dotenv>=1.2.2
Requires-Dist: python-multipart>=0.0.30
Requires-Dist: pyyaml>=6.0
Requires-Dist: rich>=15.0.0
Requires-Dist: slowapi>=0.1.9
Requires-Dist: sqlite-vec>=0.1.6
Requires-Dist: structlog>=25.0.0
Requires-Dist: tenacity>=9.0
Requires-Dist: tomli>=2.0.1; python_version < '3.11'
Requires-Dist: typing-extensions>=4.4; python_version < '3.11'
Requires-Dist: tzdata>=2026.2
Requires-Dist: ulid-py>=1.1.0
Requires-Dist: uvicorn[standard]>=0.44.0
Requires-Dist: zstandard>=0.23.0
Provides-Extra: aws
Requires-Dist: boto3>=1.43.36; extra == 'aws'
Requires-Dist: botocore>=1.43.36; extra == 'aws'
Provides-Extra: browser
Requires-Dist: playwright>=1.40; extra == 'browser'
Provides-Extra: dev
Requires-Dist: cel-python>=0.5.0; extra == 'dev'
Requires-Dist: freezegun>=1.5; extra == 'dev'
Requires-Dist: hypothesis>=6.140; extra == 'dev'
Requires-Dist: moto>=5.2.1; extra == 'dev'
Requires-Dist: pyright>=1.1; extra == 'dev'
Requires-Dist: pytest-asyncio>=1.3; extra == 'dev'
Requires-Dist: pytest-cov>=7.1; extra == 'dev'
Requires-Dist: pytest-randomly>=4.1; extra == 'dev'
Requires-Dist: pytest-rerunfailures>=16.3; extra == 'dev'
Requires-Dist: pytest-socket>=0.8; extra == 'dev'
Requires-Dist: pytest-timeout>=2.4; extra == 'dev'
Requires-Dist: pytest-xdist>=3.8; extra == 'dev'
Requires-Dist: pytest>=9.0; extra == 'dev'
Requires-Dist: ruff>=0.15; extra == 'dev'
Provides-Extra: documents
Requires-Dist: docling>=2.5; extra == 'documents'
Requires-Dist: numpy>=2.4.6; extra == 'documents'
Requires-Dist: openpyxl>=3.1; extra == 'documents'
Requires-Dist: pypdf>=6.10; extra == 'documents'
Requires-Dist: python-docx>=1.2; extra == 'documents'
Requires-Dist: python-pptx>=1.0; extra == 'documents'
Requires-Dist: reportlab>=4.4; extra == 'documents'
Provides-Extra: full
Requires-Dist: asyncpg>=0.29; extra == 'full'
Requires-Dist: audioop-lts>=0.2; (python_version >= '3.13') and extra == 'full'
Requires-Dist: boto3>=1.43.36; extra == 'full'
Requires-Dist: botocore>=1.43.36; extra == 'full'
Requires-Dist: docling>=2.5; extra == 'full'
Requires-Dist: keyring>=25.6.0; extra == 'full'
Requires-Dist: numpy>=2.4.6; extra == 'full'
Requires-Dist: openpyxl>=3.1; extra == 'full'
Requires-Dist: phonenumbers>=9.0; extra == 'full'
Requires-Dist: playwright>=1.40; extra == 'full'
Requires-Dist: psycopg-pool>=3.3.1; extra == 'full'
Requires-Dist: psycopg[binary]>=3.3.4; extra == 'full'
Requires-Dist: pypdf>=6.10; extra == 'full'
Requires-Dist: python-docx>=1.2; extra == 'full'
Requires-Dist: python-pptx>=1.0; extra == 'full'
Requires-Dist: pywebpush>=2.0; extra == 'full'
Requires-Dist: reportlab>=4.4; extra == 'full'
Requires-Dist: stripe>=15.0; extra == 'full'
Requires-Dist: twilio>=9.10; extra == 'full'
Requires-Dist: wasmtime>=40.0; extra == 'full'
Requires-Dist: websockets>=16.0; extra == 'full'
Provides-Extra: gateway
Requires-Dist: litellm>=1.99.0; extra == 'gateway'
Provides-Extra: keyring
Requires-Dist: keyring>=25.6.0; extra == 'keyring'
Provides-Extra: payments
Requires-Dist: stripe>=15.0; extra == 'payments'
Provides-Extra: postgres
Requires-Dist: asyncpg>=0.29; extra == 'postgres'
Requires-Dist: psycopg-pool>=3.3.1; extra == 'postgres'
Requires-Dist: psycopg[binary]>=3.3.4; extra == 'postgres'
Provides-Extra: telephony
Requires-Dist: audioop-lts>=0.2; (python_version >= '3.13') and extra == 'telephony'
Requires-Dist: phonenumbers>=9.0; extra == 'telephony'
Requires-Dist: twilio>=9.10; extra == 'telephony'
Provides-Extra: voice
Requires-Dist: websockets>=16.0; extra == 'voice'
Provides-Extra: wasm
Requires-Dist: wasmtime>=40.0; extra == 'wasm'
Provides-Extra: webpush
Requires-Dist: pywebpush>=2.0; extra == 'webpush'
Description-Content-Type: text/markdown

# Workweaver

[![License: AGPL-3.0-or-later](https://img.shields.io/badge/license-AGPL%203.0%20or%20later-blue.svg)](https://www.gnu.org/licenses/agpl-3.0.html)

Workweaver turns a goal you state in plain language into finished work, with a receipt for every decision.

`ww` is the Alpha CLI for that product (Python 3.10+). It remains the
generic edge harness for Workweaver. One install covers knowledge work,
coding, WorkMemory, and bidirectional ACP — the same pipe, not four
products.

## Install

```bash
python -m pip install workweaver
```

On Windows, use the Python launcher:

```powershell
py -m pip install workweaver
```

The same wheel exposes `ww`, `workweaver`, and `python -m workweaver`.
Requires Python 3.10 or newer (the `requires-python` floor in
`pyproject.toml`).

If the `ww` script is not on `PATH`, run the module form:

```bash
python -m workweaver --help
```

`pipx install workweaver` is optional when you want an isolated CLI
environment. Repo-local install (`python -m pip install -e .` from the
repo root) still works for active development.

## The edge harness

`ww` is the local command surface:

- **Knowledge** — goals, missions, skills, evidence, and receipts from the
  edge.
- **Coding** — local execution legs for governed coding work.
- **WorkMemory** — remember, recall, and forget through the same pipe as
  the rest of the harness. Writes queue locally when the API is
  unreachable and replay on sync.
- **Bidirectional ACP** — `ww acp start` serves Workweaver to editors and
  other agents; `ww acp invoke` drives invited agents. Workweaver is both
  component and orchestrator.

WorkMemory is not a second install or a second product. It rides the
same `ww` pipe.

## Start

```bash
ww login
ww memory recall "what did we decide last week"
ww acp start
```

`ww login` opens the Workweaver sign-in flow and works for both sign-in
and sign-up. CLI session metadata and bearer tokens are saved in
`~/.workweaver/config.yaml` with file mode `0600` by default; the CLI
does not touch the OS keyring unless an operator explicitly sets
`WW_ALLOW_KEYRING=1` and installs the optional keyring extra.

Self-host and first-run deployment paths live in
[docs/SELF-HOST.md](docs/SELF-HOST.md), including the
prerequisites matrix that states what `pip install` covers and what each
self-host topology still needs. They are not the primary listing story.

## Package

Live listing: <https://pypi.org/project/workweaver/>.

Releases are cut by tag through `.github/workflows/release-pypi.yml`
using PyPI Trusted Publishing (OIDC). No API tokens live in the repo.
Tags matching `pyproject.toml` pre-release versions (e.g. `v0.1.0a1`)
publish to TestPyPI; final versions publish to PyPI.

Release operators use the guarded repo targets instead of hand-rolling
tags:

```bash
VERSION=0.1.13 make release-python-prepare
VERSION=0.1.13 make release-python-check
VERSION=0.1.13 make release-python-tag
VERSION=0.1.13 make release-python-smoke-public
```

Validate a prerelease against TestPyPI:

```bash
python -m pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ workweaver
```

Then verify the installed CLI contract:

```bash
ww --version
ww memory --help
ww acp --help
```

## Repository checks

Contributors validate infra cost posture with `make cost-guard` (offline
fixed-floor register and Terraform resource review, also part of
`make check-meta`); the contract it enforces lives in
`ops/cost/profile-cost-ceilings.json`.

Canonical architecture and product truth live in:

- `policy/docs-index.yaml`
- `docs/canonical/RUNTIME.md`
- `docs/canonical/PRODUCT.md`
- `docs/canonical/CLI.md`
- `docs/reference/runtime/acp-contracts.md`

## Repository development

Development targets are defined in the repository `Makefile`. The structural
fixed-floor cost guard is enforced in CI and locally with `make cost-guard`.

<!-- ci-canary probe 2026-09-21, PR 15051 triage -->
