Metadata-Version: 2.4
Name: owa-tui
Version: 0.3.0
Summary: Textual TUI front-end for the owa-tools Microsoft 365 CLI suite
Author: Carl Joakim Damsleth
License-Expression: MIT
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: textual>=0.60
Requires-Dist: owa-tools>=1.7.0
Provides-Extra: platformdirs
Requires-Dist: platformdirs>=4; extra == "platformdirs"
Provides-Extra: dev
Requires-Dist: build>=1; extra == "dev"
Requires-Dist: pytest>=7; extra == "dev"
Requires-Dist: pytest-cov>=4; extra == "dev"
Requires-Dist: pytest-textual-snapshot<1.1,>=1; extra == "dev"
Requires-Dist: syrupy>=5; extra == "dev"
Requires-Dist: ruff>=0.4; extra == "dev"
Dynamic: license-file

# owa-tui

`owa-tui` is a Textual terminal UI front-end for the `owa-tools` Microsoft 365
CLI suite.

The project is intentionally separate from `owa-tools`: `owa-tui` imports only
the stable `owa-tools` library API and never imports broker internals directly.

## Status

## Install

```bash
uv tool install owa-tui          # or: pipx install owa-tui
# or
brew install damsleth/tap/owa-tui
```

Installing from PyPI pulls in `owa-tools` and `owa-piggy`. Set up an
`owa-piggy` profile before first use.

## Usage

```bash
owa-tui --help
owa-tui --version
owa-tui
owa-tui cal          # or: owa-tui --tool cal
owa-tui mail --profile une            # one owa-piggy profile
owa-tui cal -A                        # merge every eligible profile
owa-tui mail --profile une --profile nc
```

`-A` (or `--profile all`, or `--profile` given more than once) merges the list
screens (cal, mail, people, tasks, planner, ado, teams) across profiles, using
the same eligibility rule as owa-tools' `-A`. Rows get a profile column, and
anything you do to a row (respond, reply, mark read, open) runs as that row's
profile. Esc → Switch profile goes back to a single profile.

Running `owa-tui` starts the Textual shell. No Microsoft Graph or broker calls
are made during startup.

## Development

```bash
.venv/bin/ruff check .
.venv/bin/python -m compileall -q src
.venv/bin/python -m pytest -q --cov --cov-fail-under=85
uv build
```

CI (`.github/workflows/ci.yml`) runs all of the above plus the tui-test e2e
suite on Python 3.10–3.12 for every push to `main` and every PR.

### End-to-end terminal tests (tui-test)

In-process pytest covers widget logic; [`@microsoft/tui-test`](https://github.com/microsoft/tui-test)
covers the real binary by spawning `owa-tui` in a pty and asserting on what it
actually renders. Tests live in `e2e/`.

```bash
npm install          # one-time
npm run test:e2e     # or: npx tui-test
```

`owa-tui` must be importable on `PATH` (e.g. `pip install -e .`). Traces land in
`tui-traces/`; replay with `npx tui-test show-trace`.

A live-Graph smoke runs only when opted in: `OWA_TUI_LIVE_E2E=1 npx tui-test
e2e/live.test.ts` (and `OWA_TUI_LIVE_TESTS=1` for the unit-level token smoke).

## Releasing

Pushing a `v*` tag triggers `.github/workflows/release.yml`: it re-runs the
full gates (lint, compile, coverage, e2e) on Python 3.10–3.12, then `uv build`s
the wheel/sdist and publishes a GitHub Release. PyPI upload is local
(`uv publish`); see `RELEASING.md`. Standalone binaries are deferred, not planned.
