Context resolution¶
This page documents how Takopi resolves run context (project, worktree/branch, engine) from messages. For step-by-step usage, see Projects and Worktrees.
Overview¶
Projects let you give a repo an alias (used as /alias in messages) and opt into
worktree-based runs via @branch.
- If no projects are configured, Takopi runs in the startup working directory.
- If a project is configured,
@branchresolves/creates a git worktree and runs the task in that worktree. - Progress/final messages include a
ctx:footer when project context is active.
Config schema (relevant subset)¶
All config lives in ~/.takopi/takopi.toml.
See Config for the full reference.
default_engine = "codex" # optional
default_project = "z80" # optional
transport = "telegram" # optional, defaults to "telegram"
[transports.telegram]
bot_token = "..." # required
chat_id = 123 # required
[projects.z80]
path = "~/dev/z80" # required (repo root)
worktrees_dir = ".worktrees" # optional, default ".worktrees"
default_engine = "codex" # optional, per-project override
worktree_base = "master" # optional, base for new branches
chat_id = -123 # optional, project chat id
Legacy config note: top-level bot_token / chat_id are auto-migrated into
[transports.telegram] on startup.
Note on worktrees_dir:
- The default
.worktreeslives inside the repo root. You'll see it as an untracked directory (with nested git worktrees) unless you ignore it. - Options:
- add
.worktrees/to your repo.gitignore, or - set
worktrees_dirto a path outside the repo (e.g.~/.takopi/worktrees/<alias>). - add it to
.git/info/excludeif you prefer a local-only ignore.
Validation rules:
projectsis optional.- Each project entry must include
path(string, non-empty). default_projectmust match a configured project alias.- Project aliases cannot collide with engine ids or reserved commands (
/cancel). default_engineand per-projectdefault_enginemust be valid engine ids.projects.<alias>.chat_idmust be unique and must not matchtransports.telegram.chat_id.transportdefaults to"telegram"when omitted; override per-run with--transport.
takopi init¶
takopi init <alias> registers the current repo as a project alias.
Important behavior:
- The stored
pathis the main checkout of the repo, even if you runtakopi initinside a worktree. Takopi resolves the repo root via the git common dir and writes that path to[projects.<alias>].path. worktree_baseis set from the current repo using this resolution order:origin/HEAD→ current branch →master→main.
Directives and context resolution¶
Takopi parses the first non-empty line of a message for a directive prefix.
Supported directives:
/engineor/engine@bot: chooses the engine/project: chooses a project alias@branch: chooses a git branch/worktree
Rules:
- Directives must be a contiguous prefix of the line; parsing stops at the first non-directive token.
- At most one engine directive, one project directive, and one
@branchare allowed (duplicates are errors). - If a reply contains a
ctx:line, Takopi ignores new directives and uses the reply context.
Context footer (ctx:)¶
When a run has project context, Takopi appends a footer line rendered as inline code (backticked):
- With branch:
`ctx: <project> @<branch>` - Without branch:
`ctx: <project>`
The ctx: line is parsed from replies and takes precedence over new directives.
When a message arrives in a chat whose chat_id matches projects.<alias>.chat_id,
Takopi defaults the project context to that alias unless a reply ctx: or explicit
/project directive is present.
Worktree resolution¶
When @branch is present:
worktrees_root = <project.path> / <worktrees_dir>
worktree_path = worktrees_root / <branch>
Branch validation:
- Must be non-empty
- Must not start with
/ - Must not contain
..path segments - May include
/(nested directories) - The resolved worktree path must stay within
worktrees_root
Worktree creation rules:
1) If worktree_path exists:
- It must be a git worktree or Takopi errors.
2) If it does not exist:
- If local branch exists: git worktree add <path> <branch>
- Else if remote origin/<branch> exists:
git worktree add -b <branch> <path> origin/<branch>
- Else:
git worktree add -b <branch> <path> <base>
Base branch selection:
1) projects.<alias>.worktree_base (if set)
2) origin/HEAD (if present)
3) current checked out branch
4) master if it exists
5) main if it exists
6) otherwise error
When @branch is omitted:
- Takopi runs in
<project.path>(the main checkout).
Examples¶
Start a new thread in a worktree:
/z80 @feat/streaming fix flaky test
Reply to a progress message to continue in the same context:
ctx: z80 @feat/streaming