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.
Files changed (223) hide show
  1. package/README.md +521 -288
  2. package/dist/auth-YW3UPFSB.js +23 -0
  3. package/dist/auth-YW3UPFSB.js.map +1 -0
  4. package/dist/autonomy-PSVZVX7A.js +105 -0
  5. package/dist/autonomy-PSVZVX7A.js.map +1 -0
  6. package/dist/chunk-67RO2HKR.js +174 -0
  7. package/dist/chunk-67RO2HKR.js.map +1 -0
  8. package/dist/chunk-7OCVIDC7.js +12 -0
  9. package/dist/chunk-7OCVIDC7.js.map +1 -0
  10. package/dist/chunk-BODLDQY7.js +452 -0
  11. package/dist/chunk-BODLDQY7.js.map +1 -0
  12. package/dist/chunk-EHQJHRIW.js +103 -0
  13. package/dist/chunk-EHQJHRIW.js.map +1 -0
  14. package/dist/chunk-FFFCFZ6A.js +121 -0
  15. package/dist/chunk-FFFCFZ6A.js.map +1 -0
  16. package/dist/chunk-FIWT2NMM.js +165 -0
  17. package/dist/chunk-FIWT2NMM.js.map +1 -0
  18. package/dist/chunk-HF4WR7RA.js +154 -0
  19. package/dist/chunk-HF4WR7RA.js.map +1 -0
  20. package/dist/chunk-J6QF4ZQX.js +230 -0
  21. package/dist/chunk-J6QF4ZQX.js.map +1 -0
  22. package/dist/chunk-LOA3KWYJ.js +294 -0
  23. package/dist/chunk-LOA3KWYJ.js.map +1 -0
  24. package/dist/chunk-M5FXNY6Y.js +384 -0
  25. package/dist/chunk-M5FXNY6Y.js.map +1 -0
  26. package/dist/chunk-QHNUMM4V.js +87 -0
  27. package/dist/chunk-QHNUMM4V.js.map +1 -0
  28. package/dist/chunk-QJ7C7CMB.js +223 -0
  29. package/dist/chunk-QJ7C7CMB.js.map +1 -0
  30. package/dist/chunk-RM6BWILN.js +74 -0
  31. package/dist/chunk-RM6BWILN.js.map +1 -0
  32. package/dist/chunk-TYFTF53O.js +613 -0
  33. package/dist/chunk-TYFTF53O.js.map +1 -0
  34. package/dist/chunk-TZXD6WFN.js +420 -0
  35. package/dist/chunk-TZXD6WFN.js.map +1 -0
  36. package/dist/chunk-WVOIY5GW.js +621 -0
  37. package/dist/chunk-WVOIY5GW.js.map +1 -0
  38. package/dist/chunk-Z2UKDBNL.js +162 -0
  39. package/dist/chunk-Z2UKDBNL.js.map +1 -0
  40. package/dist/chunk-ZTQ7ISUR.js +338 -0
  41. package/dist/chunk-ZTQ7ISUR.js.map +1 -0
  42. package/dist/cli.js +2483 -5902
  43. package/dist/cli.js.map +1 -1
  44. package/dist/context-GWPF4SEY.js +291 -0
  45. package/dist/context-GWPF4SEY.js.map +1 -0
  46. package/dist/context-feed-AJGVAR6H.js +394 -0
  47. package/dist/context-feed-AJGVAR6H.js.map +1 -0
  48. package/dist/cost-XBCDJ7XC.js +275 -0
  49. package/dist/cost-XBCDJ7XC.js.map +1 -0
  50. package/dist/create-BLFGG6PF.js +286 -0
  51. package/dist/create-BLFGG6PF.js.map +1 -0
  52. package/dist/dashboard-LGT2B2BL.js +951 -0
  53. package/dist/dashboard-LGT2B2BL.js.map +1 -0
  54. package/dist/dashboard-RMK2BOD2.js +794 -0
  55. package/dist/dashboard-RMK2BOD2.js.map +1 -0
  56. package/dist/doctor-XPUIIBHJ.js +374 -0
  57. package/dist/doctor-XPUIIBHJ.js.map +1 -0
  58. package/dist/env-config-SQEI3Y7Y.js +21 -0
  59. package/dist/env-config-SQEI3Y7Y.js.map +1 -0
  60. package/dist/exec-OUXM7JBF.js +223 -0
  61. package/dist/exec-OUXM7JBF.js.map +1 -0
  62. package/dist/feedback-KNAOG5QK.js +229 -0
  63. package/dist/feedback-KNAOG5QK.js.map +1 -0
  64. package/dist/github-UQTM5KMS.js +23 -0
  65. package/dist/github-UQTM5KMS.js.map +1 -0
  66. package/dist/goal-BVHV5573.js +168 -0
  67. package/dist/goal-BVHV5573.js.map +1 -0
  68. package/dist/health-4UXN44PF.js +218 -0
  69. package/dist/health-4UXN44PF.js.map +1 -0
  70. package/dist/history-ILH3SWHB.js +232 -0
  71. package/dist/history-ILH3SWHB.js.map +1 -0
  72. package/dist/index.d.ts +736 -8
  73. package/dist/index.js +1312 -6
  74. package/dist/index.js.map +1 -1
  75. package/dist/init-XQZ7BOGT.js +812 -0
  76. package/dist/init-XQZ7BOGT.js.map +1 -0
  77. package/dist/kpi-RQIU7WGK.js +413 -0
  78. package/dist/kpi-RQIU7WGK.js.map +1 -0
  79. package/dist/learn-OIFUVZAS.js +269 -0
  80. package/dist/learn-OIFUVZAS.js.map +1 -0
  81. package/dist/login-DXZANWZY.js +155 -0
  82. package/dist/login-DXZANWZY.js.map +1 -0
  83. package/dist/memory-T3ACCS7E.js +560 -0
  84. package/dist/memory-T3ACCS7E.js.map +1 -0
  85. package/dist/memory-VNF2VFRB.js +23 -0
  86. package/dist/memory-VNF2VFRB.js.map +1 -0
  87. package/dist/progress-DAUZMT3N.js +202 -0
  88. package/dist/progress-DAUZMT3N.js.map +1 -0
  89. package/dist/providers-3P5D2XL5.js +65 -0
  90. package/dist/providers-3P5D2XL5.js.map +1 -0
  91. package/dist/results-UECWGLTB.js +224 -0
  92. package/dist/results-UECWGLTB.js.map +1 -0
  93. package/dist/run-I6KAXU6U.js +4049 -0
  94. package/dist/run-I6KAXU6U.js.map +1 -0
  95. package/dist/session-HBU6KZOD.js +64 -0
  96. package/dist/session-HBU6KZOD.js.map +1 -0
  97. package/dist/sessions-CK25VGPL.js +333 -0
  98. package/dist/sessions-CK25VGPL.js.map +1 -0
  99. package/dist/squad-parser-DCG65BJS.js +35 -0
  100. package/dist/squad-parser-DCG65BJS.js.map +1 -0
  101. package/dist/stats-G6NAU5BD.js +334 -0
  102. package/dist/stats-G6NAU5BD.js.map +1 -0
  103. package/dist/status-AQNLDZVN.js +352 -0
  104. package/dist/status-AQNLDZVN.js.map +1 -0
  105. package/dist/sync-ZI3MHA4G.js +836 -0
  106. package/dist/sync-ZI3MHA4G.js.map +1 -0
  107. package/dist/templates/core/AGENTS.md.template +51 -0
  108. package/dist/templates/core/BUSINESS_BRIEF.md.template +29 -0
  109. package/dist/templates/core/CLAUDE.md.template +48 -0
  110. package/dist/templates/core/provider.yaml.template +5 -0
  111. package/dist/templates/first-squad/SQUAD.md.template +23 -0
  112. package/dist/templates/first-squad/lead.md.template +44 -0
  113. package/dist/templates/memory/getting-started/state.md.template +19 -0
  114. package/dist/templates/seed/BUSINESS_BRIEF.md.template +27 -0
  115. package/dist/templates/seed/CLAUDE.md.template +119 -0
  116. package/dist/templates/seed/README.md.template +42 -0
  117. package/dist/templates/seed/config/SYSTEM.md +52 -0
  118. package/dist/templates/seed/config/provider.yaml +4 -0
  119. package/dist/templates/seed/hooks/settings.json.template +31 -0
  120. package/dist/templates/seed/memory/company/directives.md +37 -0
  121. package/dist/templates/seed/memory/company/manager/state.md +16 -0
  122. package/dist/templates/seed/memory/engineering/issue-solver/state.md +12 -0
  123. package/dist/templates/seed/memory/intelligence/intel-lead/state.md +9 -0
  124. package/dist/templates/seed/memory/marketing/content-drafter/state.md +12 -0
  125. package/dist/templates/seed/memory/operations/ops-lead/state.md +12 -0
  126. package/dist/templates/seed/memory/product/lead/state.md +14 -0
  127. package/dist/templates/seed/memory/research/lead/state.md +14 -0
  128. package/dist/templates/seed/skills/gh/SKILL.md +57 -0
  129. package/dist/templates/seed/skills/squads-cli/SKILL.md +84 -0
  130. package/dist/templates/seed/squads/company/SQUAD.md +51 -0
  131. package/dist/templates/seed/squads/company/company-critic.md +49 -0
  132. package/dist/templates/seed/squads/company/company-eval.md +49 -0
  133. package/dist/templates/seed/squads/company/event-dispatcher.md +43 -0
  134. package/dist/templates/seed/squads/company/goal-tracker.md +43 -0
  135. package/dist/templates/seed/squads/company/manager.md +54 -0
  136. package/dist/templates/seed/squads/engineering/SQUAD.md +48 -0
  137. package/dist/templates/seed/squads/engineering/code-reviewer.md +57 -0
  138. package/dist/templates/seed/squads/engineering/issue-solver.md +58 -0
  139. package/dist/templates/seed/squads/engineering/test-writer.md +50 -0
  140. package/dist/templates/seed/squads/intelligence/SQUAD.md +38 -0
  141. package/dist/templates/seed/squads/intelligence/intel-critic.md +36 -0
  142. package/dist/templates/seed/squads/intelligence/intel-eval.md +31 -0
  143. package/dist/templates/seed/squads/intelligence/intel-lead.md +71 -0
  144. package/dist/templates/seed/squads/marketing/SQUAD.md +47 -0
  145. package/dist/templates/seed/squads/marketing/content-drafter.md +71 -0
  146. package/dist/templates/seed/squads/marketing/growth-analyst.md +49 -0
  147. package/dist/templates/seed/squads/marketing/social-poster.md +44 -0
  148. package/dist/templates/seed/squads/operations/SQUAD.md +45 -0
  149. package/dist/templates/seed/squads/operations/finance-tracker.md +47 -0
  150. package/dist/templates/seed/squads/operations/goal-tracker.md +48 -0
  151. package/dist/templates/seed/squads/operations/ops-lead.md +58 -0
  152. package/dist/templates/seed/squads/product/SQUAD.md +41 -0
  153. package/dist/templates/seed/squads/product/lead.md +56 -0
  154. package/dist/templates/seed/squads/product/scanner.md +50 -0
  155. package/dist/templates/seed/squads/product/worker.md +55 -0
  156. package/dist/templates/seed/squads/research/SQUAD.md +38 -0
  157. package/dist/templates/seed/squads/research/analyst.md +50 -0
  158. package/dist/templates/seed/squads/research/lead.md +52 -0
  159. package/dist/templates/seed/squads/research/synthesizer.md +59 -0
  160. package/dist/templates/skills/squads-learn/SKILL.md +86 -0
  161. package/dist/templates/skills/squads-workflow/instruction.md +70 -0
  162. package/dist/terminal-FBQFQTKZ.js +55 -0
  163. package/dist/terminal-FBQFQTKZ.js.map +1 -0
  164. package/dist/update-D7CGIZ3M.js +18 -0
  165. package/dist/update-D7CGIZ3M.js.map +1 -0
  166. package/dist/update-STU276HR.js +83 -0
  167. package/dist/update-STU276HR.js.map +1 -0
  168. package/package.json +31 -13
  169. package/templates/core/AGENTS.md.template +51 -0
  170. package/templates/core/BUSINESS_BRIEF.md.template +29 -0
  171. package/templates/core/CLAUDE.md.template +48 -0
  172. package/templates/core/provider.yaml.template +5 -0
  173. package/templates/first-squad/SQUAD.md.template +23 -0
  174. package/templates/first-squad/lead.md.template +44 -0
  175. package/templates/memory/getting-started/state.md.template +19 -0
  176. package/templates/seed/BUSINESS_BRIEF.md.template +27 -0
  177. package/templates/seed/CLAUDE.md.template +119 -0
  178. package/templates/seed/README.md.template +42 -0
  179. package/templates/seed/config/SYSTEM.md +52 -0
  180. package/templates/seed/config/provider.yaml +4 -0
  181. package/templates/seed/hooks/settings.json.template +31 -0
  182. package/templates/seed/memory/company/directives.md +37 -0
  183. package/templates/seed/memory/company/manager/state.md +16 -0
  184. package/templates/seed/memory/engineering/issue-solver/state.md +12 -0
  185. package/templates/seed/memory/intelligence/intel-lead/state.md +9 -0
  186. package/templates/seed/memory/marketing/content-drafter/state.md +12 -0
  187. package/templates/seed/memory/operations/ops-lead/state.md +12 -0
  188. package/templates/seed/memory/product/lead/state.md +14 -0
  189. package/templates/seed/memory/research/lead/state.md +14 -0
  190. package/templates/seed/skills/gh/SKILL.md +57 -0
  191. package/templates/seed/skills/squads-cli/SKILL.md +84 -0
  192. package/templates/seed/squads/company/SQUAD.md +51 -0
  193. package/templates/seed/squads/company/company-critic.md +49 -0
  194. package/templates/seed/squads/company/company-eval.md +49 -0
  195. package/templates/seed/squads/company/event-dispatcher.md +43 -0
  196. package/templates/seed/squads/company/goal-tracker.md +43 -0
  197. package/templates/seed/squads/company/manager.md +54 -0
  198. package/templates/seed/squads/engineering/SQUAD.md +48 -0
  199. package/templates/seed/squads/engineering/code-reviewer.md +57 -0
  200. package/templates/seed/squads/engineering/issue-solver.md +58 -0
  201. package/templates/seed/squads/engineering/test-writer.md +50 -0
  202. package/templates/seed/squads/intelligence/SQUAD.md +38 -0
  203. package/templates/seed/squads/intelligence/intel-critic.md +36 -0
  204. package/templates/seed/squads/intelligence/intel-eval.md +31 -0
  205. package/templates/seed/squads/intelligence/intel-lead.md +71 -0
  206. package/templates/seed/squads/marketing/SQUAD.md +47 -0
  207. package/templates/seed/squads/marketing/content-drafter.md +71 -0
  208. package/templates/seed/squads/marketing/growth-analyst.md +49 -0
  209. package/templates/seed/squads/marketing/social-poster.md +44 -0
  210. package/templates/seed/squads/operations/SQUAD.md +45 -0
  211. package/templates/seed/squads/operations/finance-tracker.md +47 -0
  212. package/templates/seed/squads/operations/goal-tracker.md +48 -0
  213. package/templates/seed/squads/operations/ops-lead.md +58 -0
  214. package/templates/seed/squads/product/SQUAD.md +41 -0
  215. package/templates/seed/squads/product/lead.md +56 -0
  216. package/templates/seed/squads/product/scanner.md +50 -0
  217. package/templates/seed/squads/product/worker.md +55 -0
  218. package/templates/seed/squads/research/SQUAD.md +38 -0
  219. package/templates/seed/squads/research/analyst.md +50 -0
  220. package/templates/seed/squads/research/lead.md +52 -0
  221. package/templates/seed/squads/research/synthesizer.md +59 -0
  222. package/templates/skills/squads-learn/SKILL.md +86 -0
  223. 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,5 @@
1
+ # Squads Provider Configuration
2
+ # Selected during: squads init
3
+ # Change with: squads init --provider <name>
4
+
5
+ provider: {{PROVIDER}}
@@ -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,4 @@
1
+ # Squads Provider Configuration
2
+ # Selected during: squads init
3
+
4
+ provider: {{PROVIDER}}
@@ -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
+ }