A versioned engineering team for Claude Code. A main-thread lead (the lead skill, /team-justin:lead) scopes work, detects the stack, routes to the right specialist subagent, and drives it to done — either building a project from scratch or contributing to an existing codebase.
- Claude Code ≥ 2.1.220. Not enforceable in
plugin.json(no engine/min-version field exists) — older CLIs may silently ignore newer frontmatter fields rather than erroring. - Model access to
claude-opus-5andclaude-sonnet-5. Every agent pins an explicit model ID rather than the floatingopus/sonnetaliases, so behavior is reproducible across installs. If your plan or provider (Bedrock/Vertex/Foundry) doesn't expose those IDs, swap themodel:line inagents/*.mdback to the alias.
skills/lead/SKILL.md— the lead / orchestrator; invokes as/team-justin:lead(add theplanverb to grill a change and persist its brief). You are the PM — the team has no roadmap or prioritization function.agents/*.md— specialist subagents.TRACKER.md— the user-level plan store: the change'sbrief.md(incl. commit/PR cadence),planner's tickets, capturedIDEAS.mdlines, one file per known defect underissues/, and freeform brainstorming undernotes/. Nothing of it is written into the working repo.SOURCES.md— official MCP/skill/plugin each stack must use (official sources first).ROSTER.md— current + planned agents, and how to grow the team.CHANGELOG.md/VERSION— release history.
This repo is a self-contained Claude Code plugin (team-justin, .claude-plugin/plugin.json) served by its own single-plugin marketplace (.claude-plugin/marketplace.json, name team-justin). Installing as a plugin — rather than symlinking into ~/.claude — is what makes it work identically locally and in Claude Code on the web, because plugin content resolves ${CLAUDE_PLUGIN_ROOT} (the install dir) in both, whereas the web VM never sees your machine's ~/.claude.
Most users — install from the marketplace:
/plugin marketplace add ap-justin/team-justin
/plugin install team-justin@team-justin
Contributors (editing the plugin itself — no install, picks up edits live): clone the repo and point Claude at your clone:
git clone https://github.com/ap-justin/team-justin
claude --plugin-dir ./team-justin # /reload-plugins after edits
Claude Code on the web — commit this to the .claude/settings.json of each repo you want the team in; the web session prompts once to install:
{
"extraKnownMarketplaces": {
"team-justin": { "source": { "source": "github", "repo": "ap-justin/team-justin" } }
},
"enabledPlugins": { "team-justin@team-justin": true }
}Skills/agents load namespaced as team-justin:* (e.g. the lead is /team-justin:lead). Edit here, version in git.
Migrating from the old symlink setup? Remove the
~/.claude/agentsand~/.claude/skills/*symlinks that point here (they'd shadow the plugin copies with un-namespaced duplicates), then use one of the installs above.
- From scratch: "build a landing page for X" / "new SvelteKit app that…"
- Contribute: from inside a repo, "add feature Y" / "fix Z" — the lead maps the codebase and routes to the matching specialist.
- Or invoke explicitly:
/team-justin:lead <task>. - Plan it first:
/team-justin:lead plan <subject>— the lead grills you to the studs, then writes a change-shaped brief (what lands, blast radius, cadence — commits are the steps; a PR split means an environment boundary or a partial ship — decisions, non-goals, done-when) to the plan store. A barelead <task>still grills when the work warrants it; onlyplanpersists. - Park it for later:
/team-justin:lead idea <one-liner>— one unexamined line into the plan store'sIDEAS.md. No grill, no codebase read, no triage; the nextplangrill reads it back and you decide whether it's in scope. - Record a bug:
/team-justin:lead issue <what's wrong>— opens a defect file in the plan store'sissues/from what you just said. No investigation, no fix; the fields it didn't look into say_not investigated_so the stub can't pass for a finished write-up. - Any verb also takes an explicit trailing-
:form —plan:/idea:/issue:— for when the task itself starts with one of those words.
- Official sources first — no agent answers framework/API specifics from training data; it resolves via the official MCP/skill/plugin in
SOURCES.md. - Single-responsibility agents — each does one job well.
- Reuse built-ins —
Explore,Plan,/code-review,/tdd,/verifyinstead of reinventing them. - Minimal diff in brownfield — match the target repo's conventions, never impose the team's defaults.