Skip to content

chore: promote dev -> main (v0.12.0) - #1698

Merged
tamirdresher merged 329 commits into
mainfrom
dev
Aug 13, 2026
Merged

chore: promote dev -> main (v0.12.0)#1698
tamirdresher merged 329 commits into
mainfrom
dev

Conversation

@tamirdresher

Copy link
Copy Markdown
Collaborator

Promotes dev to main for the v0.12.0 release of @bradygaster/squad-cli and @bradygaster/squad-sdk.

Release readiness

What happens on merge

squad-release.yml fires on push to main: runs node --test test/*.test.cjs, validates the CHANGELOG entry, reads the version from root package.json, creates and pushes tag v0.12.0, and publishes a GitHub Release with --latest.

⚠️ Known follow-up required

squad-release.yml creates the Release using the default GITHUB_TOKEN, so the release: published event will not trigger squad-npm-publish.yml (GitHub's anti-loop protection). After the Release appears, npm publish must be dispatched manually:

gh workflow run squad-npm-publish.yml --repo bradygaster/squad --ref main -f version=0.12.0

--ref main is required — the repo default branch is dev, but the tag and artifacts live on main.

Prior work in this release

bradygaster and others added 30 commits June 25, 2026 10:26
….5 (#1387)

migrate-backend.ts imports addSquadStateGitignoreBlock/removeSquadStateGitignoreBlock
from @bradygaster/squad-sdk, but src/index.ts never re-exported them, breaking the CLI
TypeScript build (TS2305). Re-export both helpers (and their marker constants) so the CLI
compiles. Also bump the stale Squad.Agents.AI NuGet version 0.5.1 -> 0.5.5 so a republish
pins to the fixed CLI.

Unblocks a stable release carrying the #1378 inline-dispatch-gate fix.

Refs #1386

Co-authored-by: brady gaster <bradygaster@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…t OTel (#1384)

Adds a "subagent dispatched" envelope to the SquadSubagentTraceMapper so
consumers and OTel backends see the LLM-supplied persona identity from the
moment the coordinator invokes the `task` tool — instead of waiting for the
later SubagentStartedEvent (which only carries the catalog `agent_type`,
e.g. always "general-purpose").

Mapper / public surface:
- Add `SubagentDispatched` to `SquadAgentTraceEventKind` and four persona
  properties on `SquadAgentTraceEvent`
  (`DispatchedPersonaName/Description/AgentType/Prompt`).
- Rewrite mapper to key live activities by `ToolCallId` (primary) and
  maintain a `SdkAgentId → ToolCallId` lookup so `AssistantMessageEvent`s
  (which only carry `AgentId`) can find the right span. Activities are
  opened on the task-dispatch event and labelled with the persona name from
  the start, then augmented on `SubagentStartedEvent`.
- Surface `AssistantMessageData.ToolRequests[].Name` on the typed envelope
  as `RequestedToolNames`, and add a `squad.subagent.tool_requests`
  ActivityEvent so tool-only assistant turns (empty Content) are visible
  on the OTel span as "called gh, view, grep" instead of a blank marker.

Sample:
- Add Flow 5 demonstrating both the typed `OnSubagentTrace` callback and
  an `ActivityListener` for OTel.
- Update Flow 1 to use the same handler with the new tool-name surfacing
  and a short `ShortId` formatter so parallel subagents are
  visually distinct.
- Fix Flow 3 (BYOK): merge the parent process env with custom vars to
  avoid the `Assertion failed: ncrypto::CSPRNG(nullptr, 0)` Node crash on
  Windows.

SDK:
- When forwarding `options.Environment` to the Copilot client, merge with
  the parent process env (instead of replacing it) so the native CLI
  inherits SYSTEMROOT/PATH/TEMP and doesn't crash on crypto init.

Tests (82 total, all pass on net8.0/net9.0/net10.0):
- 11 new tests covering task-dispatch parsing, `subagent_type` alias,
  bare-arguments fallback, `ToolRequests` extraction, the
  `squad.subagent.tool_requests` ActivityEvent, ToolCallId-keyed activity
  lifecycle, parallel dispatches, missing-arguments path, and the
  `sessionConfig.Agent = "Squad"` routing assertion update.

Co-authored-by: Tamir Dresher <tamirdresher@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: escape args for cmd.exe shell on Windows (DEP0190)

When execFile is called with shell: true on Windows, Node concatenates
args with spaces but does NOT quote them. This causes multi-word prompts
(e.g. the -p/--message arg) to be split by cmd.exe, resulting in
'The system cannot find the file specified' errors.

Changes:
- Add escapeForCmd() and escapeArgs() to agent-spawn.ts that properly
  wrap args containing spaces/metacharacters in double quotes
- Apply escaping in spawnWithTimeout() and spawnAgent() before passing
  to execFile
- Migrate monitor-email, monitor-teams, retro, and decision-hygiene
  capabilities to use the shared agent-spawn module instead of
  duplicated inline buildAgentCommand/spawnWithTimeout functions
- Fix preflight checks to use IS_WINDOWS instead of hardcoded shell:true

Also resolves the Node DEP0190 deprecation warning about passing args
to a child process with shell option true being a security risk, since
args are now properly escaped before concatenation.

Fixes bradygaster/squad#TBD

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: use gh auth token instead of gh auth status for auth checks

gh auth status returns a non-zero exit code when ANY account in the
keyring has an invalid/stale token, even if the active account (e.g.
via GH_TOKEN env var) is perfectly fine. This causes squad watch and
other commands to incorrectly report 'gh CLI not authenticated'.

Switch to gh auth token which only checks the active account and
returns the token on success.

Fixes the false-negative auth check when users have multiple gh
accounts with a stale keyring entry.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: use -p flag instead of --message for copilot CLI

The copilot CLI accepts -p/--prompt for non-interactive mode, not
--message. The --message flag doesn't exist, causing 'unknown option'
errors when capabilities try to invoke copilot.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: default to --yolo when --execute is active

Copilot CLI hangs in non-interactive (-p) mode without permission
flags because it prompts for tool/path/url approval. Since squad watch
spawns copilot headlessly, default to --yolo (equivalent to
--allow-all) when execute mode is active and no explicit copilotFlags
or agentCmd are set.

Users can still override with --copilot-flags to use a more
restrictive set of permissions.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: add changeset for shell spawn fixes

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…1385)

* feat(coordinator): spawn cast members as sub-sessions in Copilot App

Add SpawnBackend abstraction with TaskSpawnBackend (CLI) and
SessionSpawnBackend (App) implementations. When create_session tool
is available, agents spawn as sub-sessions with real-time visibility
in the left nav. Zero CLI impact — behavior unchanged without the tool.

Key design:
- Platform detection via tool availability probe at session start
- Naming: '{Name} {verb}ing {noun}' (40-char max, sentence case)
- Concurrency cap: 4-5 simultaneous sub-sessions
- Depth limit: max 1 (no sub-sub-sessions)
- Graceful fallback: App backend fails → degrade to task tool

Closes #1377

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(coordinator): address PR review - wire spawnBackend, fix detection order, add release()

- Reorder platform detection: create_session > runSubagent > task > inline
- Wire spawnBackend.spawn() into spawnSingle() with fallback to createSession
- Both backends now require injected createSession callback (real session creation)
- Add release(handle) to SpawnBackend interface for concurrency tracking
- SessionSpawnBackend: proper pending/active tracking, reject (not queue) at cap
- Remove unused SpawnRequest import (now used in fan-out wiring)
- Add tests for spawn-backend and fan-out integration

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: brady gaster <bradygaster@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Hardening fixes for the sub-session spawn backend (#1377):

- App->task fallback: spawnSingle() falls back to createSession when the
  platform backend fails instead of failing the agent (emits
  session.spawn_fallback)
- Slot-leak guards: registerSpawnRelease() handles 'completed' status and
  adds an unref'd max-lifetime safety timer
- createSession timeout in both backends (createSessionTimeoutMs, default 60s)
- Honest isAvailable() with injectable availabilityCheck predicate
- Prompt sanitization for caller task/context (sanitizePromptValue)
- Re-synced template platform-detection probe order to mirrors

Adds vitest coverage for all six items.

Closes #1377

Co-authored-by: brady gaster <bradygaster@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: rename .NET Aspire references

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: Meir Blachman <meirblachman@gmail.com>

---------

Co-authored-by: Meir Blachman <meblachm@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…1263)

Remove dead .ai-team/ fallback code from workflow templates. The .squad/
directory is the canonical location since the rename — the fallback paths
were never triggered and added unnecessary complexity.

Changes:
- Remove .ai-team/ fallback branches from triage, issue-assign, heartbeat,
  and sync-squad-labels workflows
- Clean up empty if-blocks left by fallback removal
- Simplify warning messages to reference only .squad/team.md
- Change let → const for team/routing file paths (no longer reassigned)
- Sync all template copies (.squad-templates/, packages/)

Guard rail checks in squad-preview.yml and squad-promote.yml are preserved
since they legitimately prevent .ai-team/ files from shipping.

Closes #1167

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
parseRoutingMarkdown kept surrounding quotes on Examples cells, so a quoted example tokenized with the quote glued on and compiled to patterns that never matched, silently routing everything to fallback. Strip leading/trailing quotes so quoted and unquoted examples behave identically. Adds parse and matchRoute regression tests.

Co-authored-by: duau_microsoft <107149404+duau_microsoft@users.noreply.github.com>
The top-level `squad --help` command list omitted the externalize and
internalize commands, leaving them undiscoverable. Add both entries
(descriptions sourced verbatim from command-help.ts) plus a regression
test guarding the top-level command list.

Closes #1050

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…1365)

Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.9.4 to 26.0.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…1366)

Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.9.4 to 26.0.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [esbuild](https://github.com/evanw/esbuild) to 0.28.1 and updates ancestor dependency [tsx](https://github.com/privatenumber/tsx). These dependencies need to be updated together.


Updates `esbuild` from 0.27.4 to 0.28.1
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](evanw/esbuild@v0.27.4...v0.28.1)

Updates `tsx` from 4.21.0 to 4.22.4
- [Release notes](https://github.com/privatenumber/tsx/releases)
- [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs)
- [Commits](privatenumber/tsx@v4.21.0...v4.22.4)

---
updated-dependencies:
- dependency-name: esbuild
  dependency-version: 0.28.1
  dependency-type: indirect
- dependency-name: tsx
  dependency-version: 4.22.4
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…kages/squad-sdk (#1368)

Bumps [@opentelemetry/sdk-trace-base](https://github.com/open-telemetry/opentelemetry-js) from 1.30.1 to 2.8.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md)
- [Commits](open-telemetry/opentelemetry-js@v1.30.1...v2.8.0)

---
updated-dependencies:
- dependency-name: "@opentelemetry/sdk-trace-base"
  dependency-version: 2.8.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…/squad-sdk (#1369)

Bumps [@opentelemetry/resources](https://github.com/open-telemetry/opentelemetry-js) from 1.30.1 to 2.8.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md)
- [Commits](open-telemetry/opentelemetry-js@v1.30.1...v2.8.0)

---
updated-dependencies:
- dependency-name: "@opentelemetry/resources"
  dependency-version: 2.8.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [@github/copilot-sdk](https://github.com/github/copilot-sdk) from 0.3.0 to 1.0.4.
- [Release notes](https://github.com/github/copilot-sdk/releases)
- [Changelog](https://github.com/github/copilot-sdk/blob/main/CHANGELOG.md)
- [Commits](github/copilot-sdk@v0.3.0...v1.0.4)

---
updated-dependencies:
- dependency-name: "@github/copilot-sdk"
  dependency-version: 1.0.3
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…-sdk (#1371)

Bumps [@github/copilot-sdk](https://github.com/github/copilot-sdk) from 0.3.0 to 1.0.4.
- [Release notes](https://github.com/github/copilot-sdk/releases)
- [Changelog](https://github.com/github/copilot-sdk/blob/main/CHANGELOG.md)
- [Commits](github/copilot-sdk@v0.3.0...v1.0.4)

---
updated-dependencies:
- dependency-name: "@github/copilot-sdk"
  dependency-version: 1.0.3
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [cspell](https://github.com/streetsidesoftware/cspell/tree/HEAD/packages/cspell) from 9.7.0 to 10.0.1.
- [Release notes](https://github.com/streetsidesoftware/cspell/releases)
- [Changelog](https://github.com/streetsidesoftware/cspell/blob/main/packages/cspell/CHANGELOG.md)
- [Commits](https://github.com/streetsidesoftware/cspell/commits/v10.0.1/packages/cspell)

---
updated-dependencies:
- dependency-name: cspell
  dependency-version: 10.0.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Add spoiler-awareness guideline to casting/naming rules

Squad's casting system allocated character names from fictional universes
but never screened them for plot spoilers. The existing easter-egg rule
only hides the casting *rationale*, not spoiler-bearing names. A name that
encodes a character's later title, role, transformation, or fate can spoil
a user who is mid-way through the source material, since names appear in
plain text across team.md, prompts, and logs.

Adds an always-loaded Name Allocation rule in squad.agent.md and a new
"Spoiler Awareness" section in casting-reference.md (with a scrubbed
motivating example), propagated to all mirrors via sync-templates.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(casting): restore CRLF endings on casting-reference.md to remove false diff

The Spoiler Awareness edit was made on files whose committed blobs use CRLF, but local normalization rewrote them to LF. That made all 104 existing lines appear changed (122 ins / 104 del) and hid the real 18-line addition. Restoring CRLF collapses the diff to the genuine change only (18 insertions, 0 deletions).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(casting): clarify spoiler guidance wording

Address review feedback on the Spoiler Awareness section:
- Use standard spelling 'midway' instead of 'mid-way'.
- Replace the ambiguous 'Never reorganize the casting around the spoiler'
  with explicit guidance: keep existing name mappings stable and only
  let the next/new allocation pick a different spoiler-safe character.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: add changeset for spoiler-aware casting

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…te skills (#1311)

* feat(prompt): slim squad.agent.md by extracting 3 sections to satellite skills (#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 (#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 (#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-#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: #1289, #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 #1308 (phase 1).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* test+changeset: follow 'Determine team size' assertion to coordinator-init-mode skill

CI failure on #1311: test/squad-agent-roster.test.ts asserted the
'Determine team size' line is in squad.agent.md.template, but after
#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 #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 #1304.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: git-add the canonical .squad/skills/coordinator-*/ source dirs (review on #1311)

Reviewer caught a real bug: the new coordinator-* skill source dirs
existed in my worktree but had never been `git add`-ed because
`.squad/` is gitignored on this repo (specific subpaths under it are
exception-tracked). The template mirrors at
packages/squad-{cli,sdk}/templates/skills/coordinator-*/ shipped fine,
but the canonical sources at .squad/skills/coordinator-*/SKILL.md
weren't in the tree — so:

  - The changeset claim that .squad/skills/coordinator-*/ is the
    canonical source was untrue on dev.
  - scripts/sync-skill-templates.mjs would not see the new skills
    when run from a fresh checkout, breaking the contributor workflow
    (canonical → mirrors). Sync would silently drop the 3 new skills
    on the next prebuild.

Force-added the 3 dirs (`git add -f` because of the .squad/ ignore
rule, same as every other tracked skill under .squad/skills/).

Verified: `node scripts/sync-skill-templates.mjs` now lists
coordinator-* among the 26 discovered skills and re-produces the
2 template mirrors byte-identical to the canonical sources.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* test: extractInitMode follows satellite skill + version regex tolerates pre-release tail

Two narrow fixes uncovered while smoke-testing the slim squad.agent.md PR
(#1311) and the 0.10.0-insider.1 release pipeline:

1. test/init-flow.test.cjs — after the Init Mode prose moved from
   squad.agent.md to the coordinator-init-mode satellite skill (#1308 /
   PR #1311), the structural assertions in 'Init Mode prompt structure
   (#66)' had nothing to read in the parent file. They now follow the
   pointer via the new readSatelliteSkill() helper (which prefers the
   installed copy at .github/skills/<name>/SKILL.md and falls back to
   the source repo template at packages/squad-sdk/templates/skills/),
   so the same gates (STOP/WAIT, 'Look right?', numbered confirm-before-
   create flow, Phase 2 trigger) keep being enforced — just against the
   prompt the coordinator actually loads at runtime.

2. test/version-stamping.test.cjs + index.cjs — the version regex
   [0-9.]+(?:-[a-z]+)? truncated pre-release versions with a numeric
   tail (e.g. 0.10.0-insider.1 → 0.10.0-insider, 0.10.0-build.3 →
   0.10.0-build). That made the test 'upgrade detects same version'
   fail locally on any contributor who built the package (pkg.version
   gets stamped 0.10.0-build.N during build). More importantly it made
   the legacy index.cjs upgrade re-run the full upgrade flow for npm-
   installed insider users (who have 0.10.0-insider.1 on disk) instead
   of printing 'Already up to date'. Widened to
   [0-9.]+(?:-[a-z]+(?:\.[0-9]+)?)? — matches everything we already
   accepted plus the .N tail used by npm pre-release dist-tags and the
   build-time stamping script.

All 133 .cjs tests now pass (was 123 pass / 10 fail before).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(docs): rephrase 'fenced code block' row in skill-security-scanner table

CI failure on dev tip (567f447, Squad CI run 27488323855):
  test/docs-build.test.ts > 'all code blocks are properly fenced (even
  count of backticks)' → expected 1 to be 0
  test/docs-build.test.ts > 'code blocks contain language specification
  or valid content' → expected 1 to be greater than 1

Root cause: a 4-backtick table cell intended to display a literal
triple-backtick:

  | Inside a fenced code block (\\\\ \\\ \\\\) | Suppressed |

made the regex /\\\/g see 5 triple-backtick occurrences across the
file (instead of the 2 from the real bash example), tripping both the
even-fence check and the line-count > 1 check.

Rephrased the table to say 'three backticks' / 'single backtick' in
prose — no embedded delimiters, no need to defend against the markdown
fence escape mechanism. Reads cleaner anyway.

Verified locally: 22/22 docs-build tests pass; npm run build in docs/
completes (171 files emitted; pagefind indexes 168 pages, 6911 words).

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>
The canonical command for adding team members is now 'cast' — we're casting
agents, not hiring humans. 'hire' continues to work silently as an alias
(like cls/clear in PowerShell).

- squad cast (no args) → shows roster (existing behavior preserved)
- squad cast --name X --role Y → launches team creation wizard
- squad hire → always launches the wizard (silent alias)

Updated all CLI help text, README docs, blog posts, SDK templates, and
skill files. Added 'cast' to test expectations while keeping 'hire' in
the recognized-commands list.

Closes #1393

Co-authored-by: brady gaster <bradygaster@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add OSS release checklist files

- CODE_OF_CONDUCT.md (Contributor Covenant v1.4)
- SUPPORT.md (points to GitHub Discussions)
- .github/CODEOWNERS (@bradygaster @tamirdresher)
- README.md: add Requirements, License, Maintainers, Support, Contributing, Code of Conduct sections

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…o URL (#1224) (#1225)

* feat: add 'squad preset install <source>' for sharing presets via repo URL (#1224)

Closes #1224. Adds a new subcommand that installs a single preset from
a GitHub URL or local path into \\/presets/<name>/\ — the
peer-to-peer preset sharing flow that was missing in v0.10.0.

SDK side (squad-sdk/src/presets/index.ts):
- New \installPresetFromSource(source, options)\ function
- Resolves source: GitHub URL → shallow git clone --depth 1 to OS temp;
  local path → use as-is
- Locates preset within source via 3 patterns:
  - dir contains preset.json → single-preset source
  - dir contains presets/ subdir → require --name to pick
  - dir IS the presets/ dir → require --name (or auto-pick if only one)
- Validates preset.json before any destructive action
- Copies preset.json (with optional rename) + agents/ into squad home
- Cleans up temp clones in finally block (success or failure)
- Exports: installPresetFromSource, InstallPresetOptions, InstallPresetResult

CLI side (squad-cli/src/cli/commands/preset.ts):
- New 'install' dispatcher case + presetInstall() function
- Supports --name <override>, --force
- Module docstring + default usage help updated to include 'install'

Supported source shapes:
  https://github.com/owner/repo
  https://github.com/owner/repo#preset-name           (frag as subdir hint)
  https://github.com/owner/repo/tree/branch/path/...  (sub-path)
  git\@github.com:owner/repo.git                     (SSH)
  ./local/path                                       (single preset OR collection)

Smoke tested all 6 cases locally:
  1. Local single-preset → installs under manifest.name ✅
  2. Idempotent re-install fails without --force ✅
  3. --force overwrites ✅
  4. --name renames + updates manifest.name ✅
  5. Invalid source → clear error ✅
  6. GitHub URL (cloned bradygaster/squad's presets/builtin/default) ✅

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(presets): address 6 review comments — security, validation, fragment semantics, tests, help block

Addresses all six review comments on #1225:

1. [security] git clone via execSync was vulnerable to shell injection
   because the command was built as a string. Switched to execFileSync
   with an argument array (no shell), so source / ref values containing
   ';' '&&' '|' backticks etc. can no longer be interpreted by a shell.
   The earlier ad-hoc whitespace/quote escaping was the wrong defence
   layer.

2. [security] nameHint was used in path.join without validation. A value
   like '../something' would have escaped the presets/ directory. Added
   validatePathSegment() that rejects path separators ('/' '\\'), '..',
   '.', null bytes. Applied both at the public installPresetFromSource()
   entry AND inside locatePresetWithinSource() as defence-in-depth in
   case future callers go direct. Also added validateSubPath() for the
   URL-fragment-derived subPath: rejects absolute paths and '..' segments.

3. [correctness] Fragment semantics: 'repo#some-name' (bare fragment, no
   slash) was being treated as a literal subPath, so it looked for
   <clone>/some-name/ and broke the documented <clone>/presets/some-name/
   collection layout from the PR description. Restructured
   resolveInstallSource to return a new nameHint field alongside subPath:
     - Fragment WITH '/'    -> literal subPath (e.g. repo#packs/team-a)
     - Fragment WITHOUT '/' -> preset-name HINT (e.g. repo#my-team)
   The nameHint is forwarded to locatePresetWithinSource without being
   used as a path segment itself, so the common collection layout now
   works as advertised.

4. [UX] --name parsing didn't validate that a value was actually
   provided. 'squad preset install <src> --name' (no value) or
   '--name --force' (next arg is a flag) silently produced undefined or
   '--force' as the override and failed downstream with a confusing
   error. Added an early fail-fast guard with a clear usage hint.

5. [tests] Added 7 focused tests for installPresetFromSource covering
   the new code path:
     - single-preset local source (startDir/preset.json present)
     - collection local source + --name selection
     - collection source without --name throws with helpful message
     - --force overwrite of an existing same-name preset
     - --name rename + manifest.name stamping (other fields preserved)
     - --name path-escape attempts are rejected
     - empty source throws 'required'
   Remote (URL) branch isn't stubbed here — splitting the git-clone
   call into a small helper that tests can mock is a separate follow-up.

6. [docs] preset help block in command-help.ts still printed
   Usage: squad preset <list|show|apply|save|init> without 'install'.
   Updated to include 'install <source>', the new --name option, and a
   concise documentation of the fragment semantics from fix #3.

Verified locally: 36/36 preset tests pass (29 existing + 7 new);
14/14 command-help tests pass.

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>
…es (#1403)

* fix: update adapter/client.ts for @github/copilot-sdk 1.0.4 API changes

- Replace removed cliPath/cliArgs/useStdio/port/cliUrl options with RuntimeConnection
- Update ping() return type from timestamp: number to timestamp: string
- Make SquadModelBilling.multiplier optional to match upstream ModelBilling
- Replace client.on() with client.onLifecycle() for lifecycle events

Unblocks Dependabot PRs #1364 and #1370 which surface these type errors.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update test mocks for @github/copilot-sdk 1.0.4 API changes

- Add RuntimeConnection and onLifecycle to all 4 copilot-sdk test mocks
- Fix command-help.test.ts expected commands list (remove stale entries)
- Regenerate package-lock.json after merging dev (OTel dep alignment)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: brady gaster <bradygaster@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
)

Bumps both OpenTelemetry SDK packages from 1.x to 2.8.0:
- @opentelemetry/sdk-metrics: ^1.30.0 → ^2.8.0
- @opentelemetry/sdk-trace-node: ^1.30.0 → ^2.8.0

The createGauge API is still supported in SDK 2.x — no code changes
needed. All OTel tests and SDK export validations pass.

Closes #1364, Closes #1370

Co-authored-by: brady gaster <bradygaster@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…#1406)

* fix(cli): pin squad-sdk workspace dependency

Closes #1405

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix CLI SDK workspace resolution

Closes #1405

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix green test suite

Align local test expectations with current personal squad paths, stabilize observer file category detection, skip unavailable docs/Aspire capabilities, and add the missing OTel context test dependency.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix observer review hardening

Closes #1416

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Prepare clean 0.11.0 package versions and CHANGELOG notes for release staging.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(test): guard observer symlink setup

Handle restricted symlink creation in the observer symlink test so Windows and locked-down environments can continue the suite.

Refs #1416

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Address symlink test review feedback

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Without this field, Copilot CLI 1.0.66+ interprets the missing tools key as tools: [], so the Squad coordinator loads with no built-in tools (shell, view, edit, grep, glob) and only MCP-exposed tools (skill, sql) remain available. Basic operations like listing files or editing fail.

Setting tools: ["*"] in the canonical .squad-templates/squad.agent.md and mirrored copies (top-level templates/, packages/squad-cli/templates/, packages/squad-sdk/templates/) restores the previous behavior of exposing all built-in tools to the coordinator. .github/agents/squad.agent.md is intentionally left out of this PR.

Resolves the architectural-review nudge: sync-templates.mjs treats .squad-templates/ as canonical; mirrors are bundled into the published npm packages, so all of them must carry the fix for the next release to ship correctly.
… validation (#1419)

* fix(sdk): allow identity/* state writes and widen squad_decide author validation

- add identity/ to the mutable-state allowlist (Closes #1255)
- relax squad_decide author regex with a 200-char cap; slugify author
  for the inbox filename while preserving the raw display name (Closes #1256)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(sdk): address Copilot review — reject empty author slug, report real filename

Closes #1255
Closes #1256

Add empty-slug guard: authors that slugify to empty string (e.g. '   ', '()', '---', '...') now return a failure instead of writing a malformed filename. Fix success message to report the actual slugified filename written on disk instead of the raw author string.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
bradygaster and others added 15 commits August 12, 2026 01:47


- Increase create-issue max from 50 to 75 (supports larger plans)
- Add Output Budget Awareness: phasing guidance when >50 issues, compact bodies when >30
- Add Label Pre-flight: ensure squad/squad:{agent} labels exist before first create-issue
- Add Transient Failure Handling: single retry on 5xx, skip+report on second failure or 4xx
- Add Sub-issue Fallback: degrade gracefully on 404/422, record parent as body reference
- Extend gh-aw-quality tests: assert max=75, lock all four hardening behaviors, add headroom regression guard

Architecture: changes are terse inline guidance within Plan Activate — no new phases,
no speculative redesign, compressed prompt architecture preserved (33 KB, ~67 KB headroom).
Label pre-flight uses safe-output permissions (issues:read is correct per gh-aw platform layer).

Manual forward-port required: PR #1683 branch contains pre-compression 112 KB squad.md —
rebasing/merging would restore the uncompressed file and violate the 100 KB gh-aw ceiling.

Refs #1678

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e5d9bcc6-d667-485b-bccb-738bd9842102
…ful preflight reporting

Label Pre-flight previously claimed that missing labels could be created
via safe-output permissions with issues: read — this is factually wrong.
The workflow declares issues: read (not write), and no create-label
safe-output is configured. The instruction was success-shaped impossible
guidance.

Replacement behavior:
- Verify labels squad and squad:{agent} exist before first create-issue
- If missing: record as prerequisite gap in activation summary (requires
  issues: write + create-label safe-output — not configured)
- Continue activation; apply existing labels normally; omit unavailable
  labels and report exactly which were omitted — do not abort creation

Also:
- Remove .changeset/fix-safe-outputs-plan-activate-hardening.md;
  workflow-only/test-only change does not require a package changeset
- Add 3 focused tests locking the truthful preflight behavior:
  no impossible creation claims, prerequisite gap reporting, omit+report

All approved hardening preserved: create-issue max=75, output budget
phasing, single transient retry, sub-issue fallback.

Closes #1683
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e5d9bcc6-d667-485b-bccb-738bd9842102


fix(workflow): forward-port safe-output reliability hardening from #1683
)

Root cause: watchdog timeout triggered ~20s after epic creation when all task
bodies were composed before the first create-issue call — the agent had already
exceeded the post-result idle window before making any task API calls.

Mitigation: add an explicit ATOMIC CONTRACT to Step 2c requiring each task body
to be composed, called, and verified before the next — eliminating the gap
between epic completion and first task API call.

Changes:
- workflows/squad.md: ATOMIC CONTRACT note in 2c; compact body spec (one
  sentence + 1-2 ACs + one context line); explicit no-batch rule; 2d
  incomplete fallback now calls report_incomplete with counts, never noops,
  and states idempotent re-run via title match
- test/gh-aw-quality.test.ts: 7 new focused tests locking atomic contract,
  compact body, no-batch rule, report_incomplete fallback

Evidence: live failed canary run 31555893180 — watchdog fired after epics,
before task creation.

Prompt bytes (squad.md + imports): 59,846 / ~80,000 ceiling → 20 KB headroom.
Existing 37 tests remain green; total 44 passed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
)

fix(workflow): atomic task-call contract in Plan Activate Step 2c (#1678)
* feat(workflow): auto-cast pivot and resumable work from single issue (#1689)

- Add Team Guard section: bash TEAM_PRESENT/TEAM_ABSENT check applied before
  all work modes (Research, Triage, Plan, etc.); exempt Cast/Connect/Adopt/Status/Implement
- Auto-Cast Pivot: when TEAM_ABSENT, write-once squad-pending-intent-v1 comment
  (records original issue + command), deduplicate open Cast PR via gh pr list,
  run Cast on first run, post squad-cast-opened-v1 without fabricating PR number
- Cast PR body includes squad-cast-pr-v1 origin reference marker
- Plan Activate 2d: clarify N/M copy uses plan declared total not safe-output cap;
  never surface safe-output caps as reason for partial run
- Register squad-pending-intent-v1, squad-cast-opened-v1, squad-cast-pr-v1 in
  planning-ontology.md marker registry
- Add 18 structural tests in gh-aw-quality.test.ts covering all contract points
  (team guard, bash check, write-once semantics, dedup, no fabricated PR number,
  no /squad cast recovery copy, cast-pr-v1 origin, N/M copy, cap non-conflation)

Closes #1689

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 32ea40b4-299f-49f4-9561-243ad1f277c7

* fix(workflow): harden Team Guard, Cast PR dedup, and marker security (#1689)

- Team Guard TG-1: replace shallow `test -s` with awk roster-row
  detection; missing file, empty file, header-only scaffold, and
  zero-member table all yield TEAM_ABSENT; only a real data row inside
  ## Members yields TEAM_PRESENT (HIGH finding 1)

- Team Guard TG-3: replace `gh pr list --head "squad/cast-"` with
  `--jq '[.[] | select(.headRefName | startswith("squad/cast-"))]`
  so cast-{repo} branches are found; --head exact-matching was
  truncating the branch name and never returning results (HIGH finding 2)

- Marker security: remove raw {original_command} from HTML marker
  attributes and user-facing retry copy; use {canonical_mode} and
  {canonical_command} derived from the allowlisted Parse Command output
  only; marker fields now contain only issue integer, mode enum,
  optional numeric phase, ISO timestamp (security finding 3)

- Tests: update 2 existing tests (remove test -s assertion, require
  awk/## Members; replace permissive --head regex with headRefName +
  startsWith + forbidden --head check); add 9 new tests including
  fixture-based roster-row execution (missing/empty/scaffold/one-member)
  and canonical marker field assertions; all 71 tests pass

Closes #1689

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 32ea40b4-299f-49f4-9561-243ad1f277c7

* fix(workflow): CRLF-safe Team Guard, Cast-Member-proof PR dedup (#1689)

- TG-1: add sub(/\r$/,"") to awk roster-row check so CRLF-formatted
  team.md is parsed correctly; CRLF scaffold-only correctly yields
  TEAM_ABSENT instead of the previous false TEAM_PRESENT

- TG-3: narrow Cast PR dedup filter to exclude squad/cast-member-*
  branches; previously startswith("squad/cast-") would match
  squad/cast-member-dev and prevent legitimate Cast dedup; new filter:
  startswith("squad/cast-") AND NOT startswith("squad/cast-member-")

- Tests: add 2 CRLF fixture tests (scaffold-crlf → TEAM_ABSENT,
  one-member-crlf → TEAM_PRESENT); update runRosterCheck snippet to
  match new CRLF-safe awk; update structural PR dedup test to require
  cast-member exclusion; add 4-test behavioral jq suite that extracts
  the exact --jq filter from squad.md and runs it against test JSON
  confirming Cast branch matches and Cast Member branch is excluded

Closes #1689

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 32ea40b4-299f-49f4-9561-243ad1f277c7

* fix(workflow): Team Guard reads committed HEAD state via git show (#1689)

The E2E failure (run 31628021029) showed that when the activation
pre-step runs `squad init --preset default`, a local .squad/team.md
scaffold is created before the agent job. The previous Team Guard (TG-1)
read the local filesystem and returned TEAM_PRESENT for that scaffold,
causing /squad research to skip Auto-Cast and post research instead of
assembling a team.

Changes:
- TG-1 command changed from:
    awk '...' .squad/team.md 2>/dev/null | grep -q . && ...
  to:
    git show HEAD:.squad/team.md 2>/dev/null | awk '...' | grep -q . && ...
  Only committed blobs are visible to the guard; activation-restored
  local files are intentionally invisible.
- Description paragraph added explaining the committed-HEAD vs
  local-activation distinction so future authors understand why.
- Replaced fixture-based roster tests with 8 executable tests against
  real temporary git repos covering all required cases:
  working-tree-only scaffold → ABSENT; committed empty → ABSENT;
  committed header-only → ABSENT; committed real → PRESENT;
  working-tree real over absent committed → ABSENT; committed real +
  dirty working tree → PRESENT; CRLF scaffold → ABSENT; CRLF real → PRESENT.
- Added two structural tests enforcing `git show HEAD:.squad/team.md`
  presence and forbidding direct local file path in TG-1.
- All 81 tests pass; lint and build clean.

Closes #1689

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(workflows): persist planning state with safe output data

Replace unsupported Squad HTML state markers with schema-validated gh-aw data, preserve additive Cast retries, and keep originating issues open.

Closes #1689

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 32ea40b4-299f-49f4-9561-243ad1f277c7
…1671 (#1693)

Copilot SDK 1.0.9 added ReasoningEffort = "max". Squad's SquadReasoningEffort
type and VALID_REASONING_EFFORTS constant previously only permitted
low|medium|high|xhigh, causing a type incompatibility when consuming the
updated SDK.

Changes:
- adapter/types.ts: add "max" to SquadReasoningEffort union
- config/models.ts: add "max" to VALID_REASONING_EFFORTS const (satisfies
  clause keeps it in sync with the type automatically)
- Clamping logic (EFFORT_RANK, clampReasoningEffort) already handled max/xhigh
  equivalence — no changes needed
- test/model-preference.test.ts: add 3 new tests for max as a first-class value

Backwards compatible: existing callers using low/medium/high/xhigh are unaffected.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Bumps the minor-patch group with 6 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `8.65.0` | `8.66.0` |
| [eslint](https://github.com/eslint/eslint) | `10.8.0` | `10.8.1` |
| [eslint-plugin-n](https://github.com/eslint-community/eslint-plugin-n) | `18.2.2` | `18.3.0` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.1.2` | `26.2.0` |
| [@github/copilot-sdk](https://github.com/github/copilot-sdk) | `1.0.8` | `1.0.9` |
| [ws](https://github.com/websockets/ws) | `8.21.1` | `8.21.3` |



Updates `@typescript-eslint/eslint-plugin` from 8.65.0 to 8.66.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.66.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.65.0 to 8.67.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.67.0/packages/parser)

Updates `eslint` from 10.8.0 to 10.8.1
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](eslint/eslint@v10.8.0...v10.8.1)

Updates `eslint-plugin-n` from 18.2.2 to 18.3.0
- [Release notes](https://github.com/eslint-community/eslint-plugin-n/releases)
- [Changelog](https://github.com/eslint-community/eslint-plugin-n/blob/master/CHANGELOG.md)
- [Commits](eslint-community/eslint-plugin-n@v18.2.2...v18.3.0)

Updates `@types/node` from 26.1.2 to 26.2.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@github/copilot-sdk` from 1.0.8 to 1.0.9
- [Release notes](https://github.com/github/copilot-sdk/releases)
- [Changelog](https://github.com/github/copilot-sdk/blob/main/CHANGELOG.md)
- [Commits](github/copilot-sdk@v1.0.8...v1.0.9)

Updates `ws` from 8.21.1 to 8.21.3
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](websockets/ws@8.21.1...8.21.3)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.66.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.67.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: eslint
  dependency-version: 10.8.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: eslint-plugin-n
  dependency-version: 18.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@types/node"
  dependency-version: 26.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@github/copilot-sdk"
  dependency-version: 1.0.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: ws
  dependency-version: 8.21.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
deps: bump the minor-patch group across 1 directory with 7 updates
* feat(workflows): add Squad implementation mode

Closes #1681

- Add /squad implement dispatch for regular issues and ready epic tasks
- Isolate repository edits in a private implementation worker workflow
- Guard dependency handling, duplicate PR detection, concurrency, and PR file scope
- Document installation, permissions, execution waves, and CI token behavior

- gh aw compile squad-implement-worker --strict --approve
- gh aw compile squad --strict --approve
- npm run lint:docs

- The new worker reuses SQUAD_GITHUB_APP_PRIVATE_KEY and SQUAD_GITHUB_TOKEN only through the existing shared Squad bootstrap
- The main workflow remains read-only and dispatches a private worker through a bounded safe output
- Worker changes are restricted by allowed source branches, allowed files, protected-file review, and one PR per run

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 2587b35f-a675-4bf1-a761-265efc31cc23

* fix(docs): avoid unsafe git add pattern

Closes #1681

## Summary
- Split the README staging example into an explicit path-scoped command
- Avoid the repository security scanner's unsafe git add pattern

## Test Plan
- npm run lint:docs

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 2587b35f-a675-4bf1-a761-265efc31cc23

* fix(workflows): scope one-command installer package

Part of #1681

- Move the gh-aw package manifest under workflows/
- Install only the Squad dispatcher, worker, and shared dependencies
- Avoid importing unrelated repository agents and skills

- npx vitest run test/gh-aw-implement-workflow.test.ts
- npm run lint:docs

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 2587b35f-a675-4bf1-a761-265efc31cc23

* fix(docs): use explicit one-command workflow install

Part of #1681

- Install both workflow sources in one gh aw add invocation
- Preserve dependency order without importing unrelated package artifacts
- Remove the overly broad repository package manifest

- Remote gh aw add with both workflow references
- npx vitest run test/gh-aw-implement-workflow.test.ts
- npm run lint:docs

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 2587b35f-a675-4bf1-a761-265efc31cc23

* fix(workflows): require typed worker dispatch

Part of #1681

## Summary
- Use the workflow-specific worker dispatch tool instead of the generic safe output
- Require a numeric issue input for every selected child
- Prevent malformed placeholder dispatches from failing the safe-output job

## Test Plan
- gh aw compile squad --strict --approve
- npx vitest run test/gh-aw-implement-workflow.test.ts
- Two worker runs completed successfully in tamirdresher/my-new-cli-mock

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 2587b35f-a675-4bf1-a761-265efc31cc23

* feat(workflows): continue epic implementation after merge

- Relay merged implementation PRs through the existing worker to the Squad dispatcher
- Refill a maximum of three active epic implementation slots automatically
- Document rolling continuation and add structural regression coverage

- gh aw compile squad and squad-implement-worker --strict --approve --no-emit
- npx vitest run test/gh-aw-implement-workflow.test.ts
- npm run lint:docs

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 2587b35f-a675-4bf1-a761-265efc31cc23

* fix(workflows): authorize trusted workflow dispatches

## Summary
- Allow github-actions bot activation for the two-workflow implementation chain
- Propagate gh-aw context into both workflow dispatch targets
- Document and test workflow-to-workflow activation

## Test Plan
- gh aw compile squad and squad-implement-worker --strict --approve --no-emit
- npx vitest run test/gh-aw-implement-workflow.test.ts
- npm run lint:docs

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 2587b35f-a675-4bf1-a761-265efc31cc23

* fix(workflows): dispatch continuation on default branch

## Summary
- Pin the merge-triggered Squad relay to the repository default branch
- Avoid dispatch failures after merged implementation branches are deleted
- Cover and document the ref selection

## Test Plan
- gh aw compile squad and squad-implement-worker --strict --approve --no-emit
- npx vitest run test/gh-aw-implement-workflow.test.ts
- npm run lint:docs

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 2587b35f-a675-4bf1-a761-265efc31cc23

* fix(workflows): preserve implementation file guardrails

## Summary
- Restore the restricted implementation worker allowlist after rebasing
- Keep root-level source files supported without permitting arbitrary files

## Test Plan
- npx vitest run test/gh-aw-implement-workflow.test.ts
- npm run lint:docs

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 2587b35f-a675-4bf1-a761-265efc31cc23

---------

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 2587b35f-a675-4bf1-a761-265efc31cc23
Bumps [@hono/node-server](https://github.com/honojs/node-server) from 1.19.14 to 2.1.0.
- [Release notes](https://github.com/honojs/node-server/releases)
- [Commits](honojs/node-server@v1.19.14...v2.1.0)

---
updated-dependencies:
- dependency-name: "@hono/node-server"
  dependency-version: 2.1.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Add two .gitignore entries identified during E2E recovery audit
(recovery/frozen-e2e-20260812):

  /run-artifacts/  — gh-aw runtime output (aw-prompts, MCP logs,
                     safe-outputs, agent I/O) produced during live
                     workflow runs; not a source artifact.
  /.mcp.json       — machine-local MCP server configuration; personal
                     to the developer's environment.

Both paths were present as untracked files during the bradygaster/
squad-gh-aw-e2e-4 live demo session and are confirmed absent from
all remote branches. Ignoring them prevents accidental staging.

No product code, test, workflow, or squad-state changes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 32ea40b4-299f-49f4-9561-243ad1f277c7
- Write the [0.12.0] CHANGELOG entry from the 186 commits between
  upstream/main and upstream/dev, grouped under Added/Changed/Fixed/Security
  in the existing house style.
- Bump all 3 package.json files (root, squad-sdk, squad-cli) to 0.12.0 in
  lockstep via 'npm version --workspaces --include-workspace-root'.
- Mine the full 93-line body of the stale .changeset/consolidated-0.11.0.md
  (81 fragments) bullet-by-bullet against both upstream/main and
  upstream/dev history before deleting it:
  - The large majority of referenced PRs/issues are already ancestors of
    upstream/main (shipped in 0.11.0 or earlier) or already covered by an
    existing [0.12.0] bullet.
  - Three items were confirmed missing from [0.12.0] by content diff
    between main and dev and have been added: the ralph-triage
    api.github.com hostname fix (#1142), squad export resolving
    externalized state (#1396), and the memory.* tools bridge through the
    squad_state MCP server.
  - One item (#1255/#1256, "identity/* state writes + squad_decide author
    validation") was traced to commit cea62e5 on stale branches
    (chore/auto-version-promote, pr-1459) that were never merged into dev.
    No equivalent code exists on dev, so it is NOT included in the
    CHANGELOG (it does not reflect shipped behavior) and is flagged
    separately as abandoned/unmerged work, not lost content.
  - No other content from the changeset was lost; everything either maps
    to an existing bullet, was already released, or is newly added above.
- Delete .changeset/consolidated-0.11.0.md now that its content has been
  fully accounted for.

Co-authored-by: tamirdresher_microsoft <tamirdresher_microsoft@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…ut (#1697)

test/gh-aw-quality.test.ts's compiled-workflow-contract test copied
workflows/ into a bare workflows/ dir inside the ephemeral test git
repo, then ran gh aw compile workflows/squad.md --strict. Since
#1682 added safe-outputs.dispatch-workflow (workflows: [squad-implement-worker])
to workflows/squad.md, gh aw v0.85.4's dispatch-workflow validation now
resolves its expected .github/workflows/ location relative to the
compiled file, assuming the standard <root>/.github/workflows/<file>.md
depth. Because this repo's source lives one level shallower, at
<root>/workflows/<file>.md, gh aw's resolution lands one directory
too high (confirmed empirically against both the test workspace and
the real repo root), so it can never find squad-implement-worker and
fails --strict compilation. This is the sole cause of dev's vitest
red status since 2026-08-12T23:39.

Fix: mirror the real downstream deployment layout inside the test
workspace instead - copy workflows/ into <workspace>/.github/workflows/
and compile .github/workflows/squad.md, matching exactly how
docs/src/content/docs/guide/gh-aw.md documents real installs via
gh aw add owner/squad/workflows/squad-implement-worker.md@dev
owner/squad/workflows/squad.md@dev (both files land side-by-side in
the consumer's .github/workflows/). Verified this placement in an
isolated compile outside any repo/worktree - dispatch-workflow
resolves and compile succeeds with exit 0.

This also changes the compiled runtime-import placeholder paths from
bare shared/planning-ontology.md to .github/workflows/shared/planning-ontology.md,
which is gh-aw's genuine, repo-root-relative behavior for that layout
(reproduced in the same isolated compile) - updated the two literal
assertions to match. Added a 20s test timeout since gh aw compile can
exceed vitest's 5s default under full-suite parallel load.

workflows/squad.md, workflows/squad-implement-worker.md, and #1682's
dispatch-workflow feature are completely untouched.

Co-authored-by: tamirdresher_microsoft <tamirdresher_microsoft@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: tamirdresher_microsoft <tamirdresher_microsoft@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

🛫 PR Readiness Check

ℹ️ This comment updates on each push. Last checked: commit 04a5c23

PR Scope: 📦🔧 Mixed (product + infrastructure)

⚠️ 3 item(s) to address before review

Status Check Details
Single commit 250 commits — consider squashing before review
Not in draft Ready for review
Branch up to date Up to date with main
Copilot review No Copilot review yet — it may still be processing
Changeset present Changeset file found
Scope clean ⚠️ PR includes 43 .squad/ file(s) — ensure these are intentional
No merge conflicts No merge conflicts
Copilot threads resolved No Copilot review threads
CI passing 3 check(s) failing: assign-work, heartbeat, enforce

Files Changed (449 files, +35083 −13951)

File +/−
.changeset/bump-otel-sdk-2x.md +0 −5
.changeset/bundle-missing-skills-1289-1264.md +0 −39
.changeset/casting-identity-not-state.md +0 −5
.changeset/cli-upgrade-fixes.md +0 −12
.changeset/conditional-state-gitignore.md +0 −10
.changeset/docs-platform-path-fixes.md +0 −6
.changeset/feat-preset-install.md +0 −60
.changeset/fix-1126-skills-to-github-skills.md +0 −68
.changeset/fix-1296-stop-mcp-home-pollution.md +0 −40
.changeset/fix-1299-fact-checker-full-plumbing.md +0 −77
.changeset/fix-1299-fact-checker-roster-instructions.md +0 −54
.changeset/fix-1305-state-backend-handshake.md +0 −67
.changeset/fix-cli-sdk-workspace-pin.md +0 −5
.changeset/fix-coordinator-inline-dispatch-gate.md +0 −24
.changeset/fix-copilot-sdk-type-compat.md +0 −12
.changeset/fix-dep0190-shell-spawn.md +0 −11
.changeset/fix-fact-checker-auto-scaffold.md +0 −16
.changeset/fix-green-suite.md +0 −5
.changeset/fix-permission-contract.md +0 −6
.changeset/fix-release-pipeline-versions.md +0 −14
.changeset/fix-routing-strip-example-quotes.md +0 −9
.changeset/fix-sdk-export-gitignore-state.md +0 −11
.changeset/fix-skill-squad-rename-to-squad-help.md +0 −49
.changeset/fix-squad-home-env-bugs.md +0 −12
.changeset/fix-squad-slash-command.md +0 −76
.changeset/fix-squad-spawning-routing.md +0 −40
.changeset/fix-yaml-escaping-skill.md +0 −8
.changeset/help-externalize-internalize.md +0 −5
.changeset/init-prompt-copilot-member.md +0 −10
.changeset/ink7-adaptation.md +0 −12
.changeset/max-reasoning-effort.md +5 −0
.changeset/memory-tools-mcp-exposure.md +0 −5
.changeset/observer-hardening.md +0 −5
.changeset/otel-resource-api-migration.md +0 −5
.changeset/preset-apply-wires-team-1288.md +0 −38
.changeset/reasoning-effort.md +0 −17
.changeset/registry-subcommand.md +0 −20
.changeset/release-0.11.0.md +0 −6
.changeset/rename-dotnet-aspire-to-aspire.md +0 −5
.changeset/rename-hire-to-cast.md +0 −5
.changeset/slim-squad-agent-md-phase1.md +0 −90
.changeset/spawn-backend-followups-1377.md +0 −26
.changeset/spoiler-aware-casting.md +0 −29
.changeset/sub-sessions-spawn-backend.md +0 −22
.changeset/types-node-25.md +0 −6
.changeset/typescript-6.md +0 −10
.changeset/vitest-4-upgrade.md +0 −6
.changeset/vscode-jsonrpc-9-sdk.md +0 −5
.changeset/wire-cross-squad-communication-skill.md +0 −53
.copilot/skills/model-selection/SKILL.md +15 −15
... +399 more files

Total: +35083 −13951


This check runs automatically on every push. Fix any ❌ items and push again.
See CONTRIBUTING.md and PR Requirements for details.

dev's git history was orphaned on 2026-07-13 (root commit 4c5772c,
196 commits) and no longer shares a common ancestor with main (root
commit f4830e4, 1722 commits). This silently blocked promotion:
`git merge-base dev main` fails outright and PR #1698 (dev -> main)
is unmergeable as a result. The v0.11.0 promotion (2026-06-29)
predates the reset, which is why it succeeded and this one cannot.

This merges upstream/main into dev with --allow-unrelated-histories
to give the two branches a real common ancestor again, so future
dev -> main promotions work through normal fast-forward/merge
mechanics instead of hitting this dead end.

Conflict resolution policy (277 add/add conflicts, all resolved in
dev's favor):
- dev is the live 0.12.0 release line; main is 44 days stale.
- Verified the one main-only code fix, #1415
  (`tools: ['*']` in .github/agents/squad.agent.md), is already
  present on dev, so taking dev's side loses no code.
- All conflicts resolved via `git checkout --ours` (dev) + `git add`.
- Verified afterward: package.json / packages/squad-cli/package.json /
  packages/squad-sdk/package.json still read 0.12.0; CHANGELOG.md
  still holds the `## [0.12.0] - 2026-08-12` entry; test/gh-aw-quality
  .test.ts still holds the #1697 `.github/workflows` layout fix;
  workflows/squad.md and workflows/squad-implement-worker.md still
  hold the #1682 feature.

Non-conflicting content that arrived from main (~60 files):
- Restored (content lost in the July reset): 7 docs pages under
  docs/src/content/{blog,docs}/ and 5 .squad/decisions/inbox/*.md
  decision records. The 5 decision files matched a gitignore pattern
  for new `git add` but were mechanically staged fine via the merge
  itself (already-tracked-on-main content merges at the object level
  and isn't filtered by .gitignore), so all 12 were kept.
- 6 agent history.md / decisions.md files auto-merged cleanly
  (three-way, non-conflicting) and are kept as-is: they interleave
  older content from main with dev's newer entries, recovering more
  history lost in the reset.
- Dropped: 48 .changeset/*.md files that arrived from main. They are
  already consumed into CHANGELOG.md's 0.12.0 entry; re-adding them
  risks tripping the Changeset Drift check for content that's already
  released. .changeset/ after this merge contains exactly what dev
  had (README.md, config.json, max-reasoning-effort.md).

Net effect verified via `git diff --cached --stat`: only 18 files
show a real diff versus dev's tip (the 12 restored files + 6
auto-merged history files); all 275 conflict resolutions and all 48
changeset removals are no-ops against dev's existing tree.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
tamirdresher_microsoft and others added 3 commits August 13, 2026 17:57
… gate

Adds .squad/decisions/inbox/data-restore-dev-main-ancestry.md documenting the
dev/main unrelated-histories root cause and the merge resolution used to fix
it (PR #1699).

Adds Rule 0 to .squad/skills/release-process/SKILL.md: verify 'git merge-base
dev main' succeeds BEFORE starting any release-prep work, since unrelated
histories silently block promotion only at the very last step.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Three CI failures on PR #1699 traced to the 12 files restored from
main during the dev/main ancestry merge. The merge itself is correct;
the restored files needed integration into dev's current docs
infrastructure. All 12 restored files remain in place.

1. test job (docs-build.test.ts): EXPECTED_GUIDES hardcoded 12 guide
   slugs. Restoring personal-squad.md and shell.md brought the guide
   directory to 14 files. Added both slugs to EXPECTED_GUIDES so the
   contains/length assertions match the current (correct) directory
   contents.

2. Security Review - unsafe-git (3 findings): the scanner flags any
   git add immediately followed by whitespace + a literal dot,
   which also matches the safe, scoped git add .squad/.
   - docs/guide/personal-squad.md: reworded the two documented
     commands to git add -- .squad/ (an equally correct, more
     explicit scoped form using -- to disambiguate the path),
     avoiding the substring match while keeping the instructions
     accurate.
   - .squad/decisions/inbox/retro-copilot-git-safety.md: this is a
     retro describing a banned command, not an instruction to run
     it. Reworded to describe the pattern (bare-dot git add)
     instead of reproducing the literal flagged token sequence,
     preserving the record's meaning.
   No path exclusions were added and the lint rule itself is
   unchanged - inbox decisions stay in-scope by design.

3. docs-quality (markdownlint-cli2 + cspell): markdownlint was
   already clean. cspell flagged 14 unknown words in the restored
   docs/src/content/blog/033-swe-bench-lite-results.md, all
   legitimate technical terms (astropy, mwaskom, pydata, pylint,
   swebench, Sympy/sympy, xarray). Added them to cspell.json's
   custom dictionary at their correct alphabetical positions without
   reordering existing entries.

   Additionally registered the two restored guide/personal-squad.md
   and guide/shell.md pages in docs/src/navigation.ts (Guides
   section) so they are reachable from the docs sidebar, matching
   how every other guide page is surfaced.

Verified locally: test/docs-build.test.ts's guide-directory
assertion logic (vitest itself could not be installed due to the
known corporate-proxy 404 on eslint-plugin-n@18.3.0; replicated the
exact assertion in plain Node against the real directory listing -
passes with 14/14). markdownlint-cli2 and cspell run via

px --yes (bypassing the blocked full install) - both 0 issues.
security-review.mjs re-run against the committed changes - 0
unsafe-git findings (down from 3).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
chore: restore shared ancestry between dev and main
bradygaster
bradygaster previously approved these changes Aug 13, 2026
bradygaster and others added 2 commits August 13, 2026 17:18
…Cast PR return guidance

- workflows/squad.md: add safe fallback clauses to canonical_mode/canonical_command
  definitions; update first-run Auto-Cast Pivot comment to be warmer, explain
  paused-run state, and give explicit merge/rerun instruction; append return-to-
  originating-issue rerun instruction to Cast Step 6 PR body
- test/gh-aw-quality.test.ts: add focused non-duplicative #1700 describe with
  3 assertions: canonical fallback wording, paused-run wording, Cast PR body
  return/rerun instruction
- docs/demo-agentic-sdlc-walkthrough.md: label two-issue explicit Cast as
  deliberate presenter variant and note inline auto-Cast path
- docs/src/content/docs/guide/gh-aw.md: add concise no-team auto-Cast callout
  in Research section

Closes #1700

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: fcedf035-540a-4d9d-8dc5-df265d91fe34
…dance

docs(gh-aw): clarify Auto-Cast first-run UX, add canonical fallback, Cast PR return guidance (#1700)
@tamirdresher
tamirdresher merged commit 54f699f into main Aug 13, 2026
36 of 40 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.