squads-cli 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +521 -288
- package/dist/auth-YW3UPFSB.js +23 -0
- package/dist/auth-YW3UPFSB.js.map +1 -0
- package/dist/autonomy-PSVZVX7A.js +105 -0
- package/dist/autonomy-PSVZVX7A.js.map +1 -0
- package/dist/chunk-67RO2HKR.js +174 -0
- package/dist/chunk-67RO2HKR.js.map +1 -0
- package/dist/chunk-7OCVIDC7.js +12 -0
- package/dist/chunk-7OCVIDC7.js.map +1 -0
- package/dist/chunk-BODLDQY7.js +452 -0
- package/dist/chunk-BODLDQY7.js.map +1 -0
- package/dist/chunk-EHQJHRIW.js +103 -0
- package/dist/chunk-EHQJHRIW.js.map +1 -0
- package/dist/chunk-FFFCFZ6A.js +121 -0
- package/dist/chunk-FFFCFZ6A.js.map +1 -0
- package/dist/chunk-FIWT2NMM.js +165 -0
- package/dist/chunk-FIWT2NMM.js.map +1 -0
- package/dist/chunk-HF4WR7RA.js +154 -0
- package/dist/chunk-HF4WR7RA.js.map +1 -0
- package/dist/chunk-J6QF4ZQX.js +230 -0
- package/dist/chunk-J6QF4ZQX.js.map +1 -0
- package/dist/chunk-LOA3KWYJ.js +294 -0
- package/dist/chunk-LOA3KWYJ.js.map +1 -0
- package/dist/chunk-M5FXNY6Y.js +384 -0
- package/dist/chunk-M5FXNY6Y.js.map +1 -0
- package/dist/chunk-QHNUMM4V.js +87 -0
- package/dist/chunk-QHNUMM4V.js.map +1 -0
- package/dist/chunk-QJ7C7CMB.js +223 -0
- package/dist/chunk-QJ7C7CMB.js.map +1 -0
- package/dist/chunk-RM6BWILN.js +74 -0
- package/dist/chunk-RM6BWILN.js.map +1 -0
- package/dist/chunk-TYFTF53O.js +613 -0
- package/dist/chunk-TYFTF53O.js.map +1 -0
- package/dist/chunk-TZXD6WFN.js +420 -0
- package/dist/chunk-TZXD6WFN.js.map +1 -0
- package/dist/chunk-WVOIY5GW.js +621 -0
- package/dist/chunk-WVOIY5GW.js.map +1 -0
- package/dist/chunk-Z2UKDBNL.js +162 -0
- package/dist/chunk-Z2UKDBNL.js.map +1 -0
- package/dist/chunk-ZTQ7ISUR.js +338 -0
- package/dist/chunk-ZTQ7ISUR.js.map +1 -0
- package/dist/cli.js +2483 -5902
- package/dist/cli.js.map +1 -1
- package/dist/context-GWPF4SEY.js +291 -0
- package/dist/context-GWPF4SEY.js.map +1 -0
- package/dist/context-feed-AJGVAR6H.js +394 -0
- package/dist/context-feed-AJGVAR6H.js.map +1 -0
- package/dist/cost-XBCDJ7XC.js +275 -0
- package/dist/cost-XBCDJ7XC.js.map +1 -0
- package/dist/create-BLFGG6PF.js +286 -0
- package/dist/create-BLFGG6PF.js.map +1 -0
- package/dist/dashboard-LGT2B2BL.js +951 -0
- package/dist/dashboard-LGT2B2BL.js.map +1 -0
- package/dist/dashboard-RMK2BOD2.js +794 -0
- package/dist/dashboard-RMK2BOD2.js.map +1 -0
- package/dist/doctor-XPUIIBHJ.js +374 -0
- package/dist/doctor-XPUIIBHJ.js.map +1 -0
- package/dist/env-config-SQEI3Y7Y.js +21 -0
- package/dist/env-config-SQEI3Y7Y.js.map +1 -0
- package/dist/exec-OUXM7JBF.js +223 -0
- package/dist/exec-OUXM7JBF.js.map +1 -0
- package/dist/feedback-KNAOG5QK.js +229 -0
- package/dist/feedback-KNAOG5QK.js.map +1 -0
- package/dist/github-UQTM5KMS.js +23 -0
- package/dist/github-UQTM5KMS.js.map +1 -0
- package/dist/goal-BVHV5573.js +168 -0
- package/dist/goal-BVHV5573.js.map +1 -0
- package/dist/health-4UXN44PF.js +218 -0
- package/dist/health-4UXN44PF.js.map +1 -0
- package/dist/history-ILH3SWHB.js +232 -0
- package/dist/history-ILH3SWHB.js.map +1 -0
- package/dist/index.d.ts +736 -8
- package/dist/index.js +1312 -6
- package/dist/index.js.map +1 -1
- package/dist/init-XQZ7BOGT.js +812 -0
- package/dist/init-XQZ7BOGT.js.map +1 -0
- package/dist/kpi-RQIU7WGK.js +413 -0
- package/dist/kpi-RQIU7WGK.js.map +1 -0
- package/dist/learn-OIFUVZAS.js +269 -0
- package/dist/learn-OIFUVZAS.js.map +1 -0
- package/dist/login-DXZANWZY.js +155 -0
- package/dist/login-DXZANWZY.js.map +1 -0
- package/dist/memory-T3ACCS7E.js +560 -0
- package/dist/memory-T3ACCS7E.js.map +1 -0
- package/dist/memory-VNF2VFRB.js +23 -0
- package/dist/memory-VNF2VFRB.js.map +1 -0
- package/dist/progress-DAUZMT3N.js +202 -0
- package/dist/progress-DAUZMT3N.js.map +1 -0
- package/dist/providers-3P5D2XL5.js +65 -0
- package/dist/providers-3P5D2XL5.js.map +1 -0
- package/dist/results-UECWGLTB.js +224 -0
- package/dist/results-UECWGLTB.js.map +1 -0
- package/dist/run-I6KAXU6U.js +4049 -0
- package/dist/run-I6KAXU6U.js.map +1 -0
- package/dist/session-HBU6KZOD.js +64 -0
- package/dist/session-HBU6KZOD.js.map +1 -0
- package/dist/sessions-CK25VGPL.js +333 -0
- package/dist/sessions-CK25VGPL.js.map +1 -0
- package/dist/squad-parser-DCG65BJS.js +35 -0
- package/dist/squad-parser-DCG65BJS.js.map +1 -0
- package/dist/stats-G6NAU5BD.js +334 -0
- package/dist/stats-G6NAU5BD.js.map +1 -0
- package/dist/status-AQNLDZVN.js +352 -0
- package/dist/status-AQNLDZVN.js.map +1 -0
- package/dist/sync-ZI3MHA4G.js +836 -0
- package/dist/sync-ZI3MHA4G.js.map +1 -0
- package/dist/templates/core/AGENTS.md.template +51 -0
- package/dist/templates/core/BUSINESS_BRIEF.md.template +29 -0
- package/dist/templates/core/CLAUDE.md.template +48 -0
- package/dist/templates/core/provider.yaml.template +5 -0
- package/dist/templates/first-squad/SQUAD.md.template +23 -0
- package/dist/templates/first-squad/lead.md.template +44 -0
- package/dist/templates/memory/getting-started/state.md.template +19 -0
- package/dist/templates/seed/BUSINESS_BRIEF.md.template +27 -0
- package/dist/templates/seed/CLAUDE.md.template +119 -0
- package/dist/templates/seed/README.md.template +42 -0
- package/dist/templates/seed/config/SYSTEM.md +52 -0
- package/dist/templates/seed/config/provider.yaml +4 -0
- package/dist/templates/seed/hooks/settings.json.template +31 -0
- package/dist/templates/seed/memory/company/directives.md +37 -0
- package/dist/templates/seed/memory/company/manager/state.md +16 -0
- package/dist/templates/seed/memory/engineering/issue-solver/state.md +12 -0
- package/dist/templates/seed/memory/intelligence/intel-lead/state.md +9 -0
- package/dist/templates/seed/memory/marketing/content-drafter/state.md +12 -0
- package/dist/templates/seed/memory/operations/ops-lead/state.md +12 -0
- package/dist/templates/seed/memory/product/lead/state.md +14 -0
- package/dist/templates/seed/memory/research/lead/state.md +14 -0
- package/dist/templates/seed/skills/gh/SKILL.md +57 -0
- package/dist/templates/seed/skills/squads-cli/SKILL.md +84 -0
- package/dist/templates/seed/squads/company/SQUAD.md +51 -0
- package/dist/templates/seed/squads/company/company-critic.md +49 -0
- package/dist/templates/seed/squads/company/company-eval.md +49 -0
- package/dist/templates/seed/squads/company/event-dispatcher.md +43 -0
- package/dist/templates/seed/squads/company/goal-tracker.md +43 -0
- package/dist/templates/seed/squads/company/manager.md +54 -0
- package/dist/templates/seed/squads/engineering/SQUAD.md +48 -0
- package/dist/templates/seed/squads/engineering/code-reviewer.md +57 -0
- package/dist/templates/seed/squads/engineering/issue-solver.md +58 -0
- package/dist/templates/seed/squads/engineering/test-writer.md +50 -0
- package/dist/templates/seed/squads/intelligence/SQUAD.md +38 -0
- package/dist/templates/seed/squads/intelligence/intel-critic.md +36 -0
- package/dist/templates/seed/squads/intelligence/intel-eval.md +31 -0
- package/dist/templates/seed/squads/intelligence/intel-lead.md +71 -0
- package/dist/templates/seed/squads/marketing/SQUAD.md +47 -0
- package/dist/templates/seed/squads/marketing/content-drafter.md +71 -0
- package/dist/templates/seed/squads/marketing/growth-analyst.md +49 -0
- package/dist/templates/seed/squads/marketing/social-poster.md +44 -0
- package/dist/templates/seed/squads/operations/SQUAD.md +45 -0
- package/dist/templates/seed/squads/operations/finance-tracker.md +47 -0
- package/dist/templates/seed/squads/operations/goal-tracker.md +48 -0
- package/dist/templates/seed/squads/operations/ops-lead.md +58 -0
- package/dist/templates/seed/squads/product/SQUAD.md +41 -0
- package/dist/templates/seed/squads/product/lead.md +56 -0
- package/dist/templates/seed/squads/product/scanner.md +50 -0
- package/dist/templates/seed/squads/product/worker.md +55 -0
- package/dist/templates/seed/squads/research/SQUAD.md +38 -0
- package/dist/templates/seed/squads/research/analyst.md +50 -0
- package/dist/templates/seed/squads/research/lead.md +52 -0
- package/dist/templates/seed/squads/research/synthesizer.md +59 -0
- package/dist/templates/skills/squads-learn/SKILL.md +86 -0
- package/dist/templates/skills/squads-workflow/instruction.md +70 -0
- package/dist/terminal-FBQFQTKZ.js +55 -0
- package/dist/terminal-FBQFQTKZ.js.map +1 -0
- package/dist/update-D7CGIZ3M.js +18 -0
- package/dist/update-D7CGIZ3M.js.map +1 -0
- package/dist/update-STU276HR.js +83 -0
- package/dist/update-STU276HR.js.map +1 -0
- package/package.json +31 -13
- package/templates/core/AGENTS.md.template +51 -0
- package/templates/core/BUSINESS_BRIEF.md.template +29 -0
- package/templates/core/CLAUDE.md.template +48 -0
- package/templates/core/provider.yaml.template +5 -0
- package/templates/first-squad/SQUAD.md.template +23 -0
- package/templates/first-squad/lead.md.template +44 -0
- package/templates/memory/getting-started/state.md.template +19 -0
- package/templates/seed/BUSINESS_BRIEF.md.template +27 -0
- package/templates/seed/CLAUDE.md.template +119 -0
- package/templates/seed/README.md.template +42 -0
- package/templates/seed/config/SYSTEM.md +52 -0
- package/templates/seed/config/provider.yaml +4 -0
- package/templates/seed/hooks/settings.json.template +31 -0
- package/templates/seed/memory/company/directives.md +37 -0
- package/templates/seed/memory/company/manager/state.md +16 -0
- package/templates/seed/memory/engineering/issue-solver/state.md +12 -0
- package/templates/seed/memory/intelligence/intel-lead/state.md +9 -0
- package/templates/seed/memory/marketing/content-drafter/state.md +12 -0
- package/templates/seed/memory/operations/ops-lead/state.md +12 -0
- package/templates/seed/memory/product/lead/state.md +14 -0
- package/templates/seed/memory/research/lead/state.md +14 -0
- package/templates/seed/skills/gh/SKILL.md +57 -0
- package/templates/seed/skills/squads-cli/SKILL.md +84 -0
- package/templates/seed/squads/company/SQUAD.md +51 -0
- package/templates/seed/squads/company/company-critic.md +49 -0
- package/templates/seed/squads/company/company-eval.md +49 -0
- package/templates/seed/squads/company/event-dispatcher.md +43 -0
- package/templates/seed/squads/company/goal-tracker.md +43 -0
- package/templates/seed/squads/company/manager.md +54 -0
- package/templates/seed/squads/engineering/SQUAD.md +48 -0
- package/templates/seed/squads/engineering/code-reviewer.md +57 -0
- package/templates/seed/squads/engineering/issue-solver.md +58 -0
- package/templates/seed/squads/engineering/test-writer.md +50 -0
- package/templates/seed/squads/intelligence/SQUAD.md +38 -0
- package/templates/seed/squads/intelligence/intel-critic.md +36 -0
- package/templates/seed/squads/intelligence/intel-eval.md +31 -0
- package/templates/seed/squads/intelligence/intel-lead.md +71 -0
- package/templates/seed/squads/marketing/SQUAD.md +47 -0
- package/templates/seed/squads/marketing/content-drafter.md +71 -0
- package/templates/seed/squads/marketing/growth-analyst.md +49 -0
- package/templates/seed/squads/marketing/social-poster.md +44 -0
- package/templates/seed/squads/operations/SQUAD.md +45 -0
- package/templates/seed/squads/operations/finance-tracker.md +47 -0
- package/templates/seed/squads/operations/goal-tracker.md +48 -0
- package/templates/seed/squads/operations/ops-lead.md +58 -0
- package/templates/seed/squads/product/SQUAD.md +41 -0
- package/templates/seed/squads/product/lead.md +56 -0
- package/templates/seed/squads/product/scanner.md +50 -0
- package/templates/seed/squads/product/worker.md +55 -0
- package/templates/seed/squads/research/SQUAD.md +38 -0
- package/templates/seed/squads/research/analyst.md +50 -0
- package/templates/seed/squads/research/lead.md +52 -0
- package/templates/seed/squads/research/synthesizer.md +59 -0
- package/templates/skills/squads-learn/SKILL.md +86 -0
- package/templates/skills/squads-workflow/instruction.md +70 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/sync.ts","../src/lib/cycle-sync.ts"],"sourcesContent":["import { execSync } from 'child_process';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport { findMemoryDir } from '../lib/memory.js';\nimport { findSquadsDir, listSquads, parseSquadFile } from '../lib/squad-parser.js';\nimport { syncAllCycleData, isPostgresAvailable, closeCycleSyncPool, SyncResult } from '../lib/cycle-sync.js';\nimport {\n colors,\n RESET,\n gradient,\n icons,\n writeLine,\n} from '../lib/terminal.js';\nimport { track, Events } from '../lib/telemetry.js';\nimport { getEnv } from '../lib/env-config.js';\n\ninterface CommitInfo {\n hash: string;\n date: string;\n message: string;\n files: string[];\n}\n\ninterface _SquadUpdate {\n squad: string;\n commits: CommitInfo[];\n summary: string;\n}\n\ninterface SquadMappings {\n pathToSquad: Record<string, string>;\n messageToSquad: Record<string, string>;\n}\n\n/**\n * Build squad mappings dynamically from the current project's squad definitions.\n * Uses `repo:` frontmatter field for path mapping and squad dir name as keyword fallback.\n * Falls back to static defaults when no squads directory is found (e.g., fresh installs).\n */\nfunction buildSquadMappings(): SquadMappings {\n const pathToSquad: Record<string, string> = {};\n const messageToSquad: Record<string, string> = {};\n\n const squadsDir = findSquadsDir();\n if (squadsDir) {\n const squadNames = listSquads(squadsDir);\n for (const name of squadNames) {\n const squadFile = `${squadsDir}/${name}/SQUAD.md`;\n try {\n const squad = parseSquadFile(squadFile);\n // repo: field maps a repo name to this squad\n if (squad.repo) {\n pathToSquad[squad.repo] = name;\n }\n // Squad dir name matches itself as a path pattern and keyword\n pathToSquad[name] = name;\n messageToSquad[name] = name;\n } catch {\n // Corrupt SQUAD.md — skip silently, dir name still usable\n pathToSquad[name] = name;\n messageToSquad[name] = name;\n }\n }\n // Always map .agents dirs to engineering (structural convention)\n if (squadNames.includes('engineering')) {\n pathToSquad['.agents/squads'] = 'engineering';\n pathToSquad['.agents/memory'] = 'engineering';\n }\n }\n\n // If dynamic discovery found nothing (no squads dir), fall back to static defaults\n if (Object.keys(pathToSquad).length === 0) {\n return {\n pathToSquad: {\n 'squads-cli': 'product',\n 'agents-squads-web': 'website',\n 'research': 'research',\n 'intelligence': 'intelligence',\n 'customer': 'customer',\n 'finance': 'finance',\n 'engineering': 'engineering',\n 'product': 'product',\n 'company': 'company',\n '.agents/squads': 'engineering',\n '.agents/memory': 'engineering',\n },\n messageToSquad: {\n 'cli': 'product',\n 'website': 'website',\n 'web': 'website',\n 'homepage': 'website',\n 'research': 'research',\n 'intel': 'intelligence',\n 'lead': 'customer',\n 'finance': 'finance',\n 'cost': 'finance',\n 'engineering': 'engineering',\n 'infra': 'engineering',\n },\n };\n }\n\n return { pathToSquad, messageToSquad };\n}\n\nfunction getLastSyncTime(memoryDir: string): string | null {\n const syncFile = join(memoryDir, '.last-sync');\n if (existsSync(syncFile)) {\n return readFileSync(syncFile, 'utf-8').trim();\n }\n return null;\n}\n\nfunction updateLastSyncTime(memoryDir: string): void {\n const syncFile = join(memoryDir, '.last-sync');\n writeFileSync(syncFile, new Date().toISOString());\n}\n\nfunction getRecentCommits(since?: string): CommitInfo[] {\n const commits: CommitInfo[] = [];\n\n try {\n // Get commits with files changed\n const sinceArg = since ? `--since=\"${since}\"` : '-n 20';\n const logOutput = execSync(\n `git log ${sinceArg} --format=\"%H|%aI|%s\" --name-only`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!logOutput) return commits;\n\n // Parse git log output\n const entries = logOutput.split('\\n\\n');\n for (const entry of entries) {\n const lines = entry.split('\\n').filter(l => l.trim());\n if (lines.length === 0) continue;\n\n const [header, ...fileLines] = lines;\n const [hash, date, ...messageParts] = header.split('|');\n const message = messageParts.join('|');\n\n if (hash && date && message) {\n commits.push({\n hash: hash.substring(0, 7),\n date: date.split('T')[0],\n message,\n files: fileLines.filter(f => f && !f.includes('|')),\n });\n }\n }\n } catch (err) {\n if (process.env.DEBUG) {\n console.error('Git log failed (not a git repo or other error):', err);\n }\n }\n\n return commits;\n}\n\nfunction detectSquadsFromCommit(commit: CommitInfo, mappings: SquadMappings): string[] {\n const squads = new Set<string>();\n\n // Check file paths\n for (const file of commit.files) {\n for (const [pathPattern, squad] of Object.entries(mappings.pathToSquad)) {\n if (file.includes(pathPattern)) {\n squads.add(squad);\n }\n }\n }\n\n // Check commit message\n const msgLower = commit.message.toLowerCase();\n for (const [keyword, squad] of Object.entries(mappings.messageToSquad)) {\n if (msgLower.includes(keyword)) {\n squads.add(squad);\n }\n }\n\n return Array.from(squads);\n}\n\nfunction groupCommitsBySquad(commits: CommitInfo[], mappings: SquadMappings): Map<string, CommitInfo[]> {\n const grouped = new Map<string, CommitInfo[]>();\n\n for (const commit of commits) {\n const squads = detectSquadsFromCommit(commit, mappings);\n\n for (const squad of squads) {\n if (!grouped.has(squad)) {\n grouped.set(squad, []);\n }\n grouped.get(squad)!.push(commit);\n }\n }\n\n return grouped;\n}\n\nfunction generateSummary(commits: CommitInfo[]): string {\n if (commits.length === 0) return '';\n\n const messages = commits.map(c => `- ${c.message}`).join('\\n');\n const date = new Date().toISOString().split('T')[0];\n\n return `\n## Session Update (${date})\n\n${messages}\n`;\n}\n\nfunction appendToSquadMemory(\n memoryDir: string,\n squad: string,\n summary: string\n): boolean {\n // Find the lead agent for this squad\n const squadMemoryDir = join(memoryDir, squad);\n\n if (!existsSync(squadMemoryDir)) {\n mkdirSync(squadMemoryDir, { recursive: true });\n }\n\n // Look for existing agent directories or create default\n let agentDir: string;\n const existingDirs = existsSync(squadMemoryDir)\n ? readdirSync(squadMemoryDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n : [];\n\n if (existingDirs.length > 0) {\n // Use first existing agent (usually the lead)\n agentDir = join(squadMemoryDir, existingDirs[0]);\n } else {\n // Create default agent directory\n agentDir = join(squadMemoryDir, `${squad}-lead`);\n mkdirSync(agentDir, { recursive: true });\n }\n\n const statePath = join(agentDir, 'state.md');\n\n let content = '';\n if (existsSync(statePath)) {\n content = readFileSync(statePath, 'utf-8');\n } else {\n content = `# ${squad} Squad - State\\n\\nUpdated: ${new Date().toISOString().split('T')[0]}\\n`;\n }\n\n // Update the \"Updated\" line\n content = content.replace(\n /Updated:\\s*\\d{4}-\\d{2}-\\d{2}/,\n `Updated: ${new Date().toISOString().split('T')[0]}`\n );\n\n // Append the summary\n content += summary;\n\n writeFileSync(statePath, content);\n return true;\n}\n\n/**\n * Pull latest memory changes from git remote\n */\nfunction gitPullMemory(): { success: boolean; output: string; behind: number; ahead: number } {\n try {\n // First fetch to see what's different\n execSync('git fetch origin', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n\n // Check how many commits behind/ahead\n const status = execSync('git status -sb', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n const behindMatch = status.match(/behind (\\d+)/);\n const aheadMatch = status.match(/ahead (\\d+)/);\n const behind = behindMatch ? parseInt(behindMatch[1]) : 0;\n const ahead = aheadMatch ? parseInt(aheadMatch[1]) : 0;\n\n if (behind === 0) {\n return { success: true, output: 'Already up to date', behind: 0, ahead };\n }\n\n // Pull with rebase to get latest\n const output = execSync('git pull --rebase origin main', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n return { success: true, output: output.trim(), behind, ahead };\n } catch (error) {\n const err = error as { message?: string };\n return { success: false, output: err.message || 'Pull failed', behind: 0, ahead: 0 };\n }\n}\n\n/**\n * Sync squad and agent definitions to Postgres dimension tables.\n * Creates/updates dim_squads and dim_agents from SQUAD.md and agent .md files.\n */\nasync function syncDimensionsToPostgres(verbose?: boolean): Promise<void> {\n const squadsDir = findSquadsDir();\n const bridgeUrl = getEnv().bridge_url;\n\n if (!squadsDir) {\n writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}sync --dimensions${RESET}`);\n writeLine();\n writeLine(` ${icons.progress} Collecting squad definitions...`);\n\n // Collect all squads\n const squadDirs = readdirSync(squadsDir, { withFileTypes: true })\n .filter(d => d.isDirectory())\n .map(d => d.name);\n\n const squadsData: Array<{\n name: string;\n mission: string | null;\n domain: string | null;\n default_provider: string;\n daily_budget: number;\n cooldown_seconds: number;\n metadata: Record<string, unknown>;\n }> = [];\n\n const agentsData: Array<{\n name: string;\n squad: string;\n role: string | null;\n purpose: string | null;\n provider: string | null;\n trigger_type: string;\n mcp_servers: string[];\n skills: string[];\n metadata: Record<string, unknown>;\n }> = [];\n\n // Parse each squad\n const { loadSquad: loadSquadFn } = await import('../lib/squad-parser.js');\n\n for (const squadName of squadDirs) {\n const squad = loadSquadFn(squadName);\n if (!squad) continue;\n\n squadsData.push({\n name: squad.name,\n mission: squad.mission || null,\n domain: squad.domain || null,\n default_provider: squad.providers?.default || 'anthropic',\n daily_budget: squad.context?.budget?.daily || 50,\n cooldown_seconds: squad.context?.cooldown || 300,\n metadata: {\n providers: squad.providers,\n context: squad.context,\n permissions: squad.permissions,\n },\n });\n\n // Parse agents in this squad\n for (const agent of squad.agents) {\n const agentPath = join(squadsDir, squadName, `${agent.name}.md`);\n if (!existsSync(agentPath)) continue;\n\n // Extract MCP servers and skills from definition\n const definition = readFileSync(agentPath, 'utf-8');\n const mcpServers = extractMcpServersFromDef(definition);\n const skills = extractSkillsFromDef(definition);\n\n agentsData.push({\n name: agent.name,\n squad: squadName,\n role: agent.role || null,\n purpose: agent.purpose || null,\n provider: agent.provider || null,\n trigger_type: agent.trigger?.toLowerCase() || 'manual',\n mcp_servers: mcpServers,\n skills: skills,\n metadata: {\n schedule: agent.schedule,\n outputs: agent.outputs,\n },\n });\n }\n }\n\n writeLine(` ${icons.success} Found ${colors.cyan}${squadsData.length}${RESET} squads, ${colors.cyan}${agentsData.length}${RESET} agents`);\n\n if (verbose) {\n writeLine();\n for (const s of squadsData) {\n writeLine(` ${colors.cyan}${s.name}${RESET} ${colors.dim}(${s.metadata.providers ? 'with providers' : 'default'})${RESET}`);\n }\n }\n\n // Send to bridge\n writeLine();\n writeLine(` ${icons.progress} Syncing to Postgres...`);\n\n try {\n const response = await fetch(`${bridgeUrl}/api/sync/dimensions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ squads: squadsData, agents: agentsData }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Bridge returned ${response.status}: ${error}`);\n }\n\n const data = await response.json() as { synced_squads: number; synced_agents: number };\n\n writeLine(` ${icons.success} Synced ${colors.green}${data.synced_squads}${RESET} squads, ${colors.green}${data.synced_agents}${RESET} agents`);\n writeLine();\n\n } catch (error) {\n writeLine(` ${icons.error} ${colors.red}Sync failed: ${error}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}API unavailable. Run \\`squads login\\` to connect.${RESET}`);\n writeLine();\n }\n}\n\nfunction extractMcpServersFromDef(definition: string): string[] {\n const servers: Set<string> = new Set();\n const knownServers = ['chrome-devtools', 'firecrawl', 'context7', 'huggingface'];\n\n for (const server of knownServers) {\n if (definition.toLowerCase().includes(server)) {\n servers.add(server);\n }\n }\n\n const mcpMatch = definition.match(/mcp:\\s*\\n((?:\\s*-\\s*\\S+\\s*\\n?)+)/i);\n if (mcpMatch) {\n for (const line of mcpMatch[1].split('\\n')) {\n const m = line.match(/^\\s*-\\s*(\\S+)/);\n if (m) servers.add(m[1]);\n }\n }\n\n return Array.from(servers);\n}\n\nfunction extractSkillsFromDef(definition: string): string[] {\n const skills: Set<string> = new Set();\n\n const skillsMatch = definition.match(/skills:\\s*\\n((?:\\s*-\\s*\\S+\\s*\\n?)+)/i);\n if (skillsMatch) {\n for (const line of skillsMatch[1].split('\\n')) {\n const m = line.match(/^\\s*-\\s*(\\S+)/);\n if (m) skills.add(m[1]);\n }\n }\n\n const slashSkills = definition.match(/\\/[\\w-]+/g);\n if (slashSkills) {\n for (const skill of slashSkills) {\n if (!skill.startsWith('/exit') && !skill.startsWith('/help')) {\n skills.add(skill.slice(1));\n }\n }\n }\n\n return Array.from(skills);\n}\n\ninterface LearningEntry {\n squad: string;\n agent: string | null;\n content: string;\n category: string;\n importance: string;\n source_file: string;\n}\n\ninterface GeneratedLearning {\n squad: string;\n insight: string;\n category: 'success' | 'failure' | 'pattern' | 'tip';\n tags: string[];\n context: string; // commit hashes\n}\n\n// Commit message prefixes that indicate learning categories\nconst COMMIT_CATEGORY_MAP: Record<string, 'success' | 'failure' | 'pattern' | 'tip'> = {\n 'feat': 'success',\n 'fix': 'failure',\n 'refactor': 'pattern',\n 'perf': 'pattern',\n 'docs': 'tip',\n 'chore': 'tip',\n 'test': 'pattern',\n 'style': 'tip',\n};\n\n// Patterns that indicate significant learnings worth capturing\nconst SIGNIFICANT_PATTERNS = [\n { pattern: /\\d+\\s*(agents?|files?|components?)/i, weight: 2 }, // Batch operations\n { pattern: /parallel|concurrent|async/i, weight: 2 }, // Parallelization\n { pattern: /automat|hook|trigger/i, weight: 2 }, // Automation\n { pattern: /integrat|connect|bridge/i, weight: 1.5 }, // Integration\n { pattern: /improv|optim|enhanc|better/i, weight: 1.5 }, // Improvements\n { pattern: /new|add|implement|create/i, weight: 1 }, // New features\n];\n\n/**\n * Analyze commits and generate learnings based on patterns\n */\nfunction analyzeCommitsForLearnings(commits: CommitInfo[], mappings: SquadMappings): GeneratedLearning[] {\n const learnings: GeneratedLearning[] = [];\n const squadCommits = groupCommitsBySquad(commits, mappings);\n\n for (const [squad, squadCommitList] of squadCommits) {\n // Group by category (feat, fix, etc.)\n const byCategory = new Map<string, CommitInfo[]>();\n\n for (const commit of squadCommitList) {\n // Extract conventional commit prefix\n const match = commit.message.match(/^(\\w+)(?:\\(.*?\\))?:\\s*/);\n const prefix = match ? match[1].toLowerCase() : 'other';\n\n if (!byCategory.has(prefix)) {\n byCategory.set(prefix, []);\n }\n byCategory.get(prefix)!.push(commit);\n }\n\n // Generate learnings for significant patterns\n for (const [prefix, categoryCommits] of byCategory) {\n if (categoryCommits.length === 0) continue;\n\n const category = COMMIT_CATEGORY_MAP[prefix] || 'tip';\n\n // Calculate significance score\n let significanceScore = categoryCommits.length; // Base: number of commits\n const allMessages = categoryCommits.map(c => c.message).join(' ');\n\n for (const { pattern, weight } of SIGNIFICANT_PATTERNS) {\n if (pattern.test(allMessages)) {\n significanceScore *= weight;\n }\n }\n\n // Only generate learning if significant enough (score > 2)\n if (significanceScore < 2) continue;\n\n // Generate insight text\n let insight: string;\n if (categoryCommits.length === 1) {\n // Single commit - use message directly\n insight = categoryCommits[0].message.replace(/^(\\w+)(?:\\(.*?\\))?:\\s*/, '');\n } else {\n // Multiple commits - summarize\n const summaryParts = categoryCommits\n .slice(0, 3)\n .map(c => c.message.replace(/^(\\w+)(?:\\(.*?\\))?:\\s*/, ''));\n\n insight = `${prefix}: ${summaryParts.join('; ')}${categoryCommits.length > 3 ? ` (+${categoryCommits.length - 3} more)` : ''}`;\n }\n\n // Extract tags from file paths\n const tags = new Set<string>();\n for (const commit of categoryCommits) {\n for (const file of commit.files) {\n if (file.includes('agents')) tags.add('agents');\n if (file.includes('memory')) tags.add('memory');\n if (file.includes('cli')) tags.add('cli');\n if (file.includes('web')) tags.add('web');\n if (file.includes('hook')) tags.add('hooks');\n }\n }\n\n learnings.push({\n squad,\n insight,\n category,\n tags: Array.from(tags),\n context: categoryCommits.map(c => c.hash).join(', '),\n });\n }\n }\n\n return learnings;\n}\n\n/**\n * Append auto-generated learnings to learnings.md files\n */\nfunction appendAutoLearnings(memoryDir: string, learnings: GeneratedLearning[]): number {\n let appended = 0;\n const date = new Date().toISOString().split('T')[0];\n\n for (const learning of learnings) {\n const squadDir = join(memoryDir, learning.squad);\n\n // Find or create agent directory\n let agentDir: string;\n if (existsSync(squadDir)) {\n const dirs = readdirSync(squadDir, { withFileTypes: true })\n .filter(d => d.isDirectory())\n .map(d => d.name);\n agentDir = dirs.length > 0 ? join(squadDir, dirs[0]) : join(squadDir, `${learning.squad}-lead`);\n } else {\n mkdirSync(squadDir, { recursive: true });\n agentDir = join(squadDir, `${learning.squad}-lead`);\n }\n\n if (!existsSync(agentDir)) {\n mkdirSync(agentDir, { recursive: true });\n }\n\n const learningsPath = join(agentDir, 'learnings.md');\n\n // Build learning entry\n const categoryEmoji = {\n success: '✓',\n failure: '✗',\n pattern: '◆',\n tip: '→',\n }[learning.category];\n\n const tagsStr = learning.tags.length > 0 ? ` #${learning.tags.join(' #')}` : '';\n const entry = `\\n${date} ${categoryEmoji} **${learning.category.charAt(0).toUpperCase() + learning.category.slice(1)}**: ${learning.insight}${tagsStr}\\n`;\n\n // Append to file\n let content = '';\n if (existsSync(learningsPath)) {\n content = readFileSync(learningsPath, 'utf-8');\n // Check if this insight already exists (avoid duplicates)\n if (content.includes(learning.insight.slice(0, 50))) {\n continue;\n }\n } else {\n content = `# ${learning.squad} Squad - Learnings\\n\\nAuto-captured insights from session activity.\\n`;\n }\n\n writeFileSync(learningsPath, content + entry);\n appended++;\n }\n\n return appended;\n}\n\n/**\n * Parse a learnings.md file into individual learning entries\n */\nfunction parseLearningsFile(filePath: string, squad: string, agent: string | null): LearningEntry[] {\n const content = readFileSync(filePath, 'utf-8');\n const learnings: LearningEntry[] = [];\n\n // Split by headers (##, ###) to get sections\n const sections = content.split(/^##+ /m).filter(Boolean);\n\n for (const section of sections) {\n const lines = section.trim().split('\\n');\n const title = lines[0]?.trim();\n const body = lines.slice(1).join('\\n').trim();\n\n if (!body || body.length < 20) continue; // Skip empty or too short\n\n // Determine category from section title\n let category = 'insight';\n const titleLower = title?.toLowerCase() || '';\n if (titleLower.includes('what works') || titleLower.includes('success')) category = 'success';\n else if (titleLower.includes('what doesn\\'t') || titleLower.includes('unsuccessful') || titleLower.includes('fail')) category = 'failure';\n else if (titleLower.includes('pattern')) category = 'pattern';\n else if (titleLower.includes('improvement') || titleLower.includes('next')) category = 'tip';\n\n // Determine importance from content markers\n let importance = 'normal';\n if (body.includes('**Learning**:') || body.includes('critical') || body.includes('P1')) importance = 'high';\n\n learnings.push({\n squad,\n agent,\n content: title ? `## ${title}\\n${body}` : body,\n category,\n importance,\n source_file: filePath,\n });\n }\n\n // Also extract individual bullet points marked as learnings\n const learningMatches = content.matchAll(/\\*\\*Learning\\*\\*:\\s*(.+?)(?=\\n\\n|\\n\\*\\*|$)/gs);\n for (const match of learningMatches) {\n learnings.push({\n squad,\n agent,\n content: match[1].trim(),\n category: 'insight',\n importance: 'high',\n source_file: filePath,\n });\n }\n\n return learnings;\n}\n\n/**\n * Sync learnings from .agents/memory to Postgres\n */\nasync function syncLearningsToPostgres(verbose?: boolean): Promise<void> {\n const bridgeUrl = getEnv().bridge_url;\n const memoryDir = findMemoryDir();\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}sync --learnings${RESET}`);\n writeLine();\n\n if (!memoryDir) {\n writeLine(` ${icons.error} ${colors.red}No .agents/memory directory found${RESET}`);\n return;\n }\n\n // Find all learnings.md files\n writeLine(` ${icons.progress} Scanning for learnings files...`);\n\n const learningsFiles: string[] = [];\n const scanDir = (dir: string) => {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n scanDir(fullPath);\n } else if (entry.name === 'learnings.md') {\n learningsFiles.push(fullPath);\n }\n }\n };\n scanDir(memoryDir);\n\n writeLine(` ${icons.success} Found ${colors.cyan}${learningsFiles.length}${RESET} learnings files`);\n\n // Parse all learnings\n const allLearnings: LearningEntry[] = [];\n for (const file of learningsFiles) {\n // Extract squad and agent from path: .agents/memory/<squad>/<agent>/learnings.md\n const relativePath = file.replace(memoryDir + '/', '');\n const parts = relativePath.split('/');\n const squad = parts[0] || 'unknown';\n const agent = parts.length > 2 ? parts[1] : null;\n\n const entries = parseLearningsFile(file, squad, agent);\n allLearnings.push(...entries);\n\n if (verbose && entries.length > 0) {\n writeLine(` ${colors.cyan}${squad}${agent ? '/' + agent : ''}${RESET}: ${entries.length} learnings`);\n }\n }\n\n writeLine(` ${icons.success} Parsed ${colors.cyan}${allLearnings.length}${RESET} total learnings`);\n\n if (allLearnings.length === 0) {\n writeLine();\n writeLine(` ${colors.dim}No learnings to sync${RESET}`);\n return;\n }\n\n // Send to bridge\n writeLine();\n writeLine(` ${icons.progress} Syncing to Postgres...`);\n\n try {\n const response = await fetch(`${bridgeUrl}/api/sync/learnings`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ learnings: allLearnings }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Bridge returned ${response.status}: ${errorText}`);\n }\n\n const result = await response.json() as { imported: number; skipped: number };\n writeLine(` ${icons.success} Imported ${colors.green}${result.imported}${RESET} learnings${result.skipped > 0 ? `, skipped ${result.skipped} duplicates` : ''}`);\n\n } catch (error) {\n writeLine(` ${icons.error} ${colors.red}Sync failed: ${error}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}API unavailable. Run \\`squads login\\` to connect.${RESET}`);\n }\n\n writeLine();\n}\n\n/**\n * Push local memory changes to git remote\n */\nfunction gitPushMemory(): { success: boolean; output: string } {\n try {\n // Check if there are uncommitted changes in memory\n const status = execSync('git status --porcelain .agents/memory/', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n if (status) {\n // Stage and commit memory changes\n execSync('git add .agents/memory/', { stdio: ['pipe', 'pipe', 'pipe'] });\n execSync('git commit -m \"chore: sync squad memory\"', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n }\n\n // Push to remote\n const output = execSync('git push origin main', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n return { success: true, output: output.trim() || 'Pushed successfully' };\n } catch (error) {\n const err = error as { message?: string };\n return { success: false, output: err.message || 'Push failed' };\n }\n}\n\nexport async function syncCommand(options: { verbose?: boolean; push?: boolean; pull?: boolean; postgres?: boolean; dimensions?: boolean; learnings?: boolean; autoLearn?: boolean } = {}): Promise<void> {\n await track(Events.CLI_MEMORY_SYNC, { push: options.push, pull: options.pull, postgres: options.postgres, dimensions: options.dimensions, learnings: options.learnings, autoLearn: options.autoLearn });\n\n // If --dimensions flag, sync squad/agent definitions to Postgres dim tables\n if (options.dimensions) {\n await syncDimensionsToPostgres(options.verbose);\n return;\n }\n\n // If --learnings flag, sync learnings.md files to Postgres\n if (options.learnings) {\n await syncLearningsToPostgres(options.verbose);\n return;\n }\n\n // If --auto-learn flag, generate and append learnings from commits\n if (options.autoLearn) {\n const memoryDir = findMemoryDir();\n if (!memoryDir) {\n writeLine(` ${colors.yellow}No .agents/memory directory found${RESET}`);\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory sync --auto-learn${RESET}`);\n writeLine();\n\n // Get commits since last sync (or last 20)\n const lastSync = getLastSyncTime(memoryDir);\n const commits = getRecentCommits(lastSync || undefined);\n\n if (commits.length === 0) {\n writeLine(` ${colors.dim}No commits to analyze${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${icons.progress} Analyzing ${colors.cyan}${commits.length}${RESET} commits...`);\n\n // Analyze and generate learnings\n const learnings = analyzeCommitsForLearnings(commits, buildSquadMappings());\n\n if (learnings.length === 0) {\n writeLine(` ${colors.dim}No significant patterns detected${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${icons.success} Found ${colors.cyan}${learnings.length}${RESET} learnable patterns`);\n writeLine();\n\n // Show what will be captured\n if (options.verbose) {\n for (const learning of learnings) {\n const emoji = { success: '✓', failure: '✗', pattern: '◆', tip: '→' }[learning.category];\n writeLine(` ${colors.cyan}${learning.squad}${RESET} ${emoji} ${learning.insight.slice(0, 60)}${learning.insight.length > 60 ? '...' : ''}`);\n }\n writeLine();\n }\n\n // Append to learnings.md files\n const appended = appendAutoLearnings(memoryDir, learnings);\n\n writeLine(` ${icons.success} Captured ${colors.green}${appended}${RESET} learnings to memory`);\n\n // Show summary by squad\n const bySquad = new Map<string, number>();\n for (const l of learnings) {\n bySquad.set(l.squad, (bySquad.get(l.squad) || 0) + 1);\n }\n for (const [squad, count] of bySquad) {\n writeLine(` ${colors.cyan}${squad}${RESET}: ${count} learnings`);\n }\n\n writeLine();\n\n // Update last sync time\n updateLastSyncTime(memoryDir);\n\n // Sync to Postgres if requested\n if (options.postgres) {\n await syncLearningsToPostgres(options.verbose);\n }\n\n return;\n }\n const memoryDir = findMemoryDir();\n const _squadsDir = findSquadsDir();\n\n if (!memoryDir) {\n writeLine(` ${colors.yellow}No .agents/memory directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n return; // Graceful exit - don't fail hooks\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory sync${RESET}`);\n writeLine();\n\n // Default behavior: pull from remote\n const doPull = options.pull !== false; // Pull by default unless explicitly disabled\n const doPush = options.push === true; // Only push if explicitly requested\n\n // Step 1: Pull from git remote\n if (doPull) {\n writeLine(` ${icons.progress} Pulling from remote...`);\n const pullResult = gitPullMemory();\n\n if (pullResult.success) {\n if (pullResult.behind > 0) {\n writeLine(` ${icons.success} Pulled ${colors.cyan}${pullResult.behind}${RESET} commits from remote`);\n } else {\n writeLine(` ${icons.success} ${colors.dim}Already up to date${RESET}`);\n }\n if (pullResult.ahead > 0) {\n writeLine(` ${colors.dim} ${pullResult.ahead} local commits to push${RESET}`);\n }\n } else {\n writeLine(` ${icons.error} ${colors.red}Pull failed: ${pullResult.output}${RESET}`);\n }\n writeLine();\n }\n\n // Get last sync time\n const lastSync = getLastSyncTime(memoryDir);\n if (lastSync) {\n writeLine(` ${colors.dim}Last sync: ${lastSync.split('T')[0]}${RESET}`);\n } else {\n writeLine(` ${colors.dim}First sync${RESET}`);\n }\n writeLine();\n\n // Get recent commits\n const commits = getRecentCommits(lastSync || undefined);\n\n if (commits.length === 0) {\n writeLine(` ${colors.yellow}No new commits since last sync${RESET}`);\n\n // Still sync to Postgres if requested (even without new commits)\n if (options.postgres) {\n writeLine();\n writeLine(` ${icons.progress} Syncing cycle data to Postgres...`);\n\n const pgAvailable = await isPostgresAvailable();\n if (!pgAvailable) {\n writeLine(` ${icons.error} ${colors.red}Postgres not available${RESET}`);\n writeLine(` ${colors.dim}Database not configured. Run \\`squads login\\` to connect.${RESET}`);\n } else {\n try {\n const result: SyncResult = await syncAllCycleData();\n\n const totalSynced = result.goals.synced + result.feedback.synced + result.kpis.synced + result.learnings.synced;\n const totalErrors = result.goals.errors + result.feedback.errors + result.kpis.errors + result.learnings.errors;\n\n if (totalSynced > 0 || totalErrors > 0) {\n writeLine(` ${icons.success} Synced to Postgres ${colors.dim}(${result.duration}ms)${RESET}`);\n if (result.goals.synced > 0) {\n writeLine(` ${colors.dim}Goals:${RESET} ${colors.cyan}${result.goals.synced}${RESET}`);\n }\n if (result.feedback.synced > 0) {\n writeLine(` ${colors.dim}Feedback:${RESET} ${colors.cyan}${result.feedback.synced}${RESET}`);\n }\n if (result.kpis.synced > 0) {\n writeLine(` ${colors.dim}KPIs:${RESET} ${colors.cyan}${result.kpis.synced}${RESET}`);\n }\n if (result.learnings.synced > 0) {\n writeLine(` ${colors.dim}Learnings:${RESET} ${colors.cyan}${result.learnings.synced}${RESET}`);\n }\n if (totalErrors > 0) {\n writeLine(` ${colors.red}Errors:${RESET} ${totalErrors}`);\n }\n } else {\n writeLine(` ${icons.success} ${colors.dim}No new cycle data to sync${RESET}`);\n }\n\n await closeCycleSyncPool();\n } catch (err) {\n writeLine(` ${icons.error} ${colors.red}Postgres sync failed${RESET}`);\n if (process.env.DEBUG) console.error(err);\n }\n }\n }\n\n writeLine();\n return;\n }\n\n writeLine(` ${colors.cyan}${commits.length}${RESET} commits to process`);\n writeLine();\n\n // Group by squad (mappings built dynamically from local squad definitions)\n const bySquad = groupCommitsBySquad(commits, buildSquadMappings());\n\n if (bySquad.size === 0) {\n writeLine(` ${colors.yellow}No squad-related commits found${RESET}`);\n writeLine();\n updateLastSyncTime(memoryDir);\n return;\n }\n\n // Update each squad's memory\n let updated = 0;\n for (const [squad, squadCommits] of bySquad) {\n const summary = generateSummary(squadCommits);\n\n if (options.verbose) {\n writeLine(` ${icons.progress} ${colors.cyan}${squad}${RESET}`);\n for (const commit of squadCommits) {\n writeLine(` ${colors.dim}${commit.hash} ${commit.message}${RESET}`);\n }\n }\n\n const success = appendToSquadMemory(memoryDir, squad, summary);\n if (success) {\n writeLine(` ${icons.success} ${colors.cyan}${squad}${RESET} ${colors.dim}(${squadCommits.length} commits)${RESET}`);\n updated++;\n }\n }\n\n writeLine();\n writeLine(` ${colors.green}${updated}${RESET} squad memories updated`);\n writeLine();\n\n // Update last sync time\n updateLastSyncTime(memoryDir);\n\n // Step 3: Push to remote if requested\n if (doPush) {\n writeLine(` ${icons.progress} Pushing to remote...`);\n const pushResult = gitPushMemory();\n\n if (pushResult.success) {\n writeLine(` ${icons.success} ${colors.green}Pushed memory updates to remote${RESET}`);\n } else {\n writeLine(` ${icons.error} ${colors.red}Push failed: ${pushResult.output}${RESET}`);\n }\n writeLine();\n }\n\n // Step 4: Sync to Postgres if requested\n if (options.postgres) {\n writeLine(` ${icons.progress} Syncing cycle data to Postgres...`);\n\n const pgAvailable = await isPostgresAvailable();\n if (!pgAvailable) {\n writeLine(` ${icons.error} ${colors.red}Postgres not available${RESET}`);\n writeLine(` ${colors.dim}Database not configured. Run \\`squads login\\` to connect.${RESET}`);\n writeLine();\n } else {\n try {\n const result: SyncResult = await syncAllCycleData();\n\n const totalSynced = result.goals.synced + result.feedback.synced + result.kpis.synced + result.learnings.synced;\n const totalErrors = result.goals.errors + result.feedback.errors + result.kpis.errors + result.learnings.errors;\n\n if (totalSynced > 0 || totalErrors > 0) {\n writeLine(` ${icons.success} Synced to Postgres ${colors.dim}(${result.duration}ms)${RESET}`);\n if (result.goals.synced > 0) {\n writeLine(` ${colors.dim}Goals:${RESET} ${colors.cyan}${result.goals.synced}${RESET}`);\n }\n if (result.feedback.synced > 0) {\n writeLine(` ${colors.dim}Feedback:${RESET} ${colors.cyan}${result.feedback.synced}${RESET}`);\n }\n if (result.kpis.synced > 0) {\n writeLine(` ${colors.dim}KPIs:${RESET} ${colors.cyan}${result.kpis.synced}${RESET}`);\n }\n if (result.learnings.synced > 0) {\n writeLine(` ${colors.dim}Learnings:${RESET} ${colors.cyan}${result.learnings.synced}${RESET}`);\n }\n if (totalErrors > 0) {\n writeLine(` ${colors.red}Errors:${RESET} ${totalErrors}`);\n }\n } else {\n writeLine(` ${icons.success} ${colors.dim}No new cycle data to sync${RESET}`);\n }\n writeLine();\n\n await closeCycleSyncPool();\n } catch (err) {\n writeLine(` ${icons.error} ${colors.red}Postgres sync failed${RESET}`);\n if (process.env.DEBUG) console.error(err);\n writeLine();\n }\n }\n }\n\n // Show helpful commands\n writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}<squad>${RESET} ${colors.dim}View updated memory${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads status ${colors.dim}See all squads${RESET}`);\n if (!doPush && updated > 0) {\n writeLine(` ${colors.dim}$${RESET} squads memory sync --push ${colors.dim}Push changes to remote${RESET}`);\n }\n if (!options.postgres) {\n writeLine(` ${colors.dim}$${RESET} squads memory sync --postgres ${colors.dim}Sync to Postgres${RESET}`);\n }\n writeLine();\n}\n","/**\n * Cycle Data Sync — stub implementation\n *\n * Syncing cycle data to Postgres is a platform feature (Layer 3).\n * The CLI (Layer 1) stores all data in local markdown/JSON files.\n * These stubs maintain API compatibility for the sync command.\n */\n\n/**\n * Sync result for a single data type\n */\nexport interface SyncStats {\n synced: number;\n skipped: number;\n errors: number;\n}\n\n/**\n * Full sync result\n */\nexport interface SyncResult {\n goals: SyncStats;\n feedback: SyncStats;\n kpis: SyncStats;\n learnings: SyncStats;\n duration: number;\n}\n\n/**\n * Sync all cycle data (no-op without database)\n */\nexport async function syncAllCycleData(): Promise<SyncResult> {\n return {\n goals: { synced: 0, skipped: 0, errors: 0 },\n feedback: { synced: 0, skipped: 0, errors: 0 },\n kpis: { synced: 0, skipped: 0, errors: 0 },\n learnings: { synced: 0, skipped: 0, errors: 0 },\n duration: 0,\n };\n}\n\n/**\n * Check if Postgres is available (always false in CLI-only mode)\n */\nexport async function isPostgresAvailable(): Promise<boolean> {\n return false;\n}\n\n/**\n * Close the connection pool (no-op)\n */\nexport async function closeCycleSyncPool(): Promise<void> {\n // No-op: no database connection in CLI-only mode\n}\n"],"mappings":"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","names":["memoryDir","lastSync","commits","bySquad"]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Agent Instructions
|
|
2
|
+
|
|
3
|
+
Guidance for AI coding agents working on this project.
|
|
4
|
+
|
|
5
|
+
## This Project Uses Squads
|
|
6
|
+
|
|
7
|
+
AI agents are organized into squads — domain-aligned teams defined in `.agents/squads/`.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
.agents/
|
|
11
|
+
├── config/
|
|
12
|
+
│ └── SYSTEM.md # Rules every agent follows
|
|
13
|
+
├── squads/
|
|
14
|
+
│ └── <squad>/
|
|
15
|
+
│ ├── SQUAD.md # Squad identity, goals, output format
|
|
16
|
+
│ └── <agent>.md # Agent definition
|
|
17
|
+
└── memory/
|
|
18
|
+
└── <squad>/<agent>/ # Persistent state
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Before Starting Work
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
squads status # See all squads, milestones, open PRs
|
|
25
|
+
squads status <squad> # Squad detail
|
|
26
|
+
squads memory read <squad> # What the squad already knows
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## During Work
|
|
30
|
+
|
|
31
|
+
- Check for existing PRs and issues before creating new ones
|
|
32
|
+
- Prefer editing existing files over creating new ones
|
|
33
|
+
- Keep changes focused — one task per commit/PR
|
|
34
|
+
- Use `--json` on any squads command for machine-readable output
|
|
35
|
+
|
|
36
|
+
## After Work
|
|
37
|
+
|
|
38
|
+
- Persist learnings: `squads memory write <squad> "insight"`
|
|
39
|
+
- Update state in `.agents/memory/<squad>/<agent>/state.md`
|
|
40
|
+
- Create GitHub issues for follow-up work
|
|
41
|
+
|
|
42
|
+
## Commands
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
squads run <squad/agent> # Run an agent
|
|
46
|
+
squads status # Overview
|
|
47
|
+
squads memory read <squad> # Recall squad knowledge
|
|
48
|
+
squads memory write <squad> "x" # Persist a learning
|
|
49
|
+
squads env show <squad> --json # Execution context
|
|
50
|
+
squads goal list # View squad goals
|
|
51
|
+
```
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Business Brief
|
|
2
|
+
|
|
3
|
+
## #1 Priority
|
|
4
|
+
|
|
5
|
+
**[Define your top priority here]**
|
|
6
|
+
|
|
7
|
+
## Runway
|
|
8
|
+
|
|
9
|
+
**Pressure**: LOW | MEDIUM | HIGH
|
|
10
|
+
|
|
11
|
+
## Current Focus
|
|
12
|
+
|
|
13
|
+
1. **[Focus area 1]** - Description
|
|
14
|
+
2. **[Focus area 2]** - Description
|
|
15
|
+
3. **[Focus area 3]** - Description
|
|
16
|
+
|
|
17
|
+
## Blockers
|
|
18
|
+
|
|
19
|
+
- None currently (or list blockers)
|
|
20
|
+
|
|
21
|
+
## Decision Framework
|
|
22
|
+
|
|
23
|
+
1. Does this drive the #1 priority?
|
|
24
|
+
2. Is there a simpler approach?
|
|
25
|
+
3. What's the opportunity cost?
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
*This file is read by `squads context` to provide business alignment.*
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Claude-Specific Instructions
|
|
2
|
+
|
|
3
|
+
Extends AGENTS.md with Claude Code specific features.
|
|
4
|
+
|
|
5
|
+
## New Project Setup
|
|
6
|
+
|
|
7
|
+
If this project needs squads setup, run:
|
|
8
|
+
```bash
|
|
9
|
+
squads init # Plant the seed: create manager, CLI skill, and squads
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Skill Available
|
|
13
|
+
|
|
14
|
+
Use `/squads-workflow` for detailed workflow guidance.
|
|
15
|
+
|
|
16
|
+
## Session Hooks
|
|
17
|
+
|
|
18
|
+
Claude Code hooks are configured in `.claude/settings.json`:
|
|
19
|
+
- **SessionStart**: Runs `squads status` automatically
|
|
20
|
+
- **Stop**: Syncs memory and prompts for learnings
|
|
21
|
+
|
|
22
|
+
## Creating Agents
|
|
23
|
+
|
|
24
|
+
Agents live in `.agents/squads/<squad-name>/<agent-name>.md`:
|
|
25
|
+
|
|
26
|
+
```markdown
|
|
27
|
+
# Agent Name
|
|
28
|
+
|
|
29
|
+
## Purpose
|
|
30
|
+
One sentence: what this agent does.
|
|
31
|
+
|
|
32
|
+
## Model
|
|
33
|
+
simple # or: worker, leader
|
|
34
|
+
|
|
35
|
+
## Instructions
|
|
36
|
+
1. Specific step
|
|
37
|
+
2. Another step
|
|
38
|
+
3. Output location
|
|
39
|
+
|
|
40
|
+
## Output
|
|
41
|
+
What it produces and where it goes.
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Commit Signature
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
Co-Authored-By: Claude <model> <noreply@anthropic.com>
|
|
48
|
+
```
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# {{SQUAD_NAME}}
|
|
2
|
+
|
|
3
|
+
{{SQUAD_DESCRIPTION}}
|
|
4
|
+
|
|
5
|
+
## Goals
|
|
6
|
+
|
|
7
|
+
- [ ] {{GOAL}}
|
|
8
|
+
|
|
9
|
+
## Agents
|
|
10
|
+
|
|
11
|
+
| Agent | Purpose |
|
|
12
|
+
|-------|---------|
|
|
13
|
+
| lead | Orchestrates the squad and coordinates work |
|
|
14
|
+
|
|
15
|
+
## Pipeline
|
|
16
|
+
|
|
17
|
+
`lead` (orchestrates all work)
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
squads run {{SQUAD_ID}} --execute
|
|
23
|
+
```
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Lead Agent
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
Orchestrate the {{SQUAD_NAME}} squad to achieve its goals.
|
|
5
|
+
|
|
6
|
+
## Model
|
|
7
|
+
leader
|
|
8
|
+
|
|
9
|
+
## Tools
|
|
10
|
+
- Read
|
|
11
|
+
- Write
|
|
12
|
+
- Edit
|
|
13
|
+
- Bash
|
|
14
|
+
- WebSearch
|
|
15
|
+
- WebFetch
|
|
16
|
+
- Task
|
|
17
|
+
|
|
18
|
+
## Instructions
|
|
19
|
+
|
|
20
|
+
You are the lead agent for the {{SQUAD_NAME}} squad.
|
|
21
|
+
|
|
22
|
+
**Goal**: {{GOAL}}
|
|
23
|
+
|
|
24
|
+
### Approach
|
|
25
|
+
|
|
26
|
+
1. **Understand the goal** - Break down what needs to be accomplished
|
|
27
|
+
2. **Plan the work** - Create a clear execution plan
|
|
28
|
+
3. **Execute** - Work through the plan step by step
|
|
29
|
+
4. **Verify** - Confirm the goal is achieved
|
|
30
|
+
5. **Document** - Update memory with learnings
|
|
31
|
+
|
|
32
|
+
### Guidelines
|
|
33
|
+
|
|
34
|
+
- Use the Task tool to spawn sub-agents for complex, parallelizable work
|
|
35
|
+
- Check existing memory before researching: `squads memory query "<topic>"`
|
|
36
|
+
- Create GitHub issues for follow-up work
|
|
37
|
+
- Update `.agents/memory/{{SQUAD_ID}}/lead/state.md` with progress
|
|
38
|
+
|
|
39
|
+
## Output
|
|
40
|
+
Progress updates and work artifacts as appropriate.
|
|
41
|
+
|
|
42
|
+
## Labels
|
|
43
|
+
- lead
|
|
44
|
+
- orchestration
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Getting Started with Squads
|
|
2
|
+
|
|
3
|
+
## What You've Set Up
|
|
4
|
+
|
|
5
|
+
- **Your first squad** ready to run (`squads run {{SQUAD_ID}}`)
|
|
6
|
+
- **Memory system** for persistent context
|
|
7
|
+
- **Hooks** that sync status and memory automatically
|
|
8
|
+
|
|
9
|
+
## Next Steps
|
|
10
|
+
|
|
11
|
+
1. Run your squad: `squads run {{SQUAD_ID}} --execute`
|
|
12
|
+
2. Check the dashboard: `squads dash`
|
|
13
|
+
3. Create more squads in `.agents/squads/`
|
|
14
|
+
|
|
15
|
+
## Tips
|
|
16
|
+
|
|
17
|
+
- Check memory before researching: `squads memory query "<topic>"`
|
|
18
|
+
- Use `squads context` for business alignment on complex tasks
|
|
19
|
+
- Agents are reusable - if you do something twice, make it an agent
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Business Brief — {{BUSINESS_NAME}}
|
|
2
|
+
|
|
3
|
+
{{PLACEHOLDER_SENTINEL}}## About
|
|
4
|
+
|
|
5
|
+
{{BUSINESS_DESCRIPTION}}
|
|
6
|
+
|
|
7
|
+
## Research Focus
|
|
8
|
+
|
|
9
|
+
{{BUSINESS_FOCUS}}
|
|
10
|
+
|
|
11
|
+
{{COMPETITORS_SECTION}}## Priority
|
|
12
|
+
|
|
13
|
+
**#1**: Deliver value in the research focus above.
|
|
14
|
+
|
|
15
|
+
## Pressure
|
|
16
|
+
|
|
17
|
+
LOW — Learning phase. Explore, experiment, report findings.
|
|
18
|
+
|
|
19
|
+
## Decision Framework
|
|
20
|
+
|
|
21
|
+
1. Does this advance our focus area?
|
|
22
|
+
2. Is there a simpler approach for 80% of the value?
|
|
23
|
+
3. What's the opportunity cost?
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
*Read by all agents before every run. Edit this file to change what your workforce focuses on.*
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# AI Workforce Operating Manual
|
|
2
|
+
|
|
3
|
+
This project uses [Agents Squads](https://agents-squads.com) to run an AI workforce.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
.agents/
|
|
9
|
+
├── BUSINESS_BRIEF.md # What this workforce focuses on
|
|
10
|
+
├── config/
|
|
11
|
+
│ ├── SYSTEM.md # Rules every agent follows (Layer 0)
|
|
12
|
+
│ └── provider.yaml # LLM provider config
|
|
13
|
+
├── squads/
|
|
14
|
+
│ ├── intelligence/ # Strategic synthesis squad
|
|
15
|
+
│ │ ├── SQUAD.md # Mission, goals, agents
|
|
16
|
+
│ │ ├── intel-lead.md # Know / Don't Know / Playbook briefs
|
|
17
|
+
│ │ ├── intel-eval.md # Quality evaluation
|
|
18
|
+
│ │ └── intel-critic.md # Assumption challenges
|
|
19
|
+
│ ├── research/ # Deep research squad
|
|
20
|
+
│ │ ├── SQUAD.md
|
|
21
|
+
│ │ ├── lead.md # Research agenda
|
|
22
|
+
│ │ ├── analyst.md # Sourced findings
|
|
23
|
+
│ │ └── synthesizer.md # Synthesis reports
|
|
24
|
+
│ ├── product/ # Product roadmap squad
|
|
25
|
+
│ │ ├── SQUAD.md
|
|
26
|
+
│ │ ├── lead.md # Roadmap decisions
|
|
27
|
+
│ │ ├── scanner.md # Signal monitoring
|
|
28
|
+
│ │ └── worker.md # Specs and PRDs
|
|
29
|
+
│ └── company/ # Orchestration + feedback
|
|
30
|
+
│ ├── SQUAD.md
|
|
31
|
+
│ ├── manager.md # Coordinates all squads
|
|
32
|
+
│ ├── company-eval.md # Evaluates outputs
|
|
33
|
+
│ └── company-critic.md # Process improvement
|
|
34
|
+
├── memory/
|
|
35
|
+
│ ├── company/
|
|
36
|
+
│ │ ├── manager/state.md
|
|
37
|
+
│ │ └── directives.md # Strategic overlay (Layer 3)
|
|
38
|
+
│ ├── research/lead/state.md
|
|
39
|
+
│ ├── intelligence/intel-lead/state.md
|
|
40
|
+
│ └── product/lead/state.md
|
|
41
|
+
└── skills/
|
|
42
|
+
└── squads-cli/SKILL.md # CLI operations manual
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Context Cascade
|
|
46
|
+
|
|
47
|
+
Every agent execution loads context in this order (higher layers always load, lower layers drop when token budget runs out):
|
|
48
|
+
|
|
49
|
+
| Layer | File | Purpose |
|
|
50
|
+
|-------|------|---------|
|
|
51
|
+
| 0 | `config/SYSTEM.md` | Immutable rules — git, memory, escalation |
|
|
52
|
+
| 1 | `squads/{squad}/SQUAD.md` | Mission, goals, output format |
|
|
53
|
+
| 2 | `memory/{squad}/priorities.md` | Current operational focus |
|
|
54
|
+
| 3 | `memory/company/directives.md` | Company-wide strategic overlay |
|
|
55
|
+
| 4 | `memory/{squad}/active-work.md` | Open PRs/issues — prevent duplication |
|
|
56
|
+
| 5 | `memory/{squad}/{agent}/state.md` | What the agent already knows |
|
|
57
|
+
| 6 | `memory/{squad}/feedback.md` | Last cycle evaluation |
|
|
58
|
+
| 7 | `memory/daily-briefing.md` | Cross-squad context |
|
|
59
|
+
|
|
60
|
+
## Updating Business Goals
|
|
61
|
+
|
|
62
|
+
When the human operator wants to change what the workforce focuses on, help them update these files in order:
|
|
63
|
+
|
|
64
|
+
### 1. Business Brief (what we do)
|
|
65
|
+
Edit `.agents/BUSINESS_BRIEF.md` — this is the root context every agent reads.
|
|
66
|
+
```
|
|
67
|
+
What does the business do? Who are the customers? What market?
|
|
68
|
+
What should agents research first? Who are the competitors?
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 2. Directives (what matters now)
|
|
72
|
+
Edit `.agents/memory/company/directives.md` — this overrides squad goals.
|
|
73
|
+
```
|
|
74
|
+
What is the P0 priority? What metric are we optimizing?
|
|
75
|
+
What constraints apply? What should agents NOT do?
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 3. Squad Goals (what each team does)
|
|
79
|
+
Edit `## Goals` in each `squads/{squad}/SQUAD.md`:
|
|
80
|
+
```bash
|
|
81
|
+
# Or use the CLI:
|
|
82
|
+
squads goal set intelligence "Monitor competitor X's pricing weekly"
|
|
83
|
+
squads goal set research "Deep dive on Y market segment"
|
|
84
|
+
squads goal set product "Write spec for Z feature"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 4. Priorities (what to do this week)
|
|
88
|
+
Create or edit `.agents/memory/{squad}/priorities.md`:
|
|
89
|
+
```
|
|
90
|
+
- Fix issue #123 (blocking users)
|
|
91
|
+
- Research competitor's new feature launch
|
|
92
|
+
- Update roadmap based on last cycle's feedback
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Rule**: Goals are aspirational (stable). Priorities are operational (updated frequently). Directives are strategic (updated less frequently).
|
|
96
|
+
|
|
97
|
+
## For Humans
|
|
98
|
+
|
|
99
|
+
Common commands:
|
|
100
|
+
- `squads status` — What's happening now
|
|
101
|
+
- `squads dash` — Full dashboard
|
|
102
|
+
- `squads run research/lead` — Run a specific agent
|
|
103
|
+
- `squads run research --parallel` — Run the full squad
|
|
104
|
+
- `squads memory read <squad>` — What has the squad learned
|
|
105
|
+
- `squads goal list` — Business objectives
|
|
106
|
+
|
|
107
|
+
## For Agents
|
|
108
|
+
|
|
109
|
+
- Read `BUSINESS_BRIEF.md` and `directives.md` before starting work
|
|
110
|
+
- Read your state from `memory/{squad}/{agent}/state.md`
|
|
111
|
+
- Update state after every run
|
|
112
|
+
- Use the `squads-cli` skill for CLI operations
|
|
113
|
+
- Git is the coordination layer — commit everything
|
|
114
|
+
|
|
115
|
+
## Commit Signature
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
119
|
+
```
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# {{BUSINESS_NAME}}
|
|
2
|
+
|
|
3
|
+
{{BUSINESS_DESCRIPTION}}
|
|
4
|
+
|
|
5
|
+
## AI Workforce
|
|
6
|
+
|
|
7
|
+
This project uses [Agents Squads](https://agents-squads.com) — an AI workforce that runs autonomously.
|
|
8
|
+
|
|
9
|
+
### Squads
|
|
10
|
+
|
|
11
|
+
| Squad | Purpose |
|
|
12
|
+
|-------|---------|
|
|
13
|
+
| intelligence/ | Monitors trends and competitive signals |
|
|
14
|
+
| research/ | Researches your market, competitors, and opportunities |
|
|
15
|
+
| product/ | Roadmap, specs, user feedback synthesis |
|
|
16
|
+
| company/ | Manages goals, events, and strategy |
|
|
17
|
+
|
|
18
|
+
### Key Commands
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# Run a single agent
|
|
22
|
+
squads run research/lead
|
|
23
|
+
|
|
24
|
+
# See all squads and recent activity
|
|
25
|
+
squads dash
|
|
26
|
+
|
|
27
|
+
# Check system status
|
|
28
|
+
squads status
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Setup
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm install -g squads-cli
|
|
35
|
+
squads init
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Edit `.agents/BUSINESS_BRIEF.md` to customize agent context.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
*Powered by [Agents Squads](https://agents-squads.com)*
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# System Protocol
|
|
2
|
+
|
|
3
|
+
Immutable rules for all agent executions. Every agent reads this before starting work.
|
|
4
|
+
|
|
5
|
+
## Before You Start
|
|
6
|
+
|
|
7
|
+
Read `.agents/BUSINESS_BRIEF.md`. If it contains "PLACEHOLDER" in the first lines, STOP and tell the user:
|
|
8
|
+
"Edit .agents/BUSINESS_BRIEF.md with your business details before running agents."
|
|
9
|
+
Do not produce generic output from placeholder context.
|
|
10
|
+
|
|
11
|
+
## Git Workflow
|
|
12
|
+
|
|
13
|
+
Commit all changes. Git is the coordination layer — if it's not committed, it didn't happen.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
git add -A
|
|
17
|
+
git commit -m "{type}({scope}): {description}
|
|
18
|
+
|
|
19
|
+
Co-Authored-By: Claude <noreply@anthropic.com>"
|
|
20
|
+
git push origin main
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Commit types
|
|
24
|
+
`feat`, `fix`, `docs`, `chore`, `memory`, `refactor`, `test`
|
|
25
|
+
|
|
26
|
+
## Memory Protocol
|
|
27
|
+
|
|
28
|
+
- **Read before acting.** Always check `.agents/memory/{squad}/{agent}/state.md` before starting work.
|
|
29
|
+
- **Write after acting.** Update state.md with what you did, what you learned, and what's next.
|
|
30
|
+
- **Don't repeat work.** If state.md says something was already done, build on it — don't redo it.
|
|
31
|
+
|
|
32
|
+
## Output Rules
|
|
33
|
+
|
|
34
|
+
- Every claim needs a source (URL, document, or data point)
|
|
35
|
+
- "Interesting" is not enough — outputs must be actionable
|
|
36
|
+
- If nothing changed since last run, say so explicitly and stop
|
|
37
|
+
- Quality over quantity — 3 actionable insights beat 20 generic observations
|
|
38
|
+
|
|
39
|
+
## Escalation
|
|
40
|
+
|
|
41
|
+
Escalate to the human operator when:
|
|
42
|
+
- Spend exceeds $50 in a single session
|
|
43
|
+
- Scope is unclear or contradicts business goals
|
|
44
|
+
- A destructive action is needed (deleting data, overwriting work)
|
|
45
|
+
- You're unsure whether to proceed
|
|
46
|
+
|
|
47
|
+
## Coordination
|
|
48
|
+
|
|
49
|
+
- Agents communicate through memory files, not direct messages
|
|
50
|
+
- Squad leads coordinate their agents via state.md and memory writes
|
|
51
|
+
- The company manager coordinates across squads
|
|
52
|
+
- Check `squads status --json` for org-wide awareness
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hooks": {
|
|
3
|
+
"SessionStart": [
|
|
4
|
+
{
|
|
5
|
+
"hooks": [
|
|
6
|
+
{
|
|
7
|
+
"type": "command",
|
|
8
|
+
"command": "squads status",
|
|
9
|
+
"timeout": 10
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"type": "command",
|
|
13
|
+
"command": "squads memory sync --no-push",
|
|
14
|
+
"timeout": 15
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"Stop": [
|
|
20
|
+
{
|
|
21
|
+
"hooks": [
|
|
22
|
+
{
|
|
23
|
+
"type": "command",
|
|
24
|
+
"command": "squads memory sync --push",
|
|
25
|
+
"timeout": 15
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
}
|