Metadata-Version: 2.4
Name: workweaver
Version: 0.1.8
Summary: AI for business operations — open-source, self-hostable
Project-URL: Homepage, https://workweaver.ai
Project-URL: Repository, https://github.com/bitfoundry-ai/workweaver
Project-URL: Documentation, https://docs.workweaver.ai
Author-email: Workweaver <hello@workweaver.ai>
License-Expression: AGPL-3.0-or-later
License-File: LICENSE
Keywords: agents,ai,automation,business-operations,workforce
Classifier: Development Status :: 3 - Alpha
Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
Classifier: Programming Language :: Python :: 3.13
Requires-Python: <3.14,>=3.13
Requires-Dist: aiohttp>=3.13.5
Requires-Dist: aiosqlite>=0.20.0
Requires-Dist: argon2-cffi>=23.1.0
Requires-Dist: bcrypt>=5.0.0
Requires-Dist: beautifulsoup4>=4.14
Requires-Dist: biscuit-python>=0.4.0; python_version < '3.14'
Requires-Dist: boto3>=1.42
Requires-Dist: claude-agent-sdk<0.2,>=0.1.63
Requires-Dist: croniter>=6.2.2
Requires-Dist: cryptography>=46.0.7
Requires-Dist: email-validator>=2.2.0
Requires-Dist: fastapi>=0.135.0
Requires-Dist: httpx>=0.28.0
Requires-Dist: jsonschema>=4.23
Requires-Dist: livekit-api>=1.1.0
Requires-Dist: livekit>=1.1.7
Requires-Dist: numpy>=2.4.4
Requires-Dist: orjson>=3.11.0
Requires-Dist: phonenumbers>=9.0.29
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-dotenv>=1.2.2
Requires-Dist: python-multipart>=0.0.20
Requires-Dist: pyyaml>=6.0
Requires-Dist: reportlab>=4.5.0
Requires-Dist: rich>=13.9.0
Requires-Dist: slowapi>=0.1.9
Requires-Dist: sqlite-vec>=0.1.6
Requires-Dist: stripe>=15.0
Requires-Dist: structlog>=25.0.0
Requires-Dist: tzdata>=2026.2
Requires-Dist: ulid-py>=1.1.0
Requires-Dist: uvicorn[standard]>=0.44.0
Provides-Extra: aws
Requires-Dist: boto3>=1.42; extra == 'aws'
Requires-Dist: botocore>=1.42; extra == 'aws'
Provides-Extra: browser
Requires-Dist: playwright>=1.40; extra == 'browser'
Provides-Extra: dev
Requires-Dist: freezegun>=1.5; extra == 'dev'
Requires-Dist: moto>=5.1.22; 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-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: 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; extra == 'full'
Requires-Dist: boto3>=1.42; extra == 'full'
Requires-Dist: botocore>=1.42; extra == 'full'
Requires-Dist: keyring>=25.6.0; extra == 'full'
Requires-Dist: livekit-api>=1.1; extra == 'full'
Requires-Dist: livekit>=1.1; 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: psycopg2-binary>=2.9; 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: reportlab>=4.4; extra == 'full'
Requires-Dist: stripe>=15.0; extra == 'full'
Requires-Dist: twilio>=9.10; extra == 'full'
Requires-Dist: websockets>=16.0; extra == 'full'
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: psycopg2-binary>=2.9; extra == 'postgres'
Provides-Extra: telephony
Requires-Dist: audioop-lts>=0.2; extra == 'telephony'
Requires-Dist: phonenumbers>=9.0; extra == 'telephony'
Requires-Dist: twilio>=9.10; extra == 'telephony'
Provides-Extra: voice
Requires-Dist: livekit-api>=1.1; extra == 'voice'
Requires-Dist: livekit>=1.1; extra == 'voice'
Requires-Dist: websockets>=16.0; extra == 'voice'
Description-Content-Type: text/markdown

# Workweaver

Workweaver is an AI business operating system built around one codebase and
multiple deployment profiles:

- `managed_saas` for managed cloud runtime
- `self_host_production` for customer-managed deployments
- `standalone` and local-first development paths

## Install The CLI

The default user path is Workweaver Cloud:

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

On Windows, use the Python launcher:

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

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

```bash
python -m workweaver login
```

`pipx install workweaver` is optional when you want an isolated CLI
environment, but it is not required for the primary install path. The same
wheel exposes `ww`, `workweaver`, and `python -m workweaver`. Repo-local install
(`python -m pip install -e .` from the repo root) still works for active
development.

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

For users who do not want to sign in with workweaver.ai, choose the standalone
self-host path:

```bash
ww init --email operator@local --password "SelfHost1!" --tenant-name "My Workspace"
ww start
```

`My Workspace` is only the default tenant display name. Workweaver config and
data default under the current user's `~/.workweaver` directory, and CLI commands
can point at another config file with `--config /path/to/config.yaml`.

Packaged-install path is live on PyPI: <https://pypi.org/project/workweaver/>.

PyPI release automation lives in `.github/workflows/release-pypi.yml`. Tags
matching `pyproject.toml` pre-release versions (e.g. `v0.1.0a1`) publish to
TestPyPI; final versions (e.g. `v0.1.1`) publish to PyPI. Both indices use
Trusted Publishing/OIDC; no API tokens live in the repo.

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

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

Validate the latest 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 mode --output json
ww inference --help
```

For self-host runtime changes, verify the local backend contract:

```bash
curl http://127.0.0.1:8080/health
curl -i http://127.0.0.1:8080/dashboard
```

Docker self-host proof path:

```bash
make self-host-smoke
```

The self-host smoke starts Postgres, Valkey, and the backend with no AWS
credentials, verifies the `self_host_production` profile, dashboard serving,
WorkMemory remember/recall, and mission/task read paths. If Docker is not
available it skips cleanly unless `SELF_HOST_SMOKE_REQUIRED=1` is set.

Cost posture proof path:

```bash
make cost-guard
```

The cost guard checks the committed deployment-profile ceilings, managed
`cost_tier` Terraform controls, and AWS resource-type cost-review coverage
without calling paid cloud APIs.

Fast deterministic unit proof path:

```bash
make test-unit-fast
```

This runs `tests/unit/` with pytest-xdist `--dist loadfile`, `-n auto`,
`--timeout=120`, no coverage, and no pytest cache. By default it uses the
shared unit-test interpreter at
`/Users/santhanakrishnan/Documents/Coding/workweaver/.venv/bin/python`; set
`UNIT_PYTHON=/path/to/python` when running from another machine or worktree.
Use it for the canonical local unit-health signal. Keep `make test-unit` for
coverage diagnostics and `make enforce-coverage` for the coverage gate.

Canonical architecture and product truth live in:

- `policy/docs-index.yaml`
- `docs/RUNTIME.md`
- `docs/PRODUCT.md`

The managed SaaS runtime direction is frozen in
`docs/RUNTIME.md`:

- serverless edge compute for the public path
- portable relational core for stateful intelligence
- provider-specific adapters only at the boundary
