Skip to main content

augint-shell

CI Coverage Release PyPI version Python 3.12+ License

augint-shell is a Python 3.12+ command-line tool (the ai-shell command) that launches AI coding tools (Claude Code, Codex, opencode) and local LLMs (Ollama, Open WebUI, Kokoro TTS, Speaches STT) in per-project Docker containers. It is built on Click for the CLI and the Docker SDK for Python to build and orchestrate those containers. As a library/CLI it runs no servers of its own: releases are published automatically to PyPI (augint-shell) and Docker Hub (svange/augint-shell).


Pipeline Artifacts

Reports are published to GitHub Pages on every push to main.

Report Link
API docs svange.github.io/augint-shell/ai_shell.html
Test coverage svange.github.io/augint-shell/coverage/htmlcov/
Test results svange.github.io/augint-shell/coverage/test-report.html
Security scans svange.github.io/augint-shell/security/
License compliance svange.github.io/augint-shell/compliance/
PyPI package pypi.org/project/augint-shell/

Documentation

Document What's inside
CLAUDE.md Architecture -- dependency flow, the two container categories, config/env layering, mount assembly, and the scaffold system. Primary guidance for Claude Code.
AGENTS.md Agent & contributor rules -- project layout, build/test commands, coding style, testing, and commit/PR conventions.
TMUX.md Runbook for ai-shell claude --multi -- multi-pane tmux running Claude Code across several repos in one container.
CHANGELOG.md Release history, generated by Python Semantic Release from Conventional Commits.
LICENSE License terms.

Release & Branch Model

augint-shell is a library/CLI: it has no staging or production servers. Instead of deploy environments, git refs map to publish targets, and releasing is fully automated -- there is no manual deploy step.

Git ref Pipeline runs Publishes to
Feature branch -> PR to main Code quality, security scans, license compliance, unit tests, build validation Nothing (validation only)
Push / merge to main All of the above, then Python Semantic Release cuts a version when Conventional Commits warrant one PyPI, Docker Hub, and the Pipeline Artifacts reports on GitHub Pages

The single deploy environment is the GitHub Actions pypi environment (trusted publishing via OIDC -- no stored PyPI token). The Docker image also rebuilds when files under docker/ change, independent of a version bump. Full pipeline: .github/workflows/publish.yaml.


What This Does

ai-shell is a Python CLI that stands up:

  1. Per-project dev containers (augint-shell-{project}-dev) -- one per repo, runs Claude Code, Codex, opencode, or aider with your project mounted, SSH keys, AWS creds, and tool configs wired in.
  2. Host-level LLM stack (shared singletons) -- Ollama, Open WebUI, Kokoro TTS, Speaches STT, a Pipecat voice agent, and n8n on a common Docker network. GPU auto-detected.

One command replaces the old Makefile + docker-compose.yml workflow.


Getting Started

This project uses AI-assisted development. You do not need to memorize git commands or CI configuration -- your AI agent handles that.

Prerequisites

  • Docker
  • Python >= 3.12
  • (Optional) NVIDIA GPU + drivers for local LLM acceleration

First-time setup

pip install augint-shell
# or:  uv add --dev augint-shell

Running locally

# Launch Claude Code in the current project
ai-shell claude

# Launch with extra args
ai-shell claude -- --debug

# Set up local LLM stack (first time)
ai-shell llm setup

# Launch opencode with local LLM
ai-shell opencode

How to Contribute

Contributions are made through AI agents (Claude Code, Copilot, etc.). You describe what you want changed in plain language; the agent handles branching, coding, testing, and submitting a pull request.

  1. Open Claude Code (or your AI agent) in this repo.
  2. Describe the change you want -- a bug fix, a new feature, a doc update.
  3. The agent will:
    • Create a feature branch
    • Make the changes
    • Run pre-commit checks and tests
    • Open a pull request
  4. Review the PR when the agent is done. CI runs automatically.
  5. Merge once CI is green.

If you need to work manually, see the full contributor guide (if available).


Commands

AI Tools

Command Description
ai-shell claude Launch Claude Code
ai-shell claude-x Claude Code with skip-permissions
ai-shell codex Launch Codex
ai-shell opencode Launch opencode (TUI)
ai-shell opencode --web Launch opencode web UI with mDNS + CORS
ai-shell opencode serve Headless server + attach all git repos as terminals
ai-shell opencode status Show server URL, mDNS name, attached terminals
ai-shell shell [bash|zsh|fish] Interactive shell in dev container
ai-shell <tool> --t3 Also expose the project to T3 Code (phone/desktop app)
ai-shell <tool> --expo Also start a tunnelled Expo dev server and print its QR code

LLM Stack

Command Description
ai-shell llm up Start Ollama (add --webui, --whisper, --voice-agent, --n8n, --image-gen, or --all)
ai-shell llm down Stop LLM stack
ai-shell llm pull Pull configured models
ai-shell llm models Browse curated model catalog
ai-shell llm unload [MODEL] Unload models from VRAM
ai-shell llm setup First-time setup (up + pull + configure)
ai-shell llm status Show status and available models
ai-shell llm logs Tail LLM stack logs
ai-shell llm shell Shell into Ollama container

Container Management

Command Description
ai-shell manage status Show dev container status
ai-shell manage stop Stop dev container
ai-shell manage clean Remove container and volumes
ai-shell manage logs Tail dev container logs
ai-shell manage pull Pull latest Docker image
ai-shell manage env [--aws] Show resolved environment variables

Configuration

Optional .ai-shell.yaml in your project root (YAML default, TOML also accepted). Run ai-shell init for the full template.

container:
  image: svange/augint-shell
  image_tag: latest
  extra_env:
    MY_VAR: value
  dev_ports: [3000, 4200, 5000, 5173, 5678, 8000, 8080, 8888]
  extra_ports: []

openai:
  profile: work  # resolves OPENAI_API_KEY_WORK from .env

expo:
  auto: true  # start a detected Expo app automatically (--expo/--no-expo override)

llm:
  primary_chat_model: qwen3.5:27b
  secondary_chat_model: huihui_ai/qwen3.5-abliterated:27b
  primary_coding_model: qwen3-coder:30b-a3b-q4_K_M
  secondary_coding_model: huihui_ai/qwen3-coder-abliterated:30b-a3b-instruct-q4_K_M
  context_size: 32768
  ollama_port: 11434
  webui_port: 3000
  comfyui_port: 8188
  extra_models: []

Global config at ~/.ai-shell.yaml or ~/.config/ai-shell/config.yaml also supported.

Launch-time caches

To keep tool launches fast, two preflight checks are cached on the host under ~/.cache/ai-shell/:

Cache Default TTL What it skips
image-pull 15 min docker pull of the latest image to compare digests (network round-trip)
bedrock-check 24 h Bedrock converse preflight that verifies AWS auth + model access

Tune via YAML or env vars:

container:
  image_pull_cache_ttl: 900       # seconds (0 = always pull)
aws:
  bedrock_check_cache_ttl: 86400  # seconds (0 = always verify)

Equivalent env vars: AI_SHELL_IMAGE_PULL_CACHE_TTL, AI_SHELL_BEDROCK_CHECK_CACHE_TTL. Delete the corresponding file under ~/.cache/ai-shell/ to force a recheck on the next launch.


Local LLM stack

Four role-specific model slots, each sized for an RTX 4090 (24 GiB VRAM). All four defaults together total ~74 GB on disk.

Slot Default Size Role Routed to
primary_chat_model qwen3.5:27b 17 GB Best chat model that fits a 4090 Open WebUI default
secondary_chat_model huihui_ai/qwen3.5-abliterated:27b 17 GB Best uncensored chat (abliterated Qwen3.5) Open WebUI (selectable)
primary_coding_model qwen3-coder:30b-a3b-q4_K_M 19 GB Best agentic coder with explicit Ollama tools badge opencode / aider default
secondary_coding_model huihui_ai/qwen3-coder-abliterated:30b-a3b-instruct-q4_K_M 19 GB Best uncensored coder opencode (selectable)

Optional stacks (not auto-started; opt-in with ai-shell llm up --<flag> or --all):

Flag Service Port Notes
--webui Open WebUI 3000 Implies --voice so Kokoro is wired as "read aloud" backend. Use --no-voice to skip.
--voice Kokoro TTS 8880 OpenAI-compatible /v1/audio/speech
--whisper Speaches STT 8001 OpenAI-compatible /v1/audio/transcriptions. GPU image auto-used when NVIDIA is detected
--voice-agent Pipecat voice agent 8010 Push-to-talk PWA (Speaches -> Ollama -> Kokoro). See VOICE_AGENT_PLAN.md
--image-gen ComfyUI 8188 GPU image generation. Wires into WebUI when combined with --webui
--n8n n8n 5678 Workflow automation

OpenAI multi-account switching (--openai-profile)

Codex and opencode support switching between multiple OpenAI accounts via named profiles in .env:

# .env
OPENAI_API_KEY_WORK=sk-proj-...
OPENAI_ORG_ID_WORK=org-...
OPENAI_API_KEY_PERSONAL=sk-proj-...
ai-shell codex --openai-profile work
ai-shell opencode --openai-profile personal

Set a default in config (openai.profile: work) or via AI_SHELL_OPENAI_PROFILE=work.


Attaching to Windows Chrome (--local-chrome)

ai-shell claude --local-chrome bridges Claude inside the container to your real Chrome on Windows via the Chrome DevTools Protocol (using chrome-devtools-mcp). Unblocks OAuth popups, CAPTCHA pages, and "click around in a logged-in site" tasks.

  • Claude drives Chrome tabs on your Windows desktop in real time.
  • Separate Chrome profile per project -- your normal browsing untouched, each repo keeps its own logged-in state.
  • All traffic stays on localhost.

Set [claude] local_chrome = true in ai-shell.toml (or AI_SHELL_LOCAL_CHROME=1) to persist.


Remote control with T3 Code (--t3)

T3 Code is a desktop/web/mobile GUI for driving coding agents. Its server owns the workspace — it spawns the agent processes, reads git state and hosts terminals — so it has to run where the project lives, which for ai-shell is the per-project dev container. That is what --t3 sets up:

ai-shell claude --t3        # Claude in this terminal + T3 Code server for the project
ai-shell codex --t3
ai-shell pi --t3
ai-shell opencode --t3
ai-shell shell --t3         # Just the server, no tool

Each run:

  1. installs the t3 CLI in the container if the image predates T3 support;
  2. starts t3 serve --host 0.0.0.0 --port 3773 detached, with the same environment your tools get;
  3. registers the project (t3 serve deliberately does not auto-add its cwd, which is why an unprepared server shows an empty environment);
  4. mints a pairing token and prints a pairing URL + QR pointing at this machine's LAN address and the container's published host port.

Scan the QR from the T3 Code phone app, or paste the URL into the desktop app. The server keeps running after the local tool exits — that is the point.

Port 3773 is part of the standard dev-port set, so every dev container publishes it on a stable per-project host port. Containers created before this feature don't have that mapping; --t3 says so and the fix is ai-shell manage clean, then rerun.

T3 Connect (outside your LAN)

LAN pairing needs the phone on the same network. For anywhere-access, link the container once — the credential lives in the project's ~/.t3 volume, so it survives container recreation:

ai-shell shell
t3 connect link --headless      # prints a URL, paste back the code
exit
ai-shell claude --t3            # serve now also brings up the managed tunnel

--t3 reports T3 Connect status on every run.

What --t3 is and isn't

T3 Code runs its own agent processes; it does not mirror the Claude session in your terminal. Both live in the same container against the same project and the same ~/.claude config, so a conversation started in one can be resumed in the other — but they are separate processes.

Each project gets its own T3 environment (its own ~/.t3 named volume: server database, paired devices, Connect credential). The host's own ~/.t3 is never bind-mounted, so a desktop T3 Code install and the container servers never share a database.


Expo apps (--expo)

Expo apps get their dev server started inside the dev container, with the tunnel URL printed as a QR code before the agent takes the terminal — so you scan once, up front, and the phone stays attached for the whole session.

ai-shell claude              # auto-detected: Expo app -> dev server starts too
ai-shell claude --expo       # force it (and fail loudly if it can't start)
ai-shell claude --no-expo    # skip it
Expo
  Project: my-app (/root/projects/my-app)
  Scan:    exp://Xf3k2a-anonymous-8081.exp.direct
  Metro:   http://localhost:14631 (this machine)
  Log:     docker exec augint-shell-my-app-dev tail -f /var/log/ai-shell/expo-start.log

  <QR code>

The server is detached and outlives the tool session. Re-running any command just re-prints the QR against the live server.

No Expo account needed

expo start --tunnel does not require a login. The Expo CLI connects with its own ngrok token and names the tunnel {randomness}-{username}-{port}.exp.direct, falling back to anonymous when nobody is signed in. Logging in only matters for EAS (build, update, submit).

If you do want to be signed in, the practical options in a container are npx expo login (persisted in ~/.expo, which is bind-mounted) or an EXPO_TOKEN personal access token. Browser SSO does not work in the container: it binds a callback listener on an ephemeral container port and shells out to a browser that isn't there. A robot EXPO_TOKEN is worse than none here — the Expo CLI refuses to open a tunnel for robot users, and ai-shell reports that specifically if it happens.

Why tunnel, and not LAN

ngrok dials outbound from the container, so the phone reaches https://<subdomain>.exp.direct with no published port involved. LAN mode cannot work as-is: ai-shell hash-assigns dev ports into 10000-39999 rather than mapping them identity, so Metro would advertise its own :8081 and the phone would find nothing there. Port 8081 is published anyway, so a host browser can reach Metro and expo start --web.

The QR is stable across restarts: Expo persists the tunnel's random segment in .expo/settings.json inside the project directory, which is bind-mounted.

Detection

Auto-start requires both an expo dependency in package.json and an app config (app.json with an expo key, or app.config.{ts,js,mjs,cjs,json}). A dependency alone also describes Expo libraries and config plugins, which have nothing to serve. --expo needs only the dependency.

ai-shell shell never auto-starts Expo — it is the maintenance path, often where you go to fix an install — but ai-shell shell --expo works. Set expo.auto: false in .ai-shell.yaml (or AI_SHELL_EXPO_AUTO=0) to turn auto-detection off for a project.

Dependencies are checked inside the container, because node_modules is a container-local named volume: a host-side npm install is invisible there. If Expo isn't installed in the container, auto-detection says so and steps aside rather than triggering an install.


OpenCode web mode

Browser UI

ai-shell opencode --web                # Launches web UI, opens browser
ai-shell opencode --web --port 8080    # Custom port

mDNS is enabled by default -- the server is discoverable on your LAN as <project>.local. CORS is set to * for cross-device access (phone, tablet).

Headless server with multi-repo terminals

ai-shell opencode serve                # Start server + attach all git repos under CWD
ai-shell opencode serve --skip-root    # Don't attach CWD itself
ai-shell opencode serve --open         # Auto-open browser after starting

serve finds all immediate child directories that are git repositories and attaches each as a terminal to the running server via opencode attach. The current directory is also attached by default (if it's a git repo).

Status dashboard

ai-shell opencode status               # Show server URL, mDNS name, terminal count

Authentication

Set OPENCODE_SERVER_PASSWORD (and optionally OPENCODE_SERVER_USERNAME) in your project .env file. These are automatically passed through to the container.

# .env
OPENCODE_SERVER_PASSWORD=mysecret
OPENCODE_SERVER_USERNAME=admin

Requirements

  • Docker
  • Python >= 3.12
  • (Optional) NVIDIA GPU for local LLM acceleration

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

augint_shell-0.108.0.tar.gz (102.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

augint_shell-0.108.0-py3-none-any.whl (119.0 kB view details)

Uploaded Python 3

File details

Details for the file augint_shell-0.108.0.tar.gz.

File metadata

  • Download URL: augint_shell-0.108.0.tar.gz
  • Upload date:
  • Size: 102.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for augint_shell-0.108.0.tar.gz
Algorithm Hash digest
SHA256 4c7afca3ebcaaedd2c855d5d54a5fa3178a25d4100c553ad2827811d4ca21c5e
MD5 a8112ac616401e713d129cb7a56222ca
BLAKE2b-256 b47e1ca2286c0b8c698e5c8b8feb319f5a86d75700b2b23604305caf5eab10f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for augint_shell-0.108.0.tar.gz:

Publisher: publish.yaml on svange/augint-shell

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file augint_shell-0.108.0-py3-none-any.whl.

File metadata

  • Download URL: augint_shell-0.108.0-py3-none-any.whl
  • Upload date:
  • Size: 119.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for augint_shell-0.108.0-py3-none-any.whl
Algorithm Hash digest
SHA256 207787c63584c415016baa4a84623e195bb2ee84e5f2a552d19f247b14f88818
MD5 d2134645f8a572411eab9608508f0d0d
BLAKE2b-256 81115e6005fa0b7d4eac7610caa62433efb567a6ab0b0c76b15d1927e42bf5a2

See more details on using hashes here.

Provenance

The following attestation bundles were made for augint_shell-0.108.0-py3-none-any.whl:

Publisher: publish.yaml on svange/augint-shell

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.108.0 This release

2 files

0.107.1

2 files

0.107.0

2 files

0.106.0

2 files

0.105.1

2 files

0.105.0

2 files

0.104.1

2 files

0.104.0

2 files

0.103.0

2 files

0.102.1

2 files

0.102.0

2 files

0.101.1

2 files

0.101.0

2 files

0.100.1

2 files

0.100.0

2 files

0.99.0

2 files

0.98.3

2 files

0.98.2

2 files

0.98.1

2 files

0.98.0

2 files

0.97.0

2 files

0.96.0

2 files

0.95.1

2 files

0.95.0

2 files

0.94.0

2 files

0.93.0

2 files

0.92.4

2 files

0.92.3

2 files

0.92.2

2 files

0.92.1

2 files

0.92.0

2 files

0.91.0

2 files

0.90.2

2 files

0.90.1

2 files

0.90.0

2 files

0.89.1

2 files

0.89.0

2 files

0.88.1

2 files

0.88.0

2 files

0.87.0

2 files

0.86.0

2 files

0.85.0

2 files

0.84.4

2 files

0.84.3

2 files

0.84.2

2 files

0.84.1

2 files

0.84.0

2 files

0.83.0

2 files

0.82.0

2 files

0.81.0

2 files

0.80.0

2 files

0.79.0

2 files

0.78.0

2 files

0.77.0

2 files

0.76.0

2 files

0.75.1

2 files

0.75.0

2 files

0.74.0

2 files

0.73.0

2 files

0.72.0

2 files

0.71.2

2 files

0.71.1

2 files

0.71.0

2 files

0.70.0

2 files

0.69.0

2 files

0.68.0

2 files

0.67.1

2 files

0.67.0

2 files

0.66.0

2 files

0.65.0

2 files

0.64.1

2 files

0.64.0

2 files

0.63.0

2 files

0.62.0

2 files

0.61.0

2 files

0.60.0

2 files

0.59.0

2 files

0.58.0

2 files

0.57.0

2 files

0.56.0

2 files

0.55.0

2 files

0.54.0

2 files

0.53.0

2 files

0.52.1

2 files

0.52.0

2 files

0.51.0

2 files

0.50.0

2 files

0.49.0

2 files

0.48.0

2 files

0.47.0

2 files

0.46.0

2 files

0.45.0

2 files

0.44.0

2 files

0.43.0

2 files

0.42.0

2 files

0.41.0

2 files

0.40.0

2 files

0.39.0

2 files

0.38.1

2 files

0.38.0

2 files

0.37.1

2 files

0.37.0

2 files

0.36.0

2 files

0.35.0

2 files

0.34.0

2 files

0.33.0

2 files

0.32.3

2 files

0.32.2

2 files

0.32.1

2 files

0.32.0

2 files

0.31.0

2 files

0.30.0

2 files

0.29.0

2 files

0.28.0

2 files

0.27.0

2 files

0.26.1

2 files

0.26.0

2 files

0.25.0

2 files

0.24.0

2 files

0.23.0

2 files

0.22.5

2 files

0.22.4

2 files

0.22.3

2 files

0.22.2

2 files

0.22.1

2 files

0.22.0

2 files

0.21.0

2 files

0.20.0

2 files

0.19.0

2 files

0.18.0

2 files

0.17.0

2 files

0.16.11

2 files

0.16.10

2 files

0.16.9

2 files

0.16.8

2 files

0.16.7

2 files

0.16.6

2 files

0.16.5

2 files

0.16.4

2 files

0.16.3

2 files

0.16.2

2 files

0.16.1

2 files

0.16.0

2 files

0.15.0

2 files

0.14.0

2 files

0.13.0

2 files

0.12.0

2 files

0.11.0

2 files

0.10.0

2 files

0.9.0

2 files

0.8.0

2 files

0.7.0

2 files

0.6.0

2 files

0.5.0

2 files

0.4.0

2 files

0.3.0

2 files

0.2.0

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page