.bot/ directory that dotbot init creates in your project. Framework files can be re-applied at any time with dotbot init -Force without losing your workspace data.
Three core systems
MCP server
A pure PowerShell stdio MCP server implementing protocol version 2024-11-05. Tools are auto-discovered fromtools/{tool-name}/ subdirectories — no registration is needed. The server exposes 33 tools across task management, session management, plans, decisions, steering, and dev lifecycle. Because tools are file-based, you can add custom tools by dropping a metadata.yaml and script.ps1 into a new subfolder.
Web UI
A pure PowerShell HTTP server with a vanilla JS frontend. Seven tabs: Overview, Product, Roadmap, Processes, Decisions, Workflow, Settings. The default port is 8686; the server auto-selects the next available port if 8686 is busy. Launch the UI with.bot/go.ps1 from your project root.
Runtime
Manages AI CLI invocations as tracked processes. Process types includeanalysis, execution, kickstart, planning, commit, and task-creation. The runtime handles git worktree isolation and normalises invocations across Claude, Codex, and Gemini through a unified provider abstraction layer.
.bot/ directory layout
The full .bot/ directory tree after dotbot init:
Source vs. deployed
Theworkflows/ directory in the dotbot repository is the canonical source for all framework files. When you run dotbot init, framework files are copied from workflows/default/ (and any named stacks) into .bot/.
- You can freely edit files under
.bot/to customise your project. Rundotbot init -Forceto receive framework upgrades — this overwrites framework files while preserving all workspace data. - Stacks like
dotnet-blazorextend other stacks viaextendschains. Settings deep-merge in this order:default → workflows → stacks. Stack-level settings win over workflow-level settings, which win over defaults.
Runtime state: .bot/.control/ vs .bot/workspace/
dotbot separates ephemeral machine-local state from durable version-controlled state into two distinct directories.
.bot/.control/ — gitignored, machine-local
This directory is always gitignored. It contains:
| Item | Description |
|---|---|
settings.json | User-local settings overrides. Wins over settings.default.json. |
processes/ | Process registry entries tracking active AI CLI invocations. |
logs/ | Log files (retention controlled by logging.retention_days). |
| Session locks | Transient lock files preventing concurrent workflow execution. |
.bot/.control/.
.bot/workspace/ — version-controlled
This directory is committed to git. Every team member sees the same task queue, session history, product documents, and plans through standard git history.
| Directory | Contents |
|---|---|
tasks/ | Task files organised by status sub-folder (todo/, analysing/, analysed/, in-progress/, done/, needs-input/, skipped/, split/). |
sessions/ | Session log files and JSONL audit trails (token counts, costs, turn boundaries, errors). |
product/ | Product documents: mission statement, tech stack definition, entity model. |
plans/ | Implementation plan markdown files, linked to tasks by ID. |
feedback/ | Structured problem logs in three states: pending/, applied/, archived/. |
reports/ | Generated reports (cost summaries, progress reports). |
workspace/ to git means every task, question, answer, decision, and code change is auditable by your entire team through standard git tooling.
Git worktree isolation
Eachprompt and prompt_template task runs in its own git branch (task/{short-id}-{slug}) and a separate worktree directory (../worktrees/{repo}/task-{short-id}-{slug}/). On completion, the task branch is squash-merged back to the main branch and the worktree is cleaned up. This approach keeps the main working tree clean during concurrent execution and makes per-task rollback trivial.
script, mcp, and task_gen tasks skip worktree isolation and run directly in the project root. This is safe because those task types do not invoke the AI and make deterministic, auditable changes that do not require branch isolation.