fix(skills): install bundled skills to .github/skills/ (closes #1126)#1304
Conversation
🛫 PR Readiness Check
PR Scope: 📦🔧 Mixed (product + infrastructure)
|
| Status | Check | Details |
|---|---|---|
| ❌ | Single commit | 4 commits — consider squashing before review |
| ✅ | Not in draft | Ready for review |
| ✅ | Branch up to date | Up to date with dev |
| ❌ | Copilot review | No Copilot review yet — it may still be processing |
| ✅ | Changeset present | Changeset file found |
| ✅ | Scope clean | |
| ✅ | No merge conflicts | No merge conflicts |
| ❌ | Copilot threads resolved | 2 unresolved Copilot thread(s) — fix and resolve before merging |
| ❌ | CI passing | 7 check(s) still running |
Files Changed (30 files, +345 −88)
| File | +/− |
|---|---|
.changeset/fix-1126-skills-to-github-skills.md |
+68 −0 |
.github/agents/squad.agent.md |
+4 −4 |
.squad-templates/spawn-reference.md |
+1 −1 |
.squad-templates/squad.agent.md |
+4 −4 |
.squad/skills/release-process/SKILL.md |
+2 −2 |
.squad/skills/squad/SKILL.md |
+2 −2 |
packages/squad-cli/README.md |
+5 −5 |
packages/squad-cli/src/cli/commands/build.ts |
+3 −3 |
packages/squad-cli/src/cli/core/templates.ts |
+11 −11 |
packages/squad-cli/src/cli/core/upgrade.ts |
+83 −3 |
packages/squad-cli/templates/skills/release-process/SKILL.md |
+2 −2 |
packages/squad-cli/templates/spawn-reference.md |
+1 −1 |
packages/squad-cli/templates/squad.agent.md.template |
+4 −4 |
packages/squad-sdk/src/config/init.ts |
+13 −3 |
packages/squad-sdk/src/skills/handler-types.ts |
+1 −1 |
packages/squad-sdk/src/tools/index.ts |
+19 −9 |
packages/squad-sdk/templates/skills/release-process/SKILL.md |
+2 −2 |
packages/squad-sdk/templates/spawn-reference.md |
+1 −1 |
packages/squad-sdk/templates/squad.agent.md.template |
+4 −4 |
templates/spawn-reference.md |
+1 −1 |
templates/squad.agent.md.template |
+4 −4 |
test/builtin-skills.test.ts |
+4 −4 |
test/cli/init-upgrade-parity.test.ts |
+1 −1 |
test/cli/init.test.ts |
+2 −2 |
test/cli/upgrade.test.ts |
+63 −4 |
test/human-journeys.test.ts |
+1 −1 |
test/init-sdk.test.ts |
+2 −2 |
test/init.test.ts |
+33 −3 |
test/repl-ux-fixes.test.ts |
+2 −2 |
test/tools.test.ts |
+2 −2 |
Total: +345 −88
This check runs automatically on every push. Fix any ❌ items and push again.
See CONTRIBUTING.md and PR Requirements for details.
🏗️ Architectural Review
Automated architectural review — informational only. |
🟠 Impact Analysis — PR #1304Risk tier: 🟠 HIGH 📊 Summary
🎯 Risk Factors
📦 Modules Affectedci-workflows (1 file)
root (3 files)
squad-cli (7 files)
squad-sdk (6 files)
squad-state (2 files)
templates (2 files)
tests (9 files)
|
|
…ter#1126) # Conflicts: # packages/squad-cli/src/cli/core/templates.ts # packages/squad-sdk/src/config/init.ts
There was a problem hiding this comment.
Pull request overview
This PR updates Squad’s bundled-skill installation and upgrade behavior so project-level skills are written to .github/skills/ (instead of repo-root .copilot/skills/), aligning with Copilot’s documented skill discovery locations and fixing the portability gap described in #1126.
Changes:
- Update init/upgrade/template manifests so bundled skills target
.github/skills/{name}/SKILL.md. - Add upgrade-time migration to move manifest-owned skills from legacy
.copilot/skills/to.github/skills/while preserving user-added legacy skills. - Update tests and docs/templates to reference the canonical
.github/skills/location and revised scan precedence.
Reviewed changes
Copilot reviewed 28 out of 28 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| test/repl-ux-fixes.test.ts | Updates init directory expectations to assert .github/skills/ exists. |
| test/init.test.ts | Adds regression coverage ensuring fresh init creates .github/skills/ and not .copilot/skills/; asserts a bundled skill lands in the canonical path. |
| test/init-sdk.test.ts | Updates --sdk init expectations to .github/skills/. |
| test/human-journeys.test.ts | Updates end-to-end “fresh init” journey assertions to .github/skills/. |
| test/cli/upgrade.test.ts | Adds migration tests for legacy .copilot/skills/ → .github/skills/ and updates other path assertions. |
| test/cli/init.test.ts | Updates CLI init assertions and skill listing path to .github/skills/. |
| test/cli/init-upgrade-parity.test.ts | Updates parity expectations for created infrastructure dirs to include .github/skills/. |
| test/builtin-skills.test.ts | Updates TEMPLATE_MANIFEST destination assertions to .github/skills/. |
| templates/squad.agent.md.template | Updates coordinator routing/docs to reference .github/skills/ and revised scan precedence. |
| templates/spawn-reference.md | Updates skill directory scan order in spawn guidance. |
| packages/squad-sdk/templates/squad.agent.md.template | Mirrors the coordinator template updates for the SDK distribution. |
| packages/squad-sdk/templates/spawn-reference.md | Mirrors spawn-reference scan order changes for the SDK distribution. |
| packages/squad-sdk/templates/skills/release-process/SKILL.md | Updates embedded references from .copilot/skills/ to .github/skills/. |
| packages/squad-sdk/src/tools/index.ts | Updates squad_skill documentation strings to mention .github/skills/. |
| packages/squad-sdk/src/skills/handler-types.ts | Updates module documentation to reference .github/skills/ as the backend skill location. |
| packages/squad-sdk/src/config/init.ts | Creates .github/skills/ during init and installs bundled skills into it. |
| packages/squad-cli/templates/squad.agent.md.template | Mirrors the coordinator template updates for the CLI distribution. |
| packages/squad-cli/templates/spawn-reference.md | Mirrors spawn-reference scan order changes for the CLI distribution. |
| packages/squad-cli/templates/skills/squad-commands/SKILL.md | Updates “list installed skills” text to reference .github/skills/. |
| packages/squad-cli/templates/skills/release-process/SKILL.md | Updates embedded references from .copilot/skills/ to .github/skills/. |
| packages/squad-cli/src/cli/core/upgrade.ts | Ensures .github/skills/ exists on upgrade; adds legacy-skill migration and updates sync messaging. |
| packages/squad-cli/src/cli/core/templates.ts | Rewrites TEMPLATE_MANIFEST skill destinations to ../.github/skills/.... |
| packages/squad-cli/src/cli/commands/build.ts | Updates generated ceremony/custom skill paths to .github/skills/.... |
| packages/squad-cli/README.md | Updates documentation to describe .github/skills/ as the bundled skill install location. |
| .squad/skills/release-process/SKILL.md | Updates references to the Copilot-facing runbook path under .github/skills/. |
| .squad-templates/squad.agent.md | Canonical template updated with .github/skills/ references and revised scan precedence. |
| .squad-templates/spawn-reference.md | Canonical spawn reference updated with revised scan order. |
| .changeset/fix-1126-skills-to-github-skills.md | Adds a changeset documenting the migration and new tests. |
| // squad_skill: Read/write agent skills | ||
| const squadSkill = defineTool<SkillRequest>({ | ||
| name: 'squad_skill', | ||
| description: 'Read or write agent skill definitions. Skills are stored in .copilot/skills/{name}/SKILL.md.', | ||
| description: 'Read or write agent skill definitions. Skills are stored in .github/skills/{name}/SKILL.md.', | ||
| parameters: { |
| this.storage.writeSync(skillFile, skillContent); | ||
|
|
||
| return { | ||
| textResultForLlm: `Skill written: ${args.skillName} (.copilot/skills/${args.skillName}/SKILL.md)`, | ||
| textResultForLlm: `Skill written: ${args.skillName} (.github/skills/${args.skillName}/SKILL.md)`, | ||
| resultType: 'success', |
| @@ -297,19 +297,19 @@ The routing table determines **WHO** handles work. After routing, use Response M | |||
| | PRD intake ("here's the PRD", "read the PRD at X", pastes spec) | Follow PRD Mode (see that section) | | |||
| | Human member management ("add {name} as PM", routes to human) | Follow Human Team Members (see that section) | | |||
| | Ralph commands ("Ralph, go", "keep working", "Ralph, status", "Ralph, idle") | Follow Ralph — Work Monitor (see that section) | | |||
| | "squad commands", "what can squad do", "show me squad options", "slash commands", "what commands are available" | Read `.copilot/skills/squad-commands/SKILL.md`, present categorized menu (see squad-commands skill) | | |||
| | "squad commands", "what can squad do", "show me squad options", "slash commands", "what commands are available" | Read `.github/skills/squad-commands/SKILL.md`, present categorized menu (see squad-commands skill) | | |||
| // `squad upgrade` migrates any leftover manifest skills to the new | ||
| // location (see upgrade.ts). | ||
| // | ||
| // bradygaster/squad#1304 — adopt the canonical .github/skills/ path. |
| * Idempotent: skips skills already present at the new location with the | ||
| * same content (so re-running upgrade does nothing). If both locations | ||
| * exist with diverging content, the existing `.github/skills/` copy wins | ||
| * and the legacy copy is tombstoned (logged + removed) — this protects | ||
| * any in-place customization the user made at the new location. | ||
| * | ||
| * See bradygaster/squad#1304 for the rationale (Copilot CLI's canonical | ||
| * custom-skills location). |
| it('should migrate manifest skills from .copilot/skills/ to .github/skills/ (regression: #1304)', async () => { | ||
| // Pre-1304 squads have skills at .copilot/skills/. Upgrade must move | ||
| // manifest-curated skills to .github/skills/ (Copilot CLI's canonical | ||
| // custom-skills location) without touching user-added skills. | ||
| // | ||
| // Setup: simulate a pre-1304 squad with two skills in the legacy path — | ||
| // one that's in the manifest (should migrate) and one that's user-added | ||
| // (should be left alone). |
| it('should NOT clobber a customized .github/skills/{name} if the legacy copy exists (regression: #1304)', async () => { | ||
| // If both .copilot/skills/foo/ AND .github/skills/foo/ exist (e.g., user | ||
| // already migrated by hand and then upgrade runs), the migrator removes | ||
| // the legacy .copilot/skills copy and does NOT overwrite the new | ||
| // location. |
…align issue refs Reviewer follow-ups on bradygaster#1304 (closes bradygaster#1126): 1. squad_skill tool implementation matches its description now Description says skills live at '.github/skills/{name}/SKILL.md' but the handler was still writing to '.copilot/skills/' — every successful 'write' shipped to a different path than what the tool documented (and what squad init/upgrade now install to). Fixed the handler so: - write operations go to '.github/skills/{name}/SKILL.md' - read operations check .github/skills first, then fall back to .copilot/skills (legacy) and .squad/skills (in-repo team skills), in that precedence — so users with un-migrated existing skills can still read them. 2. .github/agents/squad.agent.md re-synced from .squad-templates The canonical template had the corrected routing-table reference ('.github/skills/squad-commands/SKILL.md') but the .github/agents mirror copy was never re-synced. The byte-for-byte template-sync parity test would have fired on next CI. Ran 'node scripts/sync-templates.mjs --sync'. 3. Align issue references: bradygaster#1304 → bradygaster#1126 in code/docs/tests This PR closes bradygaster#1126; bradygaster#1304 is the PR number. The migrator docstring, the init.ts comment, and the two upgrade.test.ts cases all called the regression 'bradygaster#1304' — confusing for anyone digging into git blame for the canonical issue. Renamed to bradygaster#1126 where the references describe the bug origin (kept bradygaster#1304 only where the comment specifically describes 'the PR that implemented it'). 4. Migrator docstring corrected to match reality Old docstring claimed 'skips skills already present at the new location with the same content' but the implementation never compares content — it unconditionally tombstones the legacy copy when the new location exists. Rewrote the doc paragraph to describe what the code actually does (preserves the new-location copy verbatim). Verified locally: ✓ vitest test/cli/upgrade.test.ts -t 'migrate manifest skills|should NOT clobber' ✓ vitest test/tools.test.ts -t squad_skill Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
All 3 reviewer threads + the CI failure addressed in commits 9de50de + 0512d4d:
|
…ter#1126) # Conflicts: # .github/agents/squad.agent.md # .squad-templates/squad.agent.md # packages/squad-cli/src/cli/core/templates.ts # packages/squad-cli/templates/squad.agent.md.template # packages/squad-sdk/templates/squad.agent.md.template # templates/squad.agent.md.template
# Conflicts: # .github/agents/squad.agent.md # .squad-templates/squad.agent.md # packages/squad-cli/src/cli/core/templates.ts # packages/squad-cli/templates/squad.agent.md.template # packages/squad-sdk/templates/squad.agent.md.template # templates/squad.agent.md.template
bradygaster
left a comment
There was a problem hiding this comment.
✅ Flight approves. Moving bundled skills to .github/skills is the right architectural target, migration semantics are conservative, backward-compatibility is preserved, and checks are green.
…aster#1126) Per the official Agent Skills spec docs (GitHub, VS Code), the canonical project-level custom-skills location is .github/skills/. The legacy .copilot/skills/ is invisible to all Copilot surfaces except Squad itself - cloud agent, CLI outside Squad, VS Code extension, @copilot coding agent all ignore it. Changes: * squad init writes bundled skills to .github/skills/{name}/SKILL.md * squad upgrade does the same AND migrates legacy .copilot/skills/{name}/ -> .github/skills/{name}/ for manifest skills only (user-added skills at .copilot/skills/ are preserved). Tombstones empty legacy dir. * TEMPLATE_MANIFEST destinations: 10 skill entries retargeted * ENSURE_DIRECTORIES: .copilot/skills -> .github/skills * squad.agent.md narrative: 5-path scan order now lists .github/skills as primary, .copilot/skills as legacy. Personal scope unchanged. * All user-facing docs updated (README, spawn-reference, squad-commands skill, release-process skill, build.ts skill creation paths, SDK type-comment paths). Migration semantics in upgrade.ts: * Move-only-if-new-location-empty: legacy at .copilot/skills/, new location empty -> move + tombstone legacy * Tombstone-on-collision: both locations exist -> remove legacy, new wins (then syncAllSkills overwrites manifest skills per overwriteOnUpgrade=true semantics) * Preserve user-added: skills NOT in TEMPLATE_MANIFEST stay at .copilot/skills/ untouched * All best-effort with try/catch - disk failures do not block upgrade Tests (188/188 pass): * New: init.test.ts asserts canonical path + legacy NOT created * New: upgrade.test.ts asserts manifest migration + user-skill preservation + collision tombstoning * Updated: 8 existing test files retargeted to .github/skills NOT changed (intentional): * .copilot/skills/ stays in coordinator skill-discovery scan order for backward compat with user-added skills * ~/.copilot/skills/ (personal scope) unchanged - that's Copilot CLI's official personal-skills location * Runtime skill-loader tests (skill-source, skills-export-import, tools, skill-script-loader) unchanged - those test loader behavior which still supports .copilot/skills/ as a scan path Closes bradygaster#1126 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…align issue refs Reviewer follow-ups on bradygaster#1304 (closes bradygaster#1126): 1. squad_skill tool implementation matches its description now Description says skills live at '.github/skills/{name}/SKILL.md' but the handler was still writing to '.copilot/skills/' — every successful 'write' shipped to a different path than what the tool documented (and what squad init/upgrade now install to). Fixed the handler so: - write operations go to '.github/skills/{name}/SKILL.md' - read operations check .github/skills first, then fall back to .copilot/skills (legacy) and .squad/skills (in-repo team skills), in that precedence — so users with un-migrated existing skills can still read them. 2. .github/agents/squad.agent.md re-synced from .squad-templates The canonical template had the corrected routing-table reference ('.github/skills/squad-commands/SKILL.md') but the .github/agents mirror copy was never re-synced. The byte-for-byte template-sync parity test would have fired on next CI. Ran 'node scripts/sync-templates.mjs --sync'. 3. Align issue references: bradygaster#1304 → bradygaster#1126 in code/docs/tests This PR closes bradygaster#1126; bradygaster#1304 is the PR number. The migrator docstring, the init.ts comment, and the two upgrade.test.ts cases all called the regression 'bradygaster#1304' — confusing for anyone digging into git blame for the canonical issue. Renamed to bradygaster#1126 where the references describe the bug origin (kept bradygaster#1304 only where the comment specifically describes 'the PR that implemented it'). 4. Migrator docstring corrected to match reality Old docstring claimed 'skips skills already present at the new location with the same content' but the implementation never compares content — it unconditionally tombstones the legacy copy when the new location exists. Rewrote the doc paragraph to describe what the code actually does (preserves the new-location copy verbatim). Verified locally: ✓ vitest test/cli/upgrade.test.ts -t 'migrate manifest skills|should NOT clobber' ✓ vitest test/tools.test.ts -t squad_skill Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CI failure on commit 9de50de: 'squad_skill handler > should write skill file' and 'should default confidence to medium' both still asserted '.copilot/skills/{name}/SKILL.md' as the write destination. With squad_skill's handler now writing to '.github/skills/' (the canonical Copilot CLI custom-skills location, per the fix in the same commit), those assertions need to be updated. The handler's read-fallback chain still finds .copilot/skills/ and .squad/skills/ for legacy installs, but the write target is fixed. Verified locally: 5/5 squad_skill tests pass. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
0512d4d to
8b3c632
Compare
…ills/ (cascade fix on top of bradygaster#1126) After bradygaster#1303 + bradygaster#1302 landed first (with their tests asserting .copilot/skills/), the rebase of bradygaster#1304 (which moves manifest skills to .github/skills/) leaves the test paths pointing at the old location. Update them so the rebased branch's CI is green. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ough the cross-squad skill (#1307) * fix(coordinator): route "spawn a squad" / "another squad" prompts through the cross-squad skill A coordinator initialised by `squad init` saw prompts like "spawn two squads of designers and devs" and fanned out raw `task` agents inside its own context, treating "squad" as generic English for "team / group". It never invoked the bundled `cross-squad` or `cross-squad-communication` skills, so the peer-squad delegation protocol (registry / manifest / sync CLI / git-async / GH-issue patterns) was bypassed entirely. Two structural holes in squad.agent.md allowed this: 1. The Routing table had no row mapping "spawn a squad" phrasing to the Squad-PRODUCT concept (only "upgrade squad" / "squad commands" rows covered Squad-as-a-product vocabulary). 2. The Skill-aware-routing block was process discipline ("check skill directories by domain relevance") with no hard "if the user's word matches a skill name, MUST load the skill" trigger. This fix: - Adds a new routing-table row for the squad-spawning vocabulary ("spawn a squad", "another squad", "two squads", "second squad", "fan out to squads", "delegate to a squad"). Action: invoke the skill tool on cross-squad AND cross-squad-communication BEFORE any task spawn, then delegate via Pattern 0/1/2/3. - Adds a "Hard trigger — keyword-to-skill match" paragraph at the top of the Skill-aware-routing block. If any word in the user's request matches an installed skill name (squad → cross-squad, reflect → reflect, ceremony → matching ceremony skill, fact-check → fact-checking, release → release-process), the coordinator MUST invoke the skill tool to fully load that skill before designing its approach. Includes a "failure mode this rule closes" pointer so the guard survives future paraphrasing. - Strengthens cross-squad/SKILL.md with a Read-this-FIRST callout above the existing Context paragraph, so even a coordinator that skips the routing-table row still hits the trigger when it does eventually load the skill. - Adds a regression test (template-sync.test.ts) that asserts the row + the hard-trigger paragraph + the worked example are present in every mirrored copy of squad.agent.md (5 locations). All 4 mirrors re-synced via `scripts/sync-templates.mjs --sync`. Verified: 223/223 template-sync tests pass. Composability: disjoint from #1292/#1293/#1295/#1298/#1300/#1301/#1302/ #1303/#1304/#1306 — only touches squad.agent.md mirrors + cross-squad/ SKILL.md + the template-sync test. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(coordinator): strengthen squad-spawn disambiguation — ask_user on ambiguity + anti-patterns Real-world failure (2026-06-13): even AFTER the routing-table row and hard-trigger paragraph from b5d05fb landed, a peer-squad coordinator *still* did ad-hoc `task` fan-out for "spawn two squads of engineers and QAs". Self-diagnosis surfaced four contributing failure modes: 1. Prior-session anchoring (saw earlier `reviews/squad-alpha/` folders and matched the pattern without re-evaluating user intent). 2. Ambiguous wording, lazy interpretation (silently picked the cheaper option instead of asking). 3. Coordinator doctrine biases toward `task` fan-out (the existing Eager Execution / Parallel Fan-Out section pulled the coordinator back even after it had loaded `cross-squad`). 4. Cost/overhead instinct ("two real squads for a 30-line app feels disproportionate" — judged silently instead of surfacing the trade-off). The original PR #1307 fix closed modes 1 and 3 mechanically (forces the skill to load) but left modes 2 and 4 open (didn't dictate what to DO with that knowledge). This commit closes them: A. squad.agent.md routing row — added two explicit clauses: - "**Default = literal Squad install.** Calling `task` sub-agents 'squad-alpha' / 'squad-beta' does NOT make them squads — that is the explicit anti-pattern." - "**If the request is ambiguous** ... you MUST `ask_user` with a 2-choice prompt — and never silently pick the cheaper option." No escape hatch. The coordinator can no longer rationalise the downgrade as a judgment call. B. cross-squad/SKILL.md — added a full `## Disambiguation: 'squad' vs ad-hoc agents` section with: - Default-behaviour table mapping common phrasings to expected coordinator actions (real squads vs ad-hoc agents vs ambiguous). - ask_user 2-choice protocol verbatim (heavier/persistent vs lighter/ephemeral) so the coordinator has the exact prompt shape. - Four named anti-patterns drawn directly from the observed failure: * Naming task agents "squad-alpha" doesn't make them squads * Prior-session anchoring (pattern is a hint, not a contract) * Silent cheaper-option pick (judgment call belongs to the user) * Loading the skill but doing task fan-out anyway (disambiguation rule OVERRIDES generic fan-out doctrine when "squad" was the trigger) - Sharpened `description:` so the squad skill-aware-router has better natural-language hooks. - `triggers:` frontmatter array (Copilot CLI ignores `triggers:` per sdk/index.js decompile, but the squad coordinator's skill-aware routing system uses natural-language matching against frontmatter + content, so documenting the phrases here helps that matcher fire). C. Regression tests in test/template-sync.test.ts: - Routing row must mention `ask_user` + "anti-pattern" (new × 5 mirrors = 5 assertions). - cross-squad/SKILL.md must have `## Disambiguation` section, default-behaviour rule, ask_user requirement, the squad-alpha anti-pattern, and triggers: frontmatter (5 new × 3 mirrors = 15 assertions). - 20 new assertions total; 243/243 template-sync tests pass. cross-squad/SKILL.md mirrored to packages/squad-cli/templates/skills/ and packages/squad-sdk/templates/skills/ (byte-identical). squad.agent.md re-synced to all 4 mirrors via scripts/sync-templates.mjs. Composability: still disjoint from all other open PRs. Pure additions to two files (squad.agent.md row, cross-squad/SKILL.md content) plus mirrors + tests. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Tamir Dresher <tamirdresher@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…-init-mode skill CI failure on bradygaster#1311: test/squad-agent-roster.test.ts asserted the 'Determine team size' line is in squad.agent.md.template, but after bradygaster#1308 phase 1 that line moved into the coordinator-init-mode skill. Restructured the test into two describe blocks: 1. squad.agent.md.template — must still keep an Init Mode STUB that names the coordinator-init-mode satellite skill AND preserves the load-bearing eager-execution exception callout. This makes sure future edits can't accidentally drop the satellite reference. 2. coordinator-init-mode/SKILL.md (3 mirrors) — must contain the 'Determine team size' line naming all four built-ins, AND must mark each of Scribe/Ralph/Rai/Fact Checker as 'exempt from casting'. The regression coverage from bradygaster#1299 follows the content. 22/22 tests pass. Also addressed the changeset review comment: clarified that .squad/skills/coordinator-*/SKILL.md are the canonical source files in the squad repo (where every other bundled skill source lives), and they're copied to .github/skills/ on install/upgrade per bradygaster#1304. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…te skills (bradygaster#1308 phase 1) squad.agent.md is loaded as the agent prompt at every Copilot session start. v0.10.0-insider.1 ships it at 81 KB / 1137 lines and the v0.10 stabilisation pass alone added +10.6 KB / +114 lines. Every byte is paid at every session. Phase 1 fix: extract three low-cross-reference, high-byte sections to satellite skills the coordinator loads on demand via the skill tool — same pattern that worked for cross-squad-communication (bradygaster#1295). - coordinator-init-mode — Init Mode Phase 1 + Phase 2 (5.4 KB) - coordinator-source-of-truth — Source of Truth Hierarchy (4.4 KB) - coordinator-response-mode — Response Mode Selection + Lightweight Spawn Template (3.9 KB) Result: squad.agent.md 81 KB → 70 KB (-13.9 %, -140 lines). 19 skills installed at .github/skills/ (was 16). Behaviour unchanged — each removed section is replaced with a stub naming the trigger condition and instructing the coordinator to skill(coordinator-X) before acting. Sections that stay in squad.agent.md (intentional): - Team Mode + state-backend handshake + HARD RULE — handshake must fire before any state write - Routing table — hit on every user prompt - Hard trigger keyword-to-skill match paragraph (bradygaster#1307) — load-bearing - How to Spawn an Agent — referenced from every routing action - Coordinator Identity / Personal Squad / Memory Governance Tools — frequently re-read inline Wired changes: - New canonical sources at .squad/skills/coordinator-{x}/SKILL.md plus 2 template-dir mirrors - MANIFEST_SKILL_NAMES grows by 3 entries (16 → 19) - TEMPLATE_MANIFEST grows by 3 entries with ../.github/skills/ destinations (post-bradygaster#1304 install location) - .squad-templates/squad.agent.md replaces each section with a stub - 4 mirrored squad.agent.md copies re-synced via scripts/sync-templates.mjs --sync Tests: 287/287 pass. The existing 'should install every manifest-curated skill (regression: bradygaster#1289, bradygaster#1264)' already iterates MANIFEST_SKILL_NAMES, so it automatically asserts the 3 new skills install. Smoke test: fresh squad init produces 19 skills at .github/skills/ and squad.agent.md is 70 KB. Follow-ups (separate PRs) for the still-large sections: - Routing (9.2 KB) — extract action-cell verbiage, keep trigger table - Team Mode (5.5 KB) — extract worktree-awareness sub-sections - How to Spawn (3.2 KB) — extract role-emoji catalog Target after 2-3 follow-ups: ~45 KB coordinator file. Closes bradygaster#1308 (phase 1). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…-init-mode skill CI failure on bradygaster#1311: test/squad-agent-roster.test.ts asserted the 'Determine team size' line is in squad.agent.md.template, but after bradygaster#1308 phase 1 that line moved into the coordinator-init-mode skill. Restructured the test into two describe blocks: 1. squad.agent.md.template — must still keep an Init Mode STUB that names the coordinator-init-mode satellite skill AND preserves the load-bearing eager-execution exception callout. This makes sure future edits can't accidentally drop the satellite reference. 2. coordinator-init-mode/SKILL.md (3 mirrors) — must contain the 'Determine team size' line naming all four built-ins, AND must mark each of Scribe/Ralph/Rai/Fact Checker as 'exempt from casting'. The regression coverage from bradygaster#1299 follows the content. 22/22 tests pass. Also addressed the changeset review comment: clarified that .squad/skills/coordinator-*/SKILL.md are the canonical source files in the squad repo (where every other bundled skill source lives), and they're copied to .github/skills/ on install/upgrade per bradygaster#1304. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
"@bradygaster/squad-sdk": minor
"@bradygaster/squad-cli": minor
Move bundled skills from
.copilot/skills/to.github/skills/so they're visible to all Copilot surfaces (closes #1126)Symptom (per #1126)
Squad-bundled skills installed at
.copilot/skills/are invisible to every Copilot surface except Squad itself:@copilotcoding agent on issuesPer the official Agent Skills docs, add-skills docs, and VS Code docs, the canonical project-level custom-skills location is
.github/skills/..copilot/skills/at repo root is not recognized by any Copilot surface — the home-directory equivalent~/.copilot/skills/IS recognized for personal skills, which is the source of the original mistake.Fix
squad initwrites bundled skills to.github/skills/{name}/SKILL.md(was.copilot/skills/).squad upgradedoes the same AND auto-migrates legacy.copilot/skills/{manifest-skill}/into.github/skills/{manifest-skill}/(best-effort, preserves user-added non-manifest skills at.copilot/skills/, tombstones the legacy dir when empty).TEMPLATE_MANIFESTdestinations rewritten: all 10 skill entries now target../.github/skills/instead of../.copilot/skills/.ENSURE_DIRECTORIES(upgrade.ts) updated so existing squads get.github/skills/created on upgrade..github/skills/as path feat: GitHub Issues intake, PRD mode, and human team members #2 (Copilot CLI's canonical custom-skills location) and.copilot/skills/as path [TEST] API capability test — will be deleted #3 (Legacy install path;squad upgrademigrates). Personal scope (~/.copilot/skills/) preserved as-is.spawn-reference.md,README.md,squad-commandsskill,release-processskill,build.ts, SDK type comments) updated to reference.github/skills/as the install destination.Migration semantics (
squad upgrade)migrateLegacyCopilotSkills()runs beforesyncAllSkills:.copilot/skills/.copilot/skills/{manifest-skill}/exists,.github/skills/{manifest-skill}/does NOT.copilot/skills/{manifest-skill}/exists AND.github/skills/{manifest-skill}/exists.copilot/skills/my-custom-skill/(NOT in TEMPLATE_MANIFEST).copilot/skills/becomes empty after migrationAll migration steps are best-effort with try/catch — disk-write failures don't block upgrade.
Tests
New regression tests:
test/init.test.ts > should install Squad-bundled skills at .github/skills/...— asserts canonical path, asserts legacy path is NOT createdtest/cli/upgrade.test.ts > should migrate manifest skills from .copilot/skills/ to .github/skills/— asserts manifest skill moves, user-added skill preservedtest/cli/upgrade.test.ts > should NOT clobber a customized .github/skills/{name} if the legacy copy exists— asserts both-locations case tombstones legacy without losing the newUpdated existing tests:
test/builtin-skills.test.tsregex now matches.github/skills/test/cli/init.test.ts,test/init.test.ts,test/init-sdk.test.ts,test/cli/upgrade.test.ts,test/human-journeys.test.ts,test/repl-ux-fixes.test.ts,test/cli/init-upgrade-parity.test.ts— install-path assertions updated to.github/skills/188/188 init/upgrade/builtin tests pass;
npm run lintclean.What's NOT changed (intentional)
.copilot/skills/scan path stays insquad.agent.md's 5-path skill discovery — the coordinator still discovers user-added skills at the legacy location for backward compat; only Squad-installed (manifest) skills migrate.~/.copilot/skills/(personal scope) is unchanged — that's Copilot CLI's official personal-skills location and remains valid.test/skill-source.test.ts,test/skills-export-import.test.cjs,test/tools.test.ts,test/skill-script-loader.test.tsare NOT touched — they test the runtime skill loader and tool behavior, which still supports.copilot/skills/as a valid scan path.Composability
TEMPLATE_MANIFESTarray as fix(sdk,cli): bundle missing skills on init + strip fabricated tiered-memory provenance (#1289, #1264) #1292/feat(sdk): bundle cross-squad-communication skill (#5 cross-squad protocols) #1295/feat(skills): make /squad a real slash command (user-invocable: true + rename squad-commands → squad) #1303 but only modifies the destination path, not the source or entry list. Conflicts onMANIFEST_SKILL_NAMESare trivial: take the union of skill names with the../.github/skills/destination from this PR.Out of scope (separate follow-ups)
.copilot/skills -> .github/skillssymlink. Not needed because users won't be looking at.copilot/skills/anymore once their tools find skills at.github/skills/. Filed as a follow-up if anyone reports broken muscle memory.squad doctor --skillscheck that warns when.copilot/skills/still has manifest skills after upgrade (suggesting the migration silently failed). Worth adding to the next maintenance pass.