Metadata-Version: 2.5
Name: sweatstack-cli
Version: 0.12.1
Summary: Command-line interface for SweatStack — the sports data platform for developers
Project-URL: Homepage, https://sweatstack.no
Project-URL: Documentation, https://docs.sweatstack.no
Project-URL: Repository, https://github.com/sweatstack/sweatstack-cli
Author-email: Aart Goossens <aart@sweatstack.no>
License: MIT
Keywords: api,cli,fitness,sports,sweatstack
Classifier: Development Status :: 3 - Alpha
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.11
Requires-Dist: httpx>=0.28.0
Requires-Dist: platformdirs>=4.0
Requires-Dist: typer>=0.15.0
Provides-Extra: dev
Requires-Dist: coverage>=7.0; extra == 'dev'
Requires-Dist: mypy>=1.14; extra == 'dev'
Requires-Dist: pytest-httpx>=0.35; extra == 'dev'
Requires-Dist: pytest>=8.0; extra == 'dev'
Requires-Dist: ruff>=0.9; extra == 'dev'
Description-Content-Type: text/markdown

# SweatStack CLI

Command-line interface for [SweatStack](https://sweatstack.no) — the sports data platform for developers.

## Installation

Requires Python 3.11+. We recommend [uv](https://docs.astral.sh/uv/) for installation.

```bash
# Run directly without installing
uvx sweatstack-cli

# Or install as a tool
uv tool install sweatstack-cli

# Or with pip
pip install sweatstack-cli
```

To upgrade:

```bash
uv tool upgrade sweatstack-cli
```

To reinstall (e.g. after a broken install or Python version change):

```bash
uvx --reinstall sweatstack-cli
# or if installed as a tool
uv tool install --reinstall sweatstack-cli
```

## Quick Start

```bash
# Authenticate with SweatStack
sweatstack login

# Create an app with a page, and scaffold public/index.html
sweatstack page init "My App"

# Preview locally, then publish to https://my-app.pages.sweatstack.dev
sweatstack page serve
sweatstack page deploy
```

## Commands

### Authentication

| Command | Description |
|---------|-------------|
| `sweatstack login` | Authenticate via browser (OAuth2 PKCE) |
| `sweatstack login --force` | Force re-authentication |
| `sweatstack logout` | Remove stored credentials |
| `sweatstack status` | Show auth status, user info, and version |
| `sweatstack --version` | Show version and check for updates |

### Application Management

| Command | Description |
|---------|-------------|
| `sweatstack app create [NAME]` | Create a new private OAuth2 application |
| `sweatstack app link` | Link current directory to an existing application |

#### `app create` options

| Option | Description |
|--------|-------------|
| `--description, -d TEXT` | Application description (max 500 chars) |
| `--page, -p SLUG` | Associate with a SweatStack Page |
| `--secret, -s` | Generate a client secret |
| `--env` | Write credentials to `.env` |
| `--env-file PATH` | Write credentials to a specific file |
| `--json` | Output as JSON |

#### `app link` options

| Option | Description |
|--------|-------------|
| `--force, -f` | Overwrite existing `sweatstack.toml` |

### Project Configuration

`app create`, `app link` and `page init` generate a `sweatstack.toml` in the current directory. Other commands read defaults from this file.

```toml
[app]
name = "My App"
client_id = "abc123"

[page]
slug = "my-page"
directory = "dist"
```

### Pages

Static sites hosted at `https://<slug>.pages.sweatstack.dev`. Each application has at most one page.

| Command | Description |
|---------|-------------|
| `sweatstack page init [NAME]` | Create an app and its page, and scaffold `public/index.html` |
| `sweatstack page serve` | Preview the site locally |
| `sweatstack page deploy [SLUG]` | Publish the site, creating the page if needed |

#### `page init`

Creates a private application and its page, records both in `sweatstack.toml`, and writes a starter app to `public/index.html` that signs in with SweatStack and plots your latest activity. The slug is derived from the name. With an app already linked in `sweatstack.toml`, it reuses that app instead of creating one.

| Option | Description |
|--------|-------------|
| `--slug TEXT` | Page slug (default: derived from the name) |
| `--dir PATH` | Directory to scaffold (default: `public`) |
| `--title TEXT` | Title shown on the page (default: the name) |
| `--client-id TEXT` | Reuse an existing application |
| `--force, -f` | Overwrite an existing `index.html` |

#### `page serve`

Serves the `[page] directory` from `sweatstack.toml` on the first free port from 8000. Extra arguments are passed to `python -m http.server`. Apps created by the CLI accept sign-in redirects to localhost on any port.

#### `page deploy`

```bash
# Deploy using sweatstack.toml defaults (recommended)
sweatstack page deploy

# Or specify slug and directory explicitly
sweatstack page deploy my-page --dir ./dist
```

Every deploy replaces all files on the page. If the page doesn't exist yet, `deploy` creates it. With an app linked in `sweatstack.toml`, it creates that app's page. Without one, it asks to create a new app with the page, and fails instead when not run interactively (e.g. in CI).

New apps are private: only you can sign in. After deploying, `deploy` prints a link to make the app public.

**Limits:** 10 MB per file; 100 MB and about 1,000 files per deploy.

## License

MIT
