Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ This repo **is** the dev-team Claude Code plugin and its marketplace. Do not sca

- `agents/` + `skills/` — the six roles (orchestrator is skill-only, no agent); each agent is a thin launcher — preloads its skill via `skills:`, sets effort and memory, pins no tools or model (skills are the single source of truth for role definitions)
- `commands/` — `/dev-team:sync` seed-sync command; `/dev-team:tickets` ticket-system setup/tuning; `/dev-team:checkins` Orca check-in setup; `/dev-team:board` Owner board setup
- `bin/` — check-in trigger scripts and the coordinator lock, run by Orca automations (copied into each project's git dir by the hook); `peer`, the Orca coordinator's dispatch / tell / watch helper; `board-drift`, the Owner board's PR check
- `bin/` — check-in trigger scripts and the coordinator lock, run by Orca automations (copied into each project's git dir by the hook); `peer`, the Orca coordinator's dispatch / tell / watch helper; `board-drift`, the Owner board's PR check; `seed-drift`, sync's drift check
- `templates/`, `workflow/` — framework reference shipped with the plugin, referenced via `${CLAUDE_PLUGIN_ROOT}`; `workflow/handoffs.md` is the canonical home of gate-validity rules, `workflow/adoption.md` of existing-project adoption rules, `workflow/orca.md` of the optional Orca runtime, `workflow/tickets.md` of ticket-system rules, `workflow/board.md` of the Owner board
- `seeds/` — files the `bootstrap` skill copies into consuming projects (standards, stack, status, backlog index, project CLAUDE.md); project-owned after copy
- `examples/workspace/` — worked example (one feature folder plus its ADR) referenced by the skills; `examples/board/` — Owner board sample data and README screenshots (made-up data only)
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ Plugin updates never touch project-owned files, so a project bootstrapped before

- **Moves** an older type-first workspace to feature folders (dry run first, then `git mv` with links rewritten)
- **Copies** any seed file the project is missing (standards, `stack/stack.md`, `status.md`, `status-done.md`, the backlog index and archive) and creates any missing folders
- **Reports drift** in existing standards: lists seed sections (`##` headings) absent from your project's copy, ignoring your customizations
- **Reports drift** (`bin/seed-drift`): seed sections (`##` headings) absent from your standards, seed rules absent from the project's dev-team section, and Orca Runtime-line settings renamed or added since — names only, so your customizations never show up as drift
- **Appends only what you approve** — never overwrites, rewrites, or deletes project content

After a sync, fill placeholders in newly copied files and commit them to your project repo.
Expand All @@ -128,7 +128,7 @@ Validate with `claude plugin validate .`
| `agents/`, `skills/` | The six roles (orchestrator is skill-only) + bootstrap skill | ✅ via plugin update |
| `commands/` | `/dev-team:sync` — pull missing/updated seeds into a project; `/dev-team:tickets` — ticket-system setup/tuning; `/dev-team:checkins` — Orca check-ins; `/dev-team:board` — Owner board | ✅ via plugin update |
| `templates/`, `workflow/` | Document templates, pipeline/handoff/communication rules | ✅ via plugin update |
| `bin/` | Check-in trigger scripts, the coordinator lock and `peer` (Orca runtime); `board-drift` (Owner board) | ✅ via plugin update |
| `bin/` | Check-in trigger scripts, the coordinator lock and `peer` (Orca runtime); `board-drift` (Owner board); `seed-drift` (sync) | ✅ via plugin update |
| `hooks/` | Session-start announcement + agent-memory size sentinel | ✅ via plugin update |
| `seeds/` | Copied into projects by bootstrap/sync | ❌ project-owned after copy |
| `examples/workspace/` | Worked example of the full pipeline, in the workspace layout | ✅ via plugin update |
Expand Down
47 changes: 47 additions & 0 deletions bin/seed-drift
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#!/bin/bash
# seed-drift [project-dir] — what the plugin's seeds have that this project's copies lack (commands/sync.md step 4).
# Reports seed sections missing from <ws>/standards/*.md, seed rules missing from the dev-team section, and
# outdated Orca Runtime-line settings. Prints one line per finding (exit 1), or "up to date" (exit 0).
P=${1:-.}
PLUGIN=$(cd "$(dirname "$0")/.." && pwd)
source "$PLUGIN/bin/_workspace.sh" "$P"
found=0
say() { echo "$1"; found=1; }
norm() { sed -e 's/^## *//' -e 's/ *(.*) *$//' | tr '[:upper:]' '[:lower:]'; }

# 1. Standards: seed "## " sections the project's copy lacks. "(active)" and case don't count.
for seed in "$PLUGIN"/seeds/standards/*.md; do
f="$P/$WS/standards/$(basename "$seed")"
[ -f "$f" ] || continue
have=$(grep '^## ' "$f" | norm)
while IFS= read -r h; do
printf '%s\n' "$have" | grep -qxF "$(printf '%s\n' "$h" | norm)" ||
say "standards/$(basename "$seed"): missing section \"${h#\#\# }\""
done < <(grep '^## ' "$seed")
done

# 2. The dev-team section: seed rules (bold labels under "## Rules") it lacks. Guest mode keeps it in CLAUDE.local.md.
section="$P/CLAUDE.md"
grep -qs '\*\*Workspace:\*\*' "$P/CLAUDE.local.md" && section="$P/CLAUDE.local.md"
if grep -qs -e '^# Development Organization' -e '\*\*Workspace:\*\*' "$section"; then
orca=$(grep -s 'Runtime: Orca' "$section")
label() { sed -n 's/^- \*\*\([^*:.]*\)[:.].*/\1/p'; }
have=$(label < "$section")
while IFS= read -r l; do
# Under the Orca runtime the Runtime line replaces the in-conversation rule.
[ -n "$orca" ] && [ "$l" = "Run roles in this conversation" ] && continue
printf '%s\n' "$have" | grep -qxF "$l" || say "$(basename "$section"): missing rule \"$l\""
done < <(sed -n '/^## Rules/,/^## /p' "$PLUGIN/seeds/CLAUDE.project.md" | label)

# 3. The Orca Runtime line: settings renamed or added since the project wrote it (workflow/orca.md § Opt in).
if [ -n "$orca" ]; then
case "$orca" in *"Peer clear threshold"*)
say "Runtime line: \"Peer clear threshold\" is now \"Peer size limit: 400k\" (a fresh session per task; the limit is the mid-task safety net)" ;;
*"Peer size limit"*) ;;
*) say "Runtime line: no \"Peer size limit\" (400k applies)" ;;
esac
case "$orca" in *"Board:"*) ;; *) say "Runtime line: no \"Board:\" setting (off applies)" ;; esac
fi
fi
[ $found = 0 ] && echo "up to date"
exit $found
6 changes: 3 additions & 3 deletions commands/sync.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
description: Sync plugin seeds into the project workspace — moves an old type-first layout to feature folders, copies missing files, reports seed sections missing from existing standards. Never overwrites.
description: Sync plugin seeds into the project workspace — moves an old type-first layout to feature folders, copies missing files, reports seed sections, rules, and settings an existing project lacks. Never overwrites.
---

Sync this project's workspace with the plugin's seeds. Seeds are **project-owned after copy** — never overwrite or modify an existing project file without explicit approval. Layout and settings: `${CLAUDE_PLUGIN_ROOT}/workflow/workspace.md`.
Expand Down Expand Up @@ -29,8 +29,8 @@ cp -n "${CLAUDE_PLUGIN_ROOT}/seeds/standards/"*.md "$WS/standards/"

**Guest mode** (the dev-team section is in `CLAUDE.local.md`): copy only the process standards — `planning.md`, `documentation.md`, `review.md`. Code conventions (`coding.md`, `testing.md`, `architecture.md`, `design.md`) come from the repo itself; copy one only if the repo documents nothing on that subject and the Owner wants it. `tickets.md` and `checkins.md` are never copied here — `/dev-team:tickets` and `/dev-team:checkins` add them when enabled.

4. **Drift check** on files that already existed: for each `$WS/standards/*.md` with a same-named seed, compare `##` headings. List seed headings absent from the project file — sections added to the plugin since the project's copy. Ignore all other differences (project customizations always win).
4. **Drift check** on what already existed: `"${CLAUDE_PLUGIN_ROOT}/bin/seed-drift" .` lists what the plugin added since the project's copies were made — seed sections missing from `$WS/standards/*.md`, seed rules missing from the dev-team section (`CLAUDE.md`, or `CLAUDE.local.md` in guest mode), and Orca Runtime-line settings renamed or added (`${CLAUDE_PLUGIN_ROOT}/workflow/orca.md` § Opt in). It compares names only; every other difference is a project customization and always wins.

5. **Report** four lists: **moved** (step 2), **copied** (was missing), **up to date**, **behind** (seed headings missing — name them). For each "behind" file, offer to append the missing sections verbatim; append only what the user approves. Never delete or rewrite existing content.
5. **Report** four lists: **moved** (step 2), **copied** (was missing), **up to date**, **behind** (each `seed-drift` line). For each behind item, offer the fix: append a missing section verbatim from its seed, append a missing rule bullet verbatim from `${CLAUDE_PLUGIN_ROOT}/seeds/CLAUDE.project.md`, or update the Runtime line to the setting it names. Apply only what the user approves. Never delete or rewrite existing content beyond that.

6. Remind the user to fill placeholders in newly copied files and to commit — to the project repo, or, for an uncommitted workspace, nothing to do: the Stop hook commits the workspace's own repository.
Binary file modified examples/board/board-dark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified examples/board/board-light.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 3 additions & 2 deletions examples/board/sample.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@
{ "id": "dt-product", "order": 1, "name": "dt-product", "role": "product-manager", "doing": "APP-214 saved searches: PRD waiting on you" },
{ "id": "dt-designer", "order": 2, "name": "dt-designer", "role": "designer", "doing": "APP-219 onboarding checklist: mockups" },
{ "id": "dt-architect", "order": 3, "name": "dt-architect", "role": "principal-engineer", "doing": "Idle" },
{ "id": "dt-dev-1", "order": 4, "name": "dt-dev-1", "role": "senior-developer", "doing": "APP-207 CSV export: T03 of 4" },
{ "id": "dt-dev-1", "order": 4, "name": "dt-dev-1", "role": "senior-developer", "doing": "APP-207 CSV export: #420 writer, stacked on #409" },
{ "id": "dt-dev-2", "order": 5, "name": "dt-dev-2", "role": "senior-developer", "doing": "APP-231 voice notes: waiting on the mic go" },
{ "id": "dt-dev-3", "order": 6, "name": "dt-dev-3", "role": "senior-developer", "doing": "APP-226 fixing review findings on #412" },
{ "id": "dt-reviewer", "order": 7, "name": "dt-reviewer", "role": "reviewer", "doing": "Reviewing #418, APP-228 rate limits" }
],
"work": [
{ "id": "APP-207", "group": "Reporting", "group_order": 1, "ticket": "APP-207", "title": "CSV export for invoices", "peer": "dt-dev-1", "pr": 409, "state": "building", "next": "T03 streaming writer, then T04" },
{ "id": "APP-207-query", "group": "Reporting", "group_order": 1, "ticket": "APP-207", "title": "CSV export: invoice query", "peer": "dt-dev-1", "pr": 409, "state": "ready", "next": "Reviewed and green: merges with #420, not alone" },
{ "id": "APP-207-writer", "group": "Reporting", "group_order": 1, "ticket": "APP-207", "title": "CSV export: streaming writer (stacked on #409)", "peer": "dt-dev-1", "pr": 420, "state": "building", "next": "T04, then review; merges with #409" },
{ "id": "APP-214", "group": "Reporting", "group_order": 1, "ticket": "APP-214", "title": "Saved searches", "peer": "dt-product", "state": "owner", "next": "PRD approval (Needs you)" },
{ "id": "APP-219", "group": "Reporting", "group_order": 1, "ticket": "APP-219", "title": "Onboarding checklist", "peer": "dt-designer", "state": "planning", "next": "Mockups to the PM for approval" },
{ "id": "APP-231", "group": "Mobile", "group_order": 2, "ticket": "APP-231", "title": "Voice notes on Android", "peer": "dt-dev-2", "pr": 415, "state": "owner", "next": "Recording go (Needs you)" },
Expand Down
8 changes: 8 additions & 0 deletions seeds/standards/coding.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,14 @@ Footer, when needed: `Refs: <feature>/tasks/index.md`, `Closes: #<issue>`.

One commit per coherent unit of work: a task, a batch of tasks completed together, or one fast-path fix. Never mix pipeline work with unrelated fixes.

## Stacked PRs (active when `gh stack` is installed)
Applies when `gh extension list` shows `github/gh-stack`. Who syncs what is decided by what is in flight, not fixed: adapt as stacks form and change.

- **Build on unmerged work; don't wait for the merge.** A task that depends on work whose PR has not merged builds on that PR's branch as a stacked PR: `gh stack checkout <PR#>` (or `gh stack init <lower-branch>`), `gh stack add <branch>`, commit, then `gh stack submit --auto` (new PRs open as drafts) and set the real title.
- **Each PR is reviewed on its own diff.** Its base is the branch below it; that branch's head is the Review manifest's base commit.
- **A stack merges together, bottom up,** once every PR in it is reviewed and green. A green lower PR never merges alone: `main` stays shippable for anyone releasing.
- **Keeping branches current — the owner syncs by default.** Your own stack (every branch yours): `gh stack sync`, which rebases and force-pushes the whole stack with lease. A stack shared with others: bring only your branch up to date — merge the branch below into it and push — and never run `gh stack sync`, which would rewrite their branches. When many hands share stacks, the orchestrator (the coordinator under Orca) may name one **stack keeper** for a while: it brings lower changes up with merge commits only, never force-pushes, and tells each owner to pull. Say who syncs when a stack forms, and change it when the stack changes.

## Naming
_TBD — casing, file naming, module naming._

Expand Down
6 changes: 6 additions & 0 deletions seeds/standards/review.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,11 @@
- **standard** — diff review with targeted caller checks.
- **deep** — the work contains a major decision: trace every changed public interface's callers; line-by-line on security-sensitive paths. Set by the Principal Engineer in the task index.

## Review order (active)
For changes that touch access, money, or existing data, check in this order and record each step in the review:
1. **Security** — who can read or change what, before and after. Probe base and head with a real request where possible, not only by reading.
2. **Breakage** — callers, existing data, existing connections and integrations.
3. **Cost** — performance and spend.

## Checklists
_TBD — per-project checklist (security, performance, accessibility…)._
3 changes: 3 additions & 0 deletions seeds/standards/testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
- The Senior Developer runs the full suite before marking any task complete.
- The Reviewer independently runs the suite during review.

## Behaviour changes (active)
Changes whose effect is statistical — prompts, model or tool choice, ranking, search relevance, performance — are accepted on a before/after run, never on reading the code: a fixed set of real cases, run several times on the base and on the branch; success checked against the system's real outcome (the database, not the reply); the cost (calls, failures, tokens, time); and an explicit list of what got worse.

## Test types and coverage
_TBD — unit/integration/e2e expectations, coverage thresholds._

Expand Down
1 change: 1 addition & 0 deletions skills/bootstrap/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ git log --oneline -1 2>/dev/null; ls docs CLAUDE.md CLAUDE.local.md 2>/dev/null
- **Ticket system:** Linear, Jira, GitHub, or another tracker? Yes → run `${CLAUDE_PLUGIN_ROOT}/commands/tickets.md`. No → `/dev-team:tickets` enables it later.
- **Orca:** does the Owner run Claude from Orca? Yes → add the Runtime line (`${CLAUDE_PLUGIN_ROOT}/workflow/orca.md` § Opt in) and offer `/dev-team:checkins`.
- **Owner board:** a live page of what needs the Owner, who is on what, and work in flight — recommended when several roles run at once. Yes → run `${CLAUDE_PLUGIN_ROOT}/commands/board.md`. No → `/dev-team:board` sets it up later.
- **Stacked PRs:** `gh extension list` shows `github/gh-stack` → tell the Owner `<ws>/standards/coding.md` § Stacked PRs applies. Not installed → the section stays dormant; `gh extension install github/gh-stack` turns it on.
- **Design tool:** Figma, Penpot, or another tool with an MCP server? Yes → fill `<ws>/standards/design.md` § Design tool. No → mockups are HTML in each feature's `mockups/`.

6. **Existing projects — harvest, then draw the line** (`workflow/adoption.md`):
Expand Down
1 change: 1 addition & 0 deletions skills/orchestrator/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ Traffic control: decide who acts next and where the work runs, verify prerequisi
`<ws>/status.md`; `<ws>/backlog/index.md` rows when asked what is waiting; artifact **headers only** — existence via Glob, approval via Grep (`Status:`, `Approved by`), Designer requirement via Grep for `## UX Direction` in the brief or PRD. Never read artifact bodies.

## Workflow
0. **Reports first.** A role's report that asks for a go — install, run, merge, record — is answered before anything else, in the same turn, and the answer recorded; the Owner should never be the one to find a role waiting on you. Pass the Owner's words on verbatim (`${CLAUDE_PLUGIN_ROOT}/workflow/communication.md` § Relaying the Owner).
1. Asked to pull work and a ticket system is enabled → run the config's work query and classify each ticket by its Routing, passing the ticket ID to the receiving role. Classify: bug/chore → Senior Developer fast path; small change or doc correction → the role owning the affected artifact (no gates, no status row); feature, ticket, or decision-changing work → Product Manager triage, which sets the path (`workflow/overview.md` § Paths); real but not now → a backlog item for the Product Manager (no status row until promoted).
2. Recommend where it runs: inline in this conversation by default; an agent only for concurrency, independent review, context relief, or a full phase of a role whose model the project pins differently from this session's — started with that role's model (`workflow/overview.md` § Models per role). Project `CLAUDE.md` declares **Runtime: Orca** → dispatch to top-level peers per `${CLAUDE_PLUGIN_ROOT}/workflow/orca.md` instead; never spawn subagents.
3. A feature whose `Approvals` column reads `pre-adoption` predates this organization: its upstream gates are waived, its downstream gates apply in full (`workflow/adoption.md`). Never route it back to fill in missing history.
Expand Down
Loading
Loading