- factory-audit: hook events judged per deployed target after apm's rename (Claude/Copilot event sets FAIL, others SUGGESTION); Claude plugin layouts accepted as hook sources; interpreter options and sh -c strings checked; bats 378 -> 386 - primitive-author: Must 4/5 match the audit; reference hand-back points at the right steps; Step 4.2 --target all fallback - skill-author: new-skill.sh repair only on the template marker line, so complete skills stay a no-op; provenance and calibration text - forge: restore "already named" qualifier; drop false HITL claim - apm-workflow: token example uses an env var - docs/hooks.md: the apm-hooks.json sidecar is committed, not ignored 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 something built or improved but has not yet named its type ("skill or plugin?"). If named, use instead: skill -> `skill-author`, agent -> `agent-author`, hook/instruction/prompt -> `primitive-author`, 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.