This project has been archived by its maintainers, and is no longer receiving any updates.
named-subagents
Distinct, themed, non-repeating names for parallel Claude Code subagents — a
userspace port of Codex's per-instance nickname_candidates.
Fan out several subagents in Claude Code and the task tree shows each one by its type. This plugin gives every instance its own name, themed to the kind of task and never repeated across runs. (Recorded from a real session; the banner and status line are cropped out.)
Quick start: the Claude Code plugin
claude plugin marketplace add Bobby-cell-commits/named-subagents
claude plugin install named-subagents@named-subagents
Needs python3 (3.8+) on PATH. New sessions name every subagent, for any
agent type.
The plugin runs four hooks:
PreToolUsesets the Agent tool'snamefield (shown in the tree) and the<emoji> Name · tasklabel (quoted in finish notices). Two live agents never share a name, becausenameis also the addressSendMessageroutes by; other local sessions' titles are skipped too. Anamethe model chose is left alone.SubagentStarttells the agent its name and asks it to open its report with[Name].SubagentStopfrees the name by agent ID, so a resumed agent keeps its name.Stopfails loud: if Claude Code did not record the name the hook set (for example, a future version stops honoringname), you see anamed-subagents: …notice at the end of the turn.
It adds nothing to the prompt: no agent files, no extra agent-list entries.
NAMED_SUBAGENTS_HOOK_DISABLE=1 turns it off.
If you registered hooks earlier with named-subagents hook install, run
named-subagents hook uninstall; while that install is present the plugin's hooks
stand down so the two never name one dispatch.
Known limits. name is an Agent-tool input that is not in the published
schema, so an update could drop it (the Stop check exists for that). If you
refuse an Agent permission prompt and a same-type dispatch starts within 30
seconds, that agent may be told the refused name; SubagentStop repairs the
record and shows a mix-up notice. Details and live verification: CHANGELOG.
Without the plugin
pip install named-subagents
named-subagents hook install --name # the plugin's four hooks, in ~/.claude/settings.json
named-subagents hook status
Plain hook install registers the older context-only namer instead: the agent
learns its name, but the tree does not show it. hook install --project . scopes
either to one project; hook uninstall removes them. install/uninstall back up
settings.json, refuse to touch malformed JSON, and only add or remove their own
entries. Hooks load at session start, so open a new session afterwards. Install
one runtime's hooks per machine (the ports lock state differently).
| Env var | Effect |
|---|---|
NAMED_SUBAGENTS_HOOK_DISABLE=1 |
pause the hooks without uninstalling |
NAMED_SUBAGENTS_LEDGER |
ledger path (default ~/.local/state/named-subagents/hook-ledger.json) |
NAMED_SUBAGENTS_QUEUE_DIR |
dispatch-queue dir (default ~/.local/state/named-subagents/queue/) |
NAMED_SUBAGENTS_HOOK_BIO=1 |
add the figure's one-line bio to the identity block |
NAMED_SUBAGENTS_PLUGIN_FORCE=1 |
run the plugin's hooks even next to a settings.json install |
Themes
395 names in 14 categories, each globally unique, each with a one-line bio:
| Category | Task shape | Theme | e.g. |
|---|---|---|---|
explore |
map / search a codebase | Explorers & navigators | Magellan, Shackleton |
code |
implement features | Programmers & computing pioneers | Turing, Hopper |
research |
external info gathering | Scientists | Curie, Feynman |
reflect |
design rationale | Philosophers | Socrates, Kant |
debug |
root-cause hunting | Detectives | Holmes, Poirot |
test |
edge cases, adversarial | Tricksters | Loki, Anansi |
review |
critique, verdict | Judges & jurists | Solomon, Ginsburg |
security |
audit, threat model | Guardians & sentinels | Argus, Heimdall |
design |
UI / UX / visual | Artists & designers | DaVinci, Rams |
data |
analysis, stats, ML | Mathematicians | Gauss, Noether |
orchestrate |
plan, coordinate | Strategists | SunTzu, Napoleon |
docs |
technical writing | Writers | Orwell, Borges |
build |
infra / refactor / perf | Engineers & inventors | Tesla, Brunel |
default |
catch-all | Stars | Orion, Vega |
A task maps to a category by explicit category > subagent_type > task keywords > default. The keyword layer is a heuristic; pass category= or role= when the
theme must be exact.
Non-repeat. allocate() draws in a deterministic md5-seeded order, records
used names in a ledger, and skips them next time. When a pool runs out it
starts a new generation (Magellan·2, …). A name is never reused unless you
release it. Same (category, ledger state) gives the same result, so re-runs
are safe.
Library
pip install named-subagents # Python 3.8+, zero dependencies
from named_subagents import Registry, Ledger, plan_fanout
reg = Registry.load()
ledger = Ledger(".named-subagents-ledger.json")
plan = plan_fanout(["map the auth module", "map the billing module"],
reg, ledger=ledger, role="Explore")
for a in plan:
print(a.emoji, a.nickname, "—", a.bio) # a.agent_kwargs() -> Agent-tool payload
The generated prompt asks the agent
to open with [Name]; attribute(nickname, report) repairs a missing or wrong
prefix when all you have is the report text.
CLI
named-subagents resolve --task "audit auth" --explain # which theme, and why
named-subagents allocate --category reflect --count 3
named-subagents assign --role Explore --task "map the router" --count 4 \
--ledger .ledger.json [--format agent|labels|workflow|swarm|table]
named-subagents assign --task "audit the release" --pin security=Argus # stable identity
named-subagents release --category explore --name Hudson --ledger .ledger.json # recycle
named-subagents retire --category explore --name Columbus --ledger .ledger.json # never again
named-subagents bio Heimdall
named-subagents stats --ledger .ledger.json
named-subagents doctor # self-checks; --json for machines
named-subagents init # scaffold a config
- Pins bypass the ledger and are reserved out of normal draws.
--avoid-installedkeeps names disjoint from your.claude/agentsnames.--formatemits snippets for Workflow scripts, swarm YAML, or plain labels.doctorchecks registry integrity, ledger health, pins and version strings, and self-tests the hooks./named-fanoutskill:cp -r skill/named-fanout ~/.claude/skills/.
Config comes from --config PATH, $NAMED_SUBAGENTS_CONFIG, or
~/.config/named-subagents/config.json:
{ "pins": { "security": "Argus" },
"categories": { "starships": { "theme": "Star systems", "emoji": "🚀",
"keywords": ["fleet"], "names": ["Enterprise", "Rocinante"] } },
"extend": { "explore": { "names": ["Kupe"] } } }
New keys add categories, existing keys replace them, extend appends. Custom
names are validated on load because they end up inside agent prompts. A
project-local ./.named-subagents.json is not loaded unless you pass
--cwd-config (or set NAMED_SUBAGENTS_CWD_CONFIG=1), since a cloned repo
controls it. See SECURITY.md.
Development
python3 tests/test_named_subagents.py && python3 tests/test_hook.py
python3 tests/test_name_mode.py && python3 tests/test_roster.py
CI runs the suites on Python 3.8/3.12/3.13, plus ruff and coverage. See CONTRIBUTING.md for the ground rules and docs/RELEASING.md for releases. The npm package and its JavaScript port were retired in 0.7.1. Design notes live in docs/research/; docs/COMMUNITY.md surveys the rest of the ecosystem, which names agents by role, not instance.
License
Metadata
Release files for named-subagents 0.7.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| named_subagents-0.7.1.tar.gz | 102.8 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| named_subagents-0.7.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 170.1 kB
Release files / named_subagents-0.7.1.tar.gz
| Download URL | named_subagents-0.7.1.tar.gz |
|---|---|
| Size | 102.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
82d0c8c93b3a1c721a8847a778e0b29a58a53741e6287a787e388c502391b73a
|
|
BLAKE2b-256 checksum How to use checksums |
7836ab18c443f126f4b90a03e2b5daadfd4d4122c9365ed21529647ca176ceab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency logRelease files / named_subagents-0.7.1-py3-none-any.whl
| Download URL | named_subagents-0.7.1-py3-none-any.whl |
|---|---|
| Size | 67.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
68557b60bf9b283cfdfc89b594512e357dc8d76a7aec657fc10ff5fbcce42e4c
|
|
BLAKE2b-256 checksum How to use checksums |
38bfeafaf130cd5951063cc5ba98f41ad0c8fb4c9914596b80823d9444c4122a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency logSecurity for named-subagents 0.7.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for named_subagents-0.7.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.