# Extension points — msitarzewski/agency-agents

> Canonical page: https://codevetter.com/unpack/agency-agents/extension-points

# Extension points — msitarzewski/agency-agents

Scanned commit 053ddbbf392a1688fc7043d81529f47ef2cf86c8 (2026-09-21). Generated by codevetter codevetter 1.12.0 on 2026-09-22.

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. — [CONTRIBUTING.md#L34-L49](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/CONTRIBUTING.md#L34-L49) [scripts/check-divisions.sh#L12-L16](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/check-divisions.sh#L12-L16) [scripts/check-divisions.sh#L91-L97](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/check-divisions.sh#L91-L97) [divisions.json#L2](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/divisions.json#L2)
- 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. — [tools.json#L2](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/tools.json#L2) [scripts/check-tools.sh#L1-L16](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/check-tools.sh#L1-L16) [scripts/check-tools.sh#L62-L77](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/check-tools.sh#L62-L77)
- 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. — [scripts/install.sh#L1291-L1310](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/install.sh#L1291-L1310) [scripts/install.sh#L448-L467](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/install.sh#L448-L467) [scripts/convert.sh#L693-L707](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/convert.sh#L693-L707) [scripts/convert.sh#L735](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/convert.sh#L735)
- 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. — [tools.json#L4-L7](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/tools.json#L4-L7) [scripts/check-tools.sh#L56-L60](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/check-tools.sh#L56-L60) [scripts/install.sh#L349-L352](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/install.sh#L349-L352)
- 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). — [scripts/convert.sh#L216-L264](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/convert.sh#L216-L264) [scripts/lint-agents.sh#L42-L53](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/lint-agents.sh#L42-L53) [scripts/lint-agents.sh#L118-L129](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/lint-agents.sh#L118-L129) [CONTRIBUTING.md#L157-L162](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/CONTRIBUTING.md#L157-L162)
- 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. — [CONTRIBUTING.md#L87-L163](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/CONTRIBUTING.md#L87-L163) [scripts/lint-agents.sh#L39-L40](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/lint-agents.sh#L39-L40) [scripts/lint-agents.sh#L58-L71](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/lint-agents.sh#L58-L71)
- 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. — [scripts/install.sh#L167-L174](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/install.sh#L167-L174) [scripts/convert.sh#L679-L710](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/convert.sh#L679-L710) [game-development/](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/game-development/)
- 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. — [strategy/runbooks.json#L1-L16](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/strategy/runbooks.json#L1-L16) [scripts/check-runbooks.sh#L54-L71](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/check-runbooks.sh#L54-L71)
- 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. — [scripts/build-hermes-plugin.py#L94-L107](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/build-hermes-plugin.py#L94-L107) [scripts/build-hermes-plugin.py#L452-L479](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/build-hermes-plugin.py#L452-L479) [scripts/check-hermes-plugin.py#L46-L52](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/check-hermes-plugin.py#L46-L52)
- 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. — [scripts/convert.sh#L328-L385](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/convert.sh#L328-L385) [scripts/lint-agents.sh#L58-L71](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/lint-agents.sh#L58-L71)
- 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. — [scripts/check-agent-originality.sh#L57-L64](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/check-agent-originality.sh#L57-L64) [scripts/check-agent-originality.sh#L6-L11](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/check-agent-originality.sh#L6-L11)
- examples/ is a documentation extension, not a registry the scripts scan. examples/README.md invites new multi-agent writeups. The installer never reads examples/. — [examples/README.md#L1-L47](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/examples/README.md#L1-L47) [scripts/check-divisions.sh#L32](https://github.com/msitarzewski/agency-agents/blob/053ddbbf392a1688fc7043d81529f47ef2cf86c8/scripts/check-divisions.sh#L32)

Every claim links to its cited files at the pinned commit. Citations identify source evidence; they do not establish runtime correctness. Independent CodeVetter scan — not reviewed by upstream maintainers.

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
