CodeVetter · Repo Unpack · Extension points
msitarzewski/agency-agents
New behavior is meant to plug in at three registries: a division, a tool, or a runbook. Agents themselves are just new markdown files that survive lint. Host-specific rendering is a convert_<tool> function plus an install_<tool> function, keyed by tools.json. Hermes tools are registered in one Python register() function inside the generator, not discovered from disk. Color names are a closed case list inside resolve_opencode_color.
- To add a division, CONTRIBUTING and check-divisions.sh require: create the directory with at least one frontmatter agent, add label/icon/color to divisions.json, and add the name to AGENT_DIRS in both scripts/convert.sh and scripts/lint-agents.sh. The lint workflow path filters must mention <div>/ or check-divisions.sh fails. Do not add strategy or integrations.
- To add a tool, tools.json's _note says: add the entry (id, label, kebab, format, installKind, dest), add convert_<tool> or reuse a format in convert.sh, add install_<tool> in install.sh, then run scripts/check-tools.sh. installKind must be per-agent, roster, or plugin. The same format name must mean byte-identical output.
- install_tool is the dispatch table. A new host does nothing until its kebab appears in ALL_TOOLS, is_detected, tool_label, the main --tool validator, and this case statement. convert.sh has a parallel case inside run_conversions plus the valid_tools array.
- Claude Code and Copilot are the identity format: no converter, install copies the source file. check-tools.sh treats converter tools as a subset of tools.json for that reason. A new identity tool still needs an install_<tool> and an ALL_TOOLS entry, not a convert function.
- Named colors are a closed map in resolve_opencode_color. lint-agents.sh awk-extracts the case arms and rejects any other non-hex color. CONTRIBUTING says a new name must be added to that map in the same PR or OpenCode silently renders grey (#6B7280).
- A new agent is a markdown file in a division, first line ---, with name, description, and color. The template in CONTRIBUTING.md is the section contract convert_openclaw and classify_header_target both key off. Optional frontmatter services is documented as a list of name, url, and tier.
- Nested agent files are already supported. find walks game-development subdirectories (unity, unreal-engine, godot, roblox-studio, blender). Division membership is the top-level directory, not the filename prefix.
- Runbook extension is an object in strategy/runbooks.json plus a prose file under strategy/runbooks/. Required fields are slug, title, mode, doc, and roster. agents[] must be filename stems. check-runbooks.sh fails the build on a dangling slug, missing doc, or duplicate runbook slug.
- Hermes tool extension is inside init_py() in build-hermes-plugin.py. register(ctx) calls ctx.register_tool four times with a schema and handler. plugin_yaml lists the same names under provides_tools. Adding a tool means editing both the generated source strings and check-hermes-plugin.py's expected_tools set.
- OpenClaw section routing is a keyword classifier, duplicated in convert_openclaw and lint-agents.sh classify_header_target. Headers matching identity, learning+memory, communication, style, critical rule, or rules you must follow go to SOUL.md; every other ## header goes to AGENTS.md. A new section title with none of those words will not land in SOUL.md.
- Originality's ENTITY regex is the extension point for market re-skins. Adding a country or platform name there stops a find-replace localization from looking novel. The check is otherwise generic shingle overlap and does not know about divisions.
- examples/ is a documentation extension, not a registry the scripts scan. examples/README.md invites new multi-agent writeups. The installer never reads examples/.