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 entrypointinternal/jaca/- Go TUI client, rendering, config, and RPC bridgesrc/just_another_coding_agent/- canonical Python packagesrc/just_another_coding_agent/runtime/- runtime and orchestration entrypointssrc/just_another_coding_agent/tools/- coding toolssrc/just_another_coding_agent/session/- session persistencesrc/just_another_coding_agent/rpc/- RPC transportsrc/just_another_coding_agent/contracts/- public contract helpers and schemastests/- unit tests first, e2e laterdocs/- 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 installis the persistent daily-use pathuvxis 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 nowSkipSkip 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 pytest
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 openaiselects OpenAI and starts masked auth if no OpenAI key is configured/provider anthropicselects Anthropic and starts masked auth if no Anthropic key is configured/provider googleselects 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 ollamaselects the shipped Ollama cloud catalog and starts masked auth if needed/auth ollama,/auth openai,/auth anthropic, and/auth googlestore secrets without echoing them into the transcript/auth statusshows 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 asauth-store-cleanupand keeps it unique within the current workspace/sessionshows the current durable session name, opaque session id, and any direct fork parent/trace offdisables tracing/trace localstores spans locally under~/.jaca/traces//trace logfireexports 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.mddocs/goal.mddocs/tui.mddocs/architecture.mddocs/contracts.mddocs/grounding.mddocs/development.mddocs/adr/
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file just_another_coding_agent-0.1.7.tar.gz.
File metadata
- Download URL: just_another_coding_agent-0.1.7.tar.gz
- Upload date:
- Size: 494.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
28e3dfeafbb467d4e38a2585b894c34318dec0829303d6efda26c4436a423e9d
|
|
| MD5 |
c5b15fd144c771d089c6f9bdffa8c3ea
|
|
| BLAKE2b-256 |
e0b17aa0a70e85d5d9710a83ca76a14c4a27a4f6d84ac71e262a0d34d9f0b6d6
|
Provenance
The following attestation bundles were made for just_another_coding_agent-0.1.7.tar.gz:
Publisher:
release.yml on SahilDahiya/just-another-coding-agent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
just_another_coding_agent-0.1.7.tar.gz -
Subject digest:
28e3dfeafbb467d4e38a2585b894c34318dec0829303d6efda26c4436a423e9d - Sigstore transparency entry: 1251101030
- Sigstore integration time:
-
Permalink:
SahilDahiya/just-another-coding-agent@81eb3557fef97806b890250fdaf36844de9f76f7 -
Branch / Tag:
refs/tags/v0.1.7 - Owner: https://github.com/SahilDahiya
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@81eb3557fef97806b890250fdaf36844de9f76f7 -
Trigger Event:
push
-
Statement type:
File details
Details for the file just_another_coding_agent-0.1.7-py3-none-win_amd64.whl.
File metadata
- Download URL: just_another_coding_agent-0.1.7-py3-none-win_amd64.whl
- Upload date:
- Size: 8.2 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eb96c24907a069baceb026d9aea3bf247289abfdeee06fc833159bfec4c7adb4
|
|
| MD5 |
147857039a4e7695e41b3d229ac20bab
|
|
| BLAKE2b-256 |
42c9df4831907842d1b295d7e13a728634a9dfce1881a017c6a275bcc4bb15d3
|
Provenance
The following attestation bundles were made for just_another_coding_agent-0.1.7-py3-none-win_amd64.whl:
Publisher:
release.yml on SahilDahiya/just-another-coding-agent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
just_another_coding_agent-0.1.7-py3-none-win_amd64.whl -
Subject digest:
eb96c24907a069baceb026d9aea3bf247289abfdeee06fc833159bfec4c7adb4 - Sigstore transparency entry: 1251101434
- Sigstore integration time:
-
Permalink:
SahilDahiya/just-another-coding-agent@81eb3557fef97806b890250fdaf36844de9f76f7 -
Branch / Tag:
refs/tags/v0.1.7 - Owner: https://github.com/SahilDahiya
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@81eb3557fef97806b890250fdaf36844de9f76f7 -
Trigger Event:
push
-
Statement type:
File details
Details for the file just_another_coding_agent-0.1.7-py3-none-manylinux_2_17_x86_64.whl.
File metadata
- Download URL: just_another_coding_agent-0.1.7-py3-none-manylinux_2_17_x86_64.whl
- Upload date:
- Size: 8.0 MB
- Tags: Python 3, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1f6ae4542eafac16915e04ec76b56e6126a03c1c1da997ff6e205624a3599f2f
|
|
| MD5 |
8dbc3b469420672c0dfcb2d16b2b9b5f
|
|
| BLAKE2b-256 |
dcabe85858e1ddf5465806de3eba08d315f270245e35a3dc09e751a486aa847a
|
Provenance
The following attestation bundles were made for just_another_coding_agent-0.1.7-py3-none-manylinux_2_17_x86_64.whl:
Publisher:
release.yml on SahilDahiya/just-another-coding-agent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
just_another_coding_agent-0.1.7-py3-none-manylinux_2_17_x86_64.whl -
Subject digest:
1f6ae4542eafac16915e04ec76b56e6126a03c1c1da997ff6e205624a3599f2f - Sigstore transparency entry: 1251101355
- Sigstore integration time:
-
Permalink:
SahilDahiya/just-another-coding-agent@81eb3557fef97806b890250fdaf36844de9f76f7 -
Branch / Tag:
refs/tags/v0.1.7 - Owner: https://github.com/SahilDahiya
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@81eb3557fef97806b890250fdaf36844de9f76f7 -
Trigger Event:
push
-
Statement type:
File details
Details for the file just_another_coding_agent-0.1.7-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: just_another_coding_agent-0.1.7-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 7.4 MB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a4999175521bfcf809e774b0d288ab3a21adc7e7156f0ab11cd3289fad3a1957
|
|
| MD5 |
388e1ebe8f74faded9fbbe8e0bfb2db9
|
|
| BLAKE2b-256 |
65d05bc1a81060b1c3f010d8e40a35425d0e96410ec79de6d295acd57164ac02
|
Provenance
The following attestation bundles were made for just_another_coding_agent-0.1.7-py3-none-macosx_11_0_arm64.whl:
Publisher:
release.yml on SahilDahiya/just-another-coding-agent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
just_another_coding_agent-0.1.7-py3-none-macosx_11_0_arm64.whl -
Subject digest:
a4999175521bfcf809e774b0d288ab3a21adc7e7156f0ab11cd3289fad3a1957 - Sigstore transparency entry: 1251101145
- Sigstore integration time:
-
Permalink:
SahilDahiya/just-another-coding-agent@81eb3557fef97806b890250fdaf36844de9f76f7 -
Branch / Tag:
refs/tags/v0.1.7 - Owner: https://github.com/SahilDahiya
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@81eb3557fef97806b890250fdaf36844de9f76f7 -
Trigger Event:
push
-
Statement type:
File details
Details for the file just_another_coding_agent-0.1.7-py3-none-macosx_10_12_x86_64.whl.
File metadata
- Download URL: just_another_coding_agent-0.1.7-py3-none-macosx_10_12_x86_64.whl
- Upload date:
- Size: 7.8 MB
- Tags: Python 3, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a4c5ec63f2c718036033e8e7bc9a7dc1c802047f981e24623091f38d3a62f53a
|
|
| MD5 |
b7c3f3664d001e1b6d0308b5203110a4
|
|
| BLAKE2b-256 |
7b35a5aedd1e3786459aef9bd99be3838ec67e506dacffe592fcf9f1339f9bdf
|
Provenance
The following attestation bundles were made for just_another_coding_agent-0.1.7-py3-none-macosx_10_12_x86_64.whl:
Publisher:
release.yml on SahilDahiya/just-another-coding-agent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
just_another_coding_agent-0.1.7-py3-none-macosx_10_12_x86_64.whl -
Subject digest:
a4c5ec63f2c718036033e8e7bc9a7dc1c802047f981e24623091f38d3a62f53a - Sigstore transparency entry: 1251101266
- Sigstore integration time:
-
Permalink:
SahilDahiya/just-another-coding-agent@81eb3557fef97806b890250fdaf36844de9f76f7 -
Branch / Tag:
refs/tags/v0.1.7 - Owner: https://github.com/SahilDahiya
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@81eb3557fef97806b890250fdaf36844de9f76f7 -
Trigger Event:
push
-
Statement type: