- factory-audit: ./ and bare/absolute script checks scoped to command position (no false FAILs on ./src or printf); hook sources limited to .apm/hooks or package-root hooks/; Kiro-aware lowercase events; unfilled template placeholders FAIL; repo-only instructions FAIL at any scope; Vale description FAIL documented; bats 367 -> 378 - primitive-author: split-quote/spaced paths and handler-less entries promoted to Must; Step 4.2 renders into a scratch consumer instead of a no-op dry run; dispatch and gate hand-off trimmed - apm-workflow 1.0.2: mutual boundary with primitive-author - forge: no double package bump; gotcha wording - skill-author: create keeps seeded 0.1.0 (ADR-0022); portable, retry-safe new-skill.sh; template and flow consistency fixes - hook docs: cite the ADR-0019 correction; guard caveat Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KkT7RSDwDbmrM9T34b6sTi
4.2 KiB
name, description, metadata
| name | description | metadata | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| forge | Use when the user wants to build or improve something but has not named its type ("skill or plugin?"). Not a skill -> skill-author. Not an agent -> agent-author. Not a hook, instruction or prompt -> primitive-author. Not a plugin -> apm-workflow. |
|
Gotchas
- Claude Code's skill-level
context: forkfrontmatter field and the/forksubagent command are opposites despite the shared word:context: forkisolates (fresh context, no parent access), while/forkinherits the full conversation. The route reference each classification loads spends that distinction:references/author-routes.mdchooses between a/forksubagent and an inline run, andreferences/apm-routes.mdrules the fork out.
Step 1 — Grill the intent
Call grill-with-docs unless a grill session has already run and is available in the context.
If grill-with-docs does not resolve, read references/grill-fallback.md.
Grilling often overturns or splits the assumed type, so it runs before classification, inline — a subagent cannot hold the back-and-forth.
Step 2 — Classify and dispatch
Match the grilled intent against exactly one row — or more than one, if the intent genuinely spans several artifacts.
| Intent | Artifact type | Route to | Read |
|---|---|---|---|
A reusable capability the agent loads inline in the main conversation, triggered by description-matching, free to bundle its own references/, scripts/ or assets/ |
Skill | skill-author |
references/author-routes.md |
| A recurring task needs its own reusable definition — dedicated system prompt, tools and description, invokable by name across sessions | Agent / subagent | agent-author |
references/author-routes.md |
| A runtime callback at a harness event, a rule scoped to a file pattern, or a reusable user-typed message steering existing skills or agents | Hook / instruction / prompt | primitive-author |
references/author-routes.md |
| A new distributable unit — no existing plugin is the right home for the skill, agent, hook or MCP server being built, or the bundle needs its own manifest, versioning and install lifecycle | Plugin | apm-workflow (apm plugin init) |
references/apm-routes.md |
| The plugin already exists and only its marketplace-facing metadata changes — a first listing, or a version/description update, never the plugin's contents | Marketplace entry | apm-workflow (apm marketplace package add) |
references/apm-routes.md |
The table classifies what to build, not how to run it: a one-off task that merely needs an isolated or context-inheriting run is not an artifact and has no row here. If the intent stays genuinely ambiguous between rows after grilling, ask the user rather than guessing.
A real artifact that matches no row — an MCP server, an AGENTS.md, a research doc — has no route here. Say so, hand the user the skill that does own it, and never bend it into a row to make the table fit.
When the intent spans several rows, chain the routes in dependency order — an artifact that must exist on disk before another skill can target it goes first, so apm-workflow scaffolds the plugin directory before skill-author scaffolds a skill inside it.
Announce, then invoke. State the classification and which skill(s) will run. Then read the reference file for each classified artifact type — only those — and follow it.
Step 3 — Closing gates, common to every route
- Resolve before closing. A route is finished only when its verification reports nothing unresolved. An actionable finding reopens the route; it is never reported onward as a caveat.
- Bump the package version. A skill route always lands here:
skill-authormoves only a skill's ownmetadata.version, which is not the packageapm.yml's number — so readreferences/version-bump.mdafter one; it skips the bump when the branch already has one.agent-author,primitive-authorand the apm routes bump the package themselves at plugin scope; after those, read it only when their output says neither that they bumped nor that the branch already had.