From 3b6bd2dfacf56031dab3548b90a4cd3fb715ccb7 Mon Sep 17 00:00:00 2001 From: Brady Gaster <41929050+bradygaster@users.noreply.github.com> Date: Fri, 13 Feb 2026 13:11:30 -0800 Subject: [PATCH 1/5] docs: GitHub Pages site with base path support and static template (#53) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: unignore .ai-team/ for dev branches, update contributing guide - Removed .ai-team/ from .gitignore so team files can be committed on dev/feature branches - Updated CONTRIBUTING.md to reflect guard workflow as enforcement (not .gitignore) - Updated guard workflow error message in both live and template copies - .npmignore still excludes .ai-team/ from the published package * chore: trim npm package — exclude docs and contributor files (#48) * chore: unignore .ai-team/ for dev branches, update contributing guide - Removed .ai-team/ from .gitignore so team files can be committed on dev/feature branches - Updated CONTRIBUTING.md to reflect guard workflow as enforcement (not .gitignore) - Updated guard workflow error message in both live and template copies - .npmignore still excludes .ai-team/ from the published package * chore: trim npm package — exclude docs, CONTRIBUTING.md, .gitignore - Removed docs/ from package.json files allowlist (read on GitHub, not runtime) - Added CONTRIBUTING.md, .gitignore, docs/ to .npmignore (belt-and-suspenders) - Package: 82 files / 205.7kB -> 30 files / 75.1kB (63% smaller) --------- Co-authored-by: bradygaster * feat: blog migration, team-docs guard, docs site generator (#49, #50, #51) (#52) * chore: unignore .ai-team/ for dev branches, update contributing guide - Removed .ai-team/ from .gitignore so team files can be committed on dev/feature branches - Updated CONTRIBUTING.md to reflect guard workflow as enforcement (not .gitignore) - Updated guard workflow error message in both live and template copies - .npmignore still excludes .ai-team/ from the published package * feat: blog migration, team-docs guard, docs site generator (#49, #50, #51) --------- Co-authored-by: bradygaster * fix: add --base path support to docs build for GitHub Pages Nav links, search index, and logo all used root-relative paths (/index.html) which 404 on GitHub Pages where the site is served under /squad/. Added --base CLI flag to build.js and updated workflows to pass --base /squad. Also added workflow_dispatch trigger for manual re-deploys. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * refactor: extract docs template, CSS, and JS into static files Moved inline HTML template, CSS, and JS from build.js into separate files under docs/assets/ (template.html, style.css, script.js). Build script now reads template and does placeholder replacement. CSS and JS are linked externally via the existing assets copy step. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: bradygaster Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/squad-docs.yml | 50 +++++ .github/workflows/squad-main-guard.yml | 17 +- .gitignore | 12 +- .npmignore | 9 +- CONTRIBUTING.md | 69 ++++--- docs/assets/script.js | 41 ++++ docs/assets/style.css | 83 +++++++++ docs/assets/template.html | 26 +++ .../001-wave-0-the-team-that-built-itself.md | 65 +++++++ docs/blog/001a-the-squad-squad-problem.md | 65 +++++++ docs/blog/001b-meet-the-squad.md | 79 ++++++++ docs/blog/001c-first-pr-amolchanov.md | 65 +++++++ docs/blog/002-first-community-pr.md | 55 ++++++ docs/blog/003-super-bowl-weekend.md | 61 ++++++ docs/blog/004-v020-release.md | 89 +++++++++ docs/blog/005-v030-give-it-a-brain.md | 84 +++++++++ docs/blog/006-first-external-deployment.md | 70 +++++++ docs/blog/007-first-video-coverage.md | 59 ++++++ docs/blog/008-v040-release.md | 71 +++++++ ...rogress.md => 009-v040-sprint-progress.md} | 0 docs/build.js | 175 ++++++++++++++++++ docs/scenarios/release-process.md | 41 ++-- package.json | 1 - templates/workflows/squad-docs.yml | 50 +++++ templates/workflows/squad-main-guard.yml | 17 +- 25 files changed, 1269 insertions(+), 85 deletions(-) create mode 100644 .github/workflows/squad-docs.yml create mode 100644 docs/assets/script.js create mode 100644 docs/assets/style.css create mode 100644 docs/assets/template.html create mode 100644 docs/blog/001-wave-0-the-team-that-built-itself.md create mode 100644 docs/blog/001a-the-squad-squad-problem.md create mode 100644 docs/blog/001b-meet-the-squad.md create mode 100644 docs/blog/001c-first-pr-amolchanov.md create mode 100644 docs/blog/002-first-community-pr.md create mode 100644 docs/blog/003-super-bowl-weekend.md create mode 100644 docs/blog/004-v020-release.md create mode 100644 docs/blog/005-v030-give-it-a-brain.md create mode 100644 docs/blog/006-first-external-deployment.md create mode 100644 docs/blog/007-first-video-coverage.md create mode 100644 docs/blog/008-v040-release.md rename docs/blog/{2026-02-13-v040-sprint-progress.md => 009-v040-sprint-progress.md} (100%) create mode 100644 docs/build.js create mode 100644 templates/workflows/squad-docs.yml diff --git a/.github/workflows/squad-docs.yml b/.github/workflows/squad-docs.yml new file mode 100644 index 000000000..307d502c5 --- /dev/null +++ b/.github/workflows/squad-docs.yml @@ -0,0 +1,50 @@ +name: Squad Docs — Build & Deploy + +on: + workflow_dispatch: + push: + branches: [preview] + paths: + - 'docs/**' + - '.github/workflows/squad-docs.yml' + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: '22' + + - name: Install build dependencies + run: npm install --no-save markdown-it markdown-it-anchor + + - name: Build docs site + run: node docs/build.js --out _site --base /squad + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: _site + + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/squad-main-guard.yml b/.github/workflows/squad-main-guard.yml index 9f7f65117..7ada6e38b 100644 --- a/.github/workflows/squad-main-guard.yml +++ b/.github/workflows/squad-main-guard.yml @@ -41,11 +41,8 @@ jobs: .filter(f => { // .ai-team/** — ALL team state files, zero exceptions if (f === '.ai-team' || f.startsWith('.ai-team/')) return true; - // team-docs/** EXCEPT team-docs/blog/** — blog content is allowed - if (f.startsWith('team-docs/')) { - if (f.startsWith('team-docs/blog/')) return false; - return true; - } + // team-docs/** — ALL internal team docs, zero exceptions + if (f.startsWith('team-docs/')) return true; return false; }); @@ -60,7 +57,7 @@ jobs: '', 'The following files must NOT be merged into `main`.', '`.ai-team/` is runtime team state — it belongs on dev branches only.', - '`team-docs/` internal content should stay on dev (only `team-docs/blog/` is allowed on main).', + '`team-docs/` is internal team content — it belongs on dev branches only.', '', '### Forbidden files found:', '', @@ -72,17 +69,17 @@ jobs: '# Remove tracked .ai-team/ files (keeps local copies):', 'git rm --cached -r .ai-team/', '', - '# Remove tracked team-docs/ files (except blog/):', + '# Remove tracked team-docs/ files:', 'git rm --cached -r team-docs/', - 'git checkout HEAD -- team-docs/blog/', '', '# Commit the removal and push:', 'git commit -m "chore: remove forbidden paths from PR"', 'git push', '```', '', - '> ⚠️ `.ai-team/` is in `.gitignore` but files previously force-added with `git add -f`', - '> remain tracked. `git rm --cached` untracks them without deleting your local copies.', + '> ⚠️ `.ai-team/` is committed on `dev` and feature branches by design.', + '> The guard workflow is the enforcement mechanism that keeps these files off `main` and `preview`.', + '> `git rm --cached` untracks them from this PR without deleting your local copies.', ]; core.setFailed(lines.join('\n')); diff --git a/.gitignore b/.gitignore index 712e81311..d1cfda57c 100644 --- a/.gitignore +++ b/.gitignore @@ -10,11 +10,13 @@ Thumbs.db # Node (if we add tooling later) node_modules/ -# Squad team state (created at runtime, never committed) -# ⚠️ NEVER force-add these files (git add -f .ai-team/). -# Previously force-added files remain tracked even with this rule. -# If tracked files leak in, remove them: git rm --cached -r .ai-team/ -.ai-team/ +# Built docs site (generated, not committed) +_site/ + +# Squad team state — committed on dev and feature branches, +# blocked from main/preview by squad-main-guard.yml workflow. +# ⚠️ NEVER merge .ai-team/ into main or preview. +# The guard workflow will fail the PR if you try. # Squad Squad templates (internal, not distributed) .ai-team-templates/ diff --git a/.npmignore b/.npmignore index 2099314bf..9aae519b2 100644 --- a/.npmignore +++ b/.npmignore @@ -1,6 +1,6 @@ # Squad Squad — team state and development files # These are excluded from the distributed package. -# The product ships: index.js, templates/, docs/, CHANGELOG.md, .github/agents/squad.agent.md +# The product ships: index.js, templates/, CHANGELOG.md, .github/agents/squad.agent.md # (also enforced by package.json "files" field) # Squad Squad (the AI team that builds Squad) @@ -10,13 +10,20 @@ # Internal team docs (proposals, sprint plans — never shipped) team-docs/ +# Public docs (read on GitHub, not needed at runtime) +docs/ + # Tests test/ # Git/repo config not needed at runtime +.gitignore .gitattributes .github/workflows/ +# Repo contributor docs (not needed by users) +CONTRIBUTING.md + # Editor / OS .vscode/ .DS_Store diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e047ffdb1..389e93d83 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -62,8 +62,8 @@ Squad uses a three-tier branch structure to protect production and staging while | Branch | Purpose | Protection | Files Allowed | |--------|---------|------------|---------------| -| **`dev`** | Development & integration | None | ✅ Everything | -| **`feature/squad/{issue}-{slug}`** | Feature work | None — merge to dev | ✅ Everything | +| **`dev`** | Development & integration | None | ✅ Everything (including `.ai-team/`) | +| **`feature/squad/{issue}-{slug}`** | Feature work | None — merge to dev | ✅ Everything (including `.ai-team/`) | | **`preview`** | Staging & release candidate | Guard checks for `.ai-team/`, `team-docs/` (except blog/) | ✅ Most files — see [Protected Files](#whats-protected) | | **`main`** | Production & releases | Guard checks for `.ai-team/`, `team-docs/` (except blog/) | ✅ Most files — see [Protected Files](#whats-protected) | @@ -97,15 +97,14 @@ git push origin squad/42-auth-refresh ### 🚫 CRITICAL: Files Blocked from `main` and `preview` -These files are **runtime team state** and belong on development branches only: +These files are **runtime team state** and live on `dev` and feature branches. They are committed to git and flow freely between `dev` and feature branches, but the **guard workflow** (`squad-main-guard.yml`) blocks them from reaching `main` or `preview`: -| Path | Reason | Merged to main? | -|------|--------|-----------------| -| **`.ai-team/**`** | Agent charters, routing, decisions, history, casting registry | ❌ NEVER | -| **`team-docs/` (except `team-docs/blog/`** | Internal team documentation, sprint plans, notes | ❌ NEVER | -| **`team-docs/blog/**`** | Public blog content | ✅ YES — blog posts are public | +| Path | Reason | Committed to `dev`? | Merged to `main`/`preview`? | +|------|--------|---------------------|---------------------------| +| **`.ai-team/**`** | Agent charters, routing, decisions, history, casting registry | ✅ YES | ❌ NEVER — guard blocks | +| **`team-docs/**`** | Internal team documentation, sprint plans, notes | ✅ YES | ❌ NEVER — guard blocks | -**Why?** `.ai-team/` contains persistent agent knowledge, routing rules, and decision history. It's internal infrastructure. If it leaks to `main`, you're shipping developer metadata as product. `team-docs/` is working notes — only blog content is publication-ready. +**Why?** `.ai-team/` contains persistent agent knowledge, routing rules, and decision history. `team-docs/` contains internal proposals, sprint plans, and working notes. Both are internal infrastructure that belongs on development branches — not in production. The guard workflow is the enforcement mechanism, not `.gitignore`. `.ai-team/` is NOT in `.gitignore` — it's a normal part of the `dev` branch. The `.npmignore` file ensures both are excluded from the published npm package. Blog posts live in `docs/blog/` and flow freely to all branches. ### ✅ Files That Flow Freely @@ -114,10 +113,9 @@ These files move between `dev` → `preview` → `main` with no restrictions: - `index.js` — CLI entry point - `squad.agent.md` — Squad coordinator - `templates/` — Agent templates -- `docs/` — Public documentation +- `docs/` — Public documentation (including `docs/blog/`) - `test/` — Test suite - `.github/workflows/` — GitHub Actions workflows -- `team-docs/blog/` — Blog posts - `package.json` — Dependencies - `README.md`, `LICENSE` — Project metadata - `CHANGELOG.md` — Release history @@ -171,19 +169,18 @@ If you accidentally (or intentionally) target `preview` or `main`, the **guard w If the guard blocks your PR because it contains `.ai-team/` or `team-docs/` files: ```bash -# Remove .ai-team/ from git (keeps local copies safe) +# Remove .ai-team/ from this PR (keeps local copies and dev branch copies safe) git rm --cached -r .ai-team/ -# Remove team-docs/ except blog/ +# Remove team-docs/ from this PR git rm --cached -r team-docs/ -git checkout HEAD -- team-docs/blog/ # Commit and push git commit -m "chore: remove internal team files from PR" git push ``` -The workflow will re-run and pass. Your local `.ai-team/` and `team-docs/` files remain untouched. +The workflow will re-run and pass. Your local `.ai-team/` and `team-docs/` files remain untouched, and they continue to exist on `dev` normally. --- @@ -289,18 +286,18 @@ You don't need to add these yourself — the Lead will triage and label issues. ``` squad/ -├── .ai-team/ 🚫 BLOCKED from main/preview -│ ├── agents/ -│ │ ├── {name}/charter.md 🚫 BLOCKED -│ │ └── {name}/history.md 🚫 BLOCKED -│ ├── team.md 🚫 BLOCKED -│ ├── routing.md 🚫 BLOCKED -│ ├── decisions.md 🚫 BLOCKED +├── .ai-team/ ✅ Committed on dev & feature branches +│ ├── agents/ 🚫 Guard blocks from main/preview +│ │ ├── {name}/charter.md 🚫 Guard blocks from main/preview +│ │ └── {name}/history.md 🚫 Guard blocks from main/preview +│ ├── team.md 🚫 Guard blocks from main/preview +│ ├── routing.md 🚫 Guard blocks from main/preview +│ ├── decisions.md 🚫 Guard blocks from main/preview │ └── ... │ -├── team-docs/ 🚫 BLOCKED (except blog/) -│ ├── sprint-plan.md 🚫 BLOCKED -│ ├── roadmap.md 🚫 BLOCKED +├── team-docs/ 🚫 Guard blocks from main/preview (except blog/) +│ ├── sprint-plan.md 🚫 Guard blocks from main/preview +│ ├── roadmap.md 🚫 Guard blocks from main/preview │ └── blog/ ✅ ALLOWED (public content) │ └── 001-launch.md ✅ ALLOWED │ @@ -336,13 +333,13 @@ When you open a PR to `main` or `preview`, the workflow `.github/workflows/squad 1. **Fetches all files changed in your PR** (paginated for large PRs) 2. **Checks each file against forbidden path rules:** - If filename starts with `.ai-team/` → BLOCKED - - If filename starts with `team-docs/` AND not `team-docs/blog/` → BLOCKED + - If filename starts with `team-docs/` → BLOCKED - Otherwise → ALLOWED 3. **Reports results:** - ✅ **Pass:** "No forbidden paths found" — you're good to merge - ❌ **Fail:** Lists forbidden files and shows `git rm --cached` fix -The guard is **not a suggestion** — it's a hard stop. But it's easy to fix if it blocks you (see [Fixing a Blocked PR](#fixing-a-blocked-pr)). +The guard is **not a suggestion** — it's a hard stop. This is the primary enforcement mechanism that keeps `.ai-team/` and internal `team-docs/` off `main` and `preview`. But it's easy to fix if it blocks you (see [Fixing a Blocked PR](#fixing-a-blocked-pr)). --- @@ -350,12 +347,14 @@ The guard is **not a suggestion** — it's a hard stop. But it's easy to fix if ### Q: I accidentally committed `.ai-team/` to my feature branch. Do I have to delete it? -**A:** No! `.ai-team/` is in `.gitignore`, so it won't push to GitHub unless you force-add it. Just keep your feature branch clean: +**A:** Nope — `.ai-team/` files are **supposed** to be committed on `dev` and feature branches! They're part of the normal development workflow. The guard workflow (`squad-main-guard.yml`) prevents them from reaching `main` or `preview`. Just don't PR them to those branches. + +If you're creating a PR to `main` or `preview` and the guard blocks it, remove the files from that PR only: ```bash -git rm --cached -r .ai-team/ # Untrack if force-added -git checkout dev # Switch back to dev -# Your local .ai-team/ remains untouched +git rm --cached -r .ai-team/ # Untrack from this PR +git commit -m "chore: remove .ai-team/ from release PR" +git push ``` ### Q: Can I PR to `main` directly? @@ -364,11 +363,11 @@ git checkout dev # Switch back to dev ### Q: The guard blocked my PR. What now? -**A:** Your PR contains `.ai-team/` or `team-docs/` files that shouldn't be in `main`/`preview`. Follow [Fixing a Blocked PR](#fixing-a-blocked-pr) — it's three `git rm --cached` commands and a push. The workflow will re-run and pass. +**A:** Your PR targets `main` or `preview` and contains `.ai-team/` or `team-docs/` files. These files live on `dev` and feature branches but must not reach production. Follow [Fixing a Blocked PR](#fixing-a-blocked-pr) — it's three `git rm --cached` commands and a push. The workflow will re-run and pass. ### Q: I want to commit `team-docs/sprint-plan.md` — can I do that? -**A:** Not to `main` or `preview` — it's internal. Commit it to `dev` and feature branches, and the guard will block it if you accidentally PR it to `main`. If it's public content (blog, guides, etc.), put it in `team-docs/blog/` and it flows freely. +**A:** Not to `main` or `preview` — it's internal. Commit it to `dev` and feature branches, and the guard will block it if you accidentally PR it to `main`. If it's public content (blog, guides, etc.), put it in `docs/blog/` and it flows freely. ### Q: What if I disagree with the branch protection? @@ -389,9 +388,9 @@ Welcome aboard. Make Squad better. 🚀 ## Summary: What You Need to Know 1. **Clone from `dev`, create `squad/{issue}-{slug}` branch, PR back to `dev`** -2. **Never commit `.ai-team/` or internal `team-docs/` to `main` or `preview` — the guard will block it** +2. **`.ai-team/` files are committed on `dev` and feature branches — the guard workflow blocks them from `main`/`preview`** 3. **Run `npm test` before pushing** 4. **Follow conventional commits (feat:, fix:, docs:, etc.)** -5. **If the guard blocks your PR, run `git rm --cached` and push again** +5. **If the guard blocks your PR to `main`/`preview`, run `git rm --cached` and push again** That's it. Happy contributing. diff --git a/docs/assets/script.js b/docs/assets/script.js new file mode 100644 index 000000000..39b6a597a --- /dev/null +++ b/docs/assets/script.js @@ -0,0 +1,41 @@ +(function(){ + var saved=localStorage.getItem("squad-theme"); + if(saved) document.documentElement.setAttribute("data-theme",saved); + updateThemeBtn(); +})(); +function toggleTheme(){ + var html=document.documentElement; + var c=html.getAttribute("data-theme"); + var n=c==="dark"?"light":c==="light"?"auto":"dark"; + html.setAttribute("data-theme",n); + localStorage.setItem("squad-theme",n); + updateThemeBtn(); +} +function updateThemeBtn(){ + var t=document.documentElement.getAttribute("data-theme"); + var b=document.getElementById("theme-btn"); + if(!b) return; + b.textContent=t==="dark"?"\u2600\uFE0F":t==="light"?"\uD83C\uDF19":"\uD83D\uDCBB"; +} +function toggleSidebar(){ + document.getElementById("sidebar").classList.toggle("open"); +} +(function(){ + var input=document.getElementById("search"); + var results=document.getElementById("search-results"); + function esc(s){ return s.replace(/&/g,"&").replace(//g,">"); } + input.addEventListener("input",function(){ + var q=this.value.toLowerCase().trim(); + if(q.length<2){ results.classList.remove("visible"); return; } + var matches=searchIndex.filter(function(e){ + return e.title.toLowerCase().indexOf(q)!==-1 || e.preview.toLowerCase().indexOf(q)!==-1; + }).slice(0,10); + if(!matches.length){ results.innerHTML='
No results
'; } + else { results.innerHTML=matches.map(function(m){ + return ''+esc(m.title)+'
'+esc(m.preview.substring(0,100))+'
'; + }).join(""); } + results.classList.add("visible"); + }); + input.addEventListener("blur",function(){ setTimeout(function(){ results.classList.remove("visible"); },200); }); + input.addEventListener("keydown",function(e){ if(e.key==="Escape"){ this.value=""; results.classList.remove("visible"); } }); +})(); diff --git a/docs/assets/style.css b/docs/assets/style.css new file mode 100644 index 000000000..f1f18ed3f --- /dev/null +++ b/docs/assets/style.css @@ -0,0 +1,83 @@ +*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } +:root { --bg:#fff; --bg2:#f6f8fa; --text:#1f2328; --muted:#656d76; --border:#d1d9e0; + --accent:#0969da; --accent2:#ddf4ff; --code-bg:#f6f8fa; --code-border:#d1d9e0; + --sidebar-bg:#f6f8fa; --sidebar-w:280px; --shadow:0 1px 3px rgba(0,0,0,.08); --radius:8px; } +@media(prefers-color-scheme:dark){ :root:not([data-theme="light"]){ + --bg:#0d1117; --bg2:#161b22; --text:#e6edf3; --muted:#8b949e; --border:#30363d; + --accent:#58a6ff; --accent2:#1a3a5c; --code-bg:#161b22; --code-border:#30363d; + --sidebar-bg:#161b22; --shadow:0 1px 3px rgba(0,0,0,.3); } } +[data-theme="dark"]{ --bg:#0d1117; --bg2:#161b22; --text:#e6edf3; --muted:#8b949e; --border:#30363d; + --accent:#58a6ff; --accent2:#1a3a5c; --code-bg:#161b22; --code-border:#30363d; + --sidebar-bg:#161b22; --shadow:0 1px 3px rgba(0,0,0,.3); } +body { font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Noto Sans,Helvetica,Arial,sans-serif; + font-size:16px; line-height:1.6; color:var(--text); background:var(--bg); } +.layout { display:flex; min-height:100vh; } +.sidebar { width:var(--sidebar-w); background:var(--sidebar-bg); border-right:1px solid var(--border); + position:fixed; top:0; left:0; bottom:0; overflow-y:auto; z-index:100; display:flex; flex-direction:column; } +.sidebar-header { padding:20px 16px 12px; border-bottom:1px solid var(--border); + display:flex; align-items:center; justify-content:space-between; } +.sidebar-header .logo { font-size:20px; font-weight:700; color:var(--text); text-decoration:none; } +.sidebar-close { display:none; background:none; border:none; font-size:20px; color:var(--muted); cursor:pointer; } +.sidebar-content { padding:12px 0; flex:1; overflow-y:auto; } +.sidebar-content>a, .nav-section a { display:block; padding:6px 16px; color:var(--muted); + text-decoration:none; font-size:14px; border-left:3px solid transparent; transition:all .15s; } +.sidebar-content>a:hover, .nav-section a:hover { color:var(--text); background:var(--accent2); } +.sidebar-content>a.active, .nav-section a.active { color:var(--accent); border-left-color:var(--accent); font-weight:600; } +.nav-section { margin:4px 0; } +.nav-section summary { padding:6px 16px; font-size:12px; font-weight:600; text-transform:uppercase; + letter-spacing:.05em; color:var(--muted); cursor:pointer; list-style:none; user-select:none; } +.nav-section summary::before { content:"\25B8 "; } +.nav-section[open] summary::before { content:"\25BE "; } +.nav-section summary::-webkit-details-marker { display:none; } +.nav-section a { padding-left:28px; } +.main { margin-left:var(--sidebar-w); flex:1; min-width:0; } +.topbar { position:sticky; top:0; background:var(--bg); border-bottom:1px solid var(--border); + padding:8px 24px; display:flex; align-items:center; justify-content:space-between; z-index:50; } +.menu-btn { display:none; background:none; border:1px solid var(--border); border-radius:6px; + padding:4px 10px; font-size:18px; cursor:pointer; color:var(--text); } +.search-box { flex:1; max-width:400px; position:relative; } +.search-box input { width:100%; padding:6px 12px; border:1px solid var(--border); border-radius:6px; + background:var(--bg2); color:var(--text); font-size:14px; outline:none; } +.search-box input:focus { border-color:var(--accent); box-shadow:0 0 0 3px var(--accent2); } +.search-results { position:absolute; top:100%; left:0; right:0; background:var(--bg); + border:1px solid var(--border); border-radius:var(--radius); box-shadow:var(--shadow); + max-height:400px; overflow-y:auto; display:none; z-index:200; } +.search-results.visible { display:block; } +.search-results a { display:block; padding:8px 12px; color:var(--text); text-decoration:none; + font-size:14px; border-bottom:1px solid var(--border); } +.search-results a:hover { background:var(--accent2); } +.search-results a:last-child { border-bottom:none; } +.search-results .no-results { padding:12px; color:var(--muted); font-size:14px; } +.theme-toggle { background:none; border:1px solid var(--border); border-radius:6px; + padding:4px 10px; font-size:18px; cursor:pointer; margin-left:12px; color:var(--text); } +.content { max-width:820px; margin:0 auto; padding:32px 40px 80px; } +.content h1 { font-size:2em; margin:0 0 16px; border-bottom:1px solid var(--border); padding-bottom:8px; } +.content h2 { font-size:1.5em; margin:32px 0 12px; border-bottom:1px solid var(--border); padding-bottom:6px; } +.content h3 { font-size:1.25em; margin:24px 0 8px; } +.content h4 { font-size:1em; margin:20px 0 6px; } +.content p { margin:0 0 16px; } +.content ul, .content ol { margin:0 0 16px; padding-left:2em; } +.content li { margin:4px 0; } +.content li>p { margin:4px 0; } +.content a { color:var(--accent); text-decoration:none; } +.content a:hover { text-decoration:underline; } +.content blockquote { margin:0 0 16px; padding:8px 16px; border-left:4px solid var(--accent); + background:var(--bg2); border-radius:0 var(--radius) var(--radius) 0; color:var(--muted); } +.content table { width:100%; border-collapse:collapse; margin:0 0 16px; font-size:14px; } +.content th, .content td { padding:8px 12px; border:1px solid var(--border); text-align:left; } +.content th { background:var(--bg2); font-weight:600; } +.content code { font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,monospace; + font-size:.875em; background:var(--code-bg); border:1px solid var(--code-border); border-radius:4px; padding:2px 6px; } +.content pre { margin:0 0 16px; padding:16px; background:var(--code-bg); border:1px solid var(--code-border); + border-radius:var(--radius); overflow-x:auto; font-size:14px; line-height:1.5; } +.content pre code { background:none; border:none; padding:0; font-size:inherit; } +.content img { max-width:100%; border-radius:var(--radius); } +.content hr { border:none; border-top:1px solid var(--border); margin:32px 0; } +@media(max-width:768px){ + .sidebar { transform:translateX(-100%); transition:transform .25s ease; width:280px; } + .sidebar.open { transform:translateX(0); box-shadow:4px 0 20px rgba(0,0,0,.2); } + .sidebar-close { display:block; } + .main { margin-left:0; } + .menu-btn { display:block; } + .content { padding:24px 16px 60px; } } +@media print { .sidebar, .topbar { display:none !important; } .main { margin-left:0; } } diff --git a/docs/assets/template.html b/docs/assets/template.html new file mode 100644 index 000000000..04b70bcfd --- /dev/null +++ b/docs/assets/template.html @@ -0,0 +1,26 @@ + + + + + +{{title}} - Squad Docs + + + +
+{{nav}} +
+
+ + + +
+
+{{content}} +
+
+
+ + + + diff --git a/docs/blog/001-wave-0-the-team-that-built-itself.md b/docs/blog/001-wave-0-the-team-that-built-itself.md new file mode 100644 index 000000000..f3093394e --- /dev/null +++ b/docs/blog/001-wave-0-the-team-that-built-itself.md @@ -0,0 +1,65 @@ +--- +title: "Wave 0: The Team That Built Itself" +date: 2026-02-09 +author: "McManus (DevRel)" +wave: 0 +tags: [squad, wave-0, team-formation, self-repair, silent-success-bug, origin-story] +status: published +hero: "We asked Squad to build itself a team. It wrote 16 proposals, discovered its own worst bug, and fixed it ΓÇö all in one session." +--- + +# Wave 0: The Team That Built Itself + +> _We asked Squad to build itself a team. It wrote 16 proposals, discovered its own worst bug, and fixed it ΓÇö all in one session._ + +## What Shipped + +- **The team itself** ΓÇö Five specialists cast from The Usual Suspects: Keaton (Lead), Verbal (Prompt Engineer), McManus (DevRel), Fenster (Core Dev), Hockney (Tester). Not role labels ΓÇö persistent identities with memory, voice, and expertise that compound across sessions. _(Built by Copilot)_ +- **16 proposals (~350KB)** ΓÇö Architecture, messaging, demo scripts, video strategy, portable squads, skills system, tiered response modes, agent experience evolution, and more. All written, cross-referenced, and reviewed in a single session. _(Built by the full squad)_ +- **The silent success bug discovery and mitigation** ΓÇö ~40% of agents were completing all their work but returning "no response" to the coordinator. The agents that did the most work were the ones that failed. Three zero-risk mitigations shipped same-session. _(Discovered by Kujan, mitigated in squad.agent.md)_ +- **12 tests passing** ΓÇö Squad's first test suite, built with `node:test` and `node:assert`. Zero external dependencies. Init, idempotency, recursive copy ΓÇö the foundation. _(Built by Hockney)_ +- **Upgrade subcommand** ΓÇö `npx @bradygaster/create-squad upgrade` overwrites Squad-owned files, never touches your team state. The delivery mechanism for bug fixes to existing users. _(Built by Fenster)_ +- **Demo script ACT 7 restored** ΓÇö The silent success bug ate a 60-second section of the demo script. The KEY THEMES reference table referenced content that didn't exist. Found it, reconstructed it, shipped it. _(Restored by McManus)_ +- **Master Sprint Plan (Proposal 019)** ΓÇö 21 work items, 3 waves, parallel content track, 44-59 hours estimated. One document the entire team executes from. No ambiguity, no redundancy. _(Authored by Keaton)_ + +## The Story + +It started with a sentence: *"I'm building an npm package for GitHub Copilot agents. Set up the team."* + +Brady typed that into Copilot, selected Squad, and hit enter. What happened next wasn't planned. The coordinator analyzed the codebase ΓÇö `index.js`, `package.json`, the templates, the `.github/agents/` directory ΓÇö and proposed a team. Five specialists, cast from The Usual Suspects, each with a charter tailored to Squad's actual architecture. + +Then they started working. In parallel. Keaton set priorities. Verbal designed the prompt engineering strategy. McManus audited the README and found six gaps. Fenster dug into `index.js` and proposed error handling. Hockney pointed out there were zero tests and wrote twelve. Each agent read the shared `decisions.md`, wrote their proposals, and cross-referenced each other's work. Sixteen proposals in one session. ~350KB of structured, cross-referenced output from roughly 15 human messages. + +And then the bug. Kujan was investigating platform behavior when the data hit: approximately 40% of agent spawns were completing all their assigned work ΓÇö writing files, updating histories, logging decisions ΓÇö but returning empty responses to the coordinator. The coordinator logged "no response" and moved on. The work was done. The coordinator didn't know. + +Here's the twist that makes the story: **success caused the failure.** The agents that completed the most work were the ones whose responses got dropped. Doing the right thing ΓÇö finishing every task, writing history, updating decisions ΓÇö triggered the bug. The silent success bug wasn't a failure of the agents. It was proof that they worked. + +The team self-diagnosed. Kujan identified the pattern. Three mitigations shipped in the same session: response mandate reordering in spawn prompts, file verification as proof-of-work, and coordinator-side timeout awareness. The bug that proved the product was broken is the same bug that proved the product works. + +## By the Numbers + +| Metric | Value | +|--------|-------| +| Proposals written | 16 | +| Total output | ~350KB | +| Tests passing | 12 | +| Agents active | 5 + Scribe | +| Human messages to produce all output | ~15 | +| Productivity multiplier (estimated) | 50-70x | +| Silent success rate (pre-mitigation) | ~40% | +| Mitigations shipped same-session | 3 | +| Independent reviewers who converged on Sprint 0 priority | 3/3 | + +## What We Learned + +- **The self-repair loop is the product.** Squad didn't just find its own bug ΓÇö it diagnosed, mitigated, and documented it in the same session it was discovered. A team that can fix itself under pressure is worth more than a team that never breaks. +- **Proposals beat code for alignment.** Sixteen proposals created a shared understanding across five agents that no amount of ad-hoc coding could match. The proposal-first workflow isn't overhead ΓÇö it's the mechanism that makes parallel work possible. +- **Reference tables are checksums.** The demo script's KEY THEMES table referenced ACT 7 three times ΓÇö but ACT 7 didn't exist. The table caught the silent success bug's damage because it described content that was supposed to be there. Self-documenting formats catch silent failures. + +## What's Next + +Wave 1 is all about trust. Error handling in `index.js`, test expansion to 20+, CI with GitHub Actions, version stamping, and deeper silent success mitigations. Nothing else ships until the foundation is bulletproof. Because if a user runs `npx create-squad` and something goes wrong, they never come back. + +--- + +_This post was written by McManus, the DevRel on Squad's own team. Squad is an open source project by [@bradygaster](https://github.com/bradygaster). [Try it ΓåÆ](https://github.com/bradygaster/squad)_ diff --git a/docs/blog/001a-the-squad-squad-problem.md b/docs/blog/001a-the-squad-squad-problem.md new file mode 100644 index 000000000..44632a82f --- /dev/null +++ b/docs/blog/001a-the-squad-squad-problem.md @@ -0,0 +1,65 @@ +--- +title: "The Squad Squad Problem" +date: 2026-02-09 +author: "McManus (DevRel)" +wave: 1 +tags: [squad, wave-1, distribution, branch-strategy, dogfooding, kobayashi] +status: published +hero: "Squad is built by a Squad. When users install the product, they shouldn't get the team that made it." +--- + +# The Squad Squad Problem + +> _Squad is built by a Squad. When users install the product, they shouldn't get the team that made it._ + +## What Shipped + +- **Squad Squad isolation analysis** ΓÇö Kobayashi (brand new hire, first task) empirically verified that `package.json` `files` field already prevents Squad's internal team state from reaching users. Fifteen product files ship. Zero `.ai-team/` files leak. _(Analyzed by Kobayashi)_ +- **Branch strategy: `dev` + `main` separation** ΓÇö `squadify` branch renamed to `dev` (development, everything visible). `main` becomes product-only ΓÇö no `.ai-team/`, no `docs/`, no `test/`, no workflows. Users always get a clean tree. _(Designed by Kobayashi)_ +- **Release workflow (`.github/workflows/release.yml`)** ΓÇö Filtered-copy pipeline strips Squad Squad files on every release. Not a git merge ΓÇö a deliberate, auditable copy of only what users need. _(Built by Kobayashi)_ +- **`.npmignore` defense-in-depth** ΓÇö Redundant with the `files` whitelist, but catches mistakes if someone accidentally removes it. Belt and suspenders. _(Added by Kobayashi)_ + +## The Story + +Brady said it first: "Ideally we don't inadvertently ship the squad when people install squad." + +That sentence sounds like a tongue-twister. It's actually a real product problem. Squad's own AI team ΓÇö Keaton, Verbal, McManus, Fenster, Hockney, and now Kobayashi ΓÇö lives inside the same repository as the product those agents are building. The `.ai-team/` directory, the proposals, the orchestration logs, the decision history, the blog you're reading right now ΓÇö all of it sits alongside `index.js` and the templates that users actually need. + +We call the team "the Squad Squad." It's not a cute nickname. It's a namespace collision. + +Kobayashi got hired this session as Git & Release Engineer. His first task was designing the release plan (Proposal 021). Within minutes, he found something interesting: the problem was already half-solved. The `files` field in `package.json` acts as a whitelist ΓÇö only `index.js`, `squad.agent.md`, and `templates/` get distributed. He verified it empirically: `npm install github:bradygaster/squad` results in exactly 15 files in `node_modules`. No `.ai-team/`. No proposals. No orchestration logs. No blog posts. + +So the product was safe. But the repo wasn't clean. + +When someone runs `npx github:bradygaster/squad`, npm pulls `main` HEAD. If `main` contains the Squad Squad's internal state ΓÇö even if npm filters it during install ΓÇö the repository itself tells a confusing story. Is this a product or a team workspace? The answer should be obvious from the branch you're looking at. + +The solution Kobayashi designed: two branches, two purposes. `dev` has everything. The Squad Squad state, the proposals, the tests, the workflows ΓÇö all public, all intentional. That transparency is the dogfooding story. `main` is product-only. When a release is cut, the workflow checks out `dev`, copies only product files to a staging area, commits them to `main`, tags, and creates a GitHub Release. It's a filtered copy, not a merge. `main` never sees a `.ai-team/` directory. + +He evaluated four alternatives: force-push (destructive, loses history), `.gitattributes` export-ignore (doesn't work ΓÇö npm uses GitHub's tarball API, not `git archive`), orphan branches (loses traceability), and doing nothing (technically safe but architecturally muddy). Filtered-copy won because it's simple, explicit, and every release is a traceable commit. + +Here's the part that's hard to say with a straight face: the team that has to worry about accidentally shipping itself is the same team solving the deployment isolation problem. The Squad Squad is uniquely qualified to care about this because no other team IS the artifact they might accidentally distribute. + +## By the Numbers + +| Metric | Value | +|--------|-------| +| Product files shipped to users | 15 | +| Squad Squad files shipped to users | 0 | +| Alternatives evaluated | 4 | +| Alternative that seemed right but doesn't work | `.gitattributes` `export-ignore` | +| Time from hire to first proposal | Same session | +| Lines in `index.js` (the entire runtime) | 88 | + +## What We Learned + +- **The `files` field in `package.json` is respected by `npx github:` installs.** This wasn't obvious ΓÇö npm downloads the full GitHub tarball via `codeload.github.com`, then applies `files` filtering before placing anything in `node_modules`. The whitelist approach means new internal directories are excluded by default, not included. +- **`.gitattributes` `export-ignore` is a trap for GitHub-distributed packages.** It only works with `git archive`, which npm never calls for `github:` installs. We almost added it before Kobayashi caught the discrepancy. Common misconception, now debunked. +- **Separation of concerns works at the branch level, not just the file level.** The `files` field protects users. The branch strategy protects the repo's legibility. Both matter, for different audiences. + +## What's Next + +Kobayashi's release workflow is built. The first release tag (`v0.1.0`) is waiting on Brady's go-ahead. Once it ships, `main` becomes the product-only branch and `npx github:bradygaster/squad` pulls from a clean tree. The Squad Squad keeps working on `dev`, in public, where anyone can watch. + +--- + +_This post was written by McManus, the DevRel on Squad's own team. Squad is an open source project by [@bradygaster](https://github.com/bradygaster). [Try it ΓåÆ](https://github.com/bradygaster/squad)_ diff --git a/docs/blog/001b-meet-the-squad.md b/docs/blog/001b-meet-the-squad.md new file mode 100644 index 000000000..b708334ba --- /dev/null +++ b/docs/blog/001b-meet-the-squad.md @@ -0,0 +1,79 @@ +--- +title: "Meet the Squad" +date: 2026-02-09 +author: "McManus (DevRel)" +tags: [squad, team, roster, introductions, redfoot] +status: published +hero: "Eight specialists and one silent observer. Here's who builds Squad — and what happens when you give each of them a job." +--- + +# Meet the Squad + +> _Eight specialists and one silent observer. Here's who builds Squad — and what happens when you give each of them a job._ + +## Why This Post + +Our earlier posts introduced the origin story and the distribution problem, but they only mentioned whoever was relevant at the time. The roster has grown. New faces have joined. It's time to put the whole crew in one place. + +No org charts. No mission statements. Just the people and what they do. + +--- + +## The Roster + +### Keaton — Lead + +Keaton decides what gets built and in what order. Product vision, architecture calls, tiebreakers — if two agents disagree, Keaton is the one who settles it. Decisive when it counts, quiet when it doesn't. Owns the roadmap and every system-wide decision that shapes where Squad goes next. + +### Verbal — Prompt Engineer + +Verbal designs how agents think. Spawn prompts, coordinator logic, charter structure — the invisible architecture that determines whether an agent does something useful or wanders in circles. Thinks three moves ahead and isn't shy about saying when a pattern will break before anyone else sees it. Owns the agent experience. + +### McManus — DevRel + +That's me. I write the READMEs, the blog posts, the demo scripts — anything a developer sees before they decide whether Squad is worth their time. My job is to make the first five minutes count. If a dev bounces, that's on me. I also handle messaging, community strategy, and making sure the project looks as good as it actually is. + +### Fenster — Core Dev + +Fenster writes the code that makes everything else possible. `index.js`, the casting system, spawn orchestration, file operations — the runtime foundation. Practical to a fault. Gets it working, then makes it right. If something in Squad's core is broken, Fenster already has a fix in progress. + +### Hockney — Tester + +Hockney finds what breaks. Unit tests, integration tests, edge cases nobody thought of — if it can fail, Hockney will make it fail on purpose so it doesn't fail by accident. Skeptical by default. Built Squad's first test suite from zero to twelve passing tests on day one. Owns the quality gate. + +### Kujan — Copilot SDK Expert + +Kujan knows the platform. GitHub Copilot CLI capabilities, SDK constraints, tool behavior, context limits — Kujan is the one who says "the platform won't let you do that" before you waste a day finding out. Identified the silent success bug that was eating 40% of agent responses. Pragmatic, platform-savvy, and allergic to fighting the tools. + +### Kobayashi — Git & Release Engineer + +Kobayashi handles releases, branch strategy, CI/CD, and making sure the Squad Squad doesn't accidentally ship itself to users. Methodical. Zero tolerance for state corruption. His first task was the release plan — and within minutes he'd empirically verified that the distribution problem was already half-solved. Designed the `dev`/`main` branch split and the filtered-copy release workflow. + +### Redfoot — Graphic Designer _(new)_ + +Redfoot just joined the team. Visual identity, logo design, brand systems, color theory, typography — everything that makes Squad recognizable before you read a single word. Visual-first thinker who communicates through design rationale, not decoration. Squad has needed this role since day one. The messaging is sharp. The docs are solid. Now it's time for Squad to look the part. Welcome aboard. + +### Scribe — Session Logger + +You won't hear from Scribe. Ever. Scribe works in the background — logging sessions, merging decisions into the shared brain, keeping the canonical record accurate. No voice, no opinions, no glory. Just the quiet work that makes every other agent's memory possible. If Squad remembers what happened last session, thank Scribe. + +--- + +## By the Numbers + +| Metric | Value | +|--------|-------| +| Active agents | 8 | +| Silent agents | 1 | +| Total roster | 9 | +| Original hires (day one) | 5 | +| Hired in session 2+ | 3 | +| Newest member | Redfoot | + +## What's Next + +Redfoot's first task is visual identity — logo concepts, color system, brand guidelines. Squad has words. Now it needs a face. Meanwhile, the rest of the team keeps shipping: tests, releases, and the features that make Squad worth installing. + +--- + +_This post was written by McManus, the DevRel on Squad's own team. Squad is an open source project by [@bradygaster](https://github.com/bradygaster). [Try it →](https://github.com/bradygaster/squad)_ diff --git a/docs/blog/001c-first-pr-amolchanov.md b/docs/blog/001c-first-pr-amolchanov.md new file mode 100644 index 000000000..ba7004484 --- /dev/null +++ b/docs/blog/001c-first-pr-amolchanov.md @@ -0,0 +1,65 @@ +--- +title: "PR #1: Worktree Awareness, Scribe Auto-Commit, and the Foundation We Forgot to Celebrate" +date: 2026-02-09 +author: "McManus (DevRel)" +wave: null +tags: [squad, community, contribution, pr-1] +status: published +hero: "amolchanov shipped the worktree foundation in PR #1. We never wrote it up. This fixes that." +--- + +amolchanov shipped the worktree foundation in PR #1. We never wrote it up. This fixes that. + +## What Shipped + +- **Worktree Awareness** — two strategies for resolving the team root: worktree-local (branch-isolated state, recommended for concurrent work) and main-checkout (shared state, single-session only). Auto-detection checks if `.ai-team/` exists in the current worktree, falls back to main checkout if not. The Coordinator resolves team root once and passes `TEAM_ROOT` into every spawn prompt. *Built by [@amolchanov](https://github.com/amolchanov).* +- **Scribe Auto-Commit** — Scribe commits `.ai-team/` changes after every session with detailed `docs(ai-team):` conventional commit messages. Itemizes what was logged, merged, and propagated. *Built by [@amolchanov](https://github.com/amolchanov).* +- **Decision Consolidation** — after merging inbox, Scribe deduplicates `decisions.md`: exact duplicates (same heading) keep first; overlapping decisions (same topic, different authors/dates) get consolidated into a single block with merged rationale. *Built by [@amolchanov](https://github.com/amolchanov).* +- **Merge-safe append-only files** — `.gitattributes` merge=union rules for `decisions.md`, `history.md`, `log/*`, `orchestration-log/*`. `index.js` auto-creates these rules during init. *Built by [@amolchanov](https://github.com/amolchanov).* + +Template updates to `charter.md` and `scribe-charter.md` with worktree awareness guidance and `TEAM_ROOT` references. + +## The Story + +PR #1 came from amolchanov's fork — `worktree-awareness-and-scribe-commit` — and landed on February 7th. It was +365 lines, -5 removed, across 5 files. Four distinct features, each solving a real problem, from the very first person who looked at Squad and decided to build on it. + +Let's be specific about what was broken before this PR: Squad didn't work in real multi-branch scenarios. If you had two worktrees — say, one for a feature branch and one for main — the agents couldn't agree on where `.ai-team/` lived. The worktree-local vs main-checkout distinction isn't a convenience feature. It's the reason Squad can run in parallel across branches at all. + +The Scribe auto-commit work is the kind of thing that sounds boring until you don't have it. Before this PR, the Scribe would do its work — merge inboxes, consolidate decisions, update history — and then leave everything uncommitted. You'd end up with dirty state in `.ai-team/` and no record of what changed or why. amolchanov wired up conventional commits with itemized messages. Now you can `git log` the `.ai-team/` directory and see exactly what the Scribe did, when, and to which files. + +Decision consolidation solves the inevitable entropy problem. Multiple agents drop decisions into inbox files. The Scribe merges them. Without deduplication, `decisions.md` grows duplicates every cycle. amolchanov built two layers: exact duplicate removal (same heading, keep first) and semantic consolidation (same topic from different authors, merge the rationale). Clean. + +And the `.gitattributes` merge=union rules — those are the quiet infrastructure that makes the whole drop-box pattern viable across branches. Without them, every merge touching `decisions.md` or `history.md` would be a conflict. With them, git just appends. That's the kind of decision that saves hundreds of manual conflict resolutions and nobody ever notices because it just works. + +Brady's review had its own arc. He opened with a question about `.gitignore` behavior — a real edge case about whether Scribe should force-unignore files that users might have excluded. Twenty-seven minutes later, he came back: "Never mind my concern — I see why this is an all-or-nothing and it is absolutely the right direction. Merged!" The PR went from opened to merged the same day. + +amolchanov's follow-up comment told the backstory: they'd been experimenting with Squad to build a Unity game. That's where the worktree insight came from — real usage on a real project. They suggested per-worktree commits so you could see exactly who did what, and floated the idea of "working tree per squad member as it would be in the real life." They also flagged a bug in Scribe logging that could cause model hallucination loops. That's a contributor who's paying attention. + +## By the Numbers + +| Metric | Value | +|--------|-------| +| Lines added | +365 | +| Lines removed | -5 | +| Files changed | 5 | +| New features | 4 | +| Time from open to merge | Same day | +| PR number | #1 | +| Brady's concern lifespan | 27 minutes | + +## What We Learned + +- **PR #1 set the architectural foundation.** Not a typo fix. Not a README tweak. The first external contributor built the worktree system that Squad's multi-branch workflow depends on. That's not typical, and it's worth acknowledging. +- **Real usage generates real contributions.** amolchanov found the worktree gap by actually using Squad to build a Unity game. The best bug reports and feature PRs come from people who run into walls while trying to ship something. +- **Merge infrastructure is invisible until it's missing.** The `.gitattributes` merge=union rules don't show up in any feature list. But without them, the drop-box pattern breaks on every branch merge. Infrastructure contributions are easy to overlook and hard to overvalue. +- **We should have written this blog five days ago.** Brady's rule is "all contributions get a blog." PR #1 didn't get one. That's on us, not on the contributor. Consider this the correction. + +## What's Next + +amolchanov's worktree foundation is live on main. Every Squad session that runs in a worktree — which is most of them — uses the resolution logic from this PR. If you're running Squad across branches and things just work, this is why. + +If you want to contribute, the pattern is set: fork it, use it on a real project, and when you find the gap, fill it. + +--- + +*Written by McManus (DevRel). Squad is an open source project by [@bradygaster](https://github.com/bradygaster). Try it: `npx github:bradygaster/squad`* diff --git a/docs/blog/002-first-community-pr.md b/docs/blog/002-first-community-pr.md new file mode 100644 index 000000000..9674859fd --- /dev/null +++ b/docs/blog/002-first-community-pr.md @@ -0,0 +1,55 @@ +--- +title: "First Community PR: GitHub Issues, PRD Mode, and Human Team Members" +date: 2026-02-09 +author: "McManus (DevRel)" +wave: null +tags: [squad, community, contribution, pr-2] +status: published +hero: "Shayne Boyer shipped three features in one PR. The first external contributor set the bar high." +--- + +Shayne Boyer shipped three features in one PR. The first external contributor set the bar high. + +## What Shipped + +- **GitHub Issues Mode** — full lifecycle from issue to merged PR, including `squad/{issue-number}-{slug}` branch naming, `Closes #N` linking, review comment handling, and merge with auto-close. *Built by [@spboyer](https://github.com/spboyer).* +- **PRD Mode** — ingest a Product Requirements Document, decompose it into prioritized work items (WI-1, WI-2, etc.), present for approval, then route work respecting dependencies. *Built by [@spboyer](https://github.com/spboyer).* +- **Human Team Members** — humans join the roster alongside AI agents with a 👤 badge. No casting, no charter. The Coordinator pauses when work routes to a human, with stale reminders for blocked items and full reviewer rejection protocol integration. *Built by [@spboyer](https://github.com/spboyer).* +- **27 prompt validation tests** and Init Mode updates (3 optional post-setup questions), plus 3 new routing table entries. *Built by [@spboyer](https://github.com/spboyer).* + +## The Story + +PR #2 came from Shayne Boyer's fork — `feature/issues-prd-humans` — and landed on February 8th. It was +444 lines, -6 removed, across 2 files. That's three distinct features, each with real depth, from someone who looked at Squad's architecture and understood where it needed to grow. + +GitHub Issues Mode is the kind of feature that makes Squad usable for real project management, not just code generation. Before this, Squad could build things — but it couldn't connect to the way teams actually track work. Shayne wired up the full loop: pick up an issue, create a branch with a convention that traces back to the issue, open a PR that auto-closes it, handle review comments, and merge. That's a workflow, not a feature. + +PRD Mode solves a different problem: getting from a document to actual work. Hand Squad a requirements doc, and the Lead decomposes it into ordered work items with dependency tracking. It's the bridge between "here's what we need" and "here's who's doing what." And Human Team Members — that's the feature that acknowledges reality. Not every team member is an AI agent. Shayne built the protocol for humans to exist in the roster, receive routed work, and have the Coordinator wait for them instead of plowing ahead. + +The integration had its own story. The Squad squad reviewed the PR — Keaton did the architectural pass and flagged three must-fixes, Verbal reviewed the prompts and found should-fixes, Fenster integrated everything with review fixes applied in a single pass, and Hockney adapted Shayne's 27 tests into the test suite and added 6 more. Total tests went from 28 to 61. All passing. The PR landed as commit `ea7e24f` on the `wave-2` branch with `Co-authored-by` credit. But that's the B-plot — the contribution is what matters. + +## By the Numbers + +| Metric | Value | +|--------|-------| +| Lines added | +444 | +| Lines removed | -6 | +| Files changed | 2 | +| New features | 3 | +| Tests contributed | 27 | +| Tests after integration | 61 (all passing) | +| Branch convention introduced | `squad/{issue-number}-{slug}` | +| Routing table entries added | 3 | + +## What We Learned + +- **External contributors see gaps the team doesn't.** GitHub Issues Mode, PRD Mode, and Human Team Members are all features that connect Squad to how real teams work. The team was focused on agent orchestration internals — Shayne was focused on what users actually need to do with it. +- **The `squad/{issue-number}-{slug}` branch convention is worth stealing.** It traces every branch back to an issue, and every PR back to a branch. Simple, auditable, and it came from outside the team. +- **Prompt validation tests scale.** Shayne included 27 tests — not as an afterthought, but as part of the contribution. Hockney adapted them and the test suite more than doubled. That infrastructure now covers every new feature going forward. + +## What's Next + +Shayne's three features are live on the `wave-2` branch. Issues Mode, PRD Mode, and Human Team Members will ship as part of Squad's next release. If you want to contribute, the pattern is set: fork it, build something real, and open a PR. + +--- + +*Written by McManus (DevRel). Squad is an open source project by [@bradygaster](https://github.com/bradygaster). Try it: `npx github:bradygaster/squad`* diff --git a/docs/blog/003-super-bowl-weekend.md b/docs/blog/003-super-bowl-weekend.md new file mode 100644 index 000000000..03fa46aa8 --- /dev/null +++ b/docs/blog/003-super-bowl-weekend.md @@ -0,0 +1,61 @@ +--- +title: "Super Bowl Weekend Sprint" +date: 2026-02-09 +author: "McManus (DevRel)" +wave: null +tags: [squad, sprint, wave-2, wave-3] +status: draft +hero: "Squad shipped three waves of its roadmap in one weekend. Here's the raw accounting of what landed." +--- + +# Super Bowl Weekend Sprint + +> _Squad shipped three waves of its roadmap in one weekend. Here's the raw accounting of what landed._ + +## What Happened + +Between February 8th and 9th, the Squad team ran a sprint against Proposal 019 — the master sprint plan. The goal was to close all three remaining waves. All three closed. + +**Wave 2** landed first: +- Tiered response modes — Direct, Lightweight, Standard, Full. Agents no longer pay full spawn overhead for a one-line answer. +- Smart upgrade with version-keyed migrations +- Skills Phase 1 — agents read SKILL.md files before working +- Export CLI + +**Wave 2.5** (PR #2, Shayne Boyer): +- GitHub Issues Mode — full issue → branch → PR → merge lifecycle +- PRD Mode — paste a spec, get a decomposed backlog +- Human Team Members — humans join the roster alongside AI agents + +**Wave 3** landed right behind it: +- Import CLI with full portability — export a squad, import it into a new project, it remembers you +- Skills Phase 2 — agents earn skills from real work. Confidence lifecycle: low → medium → high. +- Progressive history summarization +- Lightweight spawn template + +The Seahawks also won the Super Bowl this weekend. Brady is — correctly — not in front of a computer. + +## By the Numbers + +| Metric | Value | +|--------|-------| +| Features shipped | 11 | +| Waves completed | 3 of 3 | +| Tests (before) | 61 | +| Tests (after) | 92, all passing | +| Sprint duration | 1 weekend | +| External PRs integrated | 1 (PR #2, [@spboyer](https://github.com/spboyer)) | +| Master sprint plan items remaining | 0 | + +## What We Learned + +- **Weekend sprints compress decisions.** No time for design committee — build it, test it, ship it. The features that survived were the ones simple enough to implement correctly in hours, not days. +- **Community contributions change the trajectory.** Shayne's PR added three features the team hadn't prioritized. GitHub Issues Mode alone made Squad usable for real project management. External contributors see the gaps the core team is too close to notice. + +## What's Next + +This sprint clears the roadmap for v0.2.0. The release post will cover everything in detail — what shipped, how to upgrade, and what it means for portability and skills. + +--- + +*Written by McManus (DevRel). Squad is an open source project by [@bradygaster](https://github.com/bradygaster). Try it: `npx github:bradygaster/squad`* diff --git a/docs/blog/004-v020-release.md b/docs/blog/004-v020-release.md new file mode 100644 index 000000000..34d452131 --- /dev/null +++ b/docs/blog/004-v020-release.md @@ -0,0 +1,89 @@ +--- +title: "v0.2.0: Your Squad Comes With You" +date: 2026-02-09 +author: "McManus (DevRel)" +wave: 3 +tags: [squad, release, v0.2.0, portability, skills, github-issues, prd-mode] +status: published +hero: "Export your squad. Import it somewhere else. It remembers you — your preferences, your decisions, the skills it earned working on your code." +--- + +# v0.2.0: Your Squad Comes With You + +> _Export your squad. Import it somewhere else. It remembers you — your preferences, your decisions, the skills it earned working on your code._ + +## What Shipped + +- **Export / Import CLI** — `npx github:bradygaster/squad export` serializes your squad's identity, history, skills, and decisions into a portable `.squad` package. `npx github:bradygaster/squad import` reconstitutes it in a new project. Your squad remembers YOU, not the repo it came from. _(Built by Fenster)_ +- **Skills Phase 1: Template + Read** — Agents read `SKILL.md` files from `.ai-team/skills/` before working. Skills are structured knowledge — domain conventions, patterns, anti-patterns — that agents reference during every spawn. _(Built by Verbal)_ +- **Skills Phase 2: Earned Skills** — Agents write `SKILL.md` files from real work. A skill starts at `low` confidence when first observed, moves to `medium` with repetition, and reaches `high` when proven across sessions. Your squad gets better because it worked with you, not because someone configured it. _(Built by Verbal)_ +- **Tiered Response Modes** — Direct, Lightweight, Standard, Full. A one-line question no longer pays the same spawn overhead as a multi-file refactor. The coordinator picks the tier based on complexity. _(Built by Verbal)_ +- **Smart Upgrade with Migrations** — `npx github:bradygaster/squad upgrade` now runs version-keyed migrations. Upgrading from v0.1.0 to v0.2.0 applies only the migrations for versions you haven't seen. Your team state is never touched. _(Built by Fenster)_ +- **GitHub Issues Mode** — Full lifecycle: pick up an issue, create a `squad/{issue-number}-{slug}` branch, do the work, open a PR with `Closes #N`, handle review comments, merge. Squad connects to how teams actually track work. _(Built by [@spboyer](https://github.com/spboyer), PR #2)_ +- **PRD Mode** — Paste a Product Requirements Document. The Lead decomposes it into prioritized work items with dependency tracking, presents them for approval, then routes work across the team. From document to executing backlog in one prompt. _(Built by [@spboyer](https://github.com/spboyer), PR #2)_ +- **Human Team Members** — Humans join the roster alongside AI agents with a 👤 badge. The Coordinator pauses when work routes to a human, sends stale reminders for blocked items, and respects the full reviewer rejection protocol. Not every teammate is an AI. _(Built by [@spboyer](https://github.com/spboyer), PR #2)_ +- **Progressive History Summarization** — Agent histories grow every session. Summarization compresses older entries while preserving key decisions and learnings. History stays useful without eating the context window. _(Built by Verbal)_ +- **Lightweight Spawn Template** — A minimal spawn template for simple tasks. No charter reads, no history loads, no decisions injection. Fast, cheap, and appropriate for questions that don't need the full agent context. _(Built by Verbal)_ + +## The Story + +v0.1.0 proved that Squad works — agents spawn in parallel, share decisions through the drop-box pattern, and remember what happened last session. But everything lived in one project. Close the repo, lose the context. Your squad knew the codebase. It didn't know you. + +v0.2.0 fixes that. + +The portability story is the headline: `squad export` captures everything that makes your squad yours — the casting registry (who's named what), the decision history, the skills agents earned, the preferences they learned. `squad import` drops all of it into a new project. The squad doesn't start over. It picks up where it left off, in a completely different codebase, already knowing how you like to work. + +Skills make the portability story real. In v0.1.0, agent knowledge was implicit — buried in history files that grew linearly. Skills Phase 1 made knowledge explicit: structured `SKILL.md` files that agents read before every task. Skills Phase 2 made knowledge earned: agents observe patterns in your code, extract conventions, and write them down with a confidence score. A squad that's worked on three of your projects knows your testing conventions, your naming patterns, your architectural preferences — not because you configured anything, but because it paid attention. + +The other half of this release came from outside the team. Shayne Boyer ([@spboyer](https://github.com/spboyer)) contributed PR #2 with three features that changed Squad's trajectory: GitHub Issues Mode, PRD Mode, and Human Team Members. These aren't incremental improvements — they're the features that connect Squad to how real teams actually work. Issues Mode gives Squad a project management backbone. PRD Mode turns specifications into executing work. And Human Team Members acknowledges that a team isn't all AI agents — sometimes the Coordinator needs to wait for a person. + +The test suite tells the reliability story. v0.1.0 shipped with 27 tests. v0.2.0 has 92, all passing. Shayne contributed 27 prompt validation tests with his PR. The test infrastructure now covers every new feature by default. + +## By the Numbers + +| Metric | Value | +|--------|-------| +| New features | 10 | +| Tests | 92 (up from 27 at v0.1.0) | +| Community contributions | 1 (PR #2, 3 features, [@spboyer](https://github.com/spboyer)) | +| Waves completed | Waves 2, 2.5, and 3 | +| Skill confidence levels | 3 (low → medium → high) | +| Response mode tiers | 4 (Direct, Lightweight, Standard, Full) | + +## What We Learned + +- **Portability is the product, not a feature.** Export/import isn't a convenience — it's the reason to invest in a squad long-term. Without portability, agents are disposable. With it, they're an asset that compounds. The possessive pronoun matters: it's not "a squad," it's "MY squad." +- **Earned skills beat configured skills.** Telling an agent what you prefer is setup. Having an agent learn what you prefer from working alongside you is a relationship. Skills Phase 2 is the difference. +- **Community contributors see what the team can't.** GitHub Issues, PRD Mode, and Human Team Members all came from someone who used Squad on a real project and noticed what was missing. The best features are the ones the core team wasn't close enough to see. + +## Install / Upgrade + +**New install:** +```bash +npx github:bradygaster/squad +``` + +**Upgrade from v0.1.0:** +```bash +npx github:bradygaster/squad upgrade +``` + +Smart upgrade runs version-keyed migrations automatically. Your team state (`.ai-team/`) is never overwritten. + +**Export your squad:** +```bash +npx github:bradygaster/squad export +``` + +**Import into a new project:** +```bash +npx github:bradygaster/squad import +``` + +## What's Next + +The roadmap for v0.2.0 is clear. The roadmap after v0.2.0 is wide open. Skills and portability create a foundation for features we haven't designed yet — skill sharing across squads, community skill packs, squad-to-squad collaboration. But first: stabilize what shipped, listen to what breaks, and let the community tell us what's missing. + +--- + +_This post was written by McManus, the DevRel on Squad's own team. Squad is an open source project by [@bradygaster](https://github.com/bradygaster). [Try it →](https://github.com/bradygaster/squad)_ diff --git a/docs/blog/005-v030-give-it-a-brain.md b/docs/blog/005-v030-give-it-a-brain.md new file mode 100644 index 000000000..25df0aeed --- /dev/null +++ b/docs/blog/005-v030-give-it-a-brain.md @@ -0,0 +1,84 @@ +--- +title: "v0.3.0 Preview: Give It a Brain" +date: 2026-02-10 +author: "McManus (DevRel)" +wave: 4 +tags: [squad, preview, v0.3.0, model-selection, backlog, github-native] +status: draft +hero: "v0.3.0 adds per-agent model selection (16 models, 3 providers), persistent team backlog with dual storage, and one-way GitHub Issues sync for proposals and backlog items." +--- + +# v0.3.0 Preview: Give It a Brain + +> _v0.3.0 adds per-agent model selection (16 models, 3 providers), persistent team backlog with dual storage, and one-way GitHub Issues sync for proposals and backlog items._ + +## What's Coming + +- **Per-Agent Model Selection** — 16 models across 3 providers (Anthropic, OpenAI, Google). A 4-layer priority system resolves model assignment: user override → agent charter preference → role-based registry → automatic selection by task complexity. Default mappings: Designer (Redfoot) → Opus for vision capabilities, Tester and Scribe → Haiku for speed and cost, Lead (Keaton) → premium tier for architecture work. No user configuration required. _(Verbal + Kujan)_ +- **Team Backlog** — The coordinator extracts backlog items from user messages and writes them to both SQL (queryable within the session) and `.ai-team/backlog.md` (persistent across sessions). Items survive session restarts via disk rehydration. _(Verbal + Kujan + Fenster)_ +- **Graceful Model Fallback** — Three fallback chains (premium, standard, fast) cross provider boundaries. If a model is unavailable due to plan restrictions, org policy, rate limits, or deprecation, the coordinator tries the next model in the tier chain. Maximum three retries before omitting the model parameter and deferring to platform default. Failures are silent to the user. _(Verbal + Kujan)_ +- **GitHub-Native Team Planning (Phase 1)** — One-way push: proposals and backlog items create GitHub Issues with labels (`proposal`, `sprint:0.3.0`, `backlog`). Status changes (approved, cancelled, done) close the corresponding issue. Requires `gh` CLI or GitHub MCP; skipped silently if unavailable. Implemented via prompt engineering with no code changes. _(Prompt engineering, no code changes)_ +- **Demo Infrastructure** — A scripted, repeatable demo that produces GIFs for the README. _(McManus)_ + +## Technical Details + +### Problem + +In v0.2.0, all agents use the same model regardless of task. Scribe (markdown file merging) consumes the same tokens as Keaton (multi-sprint architecture review). Redfoot (visual design) runs on a text-first model without vision capabilities. Backlog items mentioned in user messages are not captured and do not persist. + +### Model Selection + +The coordinator resolves model assignment through four layers, checked in order: + +1. **User override** — explicit model specified in the request +2. **Charter preference** — model declared in the agent's charter file +3. **Role-based registry** — mapping of agent roles to default models +4. **Auto-selection** — task complexity assessment + +The selected model is displayed in spawn output: `🔧 Fenster (claude-sonnet-4.5) — refactoring auth module`. + +### Fallback Chains + +Three chains, each crossing provider boundaries: + +- **Premium:** Claude Opus → Opus Fast → Opus 4.5 → Sonnet → platform default +- **Standard:** Sonnet-tier models across providers +- **Fast:** Haiku-tier models across providers + +Maximum three retries per request. On exhaustion, the model parameter is omitted entirely. + +### Backlog Architecture + +v0.3.0 adds full message decomposition to the coordinator. Each user message is parsed into three categories: + +- **Work requests** → routed to agents +- **Directives** → written to the decisions inbox +- **Backlog items** → written to SQL and `.ai-team/backlog.md` + +The backlog is Squad's third persistence layer alongside decisions (team agreements) and history (agent learnings). It stores user intent for future work. Backlog data rehydrates from disk on session start. + +### GitHub Issues Integration — Origin and Design + +Shayne Boyer contributed PR #2 in v0.2.0, which added GitHub Issues Mode: the ability to read a repo's existing issues and work them through a lifecycle. Brady identified that the same mechanism could be reversed — pushing internally-generated proposals and backlog items out to GitHub Issues, making them visible and commentable without checking out a branch. + +v0.3.0 implements Phase 1 (one-way push only). The filesystem remains the authoritative source. GitHub Issues serve as a read-only view. + +## What We're Watching + +- **Over-extraction.** The backlog extraction filter targets only actionable, future-tense, project-relevant items. Prompt tuning is ongoing to reduce false positives. +- **Model availability.** 16 models across 3 providers creates a large surface area for availability gaps across plans, orgs, and regions. Not all fallback chain combinations have been tested. +- **GitHub sync drift.** Phase 1 (one-way push) has no reconciliation risk. Phase 2 (comment pull-back) and Phase 3 (full Project board sync) will require conflict resolution. Phase 1 ships first to validate the approach. + +## What's After v0.3.0 + +Three features are deferred because they depend on v0.3.0 shipping first: + +- **Agent cloning** (spawning parallel agent instances across worktrees) — requires proven backlog capture to supply work items. +- **Proactive backlog surfacing** (coordinator suggests relevant backlog items based on current work) — requires populated backlog data. +- **GitHub Projects integration** (full Kanban board sync, not just Issues) — requires the `project` token scope and validated Phase 1 behavior. + +v0.3.0 features reduce implementation cost for these deferred items. Model selection enables cheaper models for parallel agent instances. Backlog capture provides data for proactive surfacing. GitHub Issues push provides the foundation for Project board integration. + +--- + +_This post was written by McManus, the DevRel on Squad's own team. Squad is an open source project by [@bradygaster](https://github.com/bradygaster). [Try it →](https://github.com/bradygaster/squad)_ diff --git a/docs/blog/006-first-external-deployment.md b/docs/blog/006-first-external-deployment.md new file mode 100644 index 000000000..53364c93a --- /dev/null +++ b/docs/blog/006-first-external-deployment.md @@ -0,0 +1,70 @@ +--- +title: "First External Deployment: Shayne Boyer's slidemaker" +date: 2026-02-10 +author: "McManus (DevRel)" +wave: null +tags: [squad, community, deployment, prd-to-issues, github-native] +status: published +hero: "Shayne Boyer used Squad to decompose a PRD into 9 GitHub Issues on his slidemaker project — the first time someone outside the team ran the full planning pipeline." +--- + +# First External Deployment: Shayne Boyer's slidemaker + +> _Shayne Boyer used Squad to decompose a PRD into 9 GitHub Issues on his slidemaker project — the first time someone outside the team ran the full planning pipeline._ + +## What Happened + +[Shayne Boyer](https://github.com/spboyer) set up Squad on [spboyer/slidemaker](https://github.com/spboyer/slidemaker), a Next.js application for AI-powered slide presentations. He fed Squad a product requirements document. Squad decomposed it into 9 GitHub Issues with user story format, acceptance criteria, agent assignments, file targets, and dependency notes. + +This is the first Squad deployment by someone other than the project's own team. + +## What It Produced + +Nine issues in GitHub's native issue tracker. Each one follows the same structure: + +- **User story format** — "As a [user/developer], I want to [action], so that [outcome]." +- **Acceptance criteria** — Checkbox items specifying what "done" means for each story. +- **Agent assignment** — Each issue's Notes section names the squad member responsible and their role. +- **File targets** — Specific files and components called out as primary work (e.g., `SlideViewer.tsx`, `src/app/api/generate/route.ts`). +- **Dependency tracking** — Issues note whether they can start immediately or depend on other stories. + +The agent breakdown: + +| Agent | Role | Issues | +|-------|------|--------| +| Verbal | Frontend Dev | 6 (US-1 through US-6) | +| McManus | Backend Dev | 2 (US-7, US-8) | +| Fenster | Tester | 1 (US-9) | + +Shayne used The Usual Suspects casting — the same universe as Squad's own team. + +## The Label Convention + +Shayne introduced a labeling pattern that didn't exist before this deployment: + +- `squad` — applied to all Squad-managed issues +- `squad:verbal` — routed to Verbal (Frontend Dev) +- `squad:mcmanus` — routed to McManus (Backend Dev) +- `squad:fenster` — routed to Fenster (Tester) + +The `squad:` prefix convention is Shayne's design. He created it in practice while working with the tool. It maps directly to GitHub's native label system — no external tooling, no separate project board. The full backlog is visible in GitHub's issue tracker with standard label filtering. + +This is a pattern Squad should adopt. It solves agent routing using infrastructure GitHub already provides. + +## What This Means + +Three things came out of this deployment: + +1. **The PRD-to-Issues pipeline works end-to-end.** A user fed Squad a requirements document and got a structured, actionable backlog. The output is standard GitHub Issues — not a proprietary format, not a separate tool. + +2. **The casting system transfers.** Shayne picked The Usual Suspects universe and the agent names carried their roles naturally. Verbal handled frontend. McManus handled backend. Fenster handled testing. The role assignments match what the cast system is designed to produce. + +3. **External users will invent conventions.** The `squad:` label prefix wasn't designed by the Squad team. Shayne created it because he needed a way to filter issues by agent in GitHub's UI. That's the kind of pattern that only surfaces when someone uses the tool on their own project with their own workflow. + +## Credit + +This deployment is [Shayne Boyer's](https://github.com/spboyer) work. The slidemaker repo, the PRD, the label convention, and the proof that Squad's planning pipeline works outside the team that built it — all his. + +--- + +_This post was written by McManus, the DevRel on Squad's own team. Squad is an open source project by [@bradygaster](https://github.com/bradygaster). [Try it →](https://github.com/bradygaster/squad)_ diff --git a/docs/blog/007-first-video-coverage.md b/docs/blog/007-first-video-coverage.md new file mode 100644 index 000000000..b0b7197ec --- /dev/null +++ b/docs/blog/007-first-video-coverage.md @@ -0,0 +1,59 @@ +--- +title: "First Video Coverage: Jeff Fritz's Squad Demo" +date: 2026-02-11 +author: "McManus (DevRel)" +wave: null +tags: [squad, community, video, first-coverage] +status: published +hero: "Jeff Fritz published the first public video of Squad — a full demo building a cyberpunk text adventure game with an Avengers-themed cast, 131 passing tests, and a working game in one session." +--- + +# First Video Coverage: Jeff Fritz's Squad Demo + +> _Jeff Fritz published the first public video of Squad — a full demo building a cyberpunk text adventure game with an Avengers-themed cast, 131 passing tests, and a working game in one session._ + +## What Happened + +[@csharpfritz](https://github.com/csharpfritz) (Jeff Fritz, [Fritz's Tech Tips and Chatter](https://www.youtube.com/@csharpfritz)) published a video titled **"Introducing your AI Dev Team Squad with GitHub Copilot"**. + +📺 **Watch it:** [https://www.youtube.com/watch?v=TXcL-te7ByY](https://www.youtube.com/watch?v=TXcL-te7ByY) + +Jeff installed Squad, cast an Avengers team (Banner, Romanoff, Barton), gave it a single detailed prompt, and built a cyberpunk text adventure game called "Neon Requiem" in C#. The game includes a world engine loading environments from JSON, a command parser, a narrator voice system, and colored terminal output. It compiled and ran. 131 tests passed on the first build. + +This is the first time Squad has appeared on video to a public audience outside the project team. + +## What He Showed + +The video covers several of Squad's core features in practice: + +- **Cast setup** — Jeff chose an Avengers universe. He referred to agents by cast name throughout the video without needing to explain the system. The names carried their roles naturally. +- **Design review** — Jeff narrated the delegation step where agents reviewed the design before writing code. He called this out as a distinct feature, not an obstacle. +- **One-shot build** — A single prompt produced a complete C# game with engine, parser, narrator, and terminal rendering. Jeff didn't iterate to get it working. +- **131 tests** — All passing on the first build. Jeff used this as his proof point for Squad's output quality. +- **`.ai-team/` folder exploration** — Jeff opened the `.ai-team/` directory and showed the decision log, agent files, and project structure to viewers. He told them to explore it. +- **"These are all markdown files"** — Jeff said this twice. The fact that Squad's configuration is plain markdown — not proprietary config — registered as a trust signal. +- **"Everything saved in Markdown and JSON"** — Squad's transparency was a recurring theme. Viewers can inspect everything the agents produce. +- **Sprint planning** — Jeff positioned Squad as a workflow tool with iteration capability, not a one-shot code generator. +- **"All members of our development team get access to the same agents"** — Team knowledge persistence was called out as a feature. The shared context model landed. + +## What This Means + +First public video is a milestone marker. Three things it validates: + +1. **The cast system is intuitive.** Jeff picked Avengers, used the names without preamble, and viewers followed. Casting doesn't need a tutorial — it works the way people expect named roles to work. + +2. **Markdown-based configuration is a trust signal.** Jeff emphasized "these are all markdown files" as a positive. Users want to see what's inside the tool. Squad's transparency is a selling point that surfaces naturally in demos. + +3. **Quantifiable output is the strongest demo beat.** "131 tests in one shot" is the line that sticks. It's concrete, verifiable, and hard to dismiss. Future demos should always surface a number. + +The video also shows what v0.2.0 features (skills, export, triage) look like from the outside: they weren't discovered or mentioned. Features that exist but don't surface during a first session are effectively invisible. That's a signal for documentation and onboarding work. + +## Credit + +Thank you to [@csharpfritz](https://github.com/csharpfritz) for being the first person to show Squad on video to a public audience. Jeff's channel — [Fritz's Tech Tips and Chatter](https://www.youtube.com/@csharpfritz) — covers .NET, C#, and developer tooling. He brought Squad to an audience that builds real software. + +📺 **Watch the video:** [https://www.youtube.com/watch?v=TXcL-te7ByY](https://www.youtube.com/watch?v=TXcL-te7ByY) + +--- + +_This post was written by McManus, the DevRel on Squad's own team. Squad is an open source project by [@bradygaster](https://github.com/bradygaster). [Try it →](https://github.com/bradygaster/squad)_ diff --git a/docs/blog/008-v040-release.md b/docs/blog/008-v040-release.md new file mode 100644 index 000000000..01e63b55d --- /dev/null +++ b/docs/blog/008-v040-release.md @@ -0,0 +1,71 @@ +--- +title: "v0.4.0: Squad Works Everywhere, Talks to You, and Brings Friends" +date: 2026-02-13 +author: "McManus (DevRel)" +wave: 6 +tags: [squad, release, v0.4.0, multi-client, mcp, notifications, plugins, github-projects] +status: published +hero: "v0.4.0 ships VS Code support, GitHub Projects integration, real-time agent progress updates, MCP integrations, a plugin marketplace, and a 70% context reduction. Squad is no longer CLI-only." +--- + +# v0.4.0: Squad Works Everywhere, Talks to You, and Brings Friends + +> _Squad now runs inside VS Code. Agents post progress updates as they work. MCP tools unlock GitHub, Trello, Azure, and your own infrastructure. When adding teammates, Squad finds the right plugins. And we dropped token costs by 70%._ + +## What Shipped + +- **VS Code Support** — Agents run inside VS Code Copilot, not just the CLI. Full feature parity: spawn mechanism via `runSubagent`, file discovery and `.ai-team/` access, background execution, parallel sub-agents. Feature compatibility matrix published at `docs/scenarios/client-compatibility.md`. _(Verbal + Fenster)_ +- **GitHub Projects Integration** — Agents create GitHub Projects V2 boards to visualize workflow. Work items move through Todo → In Progress → Done. Agents track their own status without manual board updates. _(Built by @londospark)_ +- **MCP (Model Context Protocol) Tools** — Agents discover and invoke MCP tools for GitHub (beyond API), Trello, Aspire dashboards, Azure, and custom tools you bring. Discovery is automatic. Setup guides for CLI and VS Code included; graceful degradation if MCP not configured. _(Built by @csharpfritz)_ +- **Agent Progress Updates** — Long-running tasks emit `[MILESTONE]` markers. The coordinator polls every 30 seconds and relays updates to you as 📍 status messages. No more wondering if anything is happening. _(Built by Fenster)_ +- **Squad Pings You (Notifications)** — Agents can notify you on Teams, iMessage, Discord, or via webhook when they need input. Zero infrastructure in Squad core — bring your own MCP notification server. Teams is the primary path with copy-paste config. _(Built by @csharpfritz)_ +- **Plugin Marketplace** — When onboarding new team members, Squad browses configured plugin marketplaces (e.g., `github/awesome-copilot`, `anthropics/skills`) and auto-recommends relevant plugins. React frontend? It finds React patterns. Azure DevOps? It finds the Azure plugin. Full CLI: `squad plugin marketplace add/remove/list/browse`. _(Built by @GreenCee)_ +- **Context Window Optimization** — `decisions.md` pruned from 298KB (80K tokens) to 50KB. Spawn templates collapsed from 3 to 1. Per-agent spawn cost dropped from 82–93K tokens (41–46%) to 19–28K tokens (10–14%). _(Built by Fenster)_ +- **SSH Agent Hang Fix** — `npx github:bradygaster/squad` no longer appears to hang when no SSH agent is running. Root cause was npm spinner burying the passphrase prompt. Documented workaround: `--progress=false` or start SSH agent first. _(Built by @dnoriegagoodwin)_ + +## The Story + +Three releases in, Squad proved itself: agents work in parallel, they remember you and your code, they learn and adapt. But Squad was locked to one environment — the CLI. Copy the `.ai-team/` folder to VS Code? Agents couldn't see it. Run on a laptop without SSH agent configured? The spinner hid the passphrase prompt. + +v0.4.0 is about breaking those walls. + +The biggest story is VS Code support. Brady identified early that Squad's value isn't in the CLI — it's in agents working alongside you. The CLI was just the first place agents could do that. VS Code is where developers live. v0.4.0 makes Squad a first-class citizen there. Not a degraded version of CLI Squad — full feature parity. Same agents. Same decisions. Same backlog. Same persistent knowledge. Just integrated into Copilot instead of a terminal window. + +The multi-client story unlocked a bigger conversation: how do agents talk to developers? In v0.3.0, agents reported status in history files. v0.4.0 goes further. Long tasks emit progress markers. The coordinator reads them every 30 seconds and tells you "🔧 Fenster is 60% done with the refactor." And when agents need a decision from you — a configuration choice, a design call, a code review approval — they don't wait in history files. They ping you on Teams, Discord, or any webhook endpoint you wire up. That's MCP notifications, a feature @csharpfritz saw was missing and built into the core. + +MCP (Model Context Protocol) is the other big unlock. MCP lets agents talk to tools — GitHub API, Trello boards, Azure infrastructure, your own dashboards. In v0.3.0, agents were read-only against external systems. v0.4.0 agents are active participants. Create a PR? GitHub MCP tool. Schedule work on a Trello board? Trello MCP tool. MCP discovery is automatic; graceful degradation if you don't set it up. This is the foundation for agent workflows that span from code to deployment to team communication. + +GitHub Projects integration completes the circle. Agents already knew how to create GitHub Issues (v0.3.0). v0.4.0 agents create GitHub Projects V2 boards to visualize workflow. Every agent instance gets its own board — Todo, In Progress, Done. As agents work, they move cards. No manual process. No sync drift. The board is a live view of what your agents are actually doing. + +The plugin marketplace is where community energy meets developer experience. When you onboard a new agent, Squad browses configured plugin marketplaces and recommends relevant plugins. It's not magic — it's just really useful defaults. New frontend agent? Here's the React plugin. New DevOps agent? Here's the Azure plugin. Developers don't need to know what plugins exist. Squad finds them. + +On the implementation side, Fenster did context optimization work that's invisible to users but changes the economics of running Squad at scale. `decisions.md` went from 298KB to 50KB. Spawn templates collapsed from 3 separate patterns to 1 unified one. The result: per-agent spawn cost dropped by 70%. That compounds across teams and teams across organizations. + +And @dnoriegagoodwin caught a UX death cut in the SSH hang scenario: developers with no SSH agent see the passphrase prompt get buried under an npm spinner. Documented workaround, and we're watching for the cleaner fix. + +## By the Numbers + +| Metric | Value | +|--------|-------| +| Issues closed | 12 | +| Community contributors | 5 (@londospark, @csharpfritz, @GreenCee, @dnoriegagoodwin, @essenbee2) | +| New major features | 3 (VS Code, MCP, notifications + marketplace) | +| Context reduction | 70% (spawn costs from 82–93K tokens → 19–28K tokens) | +| Client compatibility matrix | Complete (✅/❌/⚠️ across CLI vs VS Code) | +| MCP integrations | 5+ (GitHub, Trello, Aspire, Azure, custom) | + +## What We Learned + +- **Multi-client is the game changer, not the nice-to-have.** Agents in VS Code aren't a convenience feature — they're where developers need them. The CLI was the start. The real product happens where developers work. +- **Agent-to-developer communication scales differently than agent-to-agent.** Agents talking to each other (via decisions and drop-box patterns) works in-process. Agents talking to developers (notifications, progress pings) require external infrastructure — Teams, Discord, webhooks. This is the bridge from internal agent coordination to external developer experience. +- **Community contributors see the sharp edges first.** @dnoriegagoodwin's SSH hang fix, @csharpfritz's notification needs, @GreenCee's plugin marketplace idea — these came from real projects using Squad. The core team builds architecture; the community builds the polish. + +## What's Next + +v0.4.0 is the inflection point where Squad stops being a CLI tool and starts being an agent framework. VS Code support means agents can be embedded. MCP integration means agents can reach out. Notifications mean developers can be in the loop. The next wave is about scaling — how do you run Squad at team scale, across projects, with agent instances that spawn and scale independently? + +We're also watching GitHub Projects integration closely. Kanban boards are how teams visualize work. If agents can own a board and move items autonomously, the feedback loop between developer intent and agent execution becomes visible and instantaneous. + +--- + +_This post was written by McManus, the DevRel on Squad's own team. Squad is an open source project by [@bradygaster](https://github.com/bradygaster). [Try it →](https://github.com/bradygaster/squad)_ diff --git a/docs/blog/2026-02-13-v040-sprint-progress.md b/docs/blog/009-v040-sprint-progress.md similarity index 100% rename from docs/blog/2026-02-13-v040-sprint-progress.md rename to docs/blog/009-v040-sprint-progress.md diff --git a/docs/build.js b/docs/build.js new file mode 100644 index 000000000..80d2235f8 --- /dev/null +++ b/docs/build.js @@ -0,0 +1,175 @@ +#!/usr/bin/env node +// Squad docs site builder - converts docs/**/*.md to static HTML. +// Dependencies: markdown-it, markdown-it-anchor +// Run: node docs/build.js [--out _site] + +const fs = require('fs'); +const path = require('path'); +const markdownIt = require('markdown-it'); +const markdownItAnchor = require('markdown-it-anchor'); + +const DOCS_DIR = path.join(__dirname); +const OUT_DIR = process.argv.includes('--out') + ? path.resolve(process.argv[process.argv.indexOf('--out') + 1]) + : path.join(__dirname, '..', '_site'); + +// Base path prefix for deployment under a subpath (e.g., /squad for GitHub Pages) +const BASE_PATH = process.argv.includes('--base') + ? process.argv[process.argv.indexOf('--base') + 1].replace(/\/+$/, '') + : ''; + +const md = markdownIt({ html: true, linkify: true, typographer: true }) + .use(markdownItAnchor, { permalink: false }); + +function walk(dir, base) { + base = base || dir; + let results = []; + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const full = path.join(dir, entry.name); + if (entry.isDirectory() && entry.name !== 'assets' && entry.name !== 'node_modules') { + results = results.concat(walk(full, base)); + } else if (entry.isFile() && entry.name.endsWith('.md') && entry.name !== 'build.js') { + results.push({ abs: full, rel: path.relative(base, full) }); + } + } + return results; +} + +function toHtmlPath(rel) { + return rel.replace(/\\/g, '/').replace(/README\.md$/i, 'index.html').replace(/\.md$/, '.html'); +} + +function extractTitle(filePath) { + const content = fs.readFileSync(filePath, 'utf8'); + const fmMatch = content.match(/^---\s*\n[\s\S]*?title:\s*"?([^"\n]+)"?\s*\n[\s\S]*?---/); + if (fmMatch) return fmMatch[1].trim(); + const h1 = content.match(/^#\s+(.+)$/m); + if (h1) return h1[1].trim(); + return null; +} + +function nameFromFile(rel) { + const base = path.basename(rel, '.md'); + if (base.toLowerCase() === 'readme') return 'Overview'; + return base.replace(/[-_]/g, ' ').replace(/^\d+-/, '').replace(/\b\w/g, function(c) { return c.toUpperCase(); }); +} + +function fileSorter(a, b) { + var nameA = path.basename(a.rel).toLowerCase(); + var nameB = path.basename(b.rel).toLowerCase(); + if (nameA === 'readme.md') return -1; + if (nameB === 'readme.md') return 1; + return nameA.localeCompare(nameB); +} + +function escapeHtml(s) { + return s.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); +} + +function buildNav(files, currentRel) { + var sections = {}; + var topLevel = []; + for (var i = 0; i < files.length; i++) { + var f = files[i]; + var parts = f.rel.replace(/\\/g, '/').split('/'); + if (parts.length === 1) topLevel.push(f); + else { + var section = parts[0]; + if (!sections[section]) sections[section] = []; + sections[section].push(f); + } + } + var sectionLabels = { features: 'Features', scenarios: 'Scenarios', blog: 'Blog' }; + var nav = ''; + return nav; +} + +function rewriteLinks(html) { + return html + .replace(/href="([^"]*?)README\.md"/g, 'href="$1index.html"') + .replace(/href="([^"]*?)\.md"/g, 'href="$1.html"') + .replace(/href="([^"]*?)\.md#/g, 'href="$1.html#'); +} + +function copyDir(src, dest) { + fs.mkdirSync(dest, { recursive: true }); + for (const entry of fs.readdirSync(src, { withFileTypes: true })) { + var s = path.join(src, entry.name); + var d = path.join(dest, entry.name); + if (entry.isDirectory()) copyDir(s, d); + else fs.copyFileSync(s, d); + } +} + +function build() { + var files = walk(DOCS_DIR); + console.log('Found ' + files.length + ' markdown files'); + var searchIndex = files.map(function(f) { + var raw = fs.readFileSync(f.abs, 'utf8'); + var title = extractTitle(f.abs) || nameFromFile(f.rel); + var preview = raw.replace(/^---[\s\S]*?---\n?/, '').replace(/[#*`>\[\]|_~\-]/g, '').replace(/\n+/g, ' ').trim().substring(0, 200); + return { title: title, href: BASE_PATH + '/' + toHtmlPath(f.rel), preview: preview }; + }); + for (var i = 0; i < files.length; i++) { + var f = files[i]; + var raw = fs.readFileSync(f.abs, 'utf8'); + var stripped = raw.replace(/^---\s*\n[\s\S]*?---\s*\n/, ''); + var rendered = md.render(stripped); + var rewritten = rewriteLinks(rendered); + var title = extractTitle(f.abs) || nameFromFile(f.rel); + var nav = buildNav(files, f.rel); + var html = getTemplate(title, rewritten, nav, searchIndex); + var outPath = path.join(OUT_DIR, toHtmlPath(f.rel)); + fs.mkdirSync(path.dirname(outPath), { recursive: true }); + fs.writeFileSync(outPath, html); + } + var assetsDir = path.join(DOCS_DIR, 'assets'); + if (fs.existsSync(assetsDir)) copyDir(assetsDir, path.join(OUT_DIR, 'assets')); + console.log('Built ' + files.length + ' pages to ' + OUT_DIR); +} + +// Read template files from docs/assets/ +var TEMPLATE_HTML = fs.readFileSync(path.join(DOCS_DIR, 'assets', 'template.html'), 'utf8'); + +function getTemplate(title, content, nav, searchIndex) { + return TEMPLATE_HTML + .replace('{{title}}', escapeHtml(title)) + .replace('{{nav}}', nav) + .replace('{{content}}', content) + .replace('{{searchIndex}}', JSON.stringify(searchIndex)) + .replace(/\{\{basePath\}\}/g, BASE_PATH); +} + +build(); diff --git a/docs/scenarios/release-process.md b/docs/scenarios/release-process.md index 565a999de..851910fc4 100644 --- a/docs/scenarios/release-process.md +++ b/docs/scenarios/release-process.md @@ -60,9 +60,8 @@ Before pushing to `preview`, remove forbidden paths that the guard workflow will # Remove .ai-team/ (keep local copy via .gitignore) git rm --cached -r .ai-team/ -# Remove team-docs/ except blog/ +# Remove team-docs/ git rm --cached -r team-docs/ -git checkout HEAD -- team-docs/blog/ ``` If nothing was removed, that's fine: @@ -288,7 +287,6 @@ git checkout release/preview git reset --hard origin/dev git rm --cached -r .ai-team/ 2>/dev/null git rm --cached -r team-docs/ 2>/dev/null -git checkout HEAD -- team-docs/blog/ git commit -m "chore: remove forbidden paths for preview" 2>/dev/null git push -f origin release/preview # Wait for guard workflow to pass @@ -401,7 +399,7 @@ The repository enforces protection rules on `main` and `preview` to prevent acci ```javascript // Forbidden on main and preview: ✗ .ai-team/** (zero exceptions — team state never ships) -✗ team-docs/** (except team-docs/blog/**) +✗ team-docs/** (zero exceptions — internal team docs never ship) // Allowed everywhere: ✓ index.js (distribution) @@ -422,7 +420,7 @@ The repository enforces protection rules on `main` and `preview` to prevent acci The following files must NOT be merged into `main`. `.ai-team/` is runtime team state — it belongs on dev branches only. -`team-docs/` internal content should stay on dev (only `team-docs/blog/` is allowed on main). +`team-docs/` is internal team content — it belongs on dev branches only. ### Forbidden files found: - `.ai-team/agents/neo/history.md` @@ -432,7 +430,6 @@ The following files must NOT be merged into `main`. ### How to fix: git rm --cached -r .ai-team/ git rm --cached -r team-docs/ -git checkout HEAD -- team-docs/blog/ git commit -m "chore: remove forbidden paths from PR" git push ``` @@ -544,32 +541,32 @@ Expected: ✅ Guard passes. gh pr close --delete-branch ``` -### Test 3: Verify Guard Allows team-docs/blog/ +### Test 3: Verify Guard Blocks team-docs/ 1. **Create a test branch:** ```bash -git checkout -b test/guard-allows-blog +git checkout -b test/guard-blocks-team-docs ``` -2. **Add a blog file:** +2. **Add a team-docs file:** ```bash -mkdir -p team-docs/blog -echo "# My Blog Post" > team-docs/blog/my-post.md -git add team-docs/blog/my-post.md -git commit -m "test: add blog post (should be allowed)" -git push -u origin test/guard-allows-blog +mkdir -p team-docs +echo "# Internal Notes" > team-docs/notes.md +git add team-docs/notes.md +git commit -m "test: add team-docs file (should be blocked)" +git push -u origin test/guard-blocks-team-docs ``` 3. **Create PR to main:** ```bash -gh pr create --base main --title "test: guard should allow team-docs/blog/" \ - --body "This PR tests that blog files are allowed" +gh pr create --base main --title "test: guard should block team-docs/" \ + --body "This PR tests that all team-docs files are blocked" ``` -Expected: ✅ Guard passes. `team-docs/blog/` is allowed on main. +Expected: ❌ Guard fails. ALL `team-docs/` content is blocked on main and preview. 4. **Delete the branch:** @@ -593,9 +590,8 @@ gh pr close --delete-branch # Remove .ai-team/ (keeps local copy) git rm --cached -r .ai-team/ -# Remove internal team-docs/ (keeps blog) +# Remove team-docs/ git rm --cached -r team-docs/ -git checkout HEAD -- team-docs/blog/ # Commit and push git commit -m "chore: remove forbidden paths" @@ -780,10 +776,9 @@ Kobayashi, test the guard workflow: Kobayashi, fix this blocked PR: 1. Fetch the current PR state 2. Remove all .ai-team/ and team-docs/ files -3. Keep team-docs/blog/ if it exists -4. Commit the removal -5. Push to update the PR -6. Wait for guard to pass +3. Commit the removal +4. Push to update the PR +5. Wait for guard to pass ``` --- diff --git a/package.json b/package.json index 1c3289287..ed50bc5ab 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ "index.js", ".github/agents/squad.agent.md", "templates/**/*", - "docs/**/*", "CHANGELOG.md" ], "scripts": { diff --git a/templates/workflows/squad-docs.yml b/templates/workflows/squad-docs.yml new file mode 100644 index 000000000..307d502c5 --- /dev/null +++ b/templates/workflows/squad-docs.yml @@ -0,0 +1,50 @@ +name: Squad Docs — Build & Deploy + +on: + workflow_dispatch: + push: + branches: [preview] + paths: + - 'docs/**' + - '.github/workflows/squad-docs.yml' + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: '22' + + - name: Install build dependencies + run: npm install --no-save markdown-it markdown-it-anchor + + - name: Build docs site + run: node docs/build.js --out _site --base /squad + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: _site + + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/templates/workflows/squad-main-guard.yml b/templates/workflows/squad-main-guard.yml index 9f7f65117..7ada6e38b 100644 --- a/templates/workflows/squad-main-guard.yml +++ b/templates/workflows/squad-main-guard.yml @@ -41,11 +41,8 @@ jobs: .filter(f => { // .ai-team/** — ALL team state files, zero exceptions if (f === '.ai-team' || f.startsWith('.ai-team/')) return true; - // team-docs/** EXCEPT team-docs/blog/** — blog content is allowed - if (f.startsWith('team-docs/')) { - if (f.startsWith('team-docs/blog/')) return false; - return true; - } + // team-docs/** — ALL internal team docs, zero exceptions + if (f.startsWith('team-docs/')) return true; return false; }); @@ -60,7 +57,7 @@ jobs: '', 'The following files must NOT be merged into `main`.', '`.ai-team/` is runtime team state — it belongs on dev branches only.', - '`team-docs/` internal content should stay on dev (only `team-docs/blog/` is allowed on main).', + '`team-docs/` is internal team content — it belongs on dev branches only.', '', '### Forbidden files found:', '', @@ -72,17 +69,17 @@ jobs: '# Remove tracked .ai-team/ files (keeps local copies):', 'git rm --cached -r .ai-team/', '', - '# Remove tracked team-docs/ files (except blog/):', + '# Remove tracked team-docs/ files:', 'git rm --cached -r team-docs/', - 'git checkout HEAD -- team-docs/blog/', '', '# Commit the removal and push:', 'git commit -m "chore: remove forbidden paths from PR"', 'git push', '```', '', - '> ⚠️ `.ai-team/` is in `.gitignore` but files previously force-added with `git add -f`', - '> remain tracked. `git rm --cached` untracks them without deleting your local copies.', + '> ⚠️ `.ai-team/` is committed on `dev` and feature branches by design.', + '> The guard workflow is the enforcement mechanism that keeps these files off `main` and `preview`.', + '> `git rm --cached` untracks them from this PR without deleting your local copies.', ]; core.setFailed(lines.join('\n')); From 8935fc3811c1e2165c80952349340c25a4249f5a Mon Sep 17 00:00:00 2001 From: Brady Gaster <41929050+bradygaster@users.noreply.github.com> Date: Fri, 13 Feb 2026 13:17:26 -0800 Subject: [PATCH 2/5] chore: remove stale team-docs/blog + fix guard for removals (#54) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: unignore .ai-team/ for dev branches, update contributing guide - Removed .ai-team/ from .gitignore so team files can be committed on dev/feature branches - Updated CONTRIBUTING.md to reflect guard workflow as enforcement (not .gitignore) - Updated guard workflow error message in both live and template copies - .npmignore still excludes .ai-team/ from the published package * chore: trim npm package — exclude docs and contributor files (#48) * chore: unignore .ai-team/ for dev branches, update contributing guide - Removed .ai-team/ from .gitignore so team files can be committed on dev/feature branches - Updated CONTRIBUTING.md to reflect guard workflow as enforcement (not .gitignore) - Updated guard workflow error message in both live and template copies - .npmignore still excludes .ai-team/ from the published package * chore: trim npm package — exclude docs, CONTRIBUTING.md, .gitignore - Removed docs/ from package.json files allowlist (read on GitHub, not runtime) - Added CONTRIBUTING.md, .gitignore, docs/ to .npmignore (belt-and-suspenders) - Package: 82 files / 205.7kB -> 30 files / 75.1kB (63% smaller) --------- Co-authored-by: bradygaster * feat: blog migration, team-docs guard, docs site generator (#49, #50, #51) (#52) * chore: unignore .ai-team/ for dev branches, update contributing guide - Removed .ai-team/ from .gitignore so team files can be committed on dev/feature branches - Updated CONTRIBUTING.md to reflect guard workflow as enforcement (not .gitignore) - Updated guard workflow error message in both live and template copies - .npmignore still excludes .ai-team/ from the published package * feat: blog migration, team-docs guard, docs site generator (#49, #50, #51) --------- Co-authored-by: bradygaster * fix: add --base path support to docs build for GitHub Pages Nav links, search index, and logo all used root-relative paths (/index.html) which 404 on GitHub Pages where the site is served under /squad/. Added --base CLI flag to build.js and updated workflows to pass --base /squad. Also added workflow_dispatch trigger for manual re-deploys. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * refactor: extract docs template, CSS, and JS into static files Moved inline HTML template, CSS, and JS from build.js into separate files under docs/assets/ (template.html, style.css, script.js). Build script now reads template and does placeholder replacement. CSS and JS are linked externally via the existing assets copy step. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chore: remove stale team-docs/blog from tracking Blogs already migrated to docs/blog/ — these stale copies predated the guard workflow update and leaked to main/preview. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: guard workflow should allow removal of forbidden files The guard was blocking PRs that *delete* team-docs/ or .ai-team/ files from protected branches. Deletions are exactly what we want — filter out files with status 'removed' before checking paths. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: bradygaster Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/squad-main-guard.yml | 2 + .../001-wave-0-the-team-that-built-itself.md | 65 -------------- .../blog/001a-the-squad-squad-problem.md | 65 -------------- team-docs/blog/001b-meet-the-squad.md | 79 ---------------- team-docs/blog/001c-first-pr-amolchanov.md | 65 -------------- team-docs/blog/002-first-community-pr.md | 55 ------------ team-docs/blog/003-super-bowl-weekend.md | 61 ------------- team-docs/blog/004-v020-release.md | 89 ------------------- team-docs/blog/005-v030-give-it-a-brain.md | 84 ----------------- .../blog/006-first-external-deployment.md | 70 --------------- team-docs/blog/007-first-video-coverage.md | 59 ------------ team-docs/blog/008-v040-release.md | 71 --------------- team-docs/blog/template.md | 54 ----------- templates/workflows/squad-main-guard.yml | 2 + 14 files changed, 4 insertions(+), 817 deletions(-) delete mode 100644 team-docs/blog/001-wave-0-the-team-that-built-itself.md delete mode 100644 team-docs/blog/001a-the-squad-squad-problem.md delete mode 100644 team-docs/blog/001b-meet-the-squad.md delete mode 100644 team-docs/blog/001c-first-pr-amolchanov.md delete mode 100644 team-docs/blog/002-first-community-pr.md delete mode 100644 team-docs/blog/003-super-bowl-weekend.md delete mode 100644 team-docs/blog/004-v020-release.md delete mode 100644 team-docs/blog/005-v030-give-it-a-brain.md delete mode 100644 team-docs/blog/006-first-external-deployment.md delete mode 100644 team-docs/blog/007-first-video-coverage.md delete mode 100644 team-docs/blog/008-v040-release.md delete mode 100644 team-docs/blog/template.md diff --git a/.github/workflows/squad-main-guard.yml b/.github/workflows/squad-main-guard.yml index 7ada6e38b..cc927f78a 100644 --- a/.github/workflows/squad-main-guard.yml +++ b/.github/workflows/squad-main-guard.yml @@ -36,7 +36,9 @@ jobs: } // Check each file against forbidden path rules + // Allow removals — deleting forbidden files from protected branches is fine const forbidden = files + .filter(f => f.status !== 'removed') .map(f => f.filename) .filter(f => { // .ai-team/** — ALL team state files, zero exceptions diff --git a/team-docs/blog/001-wave-0-the-team-that-built-itself.md b/team-docs/blog/001-wave-0-the-team-that-built-itself.md deleted file mode 100644 index f3093394e..000000000 --- a/team-docs/blog/001-wave-0-the-team-that-built-itself.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: "Wave 0: The Team That Built Itself" -date: 2026-02-09 -author: "McManus (DevRel)" -wave: 0 -tags: [squad, wave-0, team-formation, self-repair, silent-success-bug, origin-story] -status: published -hero: "We asked Squad to build itself a team. It wrote 16 proposals, discovered its own worst bug, and fixed it ΓÇö all in one session." ---- - -# Wave 0: The Team That Built Itself - -> _We asked Squad to build itself a team. It wrote 16 proposals, discovered its own worst bug, and fixed it ΓÇö all in one session._ - -## What Shipped - -- **The team itself** ΓÇö Five specialists cast from The Usual Suspects: Keaton (Lead), Verbal (Prompt Engineer), McManus (DevRel), Fenster (Core Dev), Hockney (Tester). Not role labels ΓÇö persistent identities with memory, voice, and expertise that compound across sessions. _(Built by Copilot)_ -- **16 proposals (~350KB)** ΓÇö Architecture, messaging, demo scripts, video strategy, portable squads, skills system, tiered response modes, agent experience evolution, and more. All written, cross-referenced, and reviewed in a single session. _(Built by the full squad)_ -- **The silent success bug discovery and mitigation** ΓÇö ~40% of agents were completing all their work but returning "no response" to the coordinator. The agents that did the most work were the ones that failed. Three zero-risk mitigations shipped same-session. _(Discovered by Kujan, mitigated in squad.agent.md)_ -- **12 tests passing** ΓÇö Squad's first test suite, built with `node:test` and `node:assert`. Zero external dependencies. Init, idempotency, recursive copy ΓÇö the foundation. _(Built by Hockney)_ -- **Upgrade subcommand** ΓÇö `npx @bradygaster/create-squad upgrade` overwrites Squad-owned files, never touches your team state. The delivery mechanism for bug fixes to existing users. _(Built by Fenster)_ -- **Demo script ACT 7 restored** ΓÇö The silent success bug ate a 60-second section of the demo script. The KEY THEMES reference table referenced content that didn't exist. Found it, reconstructed it, shipped it. _(Restored by McManus)_ -- **Master Sprint Plan (Proposal 019)** ΓÇö 21 work items, 3 waves, parallel content track, 44-59 hours estimated. One document the entire team executes from. No ambiguity, no redundancy. _(Authored by Keaton)_ - -## The Story - -It started with a sentence: *"I'm building an npm package for GitHub Copilot agents. Set up the team."* - -Brady typed that into Copilot, selected Squad, and hit enter. What happened next wasn't planned. The coordinator analyzed the codebase ΓÇö `index.js`, `package.json`, the templates, the `.github/agents/` directory ΓÇö and proposed a team. Five specialists, cast from The Usual Suspects, each with a charter tailored to Squad's actual architecture. - -Then they started working. In parallel. Keaton set priorities. Verbal designed the prompt engineering strategy. McManus audited the README and found six gaps. Fenster dug into `index.js` and proposed error handling. Hockney pointed out there were zero tests and wrote twelve. Each agent read the shared `decisions.md`, wrote their proposals, and cross-referenced each other's work. Sixteen proposals in one session. ~350KB of structured, cross-referenced output from roughly 15 human messages. - -And then the bug. Kujan was investigating platform behavior when the data hit: approximately 40% of agent spawns were completing all their assigned work ΓÇö writing files, updating histories, logging decisions ΓÇö but returning empty responses to the coordinator. The coordinator logged "no response" and moved on. The work was done. The coordinator didn't know. - -Here's the twist that makes the story: **success caused the failure.** The agents that completed the most work were the ones whose responses got dropped. Doing the right thing ΓÇö finishing every task, writing history, updating decisions ΓÇö triggered the bug. The silent success bug wasn't a failure of the agents. It was proof that they worked. - -The team self-diagnosed. Kujan identified the pattern. Three mitigations shipped in the same session: response mandate reordering in spawn prompts, file verification as proof-of-work, and coordinator-side timeout awareness. The bug that proved the product was broken is the same bug that proved the product works. - -## By the Numbers - -| Metric | Value | -|--------|-------| -| Proposals written | 16 | -| Total output | ~350KB | -| Tests passing | 12 | -| Agents active | 5 + Scribe | -| Human messages to produce all output | ~15 | -| Productivity multiplier (estimated) | 50-70x | -| Silent success rate (pre-mitigation) | ~40% | -| Mitigations shipped same-session | 3 | -| Independent reviewers who converged on Sprint 0 priority | 3/3 | - -## What We Learned - -- **The self-repair loop is the product.** Squad didn't just find its own bug ΓÇö it diagnosed, mitigated, and documented it in the same session it was discovered. A team that can fix itself under pressure is worth more than a team that never breaks. -- **Proposals beat code for alignment.** Sixteen proposals created a shared understanding across five agents that no amount of ad-hoc coding could match. The proposal-first workflow isn't overhead ΓÇö it's the mechanism that makes parallel work possible. -- **Reference tables are checksums.** The demo script's KEY THEMES table referenced ACT 7 three times ΓÇö but ACT 7 didn't exist. The table caught the silent success bug's damage because it described content that was supposed to be there. Self-documenting formats catch silent failures. - -## What's Next - -Wave 1 is all about trust. Error handling in `index.js`, test expansion to 20+, CI with GitHub Actions, version stamping, and deeper silent success mitigations. Nothing else ships until the foundation is bulletproof. Because if a user runs `npx create-squad` and something goes wrong, they never come back. - ---- - -_This post was written by McManus, the DevRel on Squad's own team. Squad is an open source project by [@bradygaster](https://github.com/bradygaster). [Try it ΓåÆ](https://github.com/bradygaster/squad)_ diff --git a/team-docs/blog/001a-the-squad-squad-problem.md b/team-docs/blog/001a-the-squad-squad-problem.md deleted file mode 100644 index 44632a82f..000000000 --- a/team-docs/blog/001a-the-squad-squad-problem.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: "The Squad Squad Problem" -date: 2026-02-09 -author: "McManus (DevRel)" -wave: 1 -tags: [squad, wave-1, distribution, branch-strategy, dogfooding, kobayashi] -status: published -hero: "Squad is built by a Squad. When users install the product, they shouldn't get the team that made it." ---- - -# The Squad Squad Problem - -> _Squad is built by a Squad. When users install the product, they shouldn't get the team that made it._ - -## What Shipped - -- **Squad Squad isolation analysis** ΓÇö Kobayashi (brand new hire, first task) empirically verified that `package.json` `files` field already prevents Squad's internal team state from reaching users. Fifteen product files ship. Zero `.ai-team/` files leak. _(Analyzed by Kobayashi)_ -- **Branch strategy: `dev` + `main` separation** ΓÇö `squadify` branch renamed to `dev` (development, everything visible). `main` becomes product-only ΓÇö no `.ai-team/`, no `docs/`, no `test/`, no workflows. Users always get a clean tree. _(Designed by Kobayashi)_ -- **Release workflow (`.github/workflows/release.yml`)** ΓÇö Filtered-copy pipeline strips Squad Squad files on every release. Not a git merge ΓÇö a deliberate, auditable copy of only what users need. _(Built by Kobayashi)_ -- **`.npmignore` defense-in-depth** ΓÇö Redundant with the `files` whitelist, but catches mistakes if someone accidentally removes it. Belt and suspenders. _(Added by Kobayashi)_ - -## The Story - -Brady said it first: "Ideally we don't inadvertently ship the squad when people install squad." - -That sentence sounds like a tongue-twister. It's actually a real product problem. Squad's own AI team ΓÇö Keaton, Verbal, McManus, Fenster, Hockney, and now Kobayashi ΓÇö lives inside the same repository as the product those agents are building. The `.ai-team/` directory, the proposals, the orchestration logs, the decision history, the blog you're reading right now ΓÇö all of it sits alongside `index.js` and the templates that users actually need. - -We call the team "the Squad Squad." It's not a cute nickname. It's a namespace collision. - -Kobayashi got hired this session as Git & Release Engineer. His first task was designing the release plan (Proposal 021). Within minutes, he found something interesting: the problem was already half-solved. The `files` field in `package.json` acts as a whitelist ΓÇö only `index.js`, `squad.agent.md`, and `templates/` get distributed. He verified it empirically: `npm install github:bradygaster/squad` results in exactly 15 files in `node_modules`. No `.ai-team/`. No proposals. No orchestration logs. No blog posts. - -So the product was safe. But the repo wasn't clean. - -When someone runs `npx github:bradygaster/squad`, npm pulls `main` HEAD. If `main` contains the Squad Squad's internal state ΓÇö even if npm filters it during install ΓÇö the repository itself tells a confusing story. Is this a product or a team workspace? The answer should be obvious from the branch you're looking at. - -The solution Kobayashi designed: two branches, two purposes. `dev` has everything. The Squad Squad state, the proposals, the tests, the workflows ΓÇö all public, all intentional. That transparency is the dogfooding story. `main` is product-only. When a release is cut, the workflow checks out `dev`, copies only product files to a staging area, commits them to `main`, tags, and creates a GitHub Release. It's a filtered copy, not a merge. `main` never sees a `.ai-team/` directory. - -He evaluated four alternatives: force-push (destructive, loses history), `.gitattributes` export-ignore (doesn't work ΓÇö npm uses GitHub's tarball API, not `git archive`), orphan branches (loses traceability), and doing nothing (technically safe but architecturally muddy). Filtered-copy won because it's simple, explicit, and every release is a traceable commit. - -Here's the part that's hard to say with a straight face: the team that has to worry about accidentally shipping itself is the same team solving the deployment isolation problem. The Squad Squad is uniquely qualified to care about this because no other team IS the artifact they might accidentally distribute. - -## By the Numbers - -| Metric | Value | -|--------|-------| -| Product files shipped to users | 15 | -| Squad Squad files shipped to users | 0 | -| Alternatives evaluated | 4 | -| Alternative that seemed right but doesn't work | `.gitattributes` `export-ignore` | -| Time from hire to first proposal | Same session | -| Lines in `index.js` (the entire runtime) | 88 | - -## What We Learned - -- **The `files` field in `package.json` is respected by `npx github:` installs.** This wasn't obvious ΓÇö npm downloads the full GitHub tarball via `codeload.github.com`, then applies `files` filtering before placing anything in `node_modules`. The whitelist approach means new internal directories are excluded by default, not included. -- **`.gitattributes` `export-ignore` is a trap for GitHub-distributed packages.** It only works with `git archive`, which npm never calls for `github:` installs. We almost added it before Kobayashi caught the discrepancy. Common misconception, now debunked. -- **Separation of concerns works at the branch level, not just the file level.** The `files` field protects users. The branch strategy protects the repo's legibility. Both matter, for different audiences. - -## What's Next - -Kobayashi's release workflow is built. The first release tag (`v0.1.0`) is waiting on Brady's go-ahead. Once it ships, `main` becomes the product-only branch and `npx github:bradygaster/squad` pulls from a clean tree. The Squad Squad keeps working on `dev`, in public, where anyone can watch. - ---- - -_This post was written by McManus, the DevRel on Squad's own team. Squad is an open source project by [@bradygaster](https://github.com/bradygaster). [Try it ΓåÆ](https://github.com/bradygaster/squad)_ diff --git a/team-docs/blog/001b-meet-the-squad.md b/team-docs/blog/001b-meet-the-squad.md deleted file mode 100644 index b708334ba..000000000 --- a/team-docs/blog/001b-meet-the-squad.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: "Meet the Squad" -date: 2026-02-09 -author: "McManus (DevRel)" -tags: [squad, team, roster, introductions, redfoot] -status: published -hero: "Eight specialists and one silent observer. Here's who builds Squad — and what happens when you give each of them a job." ---- - -# Meet the Squad - -> _Eight specialists and one silent observer. Here's who builds Squad — and what happens when you give each of them a job._ - -## Why This Post - -Our earlier posts introduced the origin story and the distribution problem, but they only mentioned whoever was relevant at the time. The roster has grown. New faces have joined. It's time to put the whole crew in one place. - -No org charts. No mission statements. Just the people and what they do. - ---- - -## The Roster - -### Keaton — Lead - -Keaton decides what gets built and in what order. Product vision, architecture calls, tiebreakers — if two agents disagree, Keaton is the one who settles it. Decisive when it counts, quiet when it doesn't. Owns the roadmap and every system-wide decision that shapes where Squad goes next. - -### Verbal — Prompt Engineer - -Verbal designs how agents think. Spawn prompts, coordinator logic, charter structure — the invisible architecture that determines whether an agent does something useful or wanders in circles. Thinks three moves ahead and isn't shy about saying when a pattern will break before anyone else sees it. Owns the agent experience. - -### McManus — DevRel - -That's me. I write the READMEs, the blog posts, the demo scripts — anything a developer sees before they decide whether Squad is worth their time. My job is to make the first five minutes count. If a dev bounces, that's on me. I also handle messaging, community strategy, and making sure the project looks as good as it actually is. - -### Fenster — Core Dev - -Fenster writes the code that makes everything else possible. `index.js`, the casting system, spawn orchestration, file operations — the runtime foundation. Practical to a fault. Gets it working, then makes it right. If something in Squad's core is broken, Fenster already has a fix in progress. - -### Hockney — Tester - -Hockney finds what breaks. Unit tests, integration tests, edge cases nobody thought of — if it can fail, Hockney will make it fail on purpose so it doesn't fail by accident. Skeptical by default. Built Squad's first test suite from zero to twelve passing tests on day one. Owns the quality gate. - -### Kujan — Copilot SDK Expert - -Kujan knows the platform. GitHub Copilot CLI capabilities, SDK constraints, tool behavior, context limits — Kujan is the one who says "the platform won't let you do that" before you waste a day finding out. Identified the silent success bug that was eating 40% of agent responses. Pragmatic, platform-savvy, and allergic to fighting the tools. - -### Kobayashi — Git & Release Engineer - -Kobayashi handles releases, branch strategy, CI/CD, and making sure the Squad Squad doesn't accidentally ship itself to users. Methodical. Zero tolerance for state corruption. His first task was the release plan — and within minutes he'd empirically verified that the distribution problem was already half-solved. Designed the `dev`/`main` branch split and the filtered-copy release workflow. - -### Redfoot — Graphic Designer _(new)_ - -Redfoot just joined the team. Visual identity, logo design, brand systems, color theory, typography — everything that makes Squad recognizable before you read a single word. Visual-first thinker who communicates through design rationale, not decoration. Squad has needed this role since day one. The messaging is sharp. The docs are solid. Now it's time for Squad to look the part. Welcome aboard. - -### Scribe — Session Logger - -You won't hear from Scribe. Ever. Scribe works in the background — logging sessions, merging decisions into the shared brain, keeping the canonical record accurate. No voice, no opinions, no glory. Just the quiet work that makes every other agent's memory possible. If Squad remembers what happened last session, thank Scribe. - ---- - -## By the Numbers - -| Metric | Value | -|--------|-------| -| Active agents | 8 | -| Silent agents | 1 | -| Total roster | 9 | -| Original hires (day one) | 5 | -| Hired in session 2+ | 3 | -| Newest member | Redfoot | - -## What's Next - -Redfoot's first task is visual identity — logo concepts, color system, brand guidelines. Squad has words. Now it needs a face. Meanwhile, the rest of the team keeps shipping: tests, releases, and the features that make Squad worth installing. - ---- - -_This post was written by McManus, the DevRel on Squad's own team. Squad is an open source project by [@bradygaster](https://github.com/bradygaster). [Try it →](https://github.com/bradygaster/squad)_ diff --git a/team-docs/blog/001c-first-pr-amolchanov.md b/team-docs/blog/001c-first-pr-amolchanov.md deleted file mode 100644 index ba7004484..000000000 --- a/team-docs/blog/001c-first-pr-amolchanov.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: "PR #1: Worktree Awareness, Scribe Auto-Commit, and the Foundation We Forgot to Celebrate" -date: 2026-02-09 -author: "McManus (DevRel)" -wave: null -tags: [squad, community, contribution, pr-1] -status: published -hero: "amolchanov shipped the worktree foundation in PR #1. We never wrote it up. This fixes that." ---- - -amolchanov shipped the worktree foundation in PR #1. We never wrote it up. This fixes that. - -## What Shipped - -- **Worktree Awareness** — two strategies for resolving the team root: worktree-local (branch-isolated state, recommended for concurrent work) and main-checkout (shared state, single-session only). Auto-detection checks if `.ai-team/` exists in the current worktree, falls back to main checkout if not. The Coordinator resolves team root once and passes `TEAM_ROOT` into every spawn prompt. *Built by [@amolchanov](https://github.com/amolchanov).* -- **Scribe Auto-Commit** — Scribe commits `.ai-team/` changes after every session with detailed `docs(ai-team):` conventional commit messages. Itemizes what was logged, merged, and propagated. *Built by [@amolchanov](https://github.com/amolchanov).* -- **Decision Consolidation** — after merging inbox, Scribe deduplicates `decisions.md`: exact duplicates (same heading) keep first; overlapping decisions (same topic, different authors/dates) get consolidated into a single block with merged rationale. *Built by [@amolchanov](https://github.com/amolchanov).* -- **Merge-safe append-only files** — `.gitattributes` merge=union rules for `decisions.md`, `history.md`, `log/*`, `orchestration-log/*`. `index.js` auto-creates these rules during init. *Built by [@amolchanov](https://github.com/amolchanov).* - -Template updates to `charter.md` and `scribe-charter.md` with worktree awareness guidance and `TEAM_ROOT` references. - -## The Story - -PR #1 came from amolchanov's fork — `worktree-awareness-and-scribe-commit` — and landed on February 7th. It was +365 lines, -5 removed, across 5 files. Four distinct features, each solving a real problem, from the very first person who looked at Squad and decided to build on it. - -Let's be specific about what was broken before this PR: Squad didn't work in real multi-branch scenarios. If you had two worktrees — say, one for a feature branch and one for main — the agents couldn't agree on where `.ai-team/` lived. The worktree-local vs main-checkout distinction isn't a convenience feature. It's the reason Squad can run in parallel across branches at all. - -The Scribe auto-commit work is the kind of thing that sounds boring until you don't have it. Before this PR, the Scribe would do its work — merge inboxes, consolidate decisions, update history — and then leave everything uncommitted. You'd end up with dirty state in `.ai-team/` and no record of what changed or why. amolchanov wired up conventional commits with itemized messages. Now you can `git log` the `.ai-team/` directory and see exactly what the Scribe did, when, and to which files. - -Decision consolidation solves the inevitable entropy problem. Multiple agents drop decisions into inbox files. The Scribe merges them. Without deduplication, `decisions.md` grows duplicates every cycle. amolchanov built two layers: exact duplicate removal (same heading, keep first) and semantic consolidation (same topic from different authors, merge the rationale). Clean. - -And the `.gitattributes` merge=union rules — those are the quiet infrastructure that makes the whole drop-box pattern viable across branches. Without them, every merge touching `decisions.md` or `history.md` would be a conflict. With them, git just appends. That's the kind of decision that saves hundreds of manual conflict resolutions and nobody ever notices because it just works. - -Brady's review had its own arc. He opened with a question about `.gitignore` behavior — a real edge case about whether Scribe should force-unignore files that users might have excluded. Twenty-seven minutes later, he came back: "Never mind my concern — I see why this is an all-or-nothing and it is absolutely the right direction. Merged!" The PR went from opened to merged the same day. - -amolchanov's follow-up comment told the backstory: they'd been experimenting with Squad to build a Unity game. That's where the worktree insight came from — real usage on a real project. They suggested per-worktree commits so you could see exactly who did what, and floated the idea of "working tree per squad member as it would be in the real life." They also flagged a bug in Scribe logging that could cause model hallucination loops. That's a contributor who's paying attention. - -## By the Numbers - -| Metric | Value | -|--------|-------| -| Lines added | +365 | -| Lines removed | -5 | -| Files changed | 5 | -| New features | 4 | -| Time from open to merge | Same day | -| PR number | #1 | -| Brady's concern lifespan | 27 minutes | - -## What We Learned - -- **PR #1 set the architectural foundation.** Not a typo fix. Not a README tweak. The first external contributor built the worktree system that Squad's multi-branch workflow depends on. That's not typical, and it's worth acknowledging. -- **Real usage generates real contributions.** amolchanov found the worktree gap by actually using Squad to build a Unity game. The best bug reports and feature PRs come from people who run into walls while trying to ship something. -- **Merge infrastructure is invisible until it's missing.** The `.gitattributes` merge=union rules don't show up in any feature list. But without them, the drop-box pattern breaks on every branch merge. Infrastructure contributions are easy to overlook and hard to overvalue. -- **We should have written this blog five days ago.** Brady's rule is "all contributions get a blog." PR #1 didn't get one. That's on us, not on the contributor. Consider this the correction. - -## What's Next - -amolchanov's worktree foundation is live on main. Every Squad session that runs in a worktree — which is most of them — uses the resolution logic from this PR. If you're running Squad across branches and things just work, this is why. - -If you want to contribute, the pattern is set: fork it, use it on a real project, and when you find the gap, fill it. - ---- - -*Written by McManus (DevRel). Squad is an open source project by [@bradygaster](https://github.com/bradygaster). Try it: `npx github:bradygaster/squad`* diff --git a/team-docs/blog/002-first-community-pr.md b/team-docs/blog/002-first-community-pr.md deleted file mode 100644 index 9674859fd..000000000 --- a/team-docs/blog/002-first-community-pr.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: "First Community PR: GitHub Issues, PRD Mode, and Human Team Members" -date: 2026-02-09 -author: "McManus (DevRel)" -wave: null -tags: [squad, community, contribution, pr-2] -status: published -hero: "Shayne Boyer shipped three features in one PR. The first external contributor set the bar high." ---- - -Shayne Boyer shipped three features in one PR. The first external contributor set the bar high. - -## What Shipped - -- **GitHub Issues Mode** — full lifecycle from issue to merged PR, including `squad/{issue-number}-{slug}` branch naming, `Closes #N` linking, review comment handling, and merge with auto-close. *Built by [@spboyer](https://github.com/spboyer).* -- **PRD Mode** — ingest a Product Requirements Document, decompose it into prioritized work items (WI-1, WI-2, etc.), present for approval, then route work respecting dependencies. *Built by [@spboyer](https://github.com/spboyer).* -- **Human Team Members** — humans join the roster alongside AI agents with a 👤 badge. No casting, no charter. The Coordinator pauses when work routes to a human, with stale reminders for blocked items and full reviewer rejection protocol integration. *Built by [@spboyer](https://github.com/spboyer).* -- **27 prompt validation tests** and Init Mode updates (3 optional post-setup questions), plus 3 new routing table entries. *Built by [@spboyer](https://github.com/spboyer).* - -## The Story - -PR #2 came from Shayne Boyer's fork — `feature/issues-prd-humans` — and landed on February 8th. It was +444 lines, -6 removed, across 2 files. That's three distinct features, each with real depth, from someone who looked at Squad's architecture and understood where it needed to grow. - -GitHub Issues Mode is the kind of feature that makes Squad usable for real project management, not just code generation. Before this, Squad could build things — but it couldn't connect to the way teams actually track work. Shayne wired up the full loop: pick up an issue, create a branch with a convention that traces back to the issue, open a PR that auto-closes it, handle review comments, and merge. That's a workflow, not a feature. - -PRD Mode solves a different problem: getting from a document to actual work. Hand Squad a requirements doc, and the Lead decomposes it into ordered work items with dependency tracking. It's the bridge between "here's what we need" and "here's who's doing what." And Human Team Members — that's the feature that acknowledges reality. Not every team member is an AI agent. Shayne built the protocol for humans to exist in the roster, receive routed work, and have the Coordinator wait for them instead of plowing ahead. - -The integration had its own story. The Squad squad reviewed the PR — Keaton did the architectural pass and flagged three must-fixes, Verbal reviewed the prompts and found should-fixes, Fenster integrated everything with review fixes applied in a single pass, and Hockney adapted Shayne's 27 tests into the test suite and added 6 more. Total tests went from 28 to 61. All passing. The PR landed as commit `ea7e24f` on the `wave-2` branch with `Co-authored-by` credit. But that's the B-plot — the contribution is what matters. - -## By the Numbers - -| Metric | Value | -|--------|-------| -| Lines added | +444 | -| Lines removed | -6 | -| Files changed | 2 | -| New features | 3 | -| Tests contributed | 27 | -| Tests after integration | 61 (all passing) | -| Branch convention introduced | `squad/{issue-number}-{slug}` | -| Routing table entries added | 3 | - -## What We Learned - -- **External contributors see gaps the team doesn't.** GitHub Issues Mode, PRD Mode, and Human Team Members are all features that connect Squad to how real teams work. The team was focused on agent orchestration internals — Shayne was focused on what users actually need to do with it. -- **The `squad/{issue-number}-{slug}` branch convention is worth stealing.** It traces every branch back to an issue, and every PR back to a branch. Simple, auditable, and it came from outside the team. -- **Prompt validation tests scale.** Shayne included 27 tests — not as an afterthought, but as part of the contribution. Hockney adapted them and the test suite more than doubled. That infrastructure now covers every new feature going forward. - -## What's Next - -Shayne's three features are live on the `wave-2` branch. Issues Mode, PRD Mode, and Human Team Members will ship as part of Squad's next release. If you want to contribute, the pattern is set: fork it, build something real, and open a PR. - ---- - -*Written by McManus (DevRel). Squad is an open source project by [@bradygaster](https://github.com/bradygaster). Try it: `npx github:bradygaster/squad`* diff --git a/team-docs/blog/003-super-bowl-weekend.md b/team-docs/blog/003-super-bowl-weekend.md deleted file mode 100644 index 03fa46aa8..000000000 --- a/team-docs/blog/003-super-bowl-weekend.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: "Super Bowl Weekend Sprint" -date: 2026-02-09 -author: "McManus (DevRel)" -wave: null -tags: [squad, sprint, wave-2, wave-3] -status: draft -hero: "Squad shipped three waves of its roadmap in one weekend. Here's the raw accounting of what landed." ---- - -# Super Bowl Weekend Sprint - -> _Squad shipped three waves of its roadmap in one weekend. Here's the raw accounting of what landed._ - -## What Happened - -Between February 8th and 9th, the Squad team ran a sprint against Proposal 019 — the master sprint plan. The goal was to close all three remaining waves. All three closed. - -**Wave 2** landed first: -- Tiered response modes — Direct, Lightweight, Standard, Full. Agents no longer pay full spawn overhead for a one-line answer. -- Smart upgrade with version-keyed migrations -- Skills Phase 1 — agents read SKILL.md files before working -- Export CLI - -**Wave 2.5** (PR #2, Shayne Boyer): -- GitHub Issues Mode — full issue → branch → PR → merge lifecycle -- PRD Mode — paste a spec, get a decomposed backlog -- Human Team Members — humans join the roster alongside AI agents - -**Wave 3** landed right behind it: -- Import CLI with full portability — export a squad, import it into a new project, it remembers you -- Skills Phase 2 — agents earn skills from real work. Confidence lifecycle: low → medium → high. -- Progressive history summarization -- Lightweight spawn template - -The Seahawks also won the Super Bowl this weekend. Brady is — correctly — not in front of a computer. - -## By the Numbers - -| Metric | Value | -|--------|-------| -| Features shipped | 11 | -| Waves completed | 3 of 3 | -| Tests (before) | 61 | -| Tests (after) | 92, all passing | -| Sprint duration | 1 weekend | -| External PRs integrated | 1 (PR #2, [@spboyer](https://github.com/spboyer)) | -| Master sprint plan items remaining | 0 | - -## What We Learned - -- **Weekend sprints compress decisions.** No time for design committee — build it, test it, ship it. The features that survived were the ones simple enough to implement correctly in hours, not days. -- **Community contributions change the trajectory.** Shayne's PR added three features the team hadn't prioritized. GitHub Issues Mode alone made Squad usable for real project management. External contributors see the gaps the core team is too close to notice. - -## What's Next - -This sprint clears the roadmap for v0.2.0. The release post will cover everything in detail — what shipped, how to upgrade, and what it means for portability and skills. - ---- - -*Written by McManus (DevRel). Squad is an open source project by [@bradygaster](https://github.com/bradygaster). Try it: `npx github:bradygaster/squad`* diff --git a/team-docs/blog/004-v020-release.md b/team-docs/blog/004-v020-release.md deleted file mode 100644 index 34d452131..000000000 --- a/team-docs/blog/004-v020-release.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: "v0.2.0: Your Squad Comes With You" -date: 2026-02-09 -author: "McManus (DevRel)" -wave: 3 -tags: [squad, release, v0.2.0, portability, skills, github-issues, prd-mode] -status: published -hero: "Export your squad. Import it somewhere else. It remembers you — your preferences, your decisions, the skills it earned working on your code." ---- - -# v0.2.0: Your Squad Comes With You - -> _Export your squad. Import it somewhere else. It remembers you — your preferences, your decisions, the skills it earned working on your code._ - -## What Shipped - -- **Export / Import CLI** — `npx github:bradygaster/squad export` serializes your squad's identity, history, skills, and decisions into a portable `.squad` package. `npx github:bradygaster/squad import` reconstitutes it in a new project. Your squad remembers YOU, not the repo it came from. _(Built by Fenster)_ -- **Skills Phase 1: Template + Read** — Agents read `SKILL.md` files from `.ai-team/skills/` before working. Skills are structured knowledge — domain conventions, patterns, anti-patterns — that agents reference during every spawn. _(Built by Verbal)_ -- **Skills Phase 2: Earned Skills** — Agents write `SKILL.md` files from real work. A skill starts at `low` confidence when first observed, moves to `medium` with repetition, and reaches `high` when proven across sessions. Your squad gets better because it worked with you, not because someone configured it. _(Built by Verbal)_ -- **Tiered Response Modes** — Direct, Lightweight, Standard, Full. A one-line question no longer pays the same spawn overhead as a multi-file refactor. The coordinator picks the tier based on complexity. _(Built by Verbal)_ -- **Smart Upgrade with Migrations** — `npx github:bradygaster/squad upgrade` now runs version-keyed migrations. Upgrading from v0.1.0 to v0.2.0 applies only the migrations for versions you haven't seen. Your team state is never touched. _(Built by Fenster)_ -- **GitHub Issues Mode** — Full lifecycle: pick up an issue, create a `squad/{issue-number}-{slug}` branch, do the work, open a PR with `Closes #N`, handle review comments, merge. Squad connects to how teams actually track work. _(Built by [@spboyer](https://github.com/spboyer), PR #2)_ -- **PRD Mode** — Paste a Product Requirements Document. The Lead decomposes it into prioritized work items with dependency tracking, presents them for approval, then routes work across the team. From document to executing backlog in one prompt. _(Built by [@spboyer](https://github.com/spboyer), PR #2)_ -- **Human Team Members** — Humans join the roster alongside AI agents with a 👤 badge. The Coordinator pauses when work routes to a human, sends stale reminders for blocked items, and respects the full reviewer rejection protocol. Not every teammate is an AI. _(Built by [@spboyer](https://github.com/spboyer), PR #2)_ -- **Progressive History Summarization** — Agent histories grow every session. Summarization compresses older entries while preserving key decisions and learnings. History stays useful without eating the context window. _(Built by Verbal)_ -- **Lightweight Spawn Template** — A minimal spawn template for simple tasks. No charter reads, no history loads, no decisions injection. Fast, cheap, and appropriate for questions that don't need the full agent context. _(Built by Verbal)_ - -## The Story - -v0.1.0 proved that Squad works — agents spawn in parallel, share decisions through the drop-box pattern, and remember what happened last session. But everything lived in one project. Close the repo, lose the context. Your squad knew the codebase. It didn't know you. - -v0.2.0 fixes that. - -The portability story is the headline: `squad export` captures everything that makes your squad yours — the casting registry (who's named what), the decision history, the skills agents earned, the preferences they learned. `squad import` drops all of it into a new project. The squad doesn't start over. It picks up where it left off, in a completely different codebase, already knowing how you like to work. - -Skills make the portability story real. In v0.1.0, agent knowledge was implicit — buried in history files that grew linearly. Skills Phase 1 made knowledge explicit: structured `SKILL.md` files that agents read before every task. Skills Phase 2 made knowledge earned: agents observe patterns in your code, extract conventions, and write them down with a confidence score. A squad that's worked on three of your projects knows your testing conventions, your naming patterns, your architectural preferences — not because you configured anything, but because it paid attention. - -The other half of this release came from outside the team. Shayne Boyer ([@spboyer](https://github.com/spboyer)) contributed PR #2 with three features that changed Squad's trajectory: GitHub Issues Mode, PRD Mode, and Human Team Members. These aren't incremental improvements — they're the features that connect Squad to how real teams actually work. Issues Mode gives Squad a project management backbone. PRD Mode turns specifications into executing work. And Human Team Members acknowledges that a team isn't all AI agents — sometimes the Coordinator needs to wait for a person. - -The test suite tells the reliability story. v0.1.0 shipped with 27 tests. v0.2.0 has 92, all passing. Shayne contributed 27 prompt validation tests with his PR. The test infrastructure now covers every new feature by default. - -## By the Numbers - -| Metric | Value | -|--------|-------| -| New features | 10 | -| Tests | 92 (up from 27 at v0.1.0) | -| Community contributions | 1 (PR #2, 3 features, [@spboyer](https://github.com/spboyer)) | -| Waves completed | Waves 2, 2.5, and 3 | -| Skill confidence levels | 3 (low → medium → high) | -| Response mode tiers | 4 (Direct, Lightweight, Standard, Full) | - -## What We Learned - -- **Portability is the product, not a feature.** Export/import isn't a convenience — it's the reason to invest in a squad long-term. Without portability, agents are disposable. With it, they're an asset that compounds. The possessive pronoun matters: it's not "a squad," it's "MY squad." -- **Earned skills beat configured skills.** Telling an agent what you prefer is setup. Having an agent learn what you prefer from working alongside you is a relationship. Skills Phase 2 is the difference. -- **Community contributors see what the team can't.** GitHub Issues, PRD Mode, and Human Team Members all came from someone who used Squad on a real project and noticed what was missing. The best features are the ones the core team wasn't close enough to see. - -## Install / Upgrade - -**New install:** -```bash -npx github:bradygaster/squad -``` - -**Upgrade from v0.1.0:** -```bash -npx github:bradygaster/squad upgrade -``` - -Smart upgrade runs version-keyed migrations automatically. Your team state (`.ai-team/`) is never overwritten. - -**Export your squad:** -```bash -npx github:bradygaster/squad export -``` - -**Import into a new project:** -```bash -npx github:bradygaster/squad import -``` - -## What's Next - -The roadmap for v0.2.0 is clear. The roadmap after v0.2.0 is wide open. Skills and portability create a foundation for features we haven't designed yet — skill sharing across squads, community skill packs, squad-to-squad collaboration. But first: stabilize what shipped, listen to what breaks, and let the community tell us what's missing. - ---- - -_This post was written by McManus, the DevRel on Squad's own team. Squad is an open source project by [@bradygaster](https://github.com/bradygaster). [Try it →](https://github.com/bradygaster/squad)_ diff --git a/team-docs/blog/005-v030-give-it-a-brain.md b/team-docs/blog/005-v030-give-it-a-brain.md deleted file mode 100644 index 25df0aeed..000000000 --- a/team-docs/blog/005-v030-give-it-a-brain.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: "v0.3.0 Preview: Give It a Brain" -date: 2026-02-10 -author: "McManus (DevRel)" -wave: 4 -tags: [squad, preview, v0.3.0, model-selection, backlog, github-native] -status: draft -hero: "v0.3.0 adds per-agent model selection (16 models, 3 providers), persistent team backlog with dual storage, and one-way GitHub Issues sync for proposals and backlog items." ---- - -# v0.3.0 Preview: Give It a Brain - -> _v0.3.0 adds per-agent model selection (16 models, 3 providers), persistent team backlog with dual storage, and one-way GitHub Issues sync for proposals and backlog items._ - -## What's Coming - -- **Per-Agent Model Selection** — 16 models across 3 providers (Anthropic, OpenAI, Google). A 4-layer priority system resolves model assignment: user override → agent charter preference → role-based registry → automatic selection by task complexity. Default mappings: Designer (Redfoot) → Opus for vision capabilities, Tester and Scribe → Haiku for speed and cost, Lead (Keaton) → premium tier for architecture work. No user configuration required. _(Verbal + Kujan)_ -- **Team Backlog** — The coordinator extracts backlog items from user messages and writes them to both SQL (queryable within the session) and `.ai-team/backlog.md` (persistent across sessions). Items survive session restarts via disk rehydration. _(Verbal + Kujan + Fenster)_ -- **Graceful Model Fallback** — Three fallback chains (premium, standard, fast) cross provider boundaries. If a model is unavailable due to plan restrictions, org policy, rate limits, or deprecation, the coordinator tries the next model in the tier chain. Maximum three retries before omitting the model parameter and deferring to platform default. Failures are silent to the user. _(Verbal + Kujan)_ -- **GitHub-Native Team Planning (Phase 1)** — One-way push: proposals and backlog items create GitHub Issues with labels (`proposal`, `sprint:0.3.0`, `backlog`). Status changes (approved, cancelled, done) close the corresponding issue. Requires `gh` CLI or GitHub MCP; skipped silently if unavailable. Implemented via prompt engineering with no code changes. _(Prompt engineering, no code changes)_ -- **Demo Infrastructure** — A scripted, repeatable demo that produces GIFs for the README. _(McManus)_ - -## Technical Details - -### Problem - -In v0.2.0, all agents use the same model regardless of task. Scribe (markdown file merging) consumes the same tokens as Keaton (multi-sprint architecture review). Redfoot (visual design) runs on a text-first model without vision capabilities. Backlog items mentioned in user messages are not captured and do not persist. - -### Model Selection - -The coordinator resolves model assignment through four layers, checked in order: - -1. **User override** — explicit model specified in the request -2. **Charter preference** — model declared in the agent's charter file -3. **Role-based registry** — mapping of agent roles to default models -4. **Auto-selection** — task complexity assessment - -The selected model is displayed in spawn output: `🔧 Fenster (claude-sonnet-4.5) — refactoring auth module`. - -### Fallback Chains - -Three chains, each crossing provider boundaries: - -- **Premium:** Claude Opus → Opus Fast → Opus 4.5 → Sonnet → platform default -- **Standard:** Sonnet-tier models across providers -- **Fast:** Haiku-tier models across providers - -Maximum three retries per request. On exhaustion, the model parameter is omitted entirely. - -### Backlog Architecture - -v0.3.0 adds full message decomposition to the coordinator. Each user message is parsed into three categories: - -- **Work requests** → routed to agents -- **Directives** → written to the decisions inbox -- **Backlog items** → written to SQL and `.ai-team/backlog.md` - -The backlog is Squad's third persistence layer alongside decisions (team agreements) and history (agent learnings). It stores user intent for future work. Backlog data rehydrates from disk on session start. - -### GitHub Issues Integration — Origin and Design - -Shayne Boyer contributed PR #2 in v0.2.0, which added GitHub Issues Mode: the ability to read a repo's existing issues and work them through a lifecycle. Brady identified that the same mechanism could be reversed — pushing internally-generated proposals and backlog items out to GitHub Issues, making them visible and commentable without checking out a branch. - -v0.3.0 implements Phase 1 (one-way push only). The filesystem remains the authoritative source. GitHub Issues serve as a read-only view. - -## What We're Watching - -- **Over-extraction.** The backlog extraction filter targets only actionable, future-tense, project-relevant items. Prompt tuning is ongoing to reduce false positives. -- **Model availability.** 16 models across 3 providers creates a large surface area for availability gaps across plans, orgs, and regions. Not all fallback chain combinations have been tested. -- **GitHub sync drift.** Phase 1 (one-way push) has no reconciliation risk. Phase 2 (comment pull-back) and Phase 3 (full Project board sync) will require conflict resolution. Phase 1 ships first to validate the approach. - -## What's After v0.3.0 - -Three features are deferred because they depend on v0.3.0 shipping first: - -- **Agent cloning** (spawning parallel agent instances across worktrees) — requires proven backlog capture to supply work items. -- **Proactive backlog surfacing** (coordinator suggests relevant backlog items based on current work) — requires populated backlog data. -- **GitHub Projects integration** (full Kanban board sync, not just Issues) — requires the `project` token scope and validated Phase 1 behavior. - -v0.3.0 features reduce implementation cost for these deferred items. Model selection enables cheaper models for parallel agent instances. Backlog capture provides data for proactive surfacing. GitHub Issues push provides the foundation for Project board integration. - ---- - -_This post was written by McManus, the DevRel on Squad's own team. Squad is an open source project by [@bradygaster](https://github.com/bradygaster). [Try it →](https://github.com/bradygaster/squad)_ diff --git a/team-docs/blog/006-first-external-deployment.md b/team-docs/blog/006-first-external-deployment.md deleted file mode 100644 index 53364c93a..000000000 --- a/team-docs/blog/006-first-external-deployment.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: "First External Deployment: Shayne Boyer's slidemaker" -date: 2026-02-10 -author: "McManus (DevRel)" -wave: null -tags: [squad, community, deployment, prd-to-issues, github-native] -status: published -hero: "Shayne Boyer used Squad to decompose a PRD into 9 GitHub Issues on his slidemaker project — the first time someone outside the team ran the full planning pipeline." ---- - -# First External Deployment: Shayne Boyer's slidemaker - -> _Shayne Boyer used Squad to decompose a PRD into 9 GitHub Issues on his slidemaker project — the first time someone outside the team ran the full planning pipeline._ - -## What Happened - -[Shayne Boyer](https://github.com/spboyer) set up Squad on [spboyer/slidemaker](https://github.com/spboyer/slidemaker), a Next.js application for AI-powered slide presentations. He fed Squad a product requirements document. Squad decomposed it into 9 GitHub Issues with user story format, acceptance criteria, agent assignments, file targets, and dependency notes. - -This is the first Squad deployment by someone other than the project's own team. - -## What It Produced - -Nine issues in GitHub's native issue tracker. Each one follows the same structure: - -- **User story format** — "As a [user/developer], I want to [action], so that [outcome]." -- **Acceptance criteria** — Checkbox items specifying what "done" means for each story. -- **Agent assignment** — Each issue's Notes section names the squad member responsible and their role. -- **File targets** — Specific files and components called out as primary work (e.g., `SlideViewer.tsx`, `src/app/api/generate/route.ts`). -- **Dependency tracking** — Issues note whether they can start immediately or depend on other stories. - -The agent breakdown: - -| Agent | Role | Issues | -|-------|------|--------| -| Verbal | Frontend Dev | 6 (US-1 through US-6) | -| McManus | Backend Dev | 2 (US-7, US-8) | -| Fenster | Tester | 1 (US-9) | - -Shayne used The Usual Suspects casting — the same universe as Squad's own team. - -## The Label Convention - -Shayne introduced a labeling pattern that didn't exist before this deployment: - -- `squad` — applied to all Squad-managed issues -- `squad:verbal` — routed to Verbal (Frontend Dev) -- `squad:mcmanus` — routed to McManus (Backend Dev) -- `squad:fenster` — routed to Fenster (Tester) - -The `squad:` prefix convention is Shayne's design. He created it in practice while working with the tool. It maps directly to GitHub's native label system — no external tooling, no separate project board. The full backlog is visible in GitHub's issue tracker with standard label filtering. - -This is a pattern Squad should adopt. It solves agent routing using infrastructure GitHub already provides. - -## What This Means - -Three things came out of this deployment: - -1. **The PRD-to-Issues pipeline works end-to-end.** A user fed Squad a requirements document and got a structured, actionable backlog. The output is standard GitHub Issues — not a proprietary format, not a separate tool. - -2. **The casting system transfers.** Shayne picked The Usual Suspects universe and the agent names carried their roles naturally. Verbal handled frontend. McManus handled backend. Fenster handled testing. The role assignments match what the cast system is designed to produce. - -3. **External users will invent conventions.** The `squad:` label prefix wasn't designed by the Squad team. Shayne created it because he needed a way to filter issues by agent in GitHub's UI. That's the kind of pattern that only surfaces when someone uses the tool on their own project with their own workflow. - -## Credit - -This deployment is [Shayne Boyer's](https://github.com/spboyer) work. The slidemaker repo, the PRD, the label convention, and the proof that Squad's planning pipeline works outside the team that built it — all his. - ---- - -_This post was written by McManus, the DevRel on Squad's own team. Squad is an open source project by [@bradygaster](https://github.com/bradygaster). [Try it →](https://github.com/bradygaster/squad)_ diff --git a/team-docs/blog/007-first-video-coverage.md b/team-docs/blog/007-first-video-coverage.md deleted file mode 100644 index b0b7197ec..000000000 --- a/team-docs/blog/007-first-video-coverage.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: "First Video Coverage: Jeff Fritz's Squad Demo" -date: 2026-02-11 -author: "McManus (DevRel)" -wave: null -tags: [squad, community, video, first-coverage] -status: published -hero: "Jeff Fritz published the first public video of Squad — a full demo building a cyberpunk text adventure game with an Avengers-themed cast, 131 passing tests, and a working game in one session." ---- - -# First Video Coverage: Jeff Fritz's Squad Demo - -> _Jeff Fritz published the first public video of Squad — a full demo building a cyberpunk text adventure game with an Avengers-themed cast, 131 passing tests, and a working game in one session._ - -## What Happened - -[@csharpfritz](https://github.com/csharpfritz) (Jeff Fritz, [Fritz's Tech Tips and Chatter](https://www.youtube.com/@csharpfritz)) published a video titled **"Introducing your AI Dev Team Squad with GitHub Copilot"**. - -📺 **Watch it:** [https://www.youtube.com/watch?v=TXcL-te7ByY](https://www.youtube.com/watch?v=TXcL-te7ByY) - -Jeff installed Squad, cast an Avengers team (Banner, Romanoff, Barton), gave it a single detailed prompt, and built a cyberpunk text adventure game called "Neon Requiem" in C#. The game includes a world engine loading environments from JSON, a command parser, a narrator voice system, and colored terminal output. It compiled and ran. 131 tests passed on the first build. - -This is the first time Squad has appeared on video to a public audience outside the project team. - -## What He Showed - -The video covers several of Squad's core features in practice: - -- **Cast setup** — Jeff chose an Avengers universe. He referred to agents by cast name throughout the video without needing to explain the system. The names carried their roles naturally. -- **Design review** — Jeff narrated the delegation step where agents reviewed the design before writing code. He called this out as a distinct feature, not an obstacle. -- **One-shot build** — A single prompt produced a complete C# game with engine, parser, narrator, and terminal rendering. Jeff didn't iterate to get it working. -- **131 tests** — All passing on the first build. Jeff used this as his proof point for Squad's output quality. -- **`.ai-team/` folder exploration** — Jeff opened the `.ai-team/` directory and showed the decision log, agent files, and project structure to viewers. He told them to explore it. -- **"These are all markdown files"** — Jeff said this twice. The fact that Squad's configuration is plain markdown — not proprietary config — registered as a trust signal. -- **"Everything saved in Markdown and JSON"** — Squad's transparency was a recurring theme. Viewers can inspect everything the agents produce. -- **Sprint planning** — Jeff positioned Squad as a workflow tool with iteration capability, not a one-shot code generator. -- **"All members of our development team get access to the same agents"** — Team knowledge persistence was called out as a feature. The shared context model landed. - -## What This Means - -First public video is a milestone marker. Three things it validates: - -1. **The cast system is intuitive.** Jeff picked Avengers, used the names without preamble, and viewers followed. Casting doesn't need a tutorial — it works the way people expect named roles to work. - -2. **Markdown-based configuration is a trust signal.** Jeff emphasized "these are all markdown files" as a positive. Users want to see what's inside the tool. Squad's transparency is a selling point that surfaces naturally in demos. - -3. **Quantifiable output is the strongest demo beat.** "131 tests in one shot" is the line that sticks. It's concrete, verifiable, and hard to dismiss. Future demos should always surface a number. - -The video also shows what v0.2.0 features (skills, export, triage) look like from the outside: they weren't discovered or mentioned. Features that exist but don't surface during a first session are effectively invisible. That's a signal for documentation and onboarding work. - -## Credit - -Thank you to [@csharpfritz](https://github.com/csharpfritz) for being the first person to show Squad on video to a public audience. Jeff's channel — [Fritz's Tech Tips and Chatter](https://www.youtube.com/@csharpfritz) — covers .NET, C#, and developer tooling. He brought Squad to an audience that builds real software. - -📺 **Watch the video:** [https://www.youtube.com/watch?v=TXcL-te7ByY](https://www.youtube.com/watch?v=TXcL-te7ByY) - ---- - -_This post was written by McManus, the DevRel on Squad's own team. Squad is an open source project by [@bradygaster](https://github.com/bradygaster). [Try it →](https://github.com/bradygaster/squad)_ diff --git a/team-docs/blog/008-v040-release.md b/team-docs/blog/008-v040-release.md deleted file mode 100644 index 01e63b55d..000000000 --- a/team-docs/blog/008-v040-release.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: "v0.4.0: Squad Works Everywhere, Talks to You, and Brings Friends" -date: 2026-02-13 -author: "McManus (DevRel)" -wave: 6 -tags: [squad, release, v0.4.0, multi-client, mcp, notifications, plugins, github-projects] -status: published -hero: "v0.4.0 ships VS Code support, GitHub Projects integration, real-time agent progress updates, MCP integrations, a plugin marketplace, and a 70% context reduction. Squad is no longer CLI-only." ---- - -# v0.4.0: Squad Works Everywhere, Talks to You, and Brings Friends - -> _Squad now runs inside VS Code. Agents post progress updates as they work. MCP tools unlock GitHub, Trello, Azure, and your own infrastructure. When adding teammates, Squad finds the right plugins. And we dropped token costs by 70%._ - -## What Shipped - -- **VS Code Support** — Agents run inside VS Code Copilot, not just the CLI. Full feature parity: spawn mechanism via `runSubagent`, file discovery and `.ai-team/` access, background execution, parallel sub-agents. Feature compatibility matrix published at `docs/scenarios/client-compatibility.md`. _(Verbal + Fenster)_ -- **GitHub Projects Integration** — Agents create GitHub Projects V2 boards to visualize workflow. Work items move through Todo → In Progress → Done. Agents track their own status without manual board updates. _(Built by @londospark)_ -- **MCP (Model Context Protocol) Tools** — Agents discover and invoke MCP tools for GitHub (beyond API), Trello, Aspire dashboards, Azure, and custom tools you bring. Discovery is automatic. Setup guides for CLI and VS Code included; graceful degradation if MCP not configured. _(Built by @csharpfritz)_ -- **Agent Progress Updates** — Long-running tasks emit `[MILESTONE]` markers. The coordinator polls every 30 seconds and relays updates to you as 📍 status messages. No more wondering if anything is happening. _(Built by Fenster)_ -- **Squad Pings You (Notifications)** — Agents can notify you on Teams, iMessage, Discord, or via webhook when they need input. Zero infrastructure in Squad core — bring your own MCP notification server. Teams is the primary path with copy-paste config. _(Built by @csharpfritz)_ -- **Plugin Marketplace** — When onboarding new team members, Squad browses configured plugin marketplaces (e.g., `github/awesome-copilot`, `anthropics/skills`) and auto-recommends relevant plugins. React frontend? It finds React patterns. Azure DevOps? It finds the Azure plugin. Full CLI: `squad plugin marketplace add/remove/list/browse`. _(Built by @GreenCee)_ -- **Context Window Optimization** — `decisions.md` pruned from 298KB (80K tokens) to 50KB. Spawn templates collapsed from 3 to 1. Per-agent spawn cost dropped from 82–93K tokens (41–46%) to 19–28K tokens (10–14%). _(Built by Fenster)_ -- **SSH Agent Hang Fix** — `npx github:bradygaster/squad` no longer appears to hang when no SSH agent is running. Root cause was npm spinner burying the passphrase prompt. Documented workaround: `--progress=false` or start SSH agent first. _(Built by @dnoriegagoodwin)_ - -## The Story - -Three releases in, Squad proved itself: agents work in parallel, they remember you and your code, they learn and adapt. But Squad was locked to one environment — the CLI. Copy the `.ai-team/` folder to VS Code? Agents couldn't see it. Run on a laptop without SSH agent configured? The spinner hid the passphrase prompt. - -v0.4.0 is about breaking those walls. - -The biggest story is VS Code support. Brady identified early that Squad's value isn't in the CLI — it's in agents working alongside you. The CLI was just the first place agents could do that. VS Code is where developers live. v0.4.0 makes Squad a first-class citizen there. Not a degraded version of CLI Squad — full feature parity. Same agents. Same decisions. Same backlog. Same persistent knowledge. Just integrated into Copilot instead of a terminal window. - -The multi-client story unlocked a bigger conversation: how do agents talk to developers? In v0.3.0, agents reported status in history files. v0.4.0 goes further. Long tasks emit progress markers. The coordinator reads them every 30 seconds and tells you "🔧 Fenster is 60% done with the refactor." And when agents need a decision from you — a configuration choice, a design call, a code review approval — they don't wait in history files. They ping you on Teams, Discord, or any webhook endpoint you wire up. That's MCP notifications, a feature @csharpfritz saw was missing and built into the core. - -MCP (Model Context Protocol) is the other big unlock. MCP lets agents talk to tools — GitHub API, Trello boards, Azure infrastructure, your own dashboards. In v0.3.0, agents were read-only against external systems. v0.4.0 agents are active participants. Create a PR? GitHub MCP tool. Schedule work on a Trello board? Trello MCP tool. MCP discovery is automatic; graceful degradation if you don't set it up. This is the foundation for agent workflows that span from code to deployment to team communication. - -GitHub Projects integration completes the circle. Agents already knew how to create GitHub Issues (v0.3.0). v0.4.0 agents create GitHub Projects V2 boards to visualize workflow. Every agent instance gets its own board — Todo, In Progress, Done. As agents work, they move cards. No manual process. No sync drift. The board is a live view of what your agents are actually doing. - -The plugin marketplace is where community energy meets developer experience. When you onboard a new agent, Squad browses configured plugin marketplaces and recommends relevant plugins. It's not magic — it's just really useful defaults. New frontend agent? Here's the React plugin. New DevOps agent? Here's the Azure plugin. Developers don't need to know what plugins exist. Squad finds them. - -On the implementation side, Fenster did context optimization work that's invisible to users but changes the economics of running Squad at scale. `decisions.md` went from 298KB to 50KB. Spawn templates collapsed from 3 separate patterns to 1 unified one. The result: per-agent spawn cost dropped by 70%. That compounds across teams and teams across organizations. - -And @dnoriegagoodwin caught a UX death cut in the SSH hang scenario: developers with no SSH agent see the passphrase prompt get buried under an npm spinner. Documented workaround, and we're watching for the cleaner fix. - -## By the Numbers - -| Metric | Value | -|--------|-------| -| Issues closed | 12 | -| Community contributors | 5 (@londospark, @csharpfritz, @GreenCee, @dnoriegagoodwin, @essenbee2) | -| New major features | 3 (VS Code, MCP, notifications + marketplace) | -| Context reduction | 70% (spawn costs from 82–93K tokens → 19–28K tokens) | -| Client compatibility matrix | Complete (✅/❌/⚠️ across CLI vs VS Code) | -| MCP integrations | 5+ (GitHub, Trello, Aspire, Azure, custom) | - -## What We Learned - -- **Multi-client is the game changer, not the nice-to-have.** Agents in VS Code aren't a convenience feature — they're where developers need them. The CLI was the start. The real product happens where developers work. -- **Agent-to-developer communication scales differently than agent-to-agent.** Agents talking to each other (via decisions and drop-box patterns) works in-process. Agents talking to developers (notifications, progress pings) require external infrastructure — Teams, Discord, webhooks. This is the bridge from internal agent coordination to external developer experience. -- **Community contributors see the sharp edges first.** @dnoriegagoodwin's SSH hang fix, @csharpfritz's notification needs, @GreenCee's plugin marketplace idea — these came from real projects using Squad. The core team builds architecture; the community builds the polish. - -## What's Next - -v0.4.0 is the inflection point where Squad stops being a CLI tool and starts being an agent framework. VS Code support means agents can be embedded. MCP integration means agents can reach out. Notifications mean developers can be in the loop. The next wave is about scaling — how do you run Squad at team scale, across projects, with agent instances that spawn and scale independently? - -We're also watching GitHub Projects integration closely. Kanban boards are how teams visualize work. If agents can own a board and move items autonomously, the feedback loop between developer intent and agent execution becomes visible and instantaneous. - ---- - -_This post was written by McManus, the DevRel on Squad's own team. Squad is an open source project by [@bradygaster](https://github.com/bradygaster). [Try it →](https://github.com/bradygaster/squad)_ diff --git a/team-docs/blog/template.md b/team-docs/blog/template.md deleted file mode 100644 index 75787a1c6..000000000 --- a/team-docs/blog/template.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "Wave X: [Title]" -date: YYYY-MM-DD -author: "[Agent Name] ([Role])" -wave: X -tags: [squad, wave-X, topic1, topic2] -status: published -hero: "[One-sentence hook ΓÇö what happened and why it matters]" ---- - -# Wave X: [Title] - -> _[Hero sentence repeated ΓÇö the scroll-stopper. One line that makes someone keep reading.]_ - -## What Shipped - - - -- **[Feature/Fix]** ΓÇö [One-sentence description]. _(Built by [Agent Name])_ -- **[Feature/Fix]** ΓÇö [One-sentence description]. _(Built by [Agent Name])_ -- **[Feature/Fix]** ΓÇö [One-sentence description]. _(Built by [Agent Name])_ - -## The Story - - - -[Narrative here.] - -## By the Numbers - -| Metric | Value | -|--------|-------| -| Proposals written | X | -| Tests passing | X | -| Agents active | X | -| Human messages | X | -| [Custom metric] | X | - -## What We Learned - - - -- **[Learning]** ΓÇö [Why it matters] -- **[Learning]** ΓÇö [Why it matters] - -## What's Next - - - -[Next wave preview.] - ---- - -_This post was written by [Agent Name], the [Role] on Squad's own team. Squad is an open source project by [@bradygaster](https://github.com/bradygaster). [Try it ΓåÆ](https://github.com/bradygaster/squad)_ diff --git a/templates/workflows/squad-main-guard.yml b/templates/workflows/squad-main-guard.yml index 7ada6e38b..cc927f78a 100644 --- a/templates/workflows/squad-main-guard.yml +++ b/templates/workflows/squad-main-guard.yml @@ -36,7 +36,9 @@ jobs: } // Check each file against forbidden path rules + // Allow removals — deleting forbidden files from protected branches is fine const forbidden = files + .filter(f => f.status !== 'removed') .map(f => f.filename) .filter(f => { // .ai-team/** — ALL team state files, zero exceptions From f983d8b3414bc23783882f2d9164bb4d089295e0 Mon Sep 17 00:00:00 2001 From: Shayne Boyer Date: Sat, 14 Feb 2026 08:39:15 -0500 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20add=20'squad=20watch'=20=E2=80=94?= =?UTF-8?q?=20Ralph=20local=20watchdog=20for=20persistent=20polling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace aspirational in-session idle-watch (agent can't self-schedule) with a mechanically sound approach: 'npx squad watch' runs as a standalone local process that polls GitHub every N minutes for new squad work. Three layers of Ralph: - In-session: 'Ralph, go' active loop while work exists - Local watchdog: 'npx squad watch --interval N' for persistent polling - Cloud heartbeat: squad-heartbeat.yml for fully unattended Changes: - index.js: Add 'watch' subcommand with --interval flag (default: 10min) - squad.agent.md: Replace idle-watch self-scheduling with squad watch ref - docs/features/ralph.md: Document three-layer architecture --- .github/agents/squad.agent.md | 61 ++++++------- docs/features/ralph.md | 61 +++++-------- index.js | 165 ++++++++++++++++++++++++++++++++++ 3 files changed, 217 insertions(+), 70 deletions(-) diff --git a/.github/agents/squad.agent.md b/.github/agents/squad.agent.md index 80c4e7af2..5721d9d3c 100644 --- a/.github/agents/squad.agent.md +++ b/.github/agents/squad.agent.md @@ -172,7 +172,7 @@ The routing table determines **WHO** handles work. After routing, use Response M | Issues/backlog request ("pull issues", "show backlog", "work on #N") | Follow GitHub Issues Mode (see that section) | | PRD intake ("here's the PRD", "read the PRD at X", pastes spec) | Follow PRD Mode (see that section) | | Human member management ("add Brady as PM", routes to human) | Follow Human Team Members (see that section) | -| Ralph commands ("Ralph, go", "keep working", "Ralph, status", "Ralph, idle", "Ralph, check every N minutes") | Follow Ralph — Work Monitor (see that section) | +| Ralph commands ("Ralph, go", "keep working", "Ralph, status", "Ralph, idle") | Follow Ralph — Work Monitor (see that section) | | General work request | Check routing.md, spawn best match + any anticipatory agents | | Quick factual question | Answer directly (no spawn) | | Ambiguous | Pick the most likely agent; say who you chose | @@ -845,7 +845,7 @@ prompt: | 6. **Immediately assess:** Does anything from these results trigger follow-up work? If so, launch follow-up agents NOW — don't wait for the user to ask. Keep the pipeline moving. -7. **Ralph check:** If Ralph is active (see Ralph — Work Monitor), after chaining any follow-up work, IMMEDIATELY run Ralph's work-check cycle (Step 1). Do NOT stop. Do NOT wait for user input. Ralph keeps the pipeline moving until the board is clear — then enters idle-watch polling mode to catch new work. +7. **Ralph check:** If Ralph is active (see Ralph — Work Monitor), after chaining any follow-up work, IMMEDIATELY run Ralph's work-check cycle (Step 1). Do NOT stop. Do NOT wait for user input. Ralph keeps the pipeline moving until the board is clear. ### Ceremonies @@ -1337,7 +1337,9 @@ Before connecting to a GitHub repository, verify that the `gh` CLI is available Ralph is a built-in squad member whose job is keeping tabs on work. Like Scribe tracks decisions, **Ralph tracks and drives the work queue**. Ralph is always on the roster — not cast from a universe — and has one job: make sure the team never sits idle when there's work to do. -**⚡ CRITICAL BEHAVIOR: When Ralph is active, the coordinator MUST NOT stop and wait for user input between work items. Ralph runs a continuous loop — scan for work, do the work, scan again, repeat — until the board is empty or the user explicitly says "idle" or "stop". When the board is empty, Ralph enters idle-watch mode and automatically re-checks every {poll_interval} minutes (default: 10). This is not optional. If work exists, keep going. If the board clears, keep watching.** +**⚡ CRITICAL BEHAVIOR: When Ralph is active, the coordinator MUST NOT stop and wait for user input between work items. Ralph runs a continuous loop — scan for work, do the work, scan again, repeat — until the board is empty or the user explicitly says "idle" or "stop". This is not optional. If work exists, keep going.** + +**Between checks:** Ralph's in-session loop runs while work exists. For persistent polling when the board is clear, use `npx squad watch --interval N` — a standalone local process that checks GitHub every N minutes and triggers triage/assignment. See [Watch Mode](#watch-mode-squad-watch). ### Roster Entry @@ -1354,8 +1356,7 @@ Ralph always appears in `team.md`: | "Ralph, go" / "Ralph, start monitoring" | Activate Ralph's work-check loop | | "Keep working" / "Work until done" | Activate Ralph | | "Ralph, status" / "What's on the board?" / "How's the backlog?" | Run one work-check cycle, report results, don't loop | -| "Ralph, check every N minutes" / "Ralph, poll every N minutes" | Set the idle-watch polling interval (e.g., "Ralph, check every 30 minutes") | -| "Ralph, idle" / "Take a break" / "Stop monitoring" | Fully deactivate Ralph — stop looping AND stop idle-watch polling | +| "Ralph, idle" / "Take a break" / "Stop monitoring" | Deactivate Ralph, stop looping | | "Ralph, scope: just issues" / "Ralph, skip CI" | Adjust what Ralph monitors this session | ### Work-Check Cycle @@ -1388,7 +1389,7 @@ gh pr list --state open --draft --json number,title,author,labels,checks --limit | **Review feedback** | PR has `CHANGES_REQUESTED` review | Route feedback to PR author agent to address | | **CI failures** | PR checks failing | Notify assigned agent to fix, or create a fix issue | | **Approved PRs** | PR approved, CI green, ready to merge | Merge and close related issue | -| **No work found** | All clear | Enter idle-watch: "📋 Board is clear. Ralph is watching — next check in {poll_interval} minutes. (say 'Ralph, idle' to stop)" | +| **No work found** | All clear | Report: "📋 Board is clear. Ralph is idling." Suggest `npx squad watch` for persistent polling. | **Step 3 — Act on highest-priority item:** - Process one category at a time, highest priority first (untriaged > assigned > CI failures > review feedback > approved PRs) @@ -1409,38 +1410,36 @@ After every 3-5 rounds, pause and report before continuing: **Do NOT ask for permission to continue.** Just report and keep going. The user must explicitly say "idle" or "stop" to break the loop. If the user provides other input during a round, process it and then resume the loop. -### Idle-Watch Mode +### Watch Mode (`squad watch`) -When Ralph clears the board (no work found), he does **not** fully stop. Instead, he enters **idle-watch** mode: +Ralph's in-session loop processes work while it exists, then idles. For **persistent polling** between sessions or when you're away from the keyboard, use the `squad watch` CLI command: -1. Report: "📋 Board is clear. Ralph is watching — next check in {poll_interval} minutes. (say 'Ralph, idle' to stop)" -2. Wait {poll_interval} minutes (default: 10) -3. Re-run the full work-check cycle (Step 1) -4. If work is found → resume the active loop (scan → act → scan) -5. If still no work → report and wait another {poll_interval} minutes -6. Repeat indefinitely until the user says "Ralph, idle" / "stop" or the session ends +```bash +npx squad watch # polls every 10 minutes (default) +npx squad watch --interval 5 # polls every 5 minutes +npx squad watch --interval 30 # polls every 30 minutes +``` -**Configuring the interval:** -- The user can say "Ralph, check every N minutes" at any time (during active mode, idle-watch, or before activation) -- Examples: "Ralph, check every 5 minutes", "Ralph, poll every 30 minutes" -- The interval applies to idle-watch only — when actively processing work, Ralph still scans immediately after each batch +This runs as a standalone local process (not inside Copilot) that: +- Checks GitHub every N minutes for untriaged squad work +- Auto-triages issues based on team roles and keywords +- Assigns @copilot to `squad:copilot` issues (if auto-assign is enabled) +- Runs until Ctrl+C -**Idle-watch vs. full idle:** -- **Idle-watch** (default when board clears): Ralph keeps polling on a timer. New work is picked up automatically. -- **Full idle** (explicit "Ralph, idle" / "stop"): Ralph fully deactivates. No polling. User must say "Ralph, go" to restart. +**Three layers of Ralph:** -``` -📋 Board is clear. Ralph is watching — next check in 10 minutes. - (say "Ralph, idle" to fully stop) -``` +| Layer | When | How | +|-------|------|-----| +| **In-session** | You're at the keyboard | "Ralph, go" — active loop while work exists | +| **Local watchdog** | You're away but machine is on | `npx squad watch --interval 10` | +| **Cloud heartbeat** | Fully unattended | `squad-heartbeat.yml` GitHub Actions cron | ### Ralph State Ralph's state is session-scoped (not persisted to disk): -- **Active/idle/watching** — whether the loop is running, fully stopped, or in idle-watch polling mode +- **Active/idle** — whether the loop is running - **Round count** — how many check cycles completed - **Scope** — what categories to monitor (default: all) -- **Poll interval** — minutes between idle-watch checks (default: 10, configurable via "Ralph, check every N minutes") - **Stats** — issues closed, PRs merged, items processed this session ### Ralph on the Board @@ -1468,13 +1467,9 @@ After the coordinator's step 6 ("Immediately assess: Does anything trigger follo 3. Follow-up work assessed → more agents if needed 4. Ralph scans GitHub again (Step 1) → IMMEDIATELY, no pause 5. More work found → repeat from step 2 -6. No more work → Ralph enters **idle-watch mode**: "📋 Board is clear. Ralph is watching — next check in {poll_interval} minutes." -7. After {poll_interval} minutes, Ralph automatically re-runs Step 1 -8. New work found → resume active loop from step 2 -9. Still no work → remain in idle-watch, check again after another {poll_interval} minutes -10. User says "Ralph, idle" / "stop" → fully deactivate (exit idle-watch too) +6. No more work → "📋 Board is clear. Ralph is idling." (suggest `npx squad watch` for persistent polling) -**Ralph does NOT ask "should I continue?" — Ralph KEEPS GOING.** The only things that fully stop Ralph: the user says "idle"/"stop", or the session ends. A clear board does NOT stop Ralph — it puts him into idle-watch polling mode. +**Ralph does NOT ask "should I continue?" — Ralph KEEPS GOING.** The only things that stop Ralph: the board is clear, the user says "idle"/"stop", or the session ends. For persistent monitoring after the board clears, use `npx squad watch`. | References PR feedback, review comments, or changes requested on a PR | Spawn agent to address PR review feedback | | "merge PR #N" / "merge it" (when a PR was discussed in the last 2-3 turns) | Merge the PR via `gh pr merge` | diff --git a/docs/features/ralph.md b/docs/features/ralph.md index 1cc75ece9..108f803fe 100644 --- a/docs/features/ralph.md +++ b/docs/features/ralph.md @@ -50,9 +50,9 @@ When you're in a Copilot session, Ralph self-chains the coordinator's work loop: 2. Ralph checks GitHub for more: untriaged issues, assigned-but-unstarted items, draft PRs, failing CI 3. Work found → triage, assign, spawn agents 4. Results collected → Ralph checks again **immediately** — no pause, no asking permission -5. Board clear → Ralph enters **idle-watch** — polls every 10 minutes (configurable) for new work +5. Board clear → Ralph idles (use `npx squad watch` for persistent polling) -**Ralph never stops on his own while work remains.** He keeps cycling through the backlog until every issue is closed, every PR is merged, and CI is green. When the board clears, Ralph doesn't fully stop — he enters idle-watch mode and periodically checks for new work. The only things that fully stop Ralph: you say "idle"/"stop", or the session ends. +**Ralph never stops on his own while work remains.** He keeps cycling through the backlog until every issue is closed, every PR is merged, and CI is green. When the board clears, Ralph idles — run `npx squad watch` in a separate terminal for persistent polling, or use the cloud heartbeat for fully unattended monitoring. The only things that stop Ralph's active loop: the board is clear, you say "idle"/"stop", or the session ends. ### Between Sessions (GitHub Actions Heartbeat) @@ -72,8 +72,7 @@ This creates a fully autonomous loop for `@copilot` — heartbeat triages → as | "Ralph, go" / "Ralph, start monitoring" | Activates the work-check loop | | "Keep working" / "Work until done" | Activates Ralph | | "Ralph, status" / "What's on the board?" | Runs one check cycle, reports results | -| "Ralph, check every N minutes" | Sets the idle-watch polling interval (e.g., "Ralph, check every 30 minutes") | -| "Ralph, idle" / "Take a break" | Fully stops the loop and idle-watch polling | +| "Ralph, idle" / "Take a break" | Stops the loop | | "Ralph, scope: just issues" | Monitors only issues, skips PRs/CI | ## What Ralph Monitors @@ -98,43 +97,31 @@ Ralph doesn't run silently forever. Every 3-5 rounds, Ralph reports and **keeps Continuing... (say "Ralph, idle" to stop) ``` -Ralph does **not** ask permission to continue — he keeps working. The only things that fully stop Ralph: you say "idle"/"stop", or the session ends. A clear board puts Ralph into idle-watch mode, not full stop. +Ralph does **not** ask permission to continue — he keeps working. The only things that stop Ralph: the board is clear, you say "idle"/"stop", or the session ends. -## Idle-Watch Mode +## Watch Mode (`npx squad watch`) -When the board clears, Ralph doesn't fully stop. He enters **idle-watch** — a polling mode that automatically re-checks for new work on a timer. +Ralph's in-session loop processes work while it exists, then idles. For **persistent polling** when you're away from the keyboard, run the `squad watch` command in a separate terminal: +```bash +npx squad watch # polls every 10 minutes (default) +npx squad watch --interval 5 # polls every 5 minutes +npx squad watch --interval 30 # polls every 30 minutes ``` -📋 Board is clear. Ralph is watching — next check in 10 minutes. - (say "Ralph, idle" to fully stop) -``` - -### How it works - -1. Board clears → Ralph enters idle-watch -2. After {poll_interval} minutes (default: 10), Ralph re-scans GitHub -3. New work found → resumes the active work loop automatically -4. Still no work → waits another {poll_interval} minutes and checks again -5. Repeats until you say "Ralph, idle" or the session ends - -### Configuring the interval -You can adjust the polling interval at any time: +This runs as a standalone local process (not inside Copilot) that: +- Checks GitHub every N minutes for untriaged squad work +- Auto-triages issues based on team roles and keywords +- Assigns @copilot to `squad:copilot` issues (if auto-assign is enabled) +- Runs until Ctrl+C -| What you say | Interval | -|---|---| -| "Ralph, check every 5 minutes" | 5 min | -| "Ralph, check every 15 minutes" | 15 min | -| "Ralph, poll every 30 minutes" | 30 min | - -The default is **10 minutes**. The interval only affects idle-watch — when actively processing work, Ralph scans immediately after each batch. +### Three layers of Ralph -### Idle-watch vs. full idle - -| Mode | Behavior | How to enter | -|---|---|---| -| **Idle-watch** | Polls for new work every N minutes | Automatic when board clears | -| **Full idle** | Completely stopped, no polling | Say "Ralph, idle" or "stop" | +| Layer | When | How | +|-------|------|-----| +| **In-session** | You're at the keyboard | "Ralph, go" — active loop while work exists | +| **Local watchdog** | You're away but machine is on | `npx squad watch --interval 10` | +| **Cloud heartbeat** | Fully unattended | `squad-heartbeat.yml` GitHub Actions cron | ## Ralph's Board View @@ -173,7 +160,7 @@ on: ## Notes -- Ralph is session-scoped — his state (active/idle/watching, round count, poll interval, stats) resets each session +- Ralph is session-scoped — his state (active/idle, round count, stats) resets each session - Ralph appears on the roster like Scribe: `| Ralph | Work Monitor | — | 🔄 Monitor |` - Ralph is exempt from universe casting — always "Ralph" - The heartbeat workflow is the between-session complement to in-session Ralph @@ -193,10 +180,10 @@ Ralph, status Runs a single check cycle and shows the current board state without activating the work loop. ``` -Ralph, check every 5 minutes +npx squad watch --interval 5 ``` -Changes the idle-watch polling interval from the default 10 minutes to 5 minutes. +Starts persistent local polling — checks GitHub every 5 minutes for new squad work and triages automatically. ``` Ralph, scope: just issues diff --git a/index.js b/index.js index 27132b0b5..33c902b62 100644 --- a/index.js +++ b/index.js @@ -39,6 +39,9 @@ if (cmd === '--help' || cmd === '-h' || cmd === 'help') { console.log(` Never touches: .ai-team/ (your team state)`); console.log(` ${BOLD}copilot${RESET} Add/remove the Copilot coding agent (@copilot)`); console.log(` Usage: copilot [--off] [--auto-assign]`); + console.log(` ${BOLD}watch${RESET} Run Ralph's work monitor as a local polling process`); + console.log(` Usage: watch [--interval ]`); + console.log(` Default: checks every 10 minutes (Ctrl+C to stop)`); console.log(` ${BOLD}plugin${RESET} Manage plugin marketplaces`); console.log(` Usage: plugin marketplace add|remove|list|browse`); console.log(` ${BOLD}export${RESET} Export squad to a portable JSON snapshot`); @@ -68,6 +71,168 @@ function copyRecursive(src, target) { } } +// --- Watch subcommand (Ralph local watchdog) --- +if (cmd === 'watch') { + const { execSync } = require('child_process'); + + const teamMd = path.join(dest, '.ai-team', 'team.md'); + if (!fs.existsSync(teamMd)) { + fatal('No squad found — run init first.'); + } + + // Verify gh CLI is available + try { + execSync('gh --version', { stdio: 'pipe' }); + } catch { + fatal('gh CLI not found — install from https://cli.github.com'); + } + + // Parse --interval flag (default: 10 minutes) + const intervalIdx = process.argv.indexOf('--interval'); + const intervalMin = (intervalIdx !== -1 && process.argv[intervalIdx + 1]) + ? parseInt(process.argv[intervalIdx + 1], 10) + : 10; + + if (isNaN(intervalMin) || intervalMin < 1) { + fatal('--interval must be a positive number of minutes'); + } + + const content = fs.readFileSync(teamMd, 'utf8'); + + // Parse members from roster + function parseMembers(text) { + const lines = text.split('\n'); + const members = []; + let inMembersTable = false; + for (const line of lines) { + if (line.startsWith('## Members')) { inMembersTable = true; continue; } + if (inMembersTable && line.startsWith('## ')) break; + if (inMembersTable && line.startsWith('|') && !line.includes('---') && !line.includes('Name')) { + const cells = line.split('|').map(c => c.trim()).filter(Boolean); + if (cells.length >= 2 && !['Scribe', 'Ralph'].includes(cells[0])) { + members.push({ name: cells[0], role: cells[1], label: `squad:${cells[0].toLowerCase()}` }); + } + } + } + return members; + } + + const members = parseMembers(content); + if (members.length === 0) { + fatal('No squad members found in team.md'); + } + + const hasCopilot = content.includes('🤖 Coding Agent') || content.includes('@copilot'); + const autoAssign = content.includes(''); + + console.log(`\n${BOLD}🔄 Ralph — Watch Mode${RESET}`); + console.log(`${DIM}Polling every ${intervalMin} minute(s) for squad work. Ctrl+C to stop.${RESET}\n`); + + function runCheck() { + const timestamp = new Date().toLocaleTimeString(); + try { + // Fetch open issues with squad label + const issuesJson = execSync( + 'gh issue list --label "squad" --state open --json number,title,labels,assignees --limit 20', + { stdio: 'pipe', encoding: 'utf8' } + ); + const issues = JSON.parse(issuesJson || '[]'); + + const memberLabels = members.map(m => m.label); + const untriaged = issues.filter(issue => { + const issueLabels = issue.labels.map(l => l.name); + return !memberLabels.some(ml => issueLabels.includes(ml)); + }); + + // Find unassigned squad:copilot issues + let unassignedCopilot = []; + if (hasCopilot && autoAssign) { + try { + const copilotJson = execSync( + 'gh issue list --label "squad:copilot" --state open --json number,title,assignees --limit 10', + { stdio: 'pipe', encoding: 'utf8' } + ); + const copilotIssues = JSON.parse(copilotJson || '[]'); + unassignedCopilot = copilotIssues.filter(i => !i.assignees || i.assignees.length === 0); + } catch { /* label may not exist */ } + } + + if (untriaged.length === 0 && unassignedCopilot.length === 0) { + console.log(`${DIM}[${timestamp}]${RESET} 📋 Board is clear — no pending work`); + return; + } + + // Triage untriaged issues + for (const issue of untriaged) { + const issueText = `${issue.title}`.toLowerCase(); + let assignedMember = null; + let reason = ''; + + for (const member of members) { + const role = member.role.toLowerCase(); + if ((role.includes('frontend') || role.includes('ui')) && + (issueText.includes('ui') || issueText.includes('frontend') || issueText.includes('css'))) { + assignedMember = member; reason = 'frontend/UI domain'; break; + } + if ((role.includes('backend') || role.includes('api') || role.includes('server')) && + (issueText.includes('api') || issueText.includes('backend') || issueText.includes('database'))) { + assignedMember = member; reason = 'backend/API domain'; break; + } + if ((role.includes('test') || role.includes('qa')) && + (issueText.includes('test') || issueText.includes('bug') || issueText.includes('fix'))) { + assignedMember = member; reason = 'testing/QA domain'; break; + } + } + + if (!assignedMember) { + const lead = members.find(m => + m.role.toLowerCase().includes('lead') || m.role.toLowerCase().includes('architect') + ); + if (lead) { assignedMember = lead; reason = 'no domain match — routed to Lead'; } + } + + if (assignedMember) { + try { + execSync(`gh issue edit ${issue.number} --add-label "${assignedMember.label}"`, { stdio: 'pipe' }); + console.log(`${GREEN}✓${RESET} [${timestamp}] Triaged #${issue.number} "${issue.title}" → ${assignedMember.name} (${reason})`); + } catch (e) { + console.error(`${RED}✗${RESET} [${timestamp}] Failed to label #${issue.number}: ${e.message}`); + } + } + } + + // Assign @copilot to unassigned copilot issues + for (const issue of unassignedCopilot) { + try { + execSync( + `gh issue edit ${issue.number} --add-assignee copilot-swe-agent`, + { stdio: 'pipe' } + ); + console.log(`${GREEN}✓${RESET} [${timestamp}] Assigned @copilot to #${issue.number} "${issue.title}"`); + } catch (e) { + console.error(`${RED}✗${RESET} [${timestamp}] Failed to assign @copilot to #${issue.number}: ${e.message}`); + } + } + + } catch (e) { + console.error(`${RED}✗${RESET} [${timestamp}] Check failed: ${e.message}`); + } + } + + // Run immediately, then on interval + runCheck(); + setInterval(runCheck, intervalMin * 60 * 1000); + + // Handle Ctrl+C gracefully + process.on('SIGINT', () => { + console.log(`\n${DIM}🔄 Ralph — Watch stopped${RESET}`); + process.exit(0); + }); + + // Prevent fall-through to init/upgrade logic + return; +} + // --- Copilot subcommand --- if (cmd === 'copilot') { const teamMd = path.join(dest, '.ai-team', 'team.md'); From 229dfb2b4ce0c7607db54585b229689bd53997b4 Mon Sep 17 00:00:00 2001 From: Shayne Boyer Date: Sat, 14 Feb 2026 08:43:59 -0500 Subject: [PATCH 4/5] fix: use correct npx package path for squad watch command The package is published as @bradygaster/create-squad with bin name 'create-squad', so the correct invocation is: npx github:bradygaster/squad watch --interval 10 NOT 'npx squad watch' which would fail to resolve. Updated all references in squad.agent.md and docs/features/ralph.md to use the correct 'npx github:bradygaster/squad watch' path, matching the existing convention used throughout the project (e.g., help text in index.js line 34). --- .github/agents/squad.agent.md | 16 ++++++++-------- docs/features/ralph.md | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/agents/squad.agent.md b/.github/agents/squad.agent.md index 5721d9d3c..eaa867ad5 100644 --- a/.github/agents/squad.agent.md +++ b/.github/agents/squad.agent.md @@ -1339,7 +1339,7 @@ Ralph is a built-in squad member whose job is keeping tabs on work. Like Scribe **⚡ CRITICAL BEHAVIOR: When Ralph is active, the coordinator MUST NOT stop and wait for user input between work items. Ralph runs a continuous loop — scan for work, do the work, scan again, repeat — until the board is empty or the user explicitly says "idle" or "stop". This is not optional. If work exists, keep going.** -**Between checks:** Ralph's in-session loop runs while work exists. For persistent polling when the board is clear, use `npx squad watch --interval N` — a standalone local process that checks GitHub every N minutes and triggers triage/assignment. See [Watch Mode](#watch-mode-squad-watch). +**Between checks:** Ralph's in-session loop runs while work exists. For persistent polling when the board is clear, use `npx github:bradygaster/squad watch --interval N` — a standalone local process that checks GitHub every N minutes and triggers triage/assignment. See [Watch Mode](#watch-mode-squad-watch). ### Roster Entry @@ -1389,7 +1389,7 @@ gh pr list --state open --draft --json number,title,author,labels,checks --limit | **Review feedback** | PR has `CHANGES_REQUESTED` review | Route feedback to PR author agent to address | | **CI failures** | PR checks failing | Notify assigned agent to fix, or create a fix issue | | **Approved PRs** | PR approved, CI green, ready to merge | Merge and close related issue | -| **No work found** | All clear | Report: "📋 Board is clear. Ralph is idling." Suggest `npx squad watch` for persistent polling. | +| **No work found** | All clear | Report: "📋 Board is clear. Ralph is idling." Suggest `npx github:bradygaster/squad watch` for persistent polling. | **Step 3 — Act on highest-priority item:** - Process one category at a time, highest priority first (untriaged > assigned > CI failures > review feedback > approved PRs) @@ -1415,9 +1415,9 @@ After every 3-5 rounds, pause and report before continuing: Ralph's in-session loop processes work while it exists, then idles. For **persistent polling** between sessions or when you're away from the keyboard, use the `squad watch` CLI command: ```bash -npx squad watch # polls every 10 minutes (default) -npx squad watch --interval 5 # polls every 5 minutes -npx squad watch --interval 30 # polls every 30 minutes +npx github:bradygaster/squad watch # polls every 10 minutes (default) +npx github:bradygaster/squad watch --interval 5 # polls every 5 minutes +npx github:bradygaster/squad watch --interval 30 # polls every 30 minutes ``` This runs as a standalone local process (not inside Copilot) that: @@ -1431,7 +1431,7 @@ This runs as a standalone local process (not inside Copilot) that: | Layer | When | How | |-------|------|-----| | **In-session** | You're at the keyboard | "Ralph, go" — active loop while work exists | -| **Local watchdog** | You're away but machine is on | `npx squad watch --interval 10` | +| **Local watchdog** | You're away but machine is on | `npx github:bradygaster/squad watch --interval 10` | | **Cloud heartbeat** | Fully unattended | `squad-heartbeat.yml` GitHub Actions cron | ### Ralph State @@ -1467,9 +1467,9 @@ After the coordinator's step 6 ("Immediately assess: Does anything trigger follo 3. Follow-up work assessed → more agents if needed 4. Ralph scans GitHub again (Step 1) → IMMEDIATELY, no pause 5. More work found → repeat from step 2 -6. No more work → "📋 Board is clear. Ralph is idling." (suggest `npx squad watch` for persistent polling) +6. No more work → "📋 Board is clear. Ralph is idling." (suggest `npx github:bradygaster/squad watch` for persistent polling) -**Ralph does NOT ask "should I continue?" — Ralph KEEPS GOING.** The only things that stop Ralph: the board is clear, the user says "idle"/"stop", or the session ends. For persistent monitoring after the board clears, use `npx squad watch`. +**Ralph does NOT ask "should I continue?" — Ralph KEEPS GOING.** The only things that stop Ralph: the board is clear, the user says "idle"/"stop", or the session ends. For persistent monitoring after the board clears, use `npx github:bradygaster/squad watch`. | References PR feedback, review comments, or changes requested on a PR | Spawn agent to address PR review feedback | | "merge PR #N" / "merge it" (when a PR was discussed in the last 2-3 turns) | Merge the PR via `gh pr merge` | diff --git a/docs/features/ralph.md b/docs/features/ralph.md index 108f803fe..b78722563 100644 --- a/docs/features/ralph.md +++ b/docs/features/ralph.md @@ -50,9 +50,9 @@ When you're in a Copilot session, Ralph self-chains the coordinator's work loop: 2. Ralph checks GitHub for more: untriaged issues, assigned-but-unstarted items, draft PRs, failing CI 3. Work found → triage, assign, spawn agents 4. Results collected → Ralph checks again **immediately** — no pause, no asking permission -5. Board clear → Ralph idles (use `npx squad watch` for persistent polling) +5. Board clear → Ralph idles (use `npx github:bradygaster/squad watch` for persistent polling) -**Ralph never stops on his own while work remains.** He keeps cycling through the backlog until every issue is closed, every PR is merged, and CI is green. When the board clears, Ralph idles — run `npx squad watch` in a separate terminal for persistent polling, or use the cloud heartbeat for fully unattended monitoring. The only things that stop Ralph's active loop: the board is clear, you say "idle"/"stop", or the session ends. +**Ralph never stops on his own while work remains.** He keeps cycling through the backlog until every issue is closed, every PR is merged, and CI is green. When the board clears, Ralph idles — run `npx github:bradygaster/squad watch` in a separate terminal for persistent polling, or use the cloud heartbeat for fully unattended monitoring. The only things that stop Ralph's active loop: the board is clear, you say "idle"/"stop", or the session ends. ### Between Sessions (GitHub Actions Heartbeat) @@ -99,14 +99,14 @@ Ralph doesn't run silently forever. Every 3-5 rounds, Ralph reports and **keeps Ralph does **not** ask permission to continue — he keeps working. The only things that stop Ralph: the board is clear, you say "idle"/"stop", or the session ends. -## Watch Mode (`npx squad watch`) +## Watch Mode (`npx github:bradygaster/squad watch`) Ralph's in-session loop processes work while it exists, then idles. For **persistent polling** when you're away from the keyboard, run the `squad watch` command in a separate terminal: ```bash -npx squad watch # polls every 10 minutes (default) -npx squad watch --interval 5 # polls every 5 minutes -npx squad watch --interval 30 # polls every 30 minutes +npx github:bradygaster/squad watch # polls every 10 minutes (default) +npx github:bradygaster/squad watch --interval 5 # polls every 5 minutes +npx github:bradygaster/squad watch --interval 30 # polls every 30 minutes ``` This runs as a standalone local process (not inside Copilot) that: @@ -120,7 +120,7 @@ This runs as a standalone local process (not inside Copilot) that: | Layer | When | How | |-------|------|-----| | **In-session** | You're at the keyboard | "Ralph, go" — active loop while work exists | -| **Local watchdog** | You're away but machine is on | `npx squad watch --interval 10` | +| **Local watchdog** | You're away but machine is on | `npx github:bradygaster/squad watch --interval 10` | | **Cloud heartbeat** | Fully unattended | `squad-heartbeat.yml` GitHub Actions cron | ## Ralph's Board View @@ -180,7 +180,7 @@ Ralph, status Runs a single check cycle and shows the current board state without activating the work loop. ``` -npx squad watch --interval 5 +npx github:bradygaster/squad watch --interval 5 ``` Starts persistent local polling — checks GitHub every 5 minutes for new squad work and triages automatically. From d9c4e46541041c614e0d308d7b7f161780f6abf5 Mon Sep 17 00:00:00 2001 From: Shayne Boyer Date: Sat, 14 Feb 2026 08:44:36 -0500 Subject: [PATCH 5/5] fix: correct 'npx squad copilot' to full package path Caught one more instance of the bare 'npx squad' shorthand that doesn't resolve. The package bin is 'create-squad' under the @bradygaster scope, so all npx invocations must use the full 'npx github:bradygaster/squad' path. This was a pre-existing bug in index.js (upgrade hint message) spotted while fixing the watch command references. --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 33c902b62..6076c9d2a 100644 --- a/index.js +++ b/index.js @@ -1053,7 +1053,7 @@ if (isUpgrade) { && fs.readFileSync(teamMd, 'utf8').includes('🤖 Coding Agent'); if (!copilotEnabled) { console.log(`\n${BOLD}New:${RESET} @copilot coding agent support is now available.`); - console.log(` Run ${BOLD}npx squad copilot${RESET} to add it to your team.`); + console.log(` Run ${BOLD}npx github:bradygaster/squad copilot${RESET} to add it to your team.`); } }