A Claude Code plugin that orchestrates multi-task workflows through structured research-plan-implement lifecycles. Named after the obvious — a fellowship of agents, each on their own quest, coordinated by a wizard who never writes code.
Fellowship gives Claude Code a disciplined workflow engine. Instead of diving straight into code, tasks go through phased lifecycles with hard gates between them: research the system, plan the changes, implement with TDD, review against conventions, then ship.
For multiple independent tasks, it spins up parallel agent teammates — each in an isolated git worktree — coordinated by a lead agent (Gandalf) who routes approvals and reports progress.
From within Claude Code, run these as two separate commands:
/plugin marketplace add justinjdev/claude-plugins
/plugin install fellowship@justinjdev
Fellowship's /quest skill orchestrates skills from these plugins. Install them for the full workflow:
| Plugin | Skills used | Phase |
|---|---|---|
| superpowers | using-git-worktrees, test-driven-development, verification-before-completion, finishing-a-development-branch |
Onboard, Implement, Review, Complete |
| pr-review-toolkit | review-pr |
Review |
These are referenced by name in skill prompts. If a dependency isn't installed, Claude performs the step's goal manually and notes the substitution in its output — but you lose the structured discipline the dedicated skill provides.
/plugin marketplace add obra/superpowers-marketplace
/plugin install superpowers@superpowers-marketplace
/plugin install pr-review-toolkit@claude-plugins-official
- Go CLI binary — gate enforcement hooks use a Go binary that is automatically downloaded from GitHub releases on first use. No manual installation required.
Add this hook to .claude/settings.local.json in repos where you use fellowship. It detects /lembas checkpoints from previous sessions and offers to resume:
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "if [ -f .fellowship/checkpoint.md ]; then echo '--- CHECKPOINT DETECTED ---'; cat .fellowship/checkpoint.md; echo '--- END CHECKPOINT ---'; echo 'A checkpoint from a previous session was found. Use /council to resume or start fresh.'; fi"
}
]
}
]
}
}Also add the fellowship data directory to your .gitignore — checkpoints and state are local ephemeral files. Keep .fellowship/config.json trackable, though: it holds committable team-shared settings (see /settings):
.fellowship/*
!.fellowship/config.jsonIf you have configured a custom dataDir in ~/.claude/fellowship.json, use that directory name instead.
Create ~/.claude/fellowship.json in your personal Claude directory to customize fellowship behavior across all projects. All settings are optional — missing keys use sensible defaults that match the out-of-box behavior.
{
"dataDir": ".fellowship",
"branch": {
"pattern": null,
"author": null,
"ticketPattern": "[A-Z]+-\\d+"
},
"worktree": {
"enabled": true,
"directory": null
},
"gates": {
"autoApprove": []
},
"pr": {
"draft": false,
"template": null
},
"palantir": {
"enabled": true,
"minQuests": 2
},
"issues": {
"autoClose": true
},
"models": {
"quest": null,
"scout": null,
"palantir": null,
"balrog": null,
"explore": null,
"validator": null
}
}| Setting | Default | Description |
|---|---|---|
dataDir |
".fellowship" |
Directory name for fellowship working files (state, checkpoints, errands, tome). Created inside each worktree and the main repo root. |
branch.pattern |
null |
Branch name template with placeholders: {slug} (task description), {ticket} (extracted from description), {author} (from config). When null, defaults to "fellowship/{slug}". |
branch.author |
null |
Static value for the {author} placeholder. If not set and pattern uses {author}, you'll be prompted. |
branch.ticketPattern |
"[A-Z]+-\\d+" |
Regex to extract ticket IDs from quest descriptions. Default matches Jira-style IDs (e.g., PROJ-123). |
worktree.enabled |
true |
Whether quests create isolated worktrees. Set to false to work on the current branch. |
worktree.directory |
null |
Parent directory for worktrees. null uses Claude Code's default (.claude/worktrees/). |
gates.autoApprove |
[] |
Gate names to auto-approve: "Onboard", "Research", "Plan", "Implement", "Adversarial", "Review" (the phase being left — "Research" auto-approves Research→Plan). Gates not listed still surface to you for approval. |
pr.draft |
false |
Create PRs as drafts. |
pr.template |
null |
PR body template string. Supports {task}, {summary}, and {changes} placeholders. |
palantir.enabled |
true |
Whether to spawn a palantir monitoring agent during fellowships. |
palantir.minQuests |
2 |
Minimum active quests before palantir is spawned. |
issues.autoClose |
true |
When true, /missive includes Closes #N in PR keywords so issues close on merge. |
models.quest |
null |
Model for quest teammates. Valid values: "haiku", "sonnet", "opus" (aliases only — spawn parameters accept neither "inherit" nor full model IDs; leave null to inherit). null = built-in default: inherit the session model. |
models.scout |
null |
Model for scout teammates. Same valid values. null = built-in default: sonnet. |
models.palantir |
null |
Model for the palantir monitor. Same valid values. null = built-in default: haiku. |
models.balrog |
null |
Model for balrog adversarial review. Same valid values. null = built-in default: inherit the session model. |
models.explore |
null |
Model for Explore scan subagents spawned by quest, scout, council, and guide. Same valid values. null = built-in default: haiku. |
models.validator |
null |
Model for scout's validation subagent. Same valid values. null = built-in default: sonnet. |
The config is read at fellowship startup and quest onboard (Phase 0). Changes to the file take effect on the next fellowship or quest invocation.
Skills are invoked automatically by Claude as part of a workflow (quest phases, context compression, etc.) — you can also invoke any of them directly with /name.
| Skill | Purpose |
|---|---|
/quest |
Full Research → Plan → Implement lifecycle for non-trivial tasks. The hub that orchestrates everything else. |
/fellowship |
Multi-task orchestrator. Spawns parallel agent teammates running /quest (code) or /scout (research). |
/scout |
Research & analysis workflow. Investigates questions, optionally validates with a fresh adversarial subagent. No code, no PRs, no commits. |
/council |
Context-aware onboarding. Loads task-relevant files, conventions, and architecture at session start. |
/gather-lore |
Studies reference files to extract conventions before writing code. Prevents "wrong approach" rework. |
/lembas |
Context compression between phases. Keeps the context window in the reasoning sweet spot. |
/warden |
Pre-PR convention review. Compares changes against reference files and documented patterns. |
/missive |
Fetches GitHub issue context for quest spawning — title, body, labels, comments, branch suggestions, and PR close keywords. |
/retro |
Post-fellowship retrospective. Analyzes gate history, palantir alerts, and quest metrics, then recommends configuration improvements. |
/lorebook |
Loads phase-specific guidance from an assigned quest template at the start of each quest phase. |
Commands are user-invoked only — Claude never calls them automatically, so they carry no base context cost.
| Command | Purpose |
|---|---|
/chronicle |
One-time codebase bootstrapping. Walks through your project to extract conventions into CLAUDE.md. |
/guide |
Interactive, learn-by-doing walkthrough of fellowship using a real task on your codebase. |
/red-book |
Post-PR convention capture. Extracts conventions from reviewer comments and adds them to CLAUDE.md. |
/rekindle |
Recovers a fellowship after a session crash — scans worktrees and state files, then re-spawns Gandalf with recovered context. |
/scribe |
Creates a reusable quest template that encodes project-specific rules and conventions into phase guidance. |
/settings |
View or edit fellowship settings (~/.claude/fellowship.json). Interactive setup for all configuration options. |
| Agent | Role |
|---|---|
| palantir | Background monitor during fellowship execution. Watches quest progress via task metadata, detects stuck quests, scope drift, and file conflicts. Reports to Gandalf. Defaults to the haiku model. |
| quest-runner | Quest execution agent. Uses the fellowship CLI for gate management, status checks, and phase transitions. |
| balrog | Adversarial validation agent spawned by quest between Implement and Review. Analyzes the diff for failure modes, writes and runs targeted test cases, and delivers a severity-ranked findings report. |
| scout | Research & analysis agent spawned as a fellowship teammate for read-only investigation — no code edits, no git operations. Defaults to the sonnet model. |
| validator | Read-only adversarial validator spawned by scout to verify research findings against the actual code (CONFIRMED/CONTESTED/UNVERIFIED). Tools restricted to Read/Glob/Grep. Defaults to the sonnet model. |
Single task — run /quest:
Phase 0: Onboard → worktree isolation + /council context loading
Phase 1: Research → explore agents + /gather-lore
Phase 2: Plan → plan mode with file:line references + user approval
Phase 3: Implement → TDD (red-green-refactor)
Phase 3.5: Adversarial → balrog attacks the implementation (edge cases, error paths)
Phase 4: Review → /warden conventions + code quality + verification
Phase 5: Complete → PR creation + worktree cleanup
Research — run /scout:
Investigate → (Validate) → Deliver
Autonomous research with confidence levels. For complex questions, spawns a fresh validator subagent to adversarially verify findings. Produces a structured report — no code changes, no PRs.
Multiple tasks — run /fellowship:
Gandalf (the coordinator) spawns quest and scout teammates. Quests run in isolated worktrees and produce PRs. Scouts research questions and deliver findings. Say "status" to see a progress table. By default, all quest gates surface to you for approval — auto-approve specific gates via ~/.claude/fellowship.json (see Configuration).
Gate enforcement — gates are structurally enforced via plugin hooks. After a teammate submits a gate, their work tools (Edit, Write, Bash, etc.) are blocked until the lead approves by writing to the quest state file. Prerequisites (running /lembas and updating task metadata) are verified before gate submission is allowed. Self-approval is structurally impossible.
- Context is the bottleneck. Compact between every phase. Don't let research noise degrade implementation reasoning.
- Hard gates prevent drift. No planning without understanding. No implementing without a plan. No PR without review.
- Compose, don't rebuild. Skills call other skills. No new runtime code — just orchestration over Claude Code primitives.
- Human in the loop. By default, all gates require your approval. You can opt into auto-approval for specific gates via config. Gandalf never merges PRs.
- Isolation by default. Every quest gets its own worktree. No shared in-progress state.
- Local scope only. Teammates are restricted to code, tests, git, and the filesystem. MCP tools and external services (Notion, Slack, Jira, etc.) require explicit approval.
- Model routing — Every subagent spawn point now routes to a cost-appropriate model: palantir defaults to
haiku, scout and the validator tosonnet, Explore scans tohaiku, while quest teammates and balrog keep the session model. Override any role via the newmodels.*config block. - Validator agent — Scout's adversarial validation runs in a dedicated read-only agent (Read/Glob/Grep only, enforced by tool restrictions) instead of an unrestricted general-purpose subagent.
- Mode-aware gate accounting — The lead verifies quest completion against the gates the quest's mode actually requires: 6 for standard/promoted quests (Adversarial included), 3 for plan-driven. Progress tracking and phase enumerations now include Adversarial everywhere.
- Spawn prompt consolidation — The three quest spawn prompt variants collapsed into one base template with per-variant deltas, eliminating ~250 lines of drift-prone duplication and unifying hold/shutdown language.
- Project config layer — Fellowship startup and quest onboard now merge
.fellowship/config.json(project) with~/.claude/fellowship.json(user) as defaults → project → user, matching/settings. - CLI phase fix —
fellowship init --phase Adversarialwas rejected and company progress ranked Adversarial-phase quests as zero; phase lists now derive from a single canonical order in the state package. - Messaging protocol fixes — SendMessage recipients are teammate names (task-ID addressing never delivered); balrog and scout embed the full report envelope inline; balrog gained Write/Edit scoped strictly to test files ("report, don't repair").
- Docs refresh — README and site document all 10 skills, 6 commands, and 5 agents; the skills page separates auto-invoked skills from user-invoked commands;
/validate-docsgained a config-schema cross-check.
- Worktree isolation guard — A fail-closed hook blocks quest teammates from writing source into the main working tree when isolation is skipped.
fellowship state initregisters it in the git-ignored.claude/settings.local.json(no commits to your repo), and it arms only while a quest worktree is live, so it never blocks ordinary solo work. - Lead cd-guard hardening — Gandalf is now blocked from
cd-ing into quest worktrees created outside.claude/worktrees/(e.g. lead-provisioned worktrees), preventing the lead from inheriting a quest's gate or hold state.
- SQLite storage — All state (quests, gates, tome, errands, herald, bulletin, autopsy) migrated from JSON files to SQLite with WAL mode. Eliminates file locking issues and race conditions in parallel quests. Run
fellowship migrateto upgrade existing data. - Interactive
/guide— Rewrote the guide from a passive concept explainer to a learn-by-doing walkthrough. Walks beginners through a real quest on their own codebase, then introduces/questand/fellowship. - Concepts page — New docs site page explaining agentic workflows, orchestration, isolation, context engineering, and human-in-the-loop.
- Quest autopsy — Failure memory that persists across sessions. When a quest fails, records what went wrong so future quests can learn from past failures.
- Bulletin board — Cross-quest knowledge sharing. Quests post discoveries to a shared bulletin during Research and Implement.
- Gate enrichment — Gate submissions now include structured context (diff stats, test results, phase summary) for informed approval decisions.
- WorktreeGuard — Blocks the lead session from accidentally
cd-ing into quest worktrees.
- Stale gate state fix — Gate guard hook no longer blocks Gandalf when a previous quest's gate state file is present in a fresh worktree. Prevents stale state from causing spurious tool blocks at session start. (#56)
- Fellowship startup fix —
ensure-binary.shnow runs before any fellowship operations, removing the PATH dependency. All CLI calls use the full binary path (~/.claude/fellowship/bin/fellowship). state initoverwrite warning — Instead of erroring whenfellowship-state.jsonalready exists,fellowship state initnow warns and proceeds (shows existing name and quest count).validate-docsmarketplace check — Validates that skill and agent counts in the marketplace description match the actual plugin.- Deprecated commands removed —
fellowship installandfellowship uninstallCLI subcommands removed.
/missiveskill — Fetches GitHub issue context for quest spawning. Pulls title, body, labels, and comments viaghCLI. Returns issue context, suggested branch name (with issue number), and PR closing keywords. Gandalf invokes it automatically on#Nreferences; also usable standalone as/missive 42.- Balrog agent — Adversarial validation agent. Reviews code for structural quality: factoring, coupling, cohesion, abstraction levels, information hiding. Challenges every design decision, not just obvious violations.
- Per-project config — Committable
.fellowship/config.jsonfor team-shared settings. Three-way merge: defaults → project → user (user always wins)./settingsshows merged config with provenance annotations. issues.autoCloseconfig — When true (default),/missiveaddsCloses #Nto PR keywords so issues close on merge.- Base branch fixes — Worktrees receive the correct base branch; handles detached HEAD and dirty working tree edge cases.
- Scout-to-quest promotion — Say
promote scout-X to a questduring a fellowship. Gandalf reads the scout's findings file, spawns a quest pre-loaded with the research, and the quest enters validation mode instead of researching from scratch. /retroskill — Post-fellowship retrospective. Analyzes gate history, palantir alerts, and quest metrics. Recommends configuration changes like auto-approving gates with zero rejection rates. Integrated into the fellowship disband flow.- Plan-driven quests — Provide a pre-existing plan file and quests skip Research and Plan phases, jumping straight to Implement. Gandalf can fan out large plans into multiple parallel quests.
- Structured conflict resolution — Hold mechanism for quests with file conflicts. Gandalf detects overlapping file sets and holds conflicting quests until dependencies complete.
- Herald logging — Dashboard gate handlers and company batch approve now emit herald events for observability.
- Palantir alert persistence — Alerts persisted to JSONL log for post-fellowship analysis by
/retro. /releasecommand — Repo-level release automation. Suggests version based on conventional commits, audits docs/site/changelog, bumps plugin.json, tags, pushes, and updates marketplace.
- Fix — Hook binary distribution fixes (v1.7.1–v1.7.5). Use binary directly in hooks, bootstrap via SessionStart, remove duplicate hook installation.
- Eagles — quest health monitoring daemon. Detects stuck quests, scope drift, and file conflicts via periodic patrol scans.
- Tome — persistent agent identity with quest CV chains. Tracks phases completed, gate history, and files touched across quest lifetimes.
- Company — work bundling for quest grouping. Groups related quests into a company for coordinated tracking and status reporting.
- Herald — activity feed with event logging, problem detection, and dashboard integration. Surfaces quest events and auto-detected problems.
- State CLI —
fellowship statecommands for inspecting and managing quest state, plusfellowship state add-companyfor company management. - File locking — mutex-based file locking for concurrent state mutations across parallel quests.
.fellowship/data directory — working files (state, checkpoints, errands, tome) now use.fellowship/instead oftmp/. Configurable viadataDirsetting.- CI — PR workflow to run Go tests on pull requests.
- LOTR theming — renamed internals: patrol→eagles, convoy→company, cv→tome, events/feed→herald.
- Shared helpers — extracted common git/file utilities into
internal/gitutilpackage. - Fix — phase tracking for auto-approved gates and pending submissions.
- Fix — hook errors silenced in non-quest contexts.
- Fix plugin discovery — moved
.claude-plugin/plugin.jsonto repo root with explicit path fields for skills, agents, commands, and hooks. Fixes skills not showing up after install.
/scoutskill — research & analysis workflow for lightweight research teammates alongside code quests. Autonomous (no gates/hooks), optional adversarial validation via fresh subagent. (#12)- Fellowship scouts — Gandalf learns to spawn scouts via
"scout: <question>"alongside code quests, with status tracking and optional routing to other teammates.
- Go CLI —
fellowshipbinary replaces bash hook scripts. Handles hook logic, gate approval/rejection, install/uninstall, and status. Distributed via GitHub releases, auto-downloaded on first use. - Plugin subfolder — plugin files moved to
plugin/for clean installs via marketplacegit-subdir. Go source, CI, and build config stay at repo root. - Quest runner agent —
agents/quest-runner.mdfor CLI-driven quest execution. - BREAKING — bash hook scripts replaced by Go CLI binary.
jqno longer required.
- Gate state machine — structural enforcement of quest phase gates via plugin hooks. Teammate tools are blocked after gate submission until the lead approves. Prerequisites (lembas + metadata) are verified before submission. Self-approval is structurally impossible. Observed compliance: ~33% with prompt-only → ~95%+ with hooks. (#5)
- Hook scripts — 4 plugin hooks (
gate-guard,gate-submit,gate-prereq,metadata-track) with test suite jqdependency — required for gate enforcement. Hooks fail-closed ifjqis missing.- BREAKING — plugin now ships executable bash scripts (
hooks/scripts/). Previously pure markdown only.
- gather-lore rewrite — simplified to study-only (pattern extraction). Code generation and diff checking removed as redundant with quest Implement + warden Review phases.
/red-bookskill — new skill for capturing conventions from PR reviewer feedback into CLAUDE.md. Closes the convention learning loop.- Quest recovery — Phase 3 now has explicit recovery procedure: when implementation hits a wall, stop, commit partial work, document the blocker, return to Plan phase.
- Quest resume — failed/dead quests can be respawned into their existing worktree. Council finds the lembas checkpoint and offers to resume.
- Palantir fix — spawned as
fellowship:palantir(custom agent with restricted tools) instead ofgeneral-purpose. - Palantir cadence — event-driven monitoring triggered by Gandalf after gate transitions and quest spawns, instead of unbounded.
- Worktree ownership — quest Phase 0 owns worktree creation. Fellowship no longer passes
isolation: "worktree", eliminating double-worktree conflicts and unused branch naming logic. - Config schema dedup — canonical schema lives in
/settings. Fellowship references it instead of duplicating. branchPrefixremoved — deprecated key fully removed from all skills and config.- Escape hatch criteria — concrete heuristics (single file, < 50 lines, no new patterns, familiar area) replace "use judgment".
- Monorepo conditional — council package scope step now skips for single-package repos.
- Nested subagent worktrees removed — if plan subtasks have file conflicts, fix the plan.
- Branch name patterns —
branch.patternconfig with a flexible template system. Supports{slug},{ticket}, and{author}placeholders for team-specific branch naming conventions (e.g.,"{author}.{ticket}.{slug}"producesjustin.JIRA-123.fix-auth-bug). Missing placeholders are prompted interactively. Breaking: removedbranchPrefix(deprecated in v1.3.0). Usebranch.patterninstead — e.g.,"myprefix/{slug}"replaces"branchPrefix": "myprefix/".
/configcommand — interactive skill to view, edit, and reset fellowship settings- Config moved to personal directory —
~/.claude/fellowship.jsonis now loaded from the user's personal Claude directory instead of the project root, making settings cross-project - Custom worktree directory —
worktree.directoryconfig option for organizations that don't use Claude Code's default worktree location - Removed superpowers:using-git-worktrees dependency — quest now uses
EnterWorktreedirectly for worktree isolation
- Config file support —
~/.claude/fellowship.jsonfor customizing branch prefixes, gate auto-approval, PR defaults, worktree strategy, and palantir settings (#3) - Palantir rewrite — rewrote from dead code into a functional monitoring agent that watches quest progress, detects stuck quests and scope drift, and alerts Gandalf via SendMessage (#2)
- Progress tracking — teammates report current phase via task metadata; say "status" during a fellowship for a structured progress table (#1)
- Gate blocking fix — replaced ineffective "WAIT" instruction with explicit turn-ending so agents actually stop at gates (#1)
- Lembas compaction at all transitions — added missing
/lembasinvocations at Implement→Review and Review→Complete (#1) - Steward removed — deleted dead agent; decomposition logic was already inlined in quest Phase 3 (#1)
- Gate discipline — Gandalf must never combine or skip gate approvals
- Conventional commits — spawn prompt and quest guidelines now enforce conventional commit format
- Initial release: quest lifecycle, fellowship orchestration, council, gather-lore, lembas, warden, chronicle
MIT