Multi-Project Management¶
Craft Easy Agentic can serve multiple projects from a single running instance. Each project has its own state, file watcher, runner, and API routes — but they all share one URL and one web UI.
Project registry¶
Projects are stored in ~/.config/craft-easy-agentic/projects.toml:
[[projects]]
slug = "petanque-life"
name = "Petanque Life"
repo_root = "/home/patrik/esi/petanque-life"
color = "#1A6B5A"
[[projects]]
slug = "airpark"
name = "Airpark"
repo_root = "/home/patrik/esi/airpark-ecosystem"
color = "#F39C12"
CLI subcommands¶
project add¶
craft-easy-agentic project add <slug> \
--repo <path> # absolute or relative path to the project root
--name "Display Name" # shown in the dashboard (defaults to slug)
--color "#1A6B5A" # accent color in the UI (any CSS hex color)
project list¶
petanque-life Petanque Life /home/patrik/esi/petanque-life
airpark Airpark /home/patrik/esi/airpark-ecosystem
project remove¶
Removes the entry from projects.toml. Does not touch the project's files.
project sync¶
Syncs canonical framework files from this repository into a registered project:
craft-easy-agentic project sync petanque-life # one project
craft-easy-agentic project sync --all # all projects
craft-easy-agentic project sync petanque-life --dry-run # preview
craft-easy-agentic project sync petanque-life --force # overwrite runner-config.yml
See Framework Hub for what sync copies and how projects can opt out.
Runtime behavior¶
When started in web mode with a populated registry:
- A separate file watcher thread is started per project (watches
tasks/.tasks-state/andtasks/). - Each project gets its own API scope at
/api/projects/{slug}/.... - The WS endpoint at
/api/projects/{slug}/eventsemits state updates only for that project. - The legacy single-project routes (
/api/snapshot,/api/runner/start, ...) proxy to the first-alphabetical project for backward compatibility.
Resolution order¶
When the server starts, it determines which projects to serve:
--repo-root <path>flag → ad-hoc single-project (backward-compat mode)~/.config/craft-easy-agentic/projects.tomlexists and has entries → multi-project from registry- Auto-discovery: if the current working directory contains
tasks/BACKLOG.md→ single-project - Neither → error with help message
Project switcher¶
The topbar contains a horizontal chip-row of project names. Clicking a chip switches the main view to that project. The active chip is highlighted with the project's accent color.
Clicking Översikt switches to the overview grid — all projects at once, each with full runner controls.
The active project is persisted in localStorage so the dashboard opens to the same project on reload.
Per-project API routes¶
Every dashboard action is scoped per project. The transport layer in the frontend uses the slug from the URL or active selection to build the correct path:
| Action | Route |
|---|---|
| Get state | GET /api/projects/{slug}/snapshot |
| Start runner | POST /api/projects/{slug}/runner/start |
| Stop runner | POST /api/projects/{slug}/runner/stop |
| Force-stop | POST /api/projects/{slug}/runner/force-stop |
| Pause | POST /api/projects/{slug}/runner/pause |
| Resume | POST /api/projects/{slug}/runner/resume |
| Cleanup | POST /api/projects/{slug}/runner/cleanup |
| Cancel stop | POST /api/projects/{slug}/runner/cancel-stop |
| List tasks | GET /api/projects/{slug}/tasks |
| Task detail | GET /api/projects/{slug}/tasks/{id} |
| File tree | GET /api/projects/{slug}/tree?path=... |
| File preview | GET /api/projects/{slug}/file?path=... |
| Chat WebSocket | WS /api/projects/{slug}/chat |
| Event stream | WS /api/projects/{slug}/events |