Run JoyZoning without the desktop — same governance rules, scriptable interface.
Familiar pattern: Like gh pr create or docker compose up talking to a local daemon.
Prerequisites: installation.md (control plane; diet-hermes only for managed task run)
Cursor-only? Skip Hermes gateway steps below. Use external-agent JSDP — you still need the control plane and
jz.
jz → http://127.0.0.1:9470 → SQLite + orchestrator
↓
hermes -p joyzoning gateway → :8642 / :9119
The control plane must be running before jz commands (desktop auto-starts it; CLI-only users start it manually).
Add to ~/.zshrc (recommended):
export DOTNET_ROOT="${DOTNET_ROOT:-$HOME/.dotnet}"
export PATH="${DOTNET_ROOT}:${PATH}"
export JOYZONING_URL="${JOYZONING_URL:-http://127.0.0.1:9470}"
export JOYZONING_DIET_HERMES_DIR="${JOYZONING_DIET_HERMES_DIR:-$HOME/Downloads/diet-hermes-main-master}"Or per session:
source /path/to/JoyZoning/scripts/jz-env.shcd JoyZoning
./scripts/install-jz.shYou should see: Installed: ~/.local/bin/jz
Note:
jzis a small wrapper script; the .NET app lives in~/.local/bin/joyzoning-jz/. Do not replace the binary with the wrapper manually.
export ASPNETCORE_ENVIRONMENT=Development
cd JoyZoning
dotnet run --project src/JoyZoning.ControlPlane/JoyZoning.ControlPlane.csprojLeave this terminal open.
"$JOYZONING_DIET_HERMES_DIR/.venv/bin/hermes" -p joyzoning gatewayOptional dashboard (kanban sync):
hermes -p joyzoning dashboard --no-open --tuiOr: curl -X POST http://127.0.0.1:9470/api/hermes/ensure-dashboard
jz doctorYou should see:
{"ok": true, "checks": [
{"id": "control_plane", "status": "ok"},
{"id": "hermes_api", "status": "ok"}
]}# Bind to a project folder (like opening a folder in VS Code)
SESSION=$(jz --field .id session create \
--name "cli-first-run" \
--workspace "$HOME/src/myrepo")
export JOYZONING_SESSION_ID="$SESSION"
# Create a low-risk task
TASK=$(jz --field .id task create \
--title "CLI smoke test" \
--description "Prove jz wiring" \
--risk 1)
echo "TASK=$TASK"You should see: UUIDs printed; no stderr errors.
jz task run "$TASK" --poll 10 --timeout 600You should see: JSON status transitions (leased → running → …).
If Hermes is down: exit 1 and JSON message on stderr — start gateway.
jz task start-external "$TASK" --agent cursor
jz task prompt "$TASK"
# edit on joyzoning/card-* in your workspace
jz task mark-ready "$TASK"jz task verify "$TASK" --cmd "echo ok"
jz task complete "$TASK" --yesYou should see: Task reaches Complete only after --yes merge.
Agents use jz agent done → ready_for_review, not Complete. See cli.md.
After dispatch:
WORKTREE=$(jz --field .worktreePath task lease "$TASK")
cd "$WORKTREE"
jz agent start --task "$TASK"
jz agent verify --cmd "dotnet build"
jz agent done
# You still run: jz task complete "$TASK" --yesExamples: scripts/examples/agent-happy-path.sh
| Desktop | CLI equivalent |
|---|---|
| Getting Started health | jz doctor |
| Open workspace | session create --workspace |
| Kanban dispatch | task run |
| Cursor / external start | task start-external · task prompt · task mark-ready |
| Merge button | task complete --yes |
| Copy health report | jz raw GET api/health + curls |
| Symptom | Fix |
|---|---|
Session required |
export JOYZONING_SESSION_ID=... |
.NET 8 missing |
DOTNET_ROOT — installation.md |
cannot execute binary file |
Re-run ./scripts/install-jz.sh |
| Hermes API warn in doctor | Start gateway; hermes-setup.md |
- Execution paths — managed vs external decision guide
- CLI reference
- whats-next.md
- choose-your-path.md