Local overrides
Put personal specs and instructions in .agnostic-ai/local/ to extend or override the team's setup. Git ignores the folder. For example, create .agnostic-ai/local/AGNOSTIC_AI.md:
Answer in Spanish.
Then run agnostic-ai sync. The text extends the shared project instructions. Generated instruction files are ignored by default; if your project commits them, your personal text appears there too, so review before committing.
For personal configuration values, use agnostic-ai.local.yaml (see configuration). In agnostic-ai ui, Local on Settings saves built-ins and settings fields as local overrides; see saving for yourself.
Add a spec
A local spec with a new name adds a spec for your machine. A local spec with the same kind and name as a shared one changes only the fields you write. Run A folder loads only when it exists. Project sync ignores The project folder reads every spec kind: For the global folder’s supported kinds and layout, see global configuration. A local spec with the same kind and name as a shared one merges into it. Write only what changes; when the team edits the shared spec, the next sync keeps your changes on top. Shared, committed: Local, ignored: After sync, Claude uses Frontmatter (the YAML fields between For example, For settings, a local per-tool Inside an The local file's location sets its scope. YAML specs (hooks, MCP servers, settings, environments) follow the same rules: a local List the targets you do not want in Shared: Local: The result is the shared review instruction followed by your benchmark step. A local skill folder with only a Only personal overrides merge field by field. A project spec replaces a pack spec with the same kind and name in full. Two files with the same name in one folder are a mistake: one wins, and In the global folder, Hooks are matched by event, matcher, and handler. A local handler is removed from the imported hook, and a script that only local hooks run stays out of Settings, reviews, and environments share one native file per target. If your local folder holds one of these kinds, import leaves every shared spec of that kind unchanged and says so.agnostic-ai sync, then agnostic-ai list to check which source won.Choose project-local or machine-wide personal sources
Name Folder Loaded by Inspect with project-user<project>/.agnostic-ai/local/agnostic-ai sync in that projectagnostic-ai listglobal-local~/.agnostic-ai/local/ (or $AGNOSTIC_AI_HOME/local/)agnostic-ai sync --globalagnostic-ai list --global~/.agnostic-ai/, and global sync ignores every project. Your personal setup wins over the shared one.Layout
local/ mirrors the source directory:my-project/.agnostic-ai/
├── AGNOSTIC_AI.md # shared, committed
├── rules/testing.md
├── skills/review/SKILL.md
└── local/ # yours: ignored, still synced
├── AGNOSTIC_AI.md # extends the shared instructions
├── rules/scratch-notes.md # new name: appends
└── skills/review/SKILL.md # same name: edits the shared skill
agents/, skills/, rules/, hooks/, mcps/, commands/, settings/, reviews/, environments/, and ignore/. It stays at .agnostic-ai/local/ even when custom sources paths in agnostic-ai.yaml move the shared specs.Change shared fields, extend bodies, and keep supporting files
Override fields
---
name: custom
description: Draft the release notes.
model:
claude: sonnet
codex: terra
---
Read the merged PRs since the last tag.
---
name: custom
model:
claude: opus
---
opus; the description, body, and Codex model stay as shared.--- lines) merges key by key, the same way agnostic-ai.local.yaml merges over agnostic-ai.yaml:Local value Result a group of keys merges into the shared group, key by key, at any depth a single value or a list replaces the shared value nullremoves the key missing keeps the shared value tools: [Read] replaces the shared list, and tools: null removes it.model or effort map treats a shared single value as its default. Shared model: sonnet with local model: {codex: sol} gives Codex sol and every other tool sonnet. A local default overrides that shared value.x-<target> map, null removes one key: x-codex.model: null drops model for Codex only.local/rules/style.md applies to the whole project even when the shared rules/backend/style.md applies to backend/ only.mcps/docs.yaml can change env.PORT and keep the shared command and args.Turn a shared spec off
targets-exclude:---
name: review
targets-exclude: [claude, codex, cursor]
---
Extend the body
::parent line. The shared body goes there. Put your text before it, after it, or around it.---
name: custom
---
Review the changed code.
---
name: custom
---
::parent
Then run my local benchmark.
::parent must start at column 0 and stand alone on its line. Keep it outside a ::target fence. In a spec with a new name, ::parent has nothing to extend, so sync drops it.Skill assets
SKILL.md keeps the shared folder's supporting files, such as scripts and templates. If the local folder holds any other file, its own supporting files replace the shared supporting files.What does not merge
agnostic-ai lint reports the other (LINT003).Extend the instructions
.agnostic-ai/local/AGNOSTIC_AI.md extends .agnostic-ai/AGNOSTIC_AI.md. Sync appends its text to every root instruction file it writes (CLAUDE.md, AGENTS.md, GEMINI.md, and the rest), after the shared body and any inlined rules:<!-- agnostic-ai:local:start -->
Answer in Spanish. Run `make test` before every commit.
<!-- agnostic-ai:local:end -->
outputs.<target>.rules-file that names the entry point gets the block too, after the rule bodies.::target fences and @path imports work as in the shared file.local/AGNOSTIC_AI.md comes last in the managed instructions block, after the shared instructions and rules.Import
agnostic-ai import never writes your local specs into .agnostic-ai/, even though sync puts them in the native files import reads (such as a local rule inlined into AGENTS.md). Import skips every name your local folder declares and lists what it skipped. A shared spec your local folder extends keeps its own content..agnostic-ai/scripts/.
Stay out of Git
init and sync add /.agnostic-ai/local/ to the managed .gitignore block, next to /agnostic-ai.local.yaml. Add nothing by hand. See gitignore.
If ~/.agnostic-ai/ is a Git repository, add this line to its .gitignore:
/local/
See what wins
agnostic-ai list prints each spec and the source that won:
$ agnostic-ai list
skill review project-user
rule testing project
rule scratch-notes project-user
agnostic-ai list --global does the same for the global and global-local setups.
Watch
sync --watch re-syncs when you edit a local spec or .agnostic-ai/local/AGNOSTIC_AI.md. See sync --watch.