fj — one-shot CLI coding agent powered by soothe-nano
Project description
fj
fj is a one-shot coding-agent CLI — everything after the command is the query:
fj explain this repo
fj -f what did we decide last time?
fj summarize README.md
It embeds soothe-nano — tools, skills, MCP, subagents, and progressive loading — with SQLite persistence.
Package name: fj-ai. Runtime: soothe-nano.
Quick start
1. Install
pip install fj-ai
# or
uv tool install fj-ai
Requires Python 3.11+.
2. Config
fj setup
fj setup is a guided setup for a local OpenAI-compatible server (Ollama, LM Studio, vLLM, ...) — it updates only endpoint/key/model basics in ~/.soothe/config/nano.yml and keeps other keys intact.
Cloud (no config file):
export OPENAI_API_KEY=sk-...
fj summarize README.md
Missing nano.yml falls back to OPENAI_API_KEY or ANTHROPIC_API_KEY.
3. Run
fj who are you
fj list Python files in this directory
Usage
fj setup
fj completion zsh|bash
fj [options] [--] <query...>
| Flag | Meaning |
|---|---|
-c PATH / --config |
Alternate nano.yml |
-t ID / --thread |
Alone: pin active thread; with query: continue it |
-f / --follow |
Continue the latest active thread |
-l / --list |
List latest threads (newest first; default 20) |
-n NUM |
Threads to list with -l (0 = all); requires -l |
-w DIR / --workspace |
Workspace root |
--no-stream |
Wait for the full answer instead of streaming tokens |
-v / --verbose |
Mirror tool calls and custom events on stderr |
-V / --version |
Version |
-- |
Force remaining argv into the query |
Query modes:
fj QUERY... # start a new thread (default)
fj -f QUERY... # continue the latest active thread
fj -t ID QUERY... # continue a specific thread
fj -t ID # pin thread as active (no query)
- Queries start a new thread by default; use
-fto continue the latest or-tto continue/pin a specific one. -fand-tare mutually exclusive;-nrequires-l;-ltakes no query.- One query per thread at a time; different threads may run concurrently.
- With
-v,fjprints the thread<id>on stderr before the run.
Shell completion
# zsh
eval "$(fj completion zsh)"
# bash
eval "$(fj completion bash)"
# persist in ~/.zshrc / ~/.bashrc
Tab completion predicts natural-language intents (not only flags) using the router fast model from nano.yml — it does not start the coding agent. If fast is omitted, it falls back to default.
Defaults
| Concern | Default |
|---|---|
| Config | ~/.soothe/config/nano.yml (SOOTHE_HOME overrides home) |
| Checkpoints | SQLite at ~/.soothe/data/soothe_checkpoints.db |
| Workspace | CWD (SOOTHE_WORKSPACE) |
| Output | Progress on stdout line 1 (tools + AI narration); final answer printed once (--no-stream hides narration preview) |
Builtin skills
fj ships AgentSkills under fj_ai/builtin_skills/ (planning, TDD, debugging, document tools, and more) and registers them with soothe-nano on startup. They appear in progressive skill discovery alongside nano’s own builtins.
Add your own by pointing nano.yml at skill folders (SKILL.md + frontmatter):
skills:
- ~/.soothe/skills/my-reviewer
- ./skills/deploy
Progressive skills are on by default (compact catalog + load on demand). Tune under progressive_skills: in nano.yml.
MCP servers
mcp_builtins:
- playwright
mcp_servers:
- name: filesystem
transport: stdio
command: npx
args: ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
defer: true
enabled: true
With defer: true (default), MCP tools activate on demand.
Powered by
fj is built on soothe-nano — tools, skills, MCP, subagents, and progressive loading, with SQLite persistence. For a full TUI coding agent from the same stack, see mirasoth/soothe.
Development
git clone https://github.com/caesar0301/fj-ai.git
cd fj-ai
make sync-dev
make test
make lint
- CI — format, lint, tests on Python 3.11–3.13; build +
twine check - Release — GitHub Release → PyPI
License
MIT
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 Distribution
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 fj_ai-1.0.9.tar.gz.
File metadata
- Download URL: fj_ai-1.0.9.tar.gz
- Upload date:
- Size: 612.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fefe166256a92fda3480d88e5c9683963ff09863a9e00fb4734fa379e96ca8a3
|
|
| MD5 |
2868ef236db9adda5ed221e08afc66d3
|
|
| BLAKE2b-256 |
d0421028110d64916fc6ada47310490cd71ccc5e70d7a027409a959b94cd2acb
|
File details
Details for the file fj_ai-1.0.9-py3-none-any.whl.
File metadata
- Download URL: fj_ai-1.0.9-py3-none-any.whl
- Upload date:
- Size: 750.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eb375c0275bff88892176db89fe17d3a5ebf7f831f904388df218610758c67e3
|
|
| MD5 |
35234e3807db839192b3561f02973cbb
|
|
| BLAKE2b-256 |
03f4e33087c519af6b695fe6ab412fae470928094ee7a1d9539f6b8dbcc20804
|