microsoft/generative-ai-for-beginners-dotnet-squad-version-check
Internals of how @bradygaster/squad-cli stamps its version, how `squad upgrade` works (what it preserves vs overwrites), and how to probe the npm registry for the latest version from a coordinator prompt.
npx skills add https://github.com/microsoft/Generative-AI-for-beginners-dotnet --skill squad-version-check
Confidence: medium
Discovered by: Data
Date: 2026-05-26
Validated in: Issue #1173 recon (bradygaster/squad)
Reusable knowledge about how @bradygaster/squad-cli stamps its version into squad.agent.md, how squad upgrade works, what it preserves vs. overwrites, and how to probe the npm registry for the latest version from a coordinator prompt.
@bradygaster/squad-clisquad (registered via package.json#bin.squad)Source file: dist/cli/core/version.js
Three functions:
getPackageVersion()Walks up from the compiled JS file to find package.json. Returns pkg.version. Works from both dist/cli/core/version.js and a bundled root cli.js. Returns '0.0.0' as fallback if not found.
stampVersion(filePath, version)Mutates squad.agent.md in three places:
<!-- version: {version} --> (must be on the line immediately after frontmatter ---)- Version: {version} Squad v{version} Called by: both init and upgrade — after copying the template to the destination.
readInstalledVersion(filePath)Reads the stamped version back from squad.agent.md:
/<!-- version: ([0-9.]+(?:-[a-z]+(?:\.\d+)?)?) -->//^version:\s*"([^"]+)"/m'0.0.0' on any errorsquad upgrade BehaviorSource file: dist/cli/core/upgrade.js
squad.agent.md — full overwrite from template, then stampVersion()overwriteOnUpgrade: true in TEMPLATE_MANIFEST: casting JSON files, template .md files, copilot-instructions.md (if @copilot enabled)templates/workflows/; non-npm projects get type-aware stubsrunMigrations() after file copyteam.md, routing.md, decisions.md, ceremonies.md (user-owned)agents/*/history.md (individual agent memory).squad/config.json — never touched; stateBackend survives intactselfUpgradeCli()):Detects npm/pnpm/yarn via npm_execpath and npm_config_user_agent. Runs:
npm install -g @bradygaster/squad-cli@latestpnpm add -g @bradygaster/squad-cli@latestyarn global add @bradygaster/squad-cli@latestUse @insider tag for insider builds.
compareSemver(a, b) utility (in upgrade.js):Returns -1/0/1. Handles pre-release: strips pre-release for base comparison, then treats pre-release as less than release (e.g., 0.9.5-insider.1 < 0.9.5). Can be ported directly if needed in prompt logic.
.squad/config.json — What It Holds{
"version": 1,
"stateBackend": "worktree"
}
Other optional fields added by the coordinator at runtime:
defaultModel — global model override for all agent spawnsagentModelOverrides.{agentName} — per-agent model overrideThe file is read-only from the upgrade path's perspective. Only the coordinator writes to it (for model preferences).
Use this one-liner from inside a coordinator prompt to fetch dist-tags:
npm view @bradygaster/squad-cli dist-tags --json
dist-tags[channel] (e.g., dist-tags["insider"]).The CLI (self-update.ts) writes latest version info to an OS-specific path with a 24h TTL.
One-liner to read the upstream cache:
node -e "const p=require('path'),o=require('os');const b=process.env.APPDATA||(process.platform==='darwin'?p.join(o.homedir(),'Library','Application Support'):p.join(o.homedir(),'.config'));const f=p.join(b,'squad-cli','update-check.json');try{const d=JSON.parse(require('fs').readFileSync(f,'utf8'));const age=Date.now()-d.checkedAt;if(age<86400000)console.log(JSON.stringify(d));else console.log('STALE')}catch{console.log('MISS')}"
Output semantics:
{"latestVersion":"X.Y.Z","checkedAt":N} → cache hit; use latestVersionSTALE → cache expired (older than 24h); treat as no dataMISS → cache missing or corrupt; treat as no dataOS-specific cache path:
%APPDATA%\squad-cli\update-check.json~/.config/squad-cli/update-check.json~/Library/Application Support/squad-cli/update-check.json.squad/.cache/version-check.jsonUsed by coordinator for insider/preview channels (the upstream cache only stores latest).
Schema:
{
"checkedAt": "2026-05-26T14:13:28.492Z",
"currentVersion": "0.9.6-insider.2",
"channel": "insider",
"channelVersion": "0.9.7-insider.1"
}
TTL: 24 hours from checkedAt.
Gitignore: .squad/.cache/ is listed in .gitignore — cache files are never committed.
| Purpose | Path |
|---|---|
| Version utilities | dist/cli/core/version.js |
| Upgrade logic | dist/cli/core/upgrade.js |
| Init logic | dist/cli/core/init.js |
| Template manifest | dist/cli/core/templates.js |
| Copilot install helper | dist/cli/copilot-install.js |
| squad.agent.md template | templates/squad.agent.md.template |
| Session init reference | templates/session-init-reference.md |
| All templates | templates/ |
Take microsoft/generative-ai-for-beginners-dotnet-squad-version-check from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npm, pnpm.
Without those the skill loads but fails at the first command.