Metadata-Version: 2.4
Name: highflame-forge
Version: 0.0.7
Summary: Run coding agents like Claude Code in isolated, policy-enforced cloud sandboxes
Project-URL: Homepage, https://github.com/highflame-ai/highflame-forge
Project-URL: Documentation, https://github.com/highflame-ai/highflame-forge#readme
Project-URL: Repository, https://github.com/highflame-ai/highflame-forge
Project-URL: Issues, https://github.com/highflame-ai/highflame-forge/issues
Author-email: Highflame Team <team@highflame.ai>
License: MIT
License-File: LICENSE
Keywords: agent,ai-agent,claude-code,coding-agent,developer-tools,gvisor,isolation,sandbox,security
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: MacOS
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Security
Classifier: Topic :: Software Development :: Build Tools
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.12
Requires-Dist: click>=8.1.0
Requires-Dist: httpx>=0.27.0
Requires-Dist: pathspec>=0.12
Requires-Dist: pydantic>=2.5.0
Requires-Dist: pyyaml>=6.0
Requires-Dist: rich>=13.7.0
Requires-Dist: typer>=0.9.0
Requires-Dist: websockets>=13.0
Provides-Extra: all
Requires-Dist: asyncssh>=2.23.1; extra == 'all'
Requires-Dist: cryptography>=49.0.0; extra == 'all'
Requires-Dist: fastapi>=0.137.0; extra == 'all'
Requires-Dist: google-cloud-aiplatform>=1.38.0; extra == 'all'
Requires-Dist: google-cloud-compute>=1.14.0; extra == 'all'
Requires-Dist: highflame-policy>=2.2.28; extra == 'all'
Requires-Dist: httpx>=0.27.0; extra == 'all'
Requires-Dist: modal>=1.5.2; extra == 'all'
Requires-Dist: opentelemetry-api>=1.27.0; extra == 'all'
Requires-Dist: opentelemetry-exporter-otlp>=1.27.0; extra == 'all'
Requires-Dist: opentelemetry-sdk>=1.27.0; extra == 'all'
Requires-Dist: pydantic-settings>=2.14.2; extra == 'all'
Requires-Dist: pyjwt[crypto]>=2.8.0; extra == 'all'
Requires-Dist: runpod>=1.6.0; extra == 'all'
Requires-Dist: starlette>=1.3.1; extra == 'all'
Requires-Dist: uvicorn[standard]>=0.26.0; extra == 'all'
Provides-Extra: dev
Requires-Dist: mypy>=1.8.0; extra == 'dev'
Requires-Dist: opentelemetry-sdk>=1.27.0; extra == 'dev'
Requires-Dist: pre-commit>=3.6.0; extra == 'dev'
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
Requires-Dist: pytest-timeout>=2.3.0; extra == 'dev'
Requires-Dist: pytest>=7.4.0; extra == 'dev'
Requires-Dist: ruff>=0.1.6; extra == 'dev'
Provides-Extra: gcp
Requires-Dist: google-cloud-aiplatform>=1.38.0; extra == 'gcp'
Requires-Dist: google-cloud-compute>=1.14.0; extra == 'gcp'
Provides-Extra: modal
Requires-Dist: modal>=1.5.2; extra == 'modal'
Provides-Extra: runpod
Requires-Dist: asyncssh>=2.23.1; extra == 'runpod'
Requires-Dist: runpod>=1.6.0; extra == 'runpod'
Provides-Extra: seccomp
Requires-Dist: pyseccomp>=0.1.2; (sys_platform == 'linux') and extra == 'seccomp'
Provides-Extra: service
Requires-Dist: cryptography>=49.0.0; extra == 'service'
Requires-Dist: fastapi>=0.137.0; extra == 'service'
Requires-Dist: highflame-policy>=2.2.28; extra == 'service'
Requires-Dist: httpx>=0.27.0; extra == 'service'
Requires-Dist: opentelemetry-api>=1.27.0; extra == 'service'
Requires-Dist: opentelemetry-exporter-otlp>=1.27.0; extra == 'service'
Requires-Dist: opentelemetry-sdk>=1.27.0; extra == 'service'
Requires-Dist: pydantic-settings>=2.14.2; extra == 'service'
Requires-Dist: pyjwt[crypto]>=2.8.0; extra == 'service'
Requires-Dist: starlette>=1.3.1; extra == 'service'
Requires-Dist: uvicorn[standard]>=0.26.0; extra == 'service'
Description-Content-Type: text/markdown

# Highflame Forge

[![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

**Run coding agents like Claude Code in isolated, policy-enforced cloud sandboxes.**

`forge` is a CLI client of the hosted Forge control plane. You sign in, launch
an agent in an isolated sandbox, and never put cloud-provider credentials on
your laptop. Requires Python 3.12+ on macOS or Linux.

## Install

`forge` is a console script. Install it as a **tool** so the `forge` binary
lands on your PATH (usually `~/.local/bin` on Linux):

```bash
uv tool install highflame-forge
```

If the next prompt says `command not found`, that directory is not on PATH yet:

```bash
uv tool update-shell
# then open a new terminal, or: export PATH="$HOME/.local/bin:$PATH"
```

`uv pip install highflame-forge` only installs into the active virtualenv. The
script then lives at `.venv/bin/forge` and is invisible until you `source
.venv/bin/activate`, or you run `uv run --with highflame-forge forge …`.

Alternatively:

```bash
pipx install highflame-forge
```

## First run

```bash
forge login
forge connect
forge create --harness claude-code
```

1. `forge login` opens a browser and stores credentials for this machine.
   Account and project are fixed at sign-in; switch project by signing in
   again with `--project NAME`.
2. `forge connect` authorizes GitHub so private repos clone. Skip it for
   public repos — `forge claude` will also prompt the first time it meets a
   private repo.
3. `forge create --harness claude-code` always starts a **new** sandbox. Run
   it from a git checkout and that repo is cloned in (current branch, unless
   you pass `--repo` / `--ref`). It prints an id; open a shell with
   `forge shell --id <id>`.

Day to day, use `forge claude` from the checkout instead. It reattaches to
the workspace you already have, and launches one if you do not.

```bash
cd ~/src/my-repo
forge claude
```

Arguments after `forge claude` are passed through to `claude`. Put `--` first
for any that Forge would otherwise read as its own.

On a machine with no browser (typically SSH into a dev box):

```bash
forge login --headless
```

## Commands

`forge --help` is the published surface. There is no `forge train`,
`forge sweep`, `forge estimate`, or `forge gpus`.

### Account

```bash
forge login                 # sign in through your browser
forge login --headless      # print a code to approve from another device
forge login --project NAME  # sign in to this project (name, slug, or id)
forge logout                # discard this profile's stored credentials
forge whoami                # identity, project, and which control plane
forge connect               # GitHub, so private repos work
```

### Workspaces

```bash
forge claude                       # Claude Code; reattaches if one is running
forge claude --id ID               # attach to a specific sandbox
forge shell                        # interactive shell (your only sandbox)
forge shell --id ID                # name the sandbox when you have more than one
forge shell --id ID pwd            # one-off remote command
forge create --harness claude-code # always a fresh sandbox
forge list                         # running sandboxes
forge kill SANDBOX_ID              # shut one down (name it; see forge list)
forge workspaces                   # saved filesystems (outlive the sandbox)
```

`create` is the explicit verb: you pick the agent. Other harnesses that are
wired today:

```bash
forge create --harness codex
forge create --harness python --entrypoint agent.py
forge create --harness langgraph
```

`python` and `langgraph` run **your** agent. The repo comes from your
checkout, its dependencies are installed at boot, and inference is governed
the same way as every other harness — with no Highflame-specific code in it.

See `forge create --help` for the full harness list, egress bundles
(`--policy-bundle`), isolation floor (`--isolation`), and billing flags
(`--subscription`, `--byok`, `--key-free`, `--direct`). Names that are not
wired yet fail rather than provision a broken sandbox.

## Configuration

The CLI talks HTTPS to the control plane. It does not take cloud-provider
credentials. Optional overrides:

```bash
# Which stored login to use (also: forge --profile NAME …)
FORGE_PROFILE=default

# Set at login if you are not on the default deployment
FORGE_API_URL=https://api-dev.highflame.dev
FORGE_AUTH_URL=https://studio-dev.highflame.dev
```

`--api-url` and `--auth-url` live on `forge login` only. Switching
deployments is a re-login, so a token minted against one environment is never
sent to another.

## Development

```bash
git clone https://github.com/highflame-ai/highflame-forge.git
cd highflame-forge
uv sync --extra dev

uv run pytest tests/
uv run mypy src/highflame_forge
uv run ruff check src/
```

## License

MIT License — see [LICENSE](LICENSE) for details.
