Across the course you've built scoped subagents, orchestrated them into workflows, written skills, commands, and hooks, and learned how a plugin packages all of it. Now you'll put it together into one real, shareable thing: a plugin that carries a multi-agent workflow, tested against a live codebase and published so anyone can install it with a single command.
Lean on Claude as you go: ask it to scaffold files, look up current syntax, and review your structure. That's how you'd really build one.
We've provided a repo for your plugin — this is where you'll assemble and publish it. The same Express API from the earlier projects is included here under course-api/; build and test your plugin against it so your subagents and workflow operate on real code rather than a toy example.
By the end, the provided repo will be two things at once: the plugin itself, and the marketplace that offers it.
A single plugin that bundles:
- Two scoped subagents — purpose-built workers, each limited to the tools and model its job needs.
- A multi-agent workflow command — one command that runs those subagents as a workflow, with at least one parallel step and one dependent step.
- A skill and a hook — to round the plugin into a complete setup, not just agents.
- A manifest, a README, and a marketplace catalog — so the plugin installs by name and you can version it.
- Have this repo cloned. The course API to test against is included here in
course-api/—cd course-api && npm installonce so it's ready to run. - Skim back over Unit 8 (creating, scoping, and orchestrating subagents) and Unit 9 (plugin structure,
${CLAUDE_PLUGIN_ROOT}, marketplaces, versioning) — you'll use all of it. - Decide on a theme for your plugin so the pieces belong together. A 'code quality' plugin (review + tests + a formatting hook) or a 'release' plugin (changelog + version bump + checks) both work well.
In the provided repo, create the plugin structure: .claude-plugin/plugin.json with a name and a starting version, the component folders you'll need at the root, and a README.md. Confirm the layout is right — only plugin.json lives inside .claude-plugin/, everything else sits at the root.
Add at least two custom subagents in agents/. For each one:
- a
descriptionthat names when to use it, in the words a real situation would use; - a body that says what to do and what to return;
- a
toolsline limited to what the job actually needs (read-only workers get read-and-search tools only); - a
modelmatched to the difficulty of the job. Make them genuinely different — for example, a read-only reviewer and an agent that writes or edits.
Add a command in commands/ whose body runs your subagents as a workflow. It must include at least one parallel step and one dependent (sequential) step — independent work running together, and a step that waits for earlier results. Write the orchestration in plain language, the command is the one-word trigger for the whole flow.
Add one skill (skills/<name>/SKILL.md) and one hook (hooks/hooks.json) that fit your plugin's theme. If the hook runs a bundled script, reference it through ${CLAUDE_PLUGIN_ROOT} so it resolves wherever the plugin installs — don't hardcode a path.
Load the plugin with claude --plugin-dir . from the repo root and run it against the API in course-api/. Confirm each piece fires by its namespaced name, and that your workflow command orchestrates the subagents in the right order. Use /reload-plugins to pick up edits as you refine. Fix anything that doesn't load — start by checking folder placement.
Add .claude-plugin/marketplace.json listing your plugin (its name matching plugin.json, source: "./", a one-line description). Commit and push. Then, as your own first user, run /plugin marketplace add <your repo> and /plugin install <your-plugin>@<your-marketplace> in a fresh session, and confirm everything installs and runs cleanly.
Add a NOTES.md to the repo covering:
- what the plugin does and how to install it;
- one scoping decision and why you made it (why a subagent got the tools or model it did);
- why your workflow command runs the steps it does in parallel versus in sequence.
- The repo has a valid plugin:
.claude-plugin/plugin.jsonwithnameandversion, component folders at the root, and aREADME.md. - At least two subagents in
agents/, each with a sharp description, a body that states what to return, a scopedtoolsline, and a fittingmodel. - A workflow command in
commands/that orchestrates the subagents with at least one parallel step and one dependent step. - A skill in
skills/<name>/SKILL.mdand a hook inhooks/hooks.json, both fitting the plugin's theme; any bundled script path uses${CLAUDE_PLUGIN_ROOT}. - The plugin loads and runs locally via --plugin-dir against the API in course-api/.
-
.claude-plugin/marketplace.jsonis present and correct, and the plugin installs cleanly via/plugin marketplace add+/plugin install. -
NOTES.mdcovers install steps, one scoping decision, and one orchestration decision. - Everything is committed and pushed.
Build your plugin in this repo, commit, and push — pushing is submitting, there's no form to fill in. Make sure plugin.json, marketplace.json, all your component folders, the README.md, and NOTES.md are committed, and that the repo installs as a marketplace from a clean checkout.
This project is graded automatically by the Validate plugin check that runs on every push — the tick or cross next to your latest commit, with the full run in the Actions tab. When you first open the repo the check is red, because there's no plugin yet. It turns green once your plugin is complete and correctly structured, and green is the pass. If it's red, open the run: it prints exactly which item is missing or wrong.
The check confirms everything that can be read from your files:
plugin.jsonis valid with anameandversion, and only manifest files sit inside.claude-plugin/;- at least two subagents in
agents/, each with adescription, a body, a scopedtoolsline, and amodel— and genuinely different: at least one read-only worker, and at least one that can write or edit; - a workflow command in
commands/; - a skill at
skills/<name>/SKILL.mdand a hook athooks/hooks.json, with no hardcoded absolute paths (use${CLAUDE_PLUGIN_ROOT}); marketplace.jsonis valid and lists your plugin under the samenameasplugin.json;README.mdand a realNOTES.mdare present.