From 6a726342039c5eb266c8518bb1cecfe22d3c43d3 Mon Sep 17 00:00:00 2001 From: Copilot <223556219+Copilot@users.noreply.github.com> Date: Mon, 18 May 2026 09:49:42 -0700 Subject: [PATCH 1/4] feat: add routing.md to squad export/import functionality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Include the full routing.md file content in both the SDK-level and CLI-level export/import flows. Previously only structured routing rules (pattern → agent) were extracted; now the complete file with tables, comments, and routing principles is preserved during export and faithfully restored on import. - SDK export: adds routingFile field to ExportBundle - SDK import: prefers raw routingFile over formatted rules - CLI export: includes routing.md content in manifest - CLI import: writes routing.md to .squad/ on import Closes #1123 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .changeset/add-routing-to-export-import.md | 10 ++++ packages/squad-cli/src/cli/commands/export.ts | 8 +++ packages/squad-cli/src/cli/commands/import.ts | 9 +++ packages/squad-sdk/src/sharing/export.ts | 12 ++++ packages/squad-sdk/src/sharing/import.ts | 5 +- test/sharing.test.ts | 58 +++++++++++++++++++ 6 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 .changeset/add-routing-to-export-import.md diff --git a/.changeset/add-routing-to-export-import.md b/.changeset/add-routing-to-export-import.md new file mode 100644 index 000000000..14dbb9260 --- /dev/null +++ b/.changeset/add-routing-to-export-import.md @@ -0,0 +1,10 @@ +--- +"@bradygaster/squad-sdk": minor +"@bradygaster/squad-cli": minor +--- + +Add routing.md to squad export/import functionality + +The routing.md file is now included when exporting and importing Squad configurations. +This preserves the full routing context (tables, comments, principles) alongside the +structured routing rules that were already exported. diff --git a/packages/squad-cli/src/cli/commands/export.ts b/packages/squad-cli/src/cli/commands/export.ts index 41216bb66..fd7983532 100644 --- a/packages/squad-cli/src/cli/commands/export.ts +++ b/packages/squad-cli/src/cli/commands/export.ts @@ -16,6 +16,7 @@ interface ExportManifest { casting: Record; agents: Record; skills: string[]; + routing?: string; } /** @@ -98,6 +99,13 @@ export async function runExport(dest: string, outPath?: string): Promise { console.error(`Warning: could not read skills: ${(err as Error).message}`); } + // Read routing.md + const routingPath = path.join(squadInfo.path, 'routing.md'); + const routingContent = storage.readSync(routingPath); + if (routingContent !== undefined) { + manifest.routing = routingContent; + } + // Determine output path const finalOutPath = outPath || path.join(dest, 'squad-export.json'); diff --git a/packages/squad-cli/src/cli/commands/import.ts b/packages/squad-cli/src/cli/commands/import.ts index da61ad928..4cc32ef08 100644 --- a/packages/squad-cli/src/cli/commands/import.ts +++ b/packages/squad-cli/src/cli/commands/import.ts @@ -17,6 +17,7 @@ interface ImportManifest { casting: Record; agents: Record; skills: string[]; + routing?: string; } /** @@ -81,6 +82,11 @@ export async function runImport(dest: string, importPath: string, force: boolean storage.writeSync(path.join(squadDir, 'decisions.md'), ''); storage.writeSync(path.join(squadDir, 'team.md'), ''); + // Write routing.md if present in manifest + if (manifest.routing) { + storage.writeSync(path.join(squadDir, 'routing.md'), manifest.routing); + } + // Write casting state for (const [key, value] of Object.entries(manifest.casting)) { storage.writeSync( @@ -135,6 +141,9 @@ export async function runImport(dest: string, importPath: string, force: boolean success(`Imported squad from ${path.basename(resolvedPath)}`); info(` ${agentNames.length} agents: ${agentNames.join(', ')}`); info(` ${manifest.skills.length} skills imported`); + if (manifest.routing) { + info(` routing.md imported`); + } info(` Casting: ${universe} universe preserved`); console.log(); warn('Project-specific learnings are marked in agent histories — review if needed'); diff --git a/packages/squad-sdk/src/sharing/export.ts b/packages/squad-sdk/src/sharing/export.ts index a15fa3009..342381b23 100644 --- a/packages/squad-sdk/src/sharing/export.ts +++ b/packages/squad-sdk/src/sharing/export.ts @@ -38,6 +38,7 @@ export interface ExportBundle { agents: AgentCharter[]; skills: string[]; routingRules: ExportRoutingRule[]; + routingFile?: string; metadata: ExportMetadata; history?: Record[]; } @@ -154,11 +155,22 @@ export function exportSquadConfig(projectDir: string, options?: ExportOptions): })); } + // Read raw routing file content + const routingFile = join(projectDir, '.ai-team', 'routing.md'); + let routingFileContent: string | undefined; + if (storage.existsSync(routingFile)) { + routingFileContent = storage.readSync(routingFile) ?? undefined; + if (opts.anonymize && routingFileContent) { + routingFileContent = anonymizeContent(routingFileContent); + } + } + const bundle: ExportBundle = { config: opts.anonymize ? {} : config, agents, skills, routingRules, + routingFile: routingFileContent, metadata: { version: '1.0.0', timestamp: new Date().toISOString(), diff --git a/packages/squad-sdk/src/sharing/import.ts b/packages/squad-sdk/src/sharing/import.ts index 834f8f6ac..86167f1d3 100644 --- a/packages/squad-sdk/src/sharing/import.ts +++ b/packages/squad-sdk/src/sharing/import.ts @@ -151,10 +151,11 @@ export function importSquadConfig( } // Import routing rules - if (bundle.routingRules.length > 0) { + if (bundle.routingRules.length > 0 || bundle.routingFile) { const routingPath = join(targetDir, '.ai-team', 'routing.md'); const relativePath = '.ai-team/routing.md'; - const routingContent = formatRoutingRules(bundle.routingRules); + // Prefer the raw routing file content if available; fall back to formatted rules + const routingContent = bundle.routingFile ?? formatRoutingRules(bundle.routingRules); if (storage.existsSync(routingPath) && !opts.merge) { changes.push({ type: 'skipped', path: relativePath, reason: 'File exists and merge is disabled' }); diff --git a/test/sharing.test.ts b/test/sharing.test.ts index cae3916d2..2a014f8bb 100644 --- a/test/sharing.test.ts +++ b/test/sharing.test.ts @@ -112,6 +112,30 @@ describe('Export', () => { expect(bundle.routingRules.some(r => r.agent === 'fenster')).toBe(true); }); + it('should export raw routing file content', () => { + const bundle = exportSquadConfig(TEST_DIR); + expect(bundle.routingFile).toBeDefined(); + expect(bundle.routingFile).toContain('build/*'); + expect(bundle.routingFile).toContain('fenster'); + }); + + it('should not include routingFile when routing.md is missing', () => { + rmSync(join(TEST_DIR, '.ai-team', 'routing.md')); + const bundle = exportSquadConfig(TEST_DIR); + expect(bundle.routingFile).toBeUndefined(); + }); + + it('should anonymize routingFile content when anonymize option is set', () => { + writeFileSync( + join(TEST_DIR, '.ai-team', 'routing.md'), + '# Routing\n\n- `build/*` → fenster\n\nContact: user@example.com\n', + ); + const bundle = exportSquadConfig(TEST_DIR, { anonymize: true }); + expect(bundle.routingFile).toBeDefined(); + expect(bundle.routingFile).not.toContain('user@example.com'); + expect(bundle.routingFile).toContain('[email]'); + }); + it('should export skills when includeSkills is true', () => { const bundle = exportSquadConfig(TEST_DIR, { includeSkills: true }); expect(bundle.skills).toContain('typescript'); @@ -276,6 +300,40 @@ describe('Import', () => { expect(existsSync(join(targetDir, '.github', 'agents', 'fenster.agent.md'))).toBe(true); }); + it('should import raw routingFile content when present', () => { + const bundle = makeBundle(); + bundle.routingFile = '# Full Routing\n\n- `build/*` → fenster\n- `review/*` → ralph\n\n## Extra Context\nCustom notes here.\n'; + const bundlePath = join(IMPORT_DIR, 'bundle-routing.json'); + writeFileSync(bundlePath, JSON.stringify(bundle)); + + const targetDir = join(IMPORT_DIR, 'target-routing'); + mkdirSync(targetDir, { recursive: true }); + + const result = importSquadConfig(bundlePath, targetDir); + expect(result.success).toBe(true); + expect(result.changes.some(c => c.path === '.ai-team/routing.md')).toBe(true); + const routingContent = readFileSync(join(targetDir, '.ai-team', 'routing.md'), 'utf-8'); + expect(routingContent).toContain('## Extra Context'); + expect(routingContent).toContain('Custom notes here.'); + }); + + it('should import routing.md even when routingRules is empty but routingFile is present', () => { + const bundle = makeBundle(); + bundle.routingRules = []; + bundle.routingFile = '# Routing Rules\n\nNo structured rules, just notes.\n'; + const bundlePath = join(IMPORT_DIR, 'bundle-routing-only.json'); + writeFileSync(bundlePath, JSON.stringify(bundle)); + + const targetDir = join(IMPORT_DIR, 'target-routing-only'); + mkdirSync(targetDir, { recursive: true }); + + const result = importSquadConfig(bundlePath, targetDir); + expect(result.success).toBe(true); + expect(result.changes.some(c => c.path === '.ai-team/routing.md')).toBe(true); + const routingContent = readFileSync(join(targetDir, '.ai-team', 'routing.md'), 'utf-8'); + expect(routingContent).toContain('No structured rules, just notes.'); + }); + it('should support dry run', () => { const bundle = makeBundle(); const bundlePath = join(IMPORT_DIR, 'bundle.json'); From 44e731d89b75728876adacc296a7fa3daf1aa830 Mon Sep 17 00:00:00 2001 From: Copilot <223556219+Copilot@users.noreply.github.com> Date: Mon, 18 May 2026 10:13:54 -0700 Subject: [PATCH 2/4] fix: use strict undefined checks for routing and add CLI round-trip test Address review feedback: - SDK import: check bundle.routingFile !== undefined (preserves empty files) - CLI import: check manifest.routing !== undefined (same reason) - Add CLI integration test for routing.md export/import round-trip Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- packages/squad-cli/src/cli/commands/import.ts | 2 +- packages/squad-sdk/src/sharing/import.ts | 4 ++-- test/cli/export-import.test.ts | 20 +++++++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/packages/squad-cli/src/cli/commands/import.ts b/packages/squad-cli/src/cli/commands/import.ts index 4cc32ef08..0e260f239 100644 --- a/packages/squad-cli/src/cli/commands/import.ts +++ b/packages/squad-cli/src/cli/commands/import.ts @@ -83,7 +83,7 @@ export async function runImport(dest: string, importPath: string, force: boolean storage.writeSync(path.join(squadDir, 'team.md'), ''); // Write routing.md if present in manifest - if (manifest.routing) { + if (manifest.routing !== undefined) { storage.writeSync(path.join(squadDir, 'routing.md'), manifest.routing); } diff --git a/packages/squad-sdk/src/sharing/import.ts b/packages/squad-sdk/src/sharing/import.ts index 86167f1d3..ffd4d5d87 100644 --- a/packages/squad-sdk/src/sharing/import.ts +++ b/packages/squad-sdk/src/sharing/import.ts @@ -151,11 +151,11 @@ export function importSquadConfig( } // Import routing rules - if (bundle.routingRules.length > 0 || bundle.routingFile) { + if (bundle.routingRules.length > 0 || bundle.routingFile !== undefined) { const routingPath = join(targetDir, '.ai-team', 'routing.md'); const relativePath = '.ai-team/routing.md'; // Prefer the raw routing file content if available; fall back to formatted rules - const routingContent = bundle.routingFile ?? formatRoutingRules(bundle.routingRules); + const routingContent = bundle.routingFile !== undefined ? bundle.routingFile : formatRoutingRules(bundle.routingRules); if (storage.existsSync(routingPath) && !opts.merge) { changes.push({ type: 'skipped', path: relativePath, reason: 'File exists and merge is disabled' }); diff --git a/test/cli/export-import.test.ts b/test/cli/export-import.test.ts index 8c6ba84c7..e54e7d1a9 100644 --- a/test/cli/export-import.test.ts +++ b/test/cli/export-import.test.ts @@ -230,6 +230,26 @@ describe('CLI: export/import commands', () => { expect(importedPolicy).toEqual(policyData); }); + it('should preserve routing.md through export and import round-trip', async () => { + const teamPath = join(TEST_ROOT, '.squad', 'team.md'); + await writeFile(teamPath, '# Team\n'); + + // Create routing.md with rich content + const routingContent = '# Routing Rules\n\n| Pattern | Agent |\n|---------|-------|\n| build/* | fenster |\n| docs/* | pao |\n\n## Principles\n\n1. Eager by default\n2. Scribe always runs\n'; + await writeFile(join(TEST_ROOT, '.squad', 'routing.md'), routingContent); + + // Export and import + const exportPath = join(TEST_ROOT, 'squad-export.json'); + await runExport(TEST_ROOT, exportPath); + await runImport(IMPORT_ROOT, exportPath, false); + + // Verify routing.md was faithfully preserved + const importedRoutingPath = join(IMPORT_ROOT, '.squad', 'routing.md'); + expect(existsSync(importedRoutingPath)).toBe(true); + const importedRouting = await readFile(importedRoutingPath, 'utf-8'); + expect(importedRouting).toBe(routingContent); + }); + it('should mark history as imported with source info', async () => { const teamPath = join(TEST_ROOT, '.squad', 'team.md'); await writeFile(teamPath, '# Team\n'); From 9548d696bbfd355905afe3e2e04e47f7e8f64d79 Mon Sep 17 00:00:00 2001 From: Copilot <223556219+Copilot@users.noreply.github.com> Date: Mon, 18 May 2026 12:05:24 -0700 Subject: [PATCH 3/4] fix: use strict undefined check for routing status message too Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- packages/squad-cli/src/cli/commands/import.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/squad-cli/src/cli/commands/import.ts b/packages/squad-cli/src/cli/commands/import.ts index 0e260f239..26cdb14c7 100644 --- a/packages/squad-cli/src/cli/commands/import.ts +++ b/packages/squad-cli/src/cli/commands/import.ts @@ -141,7 +141,7 @@ export async function runImport(dest: string, importPath: string, force: boolean success(`Imported squad from ${path.basename(resolvedPath)}`); info(` ${agentNames.length} agents: ${agentNames.join(', ')}`); info(` ${manifest.skills.length} skills imported`); - if (manifest.routing) { + if (manifest.routing !== undefined) { info(` routing.md imported`); } info(` Casting: ${universe} universe preserved`); From fcbf2b8471fdd6a559b6691099e051d534ceb9fc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 18 May 2026 19:44:54 +0000 Subject: [PATCH 4/4] fix: resolve merge conflicts with origin/dev Agent-Logs-Url: https://github.com/bradygaster/squad/sessions/a692277d-db4b-42c9-928f-ade11b4a91e0 Co-authored-by: bradygaster <41929050+bradygaster@users.noreply.github.com> --- package-lock.json | 494 +----------------- .../skills/e2e-template-testing/SKILL.md | 6 +- .../skills/e2e-template-testing/SKILL.md | 6 +- .../skills/e2e-template-testing/SKILL.md | 6 +- 4 files changed, 13 insertions(+), 499 deletions(-) diff --git a/package-lock.json b/package-lock.json index fb93d6934..1f2dd42dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bradygaster/squad", - "version": "0.9.1", + "version": "0.9.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@bradygaster/squad", - "version": "0.9.1", + "version": "0.9.6", "license": "MIT", "workspaces": [ "packages/*" @@ -25,7 +25,6 @@ "highlight.js": "^11.11.1", "markdown-it": "^14.1.1", "markdownlint-cli2": "^0.21.0", - "playwright": "^1.58.2", "typescript": "^5.7.0", "vitest": "^3.0.0" }, @@ -8928,7 +8927,7 @@ }, "packages/squad-cli": { "name": "@bradygaster/squad-cli", - "version": "0.9.1", + "version": "0.9.6", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -8945,7 +8944,6 @@ "devDependencies": { "@types/node": "^22.0.0", "@types/react": "^19.2.14", - "esbuild": "^0.25.0", "ink-testing-library": "^4.0.0", "typescript": "^5.7.0" }, @@ -8957,493 +8955,9 @@ "qrcode-terminal": "^0.12.0" } }, - "packages/squad-cli/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "packages/squad-cli/node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, "packages/squad-sdk": { "name": "@bradygaster/squad-sdk", - "version": "0.9.1", + "version": "0.9.6", "license": "MIT", "dependencies": { "@github/copilot-sdk": "^0.1.32", diff --git a/packages/squad-cli/templates/skills/e2e-template-testing/SKILL.md b/packages/squad-cli/templates/skills/e2e-template-testing/SKILL.md index c08c48e63..1696b4f40 100644 --- a/packages/squad-cli/templates/skills/e2e-template-testing/SKILL.md +++ b/packages/squad-cli/templates/skills/e2e-template-testing/SKILL.md @@ -83,17 +83,17 @@ cat .squad/config.json # should reflect any CLI flags you passed Use the Copilot CLI's `-p` flag for non-interactive single-turn sessions: ```bash -copilot -p "Picard, decide what testing framework to use. Write your decision." \ +copilot --agent squad -p "Picard, decide what testing framework to use. Write your decision." \ 2>&1 | tee evidence/session-task.log ``` For multi-turn workflows, run sequential sessions: ```bash # Session A: give the team a task -copilot -p "prompt A" 2>&1 | tee evidence/session-A.log +copilot --agent squad -p "prompt A" 2>&1 | tee evidence/session-A.log # Session B: verify state persisted -copilot -p "What decisions has the team made?" 2>&1 | tee evidence/session-B.log +copilot --agent squad -p "What decisions has the team made?" 2>&1 | tee evidence/session-B.log ``` ### Step 5 — Verify the outcome diff --git a/packages/squad-sdk/templates/skills/e2e-template-testing/SKILL.md b/packages/squad-sdk/templates/skills/e2e-template-testing/SKILL.md index c08c48e63..1696b4f40 100644 --- a/packages/squad-sdk/templates/skills/e2e-template-testing/SKILL.md +++ b/packages/squad-sdk/templates/skills/e2e-template-testing/SKILL.md @@ -83,17 +83,17 @@ cat .squad/config.json # should reflect any CLI flags you passed Use the Copilot CLI's `-p` flag for non-interactive single-turn sessions: ```bash -copilot -p "Picard, decide what testing framework to use. Write your decision." \ +copilot --agent squad -p "Picard, decide what testing framework to use. Write your decision." \ 2>&1 | tee evidence/session-task.log ``` For multi-turn workflows, run sequential sessions: ```bash # Session A: give the team a task -copilot -p "prompt A" 2>&1 | tee evidence/session-A.log +copilot --agent squad -p "prompt A" 2>&1 | tee evidence/session-A.log # Session B: verify state persisted -copilot -p "What decisions has the team made?" 2>&1 | tee evidence/session-B.log +copilot --agent squad -p "What decisions has the team made?" 2>&1 | tee evidence/session-B.log ``` ### Step 5 — Verify the outcome diff --git a/templates/skills/e2e-template-testing/SKILL.md b/templates/skills/e2e-template-testing/SKILL.md index c08c48e63..1696b4f40 100644 --- a/templates/skills/e2e-template-testing/SKILL.md +++ b/templates/skills/e2e-template-testing/SKILL.md @@ -83,17 +83,17 @@ cat .squad/config.json # should reflect any CLI flags you passed Use the Copilot CLI's `-p` flag for non-interactive single-turn sessions: ```bash -copilot -p "Picard, decide what testing framework to use. Write your decision." \ +copilot --agent squad -p "Picard, decide what testing framework to use. Write your decision." \ 2>&1 | tee evidence/session-task.log ``` For multi-turn workflows, run sequential sessions: ```bash # Session A: give the team a task -copilot -p "prompt A" 2>&1 | tee evidence/session-A.log +copilot --agent squad -p "prompt A" 2>&1 | tee evidence/session-A.log # Session B: verify state persisted -copilot -p "What decisions has the team made?" 2>&1 | tee evidence/session-B.log +copilot --agent squad -p "What decisions has the team made?" 2>&1 | tee evidence/session-B.log ``` ### Step 5 — Verify the outcome