Two scopes
Every kind is looked for in the same two places, in this order.- Your profile root,
~/.seri/<kind>/, which applies to every project. - The project,
.seri/<kind>/, found by walking up from where you started seri to the first ancestor that has one.
~/.seri/<kind> as a
project scope, because a repository that happens to sit under your home directory would otherwise
claim your default profile’s extensions as its own, and a --profile work run would reach them
through that back door. The comparison is case-folded on Windows and macOS, where one directory
routinely has two spellings.
A bad file is skipped, not fatal
Across all five kinds, a file that does not parse, or that takes a name already claimed, is skipped with a warning at startup naming the file. The session still starts. That is the same judgement in every loader. A typo in one agent file should not cost you the session, and a silent skip should not cost you the afternoon.What each one costs at session start
A directory of twenty skills costs twenty descriptions, not twenty procedures.
Compatibility, but not auto-adoption
The file formats are Cursor’s and Claude Code’s, unchanged, so existing agent files,SKILL.md
files, .mdc rules and hook scripts work when you copy them in.
seri does not read .cursor/agents/, .claude/agents/, .cursor/skills/ or .cursor/hooks/
itself. An artifact written for another harness’s toolset and another load contract loading
automatically here is a surprise rather than a convenience. Compatibility lives in the format,
and migrating is copying the files in.
Hooks are the one exception to loading on sight
Rules and skills carry text. A hook carries a program, and it runs in front of the permission gate on tools that never prompt, so an untrusted one would be code execution from agit clone
with nothing asked of you first.
Hooks in your profile root run, because nothing arrives there by cloning anything. A project’s
hooks are found, listed and left dormant until you read them and run /hooks trust, and the
trust is bound to the bytes rather than the path.
