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 who is your name
fj 修改这个文件。
fj explain the auth flow in this repo
It embeds soothe-nano (tools, skills, MCP, subagents, progressive loading) with SQLite persistence and config at ~/.soothe/config/nano.yml.
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
Copy the example for a local OpenAI-compatible server (Ollama, LM Studio, vLLM, …):
mkdir -p ~/.soothe/config
cp nano.yml ~/.soothe/config/nano.yml
# or: fj -c ./nano.yml who are you
nano.yml is a minimal local profile; everything else uses soothe-nano defaults.
# start your local server / pull a model, then:
fj who are you
fj list Python files in this directory
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. 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; final answer when done |
Usage
fj [options] [--] <query...>
| Flag | Meaning |
|---|---|
-c PATH / --config |
Alternate nano.yml |
-t ID / --thread |
Reuse LangGraph thread id |
-w DIR / --workspace |
Workspace root |
--no-stream |
Final-only answer (progress still on TTY) |
-v / --verbose |
Mirror tool/custom events on stderr |
-V / --version |
Version |
-- |
Force remaining argv into the query |
fj who is your name
fj -v refactor the CLI parser
fj --thread demo-1 continue: what files did you touch?
fj -w ~/code/myapp find TODO comments
Add skills
Point nano at skill folders (SKILL.md + frontmatter) in nano.yml:
skills:
- ~/.soothe/skills/my-reviewer
- ./skills/deploy
~/.soothe/skills/my-reviewer/
SKILL.md
---
name: my-reviewer
description: Review Python PRs for style and security
---
# Reviewer
When asked to review code, check for ...
Progressive skills are on by default (compact catalog + load on demand). Tune under progressive_skills: in nano.yml.
Add 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.
Agent features
fj is a thin CLI over soothe-nano (soothe-deepagents + soothe-sdk).
| Layer | Behavior |
|---|---|
| Tools | Core tools at startup; deferred via search_tools |
| Skills | Compact listings + search_skills / invoke_skill |
| MCP | Deferred by default; activated on demand |
Also included: builtin tool groups, ready subagents (planner, explorer, research, browser), workspace scoping, YAML/env config, SQLite persistence, and middleware (limits, timeouts, retries).
Compared to other agents
For a full TUI coding agent from the same stack, see mirasoth/soothe.
| fj / soothe-nano | soothe | OpenCode | Pi-style | |
|---|---|---|---|---|
| Shape | Thin one-shot CLI | Full TUI + optional daemon | Full TUI product (JS/TS) | Minimal loops |
| Agent loop | CoreAgent (ReAct) | Strange Loop: plan → assess → execute | Product agent loop | Single / lean loop |
| Goals | One query → answer | Goal-oriented; autopilot multi-goal DAG | Session / product UX | Usually single turn |
| Autopilot | — | Daemon schedule, dreaming, cron, veritas | — | — |
| Tools / skills / MCP | Progressive | Same core + TUI / loop durability | Product surface | Often fixed |
| Config | nano.yml |
nano.yml + soothe.yml |
App / project config | Code / light config |
| Best when | Scriptable coding in a repo | Interactive + 24/7 goal orchestration | Daily interactive coding | Experiments |
- vs soothe: shared CoreAgent; fj is argv → answer; soothe adds Strange Loop, TUI, and autopilot.
- vs OpenCode: rich TUI product vs argv → answer (fj) or goal-orchestration stack (soothe).
- vs Pi-style: lean loops vs progressive loading, workspace security, sqlite threads.
Development
git clone https://github.com/caesar0301/fj-ai.git
cd fj-ai
make sync-dev
make test
make lint
# optional local soothe-nano:
# uv add --editable ../soothe/packages/soothe-nano
uv run fj who is your name
src/fj_ai/
cli.py # argv → query
config.py # nano.yml loader
agent.py # create_nano_agent + sqlite
stream.py # stdout streaming
nano.yml
.github/workflows/
ci.yml
release.yml
- CI — format, lint, tests on Python 3.11–3.13; build +
twine check - Release — GitHub Release /
workflow_dispatch→ 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.2.tar.gz.
File metadata
- Download URL: fj_ai-1.0.2.tar.gz
- Upload date:
- Size: 20.3 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 |
b5ade777ce79b39f769e980e1045dc314c7da324870f32d8e20f44149e8e6473
|
|
| MD5 |
dadf08350c858db4e639bde7345141e6
|
|
| BLAKE2b-256 |
7efcc2cc7502c14d78ceddd3386c145917b638f6312f5a34be4c91577d6074ee
|
File details
Details for the file fj_ai-1.0.2-py3-none-any.whl.
File metadata
- Download URL: fj_ai-1.0.2-py3-none-any.whl
- Upload date:
- Size: 21.5 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 |
d7211d5add180a1a1f26cfe4abc6bcb232e2122cc11e857a61f8d60400de865f
|
|
| MD5 |
74e0a6ebab481c6b47208e06783655ad
|
|
| BLAKE2b-256 |
a688791e1c36188c57b85514a6e1df23c8f9e9466b236e4c260a25c3d85825eb
|