Config
The keys in .codeloop/config.yaml that codeloop 0.4.1 reads, and the local.yaml overlay.
Two files
.codeloop/config.yaml is committed and shared. .codeloop/local.yaml is gitignored, never synced to the cloud, and laid over config.yaml key by key: a map in local.yaml merges with the shared one, a list or a plain value replaces it. Put agent commands, machine paths and anything secret there.
codeloop config get <dotted.path> prints one value with the overlay applied, or nothing when it is unset. The CI templates use it: codeloop config get deploy.staging.command.
Keys the CLI reads
| Key | Default | Read by |
|---|---|---|
project.name |
the folder name | Mock paths, status output. |
personas |
founder, builder, reviewer, dev, visitor, team | The story check. A list of names, a list of { name, pains }, or a map keyed by name. |
agents.default |
the first tool init set up |
run --agent with no name. init writes an agents: block for the tools it detects (claude -p --permission-mode acceptEdits < {brief}, codex exec --full-auto, cursor-agent -p) and never overwrites one that exists. |
agents.<name>.cmd |
required | Shell command run in the project directory. {brief} becomes the shell-quoted path of the stage brief. |
agents.<name>.timeout_minutes |
20 | The agent and its children are killed after this. |
agents.<name>.max_runs_per_day |
20 | Starts of this agent across the project in any 24 hours. |
run.agent |
false | true makes plain codeloop run start agents. --no-agent turns it off for one run. |
lanes.auto_start |
false | A finishing lane's own on_done: { start } actually starts the next card. Off, a done card only announces what it would start. A downstream lane's own trigger: { on: lane.done } is a separate mechanism and fires either way. |
gates.mode |
all |
trusted auto-approves gates that come after a check. Outward gates still park on entry. |
capacity.gates_per_day |
unset | start and card new are refused while this many cards are waiting on you. Proposals do not count. |
deploy.<env>.command |
unset | The CI workflows run it for staging and production. |
deploy.<env>.base_url |
unset | verify --env <env> sends api-layer use cases here. |
verify.setup |
npm ci && npm run build |
What verify --mutate runs on the old commit before re-running use cases. |
codeloop.critical_frequency |
3 | A wiki page at this frequency becomes critical. |
codeloop.promote_frequency |
10 | A wiki page at this frequency is copied into rules.md. |
store.driver |
file |
Where cards, lanes, wiki and evidence are read from. Only file ships. |
Keys the skills read
The ten skill files that init writes are prompts, and they read these keys when a host runs them. The CLI does not enforce them.
| Key | Used by |
|---|---|
scopes.<name>.paths, gotcha_sections, pattern_sections |
/commit maps changed files to scopes and loads only those sections of gotchas.md and patterns.md. |
quality_checks.<scope>[] with name and command |
/commit runs them; a non-zero exit is a critical finding. codeloop status warns when none are defined. |
diff_scan[] with pattern, files, exclude, severity, message |
/commit searches the diff. |
test.command, coverage_threshold, integrity_checks |
/test and /qa. |
deploy.staging.verify, deploy.production.verify, deploy.production.requires |
/deploy and /ship. |
debug.logs, debug.health |
/debug. |
commit.types, commit.format |
/commit builds the message. |
watch.* |
codeloop watch: enabled, idle_timeout, signals.*, ignore. |
A working example
The generic starter, with the agent block filled in:
project:
name: "exportly"
personas:
- founder
- accountant
scopes:
all:
paths: ["**/*"]
gotcha_sections: []
pattern_sections: []
quality_checks:
all:
- name: "Typecheck"
command: "npx tsc --noEmit 2>&1 | tail -20"
commit:
types: [feat, fix, refactor, docs, test, chore, perf]
format: "type(scope): message"
deploy:
staging:
command: "make deploy-staging"
base_url: "https://staging.exportly.example"
production:
command: "make deploy-prod"
agents:
default: claude
claude:
cmd: "claude -p --permission-mode acceptEdits < {brief}"
timeout_minutes: 20
max_runs_per_day: 20
run:
agent: true
codeloop:
critical_frequency: 3
promote_frequency: 10
max_knowledge_lines: 200Starters for node-typescript, python and go fill in scopes and quality checks for that stack; init picks one from the files it finds, or takes --starter.