Skip to main content

Terminal coding agent with a PydanticAI backend and first-party Go TUI

Project description

just-another-coding-agent

read_when: you need the repo overview, scope, or setup commands

Terminal coding agent with a PydanticAI backend and a first-party Go TUI.

This repo preserves the product shape of pi's coding agent while rebuilding it as a clean Python implementation around PydanticAI. It does not inherit pi-mono's monorepo layout, extension ecosystem, or migration burden.

It is intentionally narrow: coding-agent backend first, a thin first-party terminal UI, strict contracts, no fallbacks, and no compatibility glue. PydanticAI should provide as much of the agent machinery as possible; local code exists to define and enforce the coding-agent product contract.

Scope

  • Headless coding-agent runtime
  • Thin first-party terminal UI built on the same runtime
  • File and shell tools
  • Streaming run events
  • Session persistence
  • JSON-over-stdio RPC for non-Python consumers

Non-goals

  • General-purpose agent framework work
  • Backward compatibility layers
  • Legacy migration shims

Project Layout

  • cmd/jaca/ - Go TUI entrypoint
  • internal/jaca/ - Go TUI client, rendering, config, and RPC bridge
  • src/just_another_coding_agent/ - canonical Python package
  • src/just_another_coding_agent/runtime/ - runtime and orchestration entrypoints
  • src/just_another_coding_agent/tools/ - coding tools
  • src/just_another_coding_agent/session/ - session persistence
  • src/just_another_coding_agent/rpc/ - RPC transport
  • src/just_another_coding_agent/contracts/ - public contract helpers and schemas
  • tests/ - unit tests first, e2e later
  • docs/ - scope, architecture, contracts, ADRs, development

Install

For normal use outside a repo checkout, prefer one of these published-package paths:

uv tool install just-another-coding-agent
jaca
uvx --from just-another-coding-agent jaca
  • uv tool install is the persistent daily-use path
  • uvx is the ephemeral no-install path
  • installed builds update explicitly with:
uv tool upgrade just-another-coding-agent

JACA does not auto-upgrade or self-reinstall on startup. Installed uv tool builds may show an optional update prompt with:

  • Update now
  • Skip
  • Skip until next release

When Update now is available, JACA shows the exact upgrade command before it runs it, then asks you to relaunch explicitly after a successful update.

Repo Setup

uv sync --extra dev --extra test
uv run ruff check .
uv run vulture src evaluations --min-confidence 80
go run honnef.co/go/tools/cmd/staticcheck@v0.6.0 ./...
uv run pytest

Or run the combined lint pass with:

make lint

That default uv sync --extra dev --extra test path is for the Python backend, Harbor, and headless evaluation flows. It stays Go-free.

If you want the interactive TUI too, rebuild the package explicitly with Go enabled:

JACA_BUILD_TUI=1 uv sync --reinstall-package just-another-coding-agent --extra dev --extra test

Run

Launch the long-lived stdio RPC server with explicit backend configuration:

uv run just-another-coding-agent \
  --model <provider:model> \
  --workspace-root /abs/path/to/workspace \
  --sessions-root /abs/path/to/sessions

The process reads one JSON RPC request per stdin line and writes one or more JSON lines to stdout.

Launch the first-party terminal UI:

uv run jaca

In a repo checkout, uv run jaca is the canonical development launcher. The interactive launcher talks to the Python backend over stdio RPC.

In a live repo checkout, uv run jaca prefers go run ./cmd/jaca when go is available so the TUI always reflects current source.

Outside a repo checkout, the installed jaca command launches the installed jaca-go binary.

If uv run jaca says the Go TUI binary is missing, rebuild the environment with:

JACA_BUILD_TUI=1 uv sync --reinstall-package just-another-coding-agent --extra dev --extra test

First Run

The TUI keeps non-secret provider, model, and trace preferences in ~/.jaca/config.json. Provider secrets are backend-owned and stored in the local OS keychain by default. When keychain storage is unavailable, JACA stores them in ~/.jaca/secrets.json instead and explains why in the auth panel. Environment variables remain the explicit override for headless, CI, and evaluation flows. On Linux/WSL, interactive /auth requires a supported OS keychain backend such as Secret Service via gnome-keyring.

On first launch without a saved provider, JACA opens a centered chooser panel with the shipped provider choices before chat. Ollama is split explicitly:

  • local Ollama: use /model ollama:<local-model> with no key
  • shipped Ollama cloud path: use /provider ollama, which starts masked auth if needed

If a saved cloud-provider selection is still missing credentials, JACA starts masked auth immediately at startup instead of waiting for the first /provider or /model command. When auth starts, JACA opens a centered secure setup panel: provider-specific labeling, masked input, no transcript/history capture for the secret, and backend-owned storage on save. On first run, the prompt footer also tells the user to press Tab to choose a provider directly from the prompt zone.

Inside jaca:

  • /provider openai selects OpenAI and starts masked auth if no OpenAI key is configured
  • /provider anthropic selects Anthropic and starts masked auth if no Anthropic key is configured
  • /provider google selects Google Gemini and starts masked auth if no Google key is configured
  • /model ollama:<local-model> uses local Ollama at the default localhost endpoint with no key
  • /provider ollama selects the shipped Ollama cloud catalog and starts masked auth if needed
  • /auth ollama, /auth openai, /auth anthropic, and /auth google store secrets without echoing them into the transcript
  • /auth status shows whether each provider is configured from env, keychain, local file, or neither, and whether interactive local secret storage is available at all
  • /auth clear <provider> removes the stored local secret for that provider from both keychain and local file storage
  • /model <provider:model> switches the active model and aligns provider state to that model
  • /name <text> assigns a durable backend-normalized session name such as auth-store-cleanup and keeps it unique within the current workspace
  • /session shows the current durable session name, opaque session id, and any direct fork parent
  • /trace off disables tracing
  • /trace local stores spans locally under ~/.jaca/traces/
  • /trace logfire exports spans to Logfire

To continue a named or known session later:

jaca resume auth-store-cleanup

If you omit the reference, jaca resume shows the recent sessions from the current workspace, even when there is only one session, caps the picker to the most recent ten, and lets you choose one by number. This picker requires an interactive terminal. Resumed and forked sessions also hydrate a bounded recent-history preview into the transcript instead of trying to render the entire saved session.

To branch a current-workspace session into a new one:

jaca fork auth-store-cleanup --name auth-store-cleanup-followup

If you omit the reference, jaca fork uses the same current-workspace picker as jaca resume. Forked sessions keep durable lineage to their direct parent and start as a new session with copied history instead of mutating the original thread.

Tracing is off by default. Local and Logfire tracing both require the optional trace dependency:

uv sync --extra trace

For logfire mode, authenticate first:

uv run logfire auth
uv run logfire projects use <project>

If interactive auth starts on a machine without a supported OS keychain backend, JACA goes directly to the local secret file flow and explains that it is doing so because keychain storage is unavailable.

For direct Go TUI development, pass the backend command explicitly:

go run ./cmd/jaca \
  --backend-command-json='["uv","run","python","-m","just_another_coding_agent"]'

Docs

  • docs/README.md
  • docs/goal.md
  • docs/tui.md
  • docs/architecture.md
  • docs/contracts.md
  • docs/grounding.md
  • docs/development.md
  • docs/adr/

Project details


Download files

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

Source Distribution

just_another_coding_agent-0.1.9.tar.gz (496.8 kB view details)

Uploaded Source

Built Distributions

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

just_another_coding_agent-0.1.9-py3-none-win_amd64.whl (8.2 MB view details)

Uploaded Python 3Windows x86-64

just_another_coding_agent-0.1.9-py3-none-manylinux_2_17_x86_64.whl (8.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

just_another_coding_agent-0.1.9-py3-none-macosx_11_0_arm64.whl (7.4 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

just_another_coding_agent-0.1.9-py3-none-macosx_10_12_x86_64.whl (7.8 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file just_another_coding_agent-0.1.9.tar.gz.

File metadata

File hashes

Hashes for just_another_coding_agent-0.1.9.tar.gz
Algorithm Hash digest
SHA256 2f2a05c15ce644e57f05a70fc3d106a2cb78bcb4e761989d2f49b79834368b75
MD5 ad23d330078fbf09f5ce021e4d0515ed
BLAKE2b-256 922ff38b3fda7779e3eaed663fcccbd44ff5d51c67a20f5c26065992b36ba85b

See more details on using hashes here.

Provenance

The following attestation bundles were made for just_another_coding_agent-0.1.9.tar.gz:

Publisher: release.yml on SahilDahiya/just-another-coding-agent

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

File details

Details for the file just_another_coding_agent-0.1.9-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for just_another_coding_agent-0.1.9-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 83ece6e92befb7fe3dc7296f430bdb67bb7fc3c57dbd0365d7e58ea4e0d8a7e8
MD5 ad8738399e9c27e2256509ac00d21e19
BLAKE2b-256 6e69fed22ac00562ac472436e3e0c6a9e610a894ffe73dc68a0fa673ccdd4841

See more details on using hashes here.

Provenance

The following attestation bundles were made for just_another_coding_agent-0.1.9-py3-none-win_amd64.whl:

Publisher: release.yml on SahilDahiya/just-another-coding-agent

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

File details

Details for the file just_another_coding_agent-0.1.9-py3-none-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for just_another_coding_agent-0.1.9-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 9ea061c55b7db2731e47a3925c07f03c41c409fe2162ac950a6b54fafb9efd57
MD5 89335a2e6bf3000d3a98001e25564019
BLAKE2b-256 4997e5ab3fa6c236f8d7d89b844888aaac19d2665e96d12e590b9d4148bc5f36

See more details on using hashes here.

Provenance

The following attestation bundles were made for just_another_coding_agent-0.1.9-py3-none-manylinux_2_17_x86_64.whl:

Publisher: release.yml on SahilDahiya/just-another-coding-agent

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

File details

Details for the file just_another_coding_agent-0.1.9-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for just_another_coding_agent-0.1.9-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e2ca07013c505add919a2955a4816dc672667a0dd5351a5ef921d6889a39ecd5
MD5 606c8cb86886fdaf956ca1ca863d3fb7
BLAKE2b-256 91ace418e3aa39e6052aeb2f08364ce7782a7b590091a788a65d2ed77b56fd63

See more details on using hashes here.

Provenance

The following attestation bundles were made for just_another_coding_agent-0.1.9-py3-none-macosx_11_0_arm64.whl:

Publisher: release.yml on SahilDahiya/just-another-coding-agent

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

File details

Details for the file just_another_coding_agent-0.1.9-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for just_another_coding_agent-0.1.9-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 f74d6e5598adc47b8c5edf42285dc8c5ce32b5cfa0cfb5221eadbdfbaf410530
MD5 9aeb0e3118d5aefe6e9b94f25ae54675
BLAKE2b-256 f30b31da79ff9472a964c096a0c68a3e24290c3622ca48eb0510e0079f54796b

See more details on using hashes here.

Provenance

The following attestation bundles were made for just_another_coding_agent-0.1.9-py3-none-macosx_10_12_x86_64.whl:

Publisher: release.yml on SahilDahiya/just-another-coding-agent

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

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page