Claude Code ships a built-in agent-creation wizard at /agents. It walks you through one agent at a time: type, description, prompt, model, color, tools, memory, location, confirm. The system prompt it uses to generate the agent for you is AGENT_CREATION_SYSTEM_PROMPT in the binary, and it has a lot of opinions about what a good subagent looks like (identifier rules, Use this agent when ... descriptions with <example> blocks, second-person prompts, "recently written code" defaults for reviewers, etc.).
That wizard is fine for one-off agents. But if you sit down in a fresh repo and want a useful set of subagents, you don't want to run the wizard six times and answer the same context questions. You want something that reads the repo, figures out what a good set of agents would be, and writes them all in one shot.
So I built /agentify. It scans the project (manifests, CI, CLAUDE.md, source layout, existing .claude/ setup), proposes a set of agents tailored to what it finds, and writes them to .claude/agents/*.md after you confirm. The authoring discipline mirrors AGENT_CREATION_SYSTEM_PROMPT and the validation mirrors validateAgent.ts so the output is the same shape Claude Code's own wizard produces.
Given a project directory (defaults to your current working directory):
- Resolve the project root via
pwd/git rev-parse --show-toplevel. - Scan the codebase:
CLAUDE.md,AGENTS.md,README*, package manifests, CI configs, source layout, existing.claude/agents/and.claude/skills/. - Propose a set of subagents. Each one points to evidence from the scan (a real workflow, file, command, or convention). Minimum one. Zero is a valid outcome if the project doesn't justify any. No padding to hit a count.
- Wait for your confirmation. No files written before you say yes.
- Write each agent to
<project>/.claude/agents/<name>.mdwith canonical frontmatter (name,description,tools,model,effort,color,memoryin that order) and a second-person system prompt that references real paths and conventions from the scan. - Validate against the real rules: name regex
^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]$(length 3-50), enum-checkedmodel/color/memory/permissionMode/isolation, description starting withUse this agent when ...with at least one<example>block.
Add the marketplace and install the plugin in Claude Code:
/plugin marketplace add 0xMH/claude-agentify
/plugin install agentify@0xMH/claude-agentify
Or test locally during development:
claude --plugin-dir ./path/to/claude-agentify
From inside a project:
/agentify
Or pass a path or a brief:
/agentify ~/code/my-app
/agentify make me a migration checker and a release auditor
After it writes files to .claude/agents/, you can use the agents three ways:
- Auto-delegation: the main Claude reads each agent's
descriptionand routes matching tasks to it. The<example>blocks in the description are what drives this, so they matter. - Explicit:
Use the <agent-name> subagent to ... /agents: list, view, edit, invoke from the built-in UI.
Newly written agents may need a session restart to load.
The built-in /agents wizard creates one agent per run and asks you for every dimension. agentify:
- Reads the project and proposes a tailored set, so you confirm once instead of running the wizard N times.
- Forces evidence per agent. If a proposed agent can't point to something in the scan, it gets dropped. No generic
code-reviewerfiller. - Restricts tools by role automatically (read-only roles do not get
Write/Edit). - Mirrors the
AGENT_CREATION_SYSTEM_PROMPTdiscipline (identifier rules,Use this agent when ...descriptions with<example>blocks, second-person prompts, code-review "recently written" default, memory section pattern whenmemory:is set). - Writes the canonical field set (
name,description,tools,model,effort,color,memory) in the same order Claude Code's own writer uses.
Agents written by agentify follow this structure:
---
name: project-role
description: "Use this agent when ... <example>Context: ...\nuser: \"...\"\nassistant: \"...\"\n<commentary>...</commentary></example>"
tools: Read, Glob, Grep
model: inherit
color: blue
---
You are ...Field rules (enforced by Claude Code's own validator):
name(required): regex^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]$, length 3-50, must equal filename without.md.description(required): YAML double-quoted, newlines escaped as\n. Should start withUse this agent when ...and embed<example>blocks.tools(optional): comma-separated. Omit the field entirely to inherit all tools.model(optional):sonnet | opus | haiku | inherit.color(optional):red | blue | green | yellow | purple | orange | pink | cyan.memory(optional):user | project | local.effort(optional): enum string or positive integer.
Reader-only fields parsed if present: disallowedTools, permissionMode, maxTurns, isolation, background, initialPrompt, skills, mcpServers, hooks.
MIT