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/run.ts","../src/lib/permissions.ts","../src/lib/workflow.ts","../src/lib/conversation.ts","../src/lib/run-context.ts","../src/lib/api-client.ts","../src/lib/squad-loop.ts","../src/lib/cognition.ts"],"sourcesContent":["import ora from 'ora';\nimport { spawn, execSync } from 'child_process';\nimport { join, dirname } from 'path';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, cpSync, unlinkSync } from 'fs';\nimport {\n findSquadsDir,\n loadSquad,\n listAgents,\n loadAgentDefinition,\n parseAgentProvider,\n listSquads,\n findSimilarSquads,\n EffortLevel,\n Squad,\n} from '../lib/squad-parser.js';\nimport { resolveMcpConfigPath } from '../lib/mcp-config.js';\nimport {\n buildContextFromSquad,\n validateExecution,\n formatViolations,\n ExecutionRequest\n} from '../lib/permissions.js';\nimport { findMemoryDir } from '../lib/memory.js';\nimport { track, Events, flushEvents } from '../lib/telemetry.js';\nimport { parseCooldown } from '../lib/cron.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n icons,\n writeLine,\n} from '../lib/terminal.js';\nimport {\n getCLIConfig,\n isProviderCLIAvailable,\n} from '../lib/llm-clis.js';\nimport { detectProviderFromModel } from '../lib/providers.js';\nimport { loadSession, isLoggedIn } from '../lib/auth.js';\nimport { getApiUrl, getBridgeUrl } from '../lib/env-config.js';\nimport { runConversation, saveTranscript, type ConversationOptions } from '../lib/workflow.js';\nimport { reportExecutionStart, reportConversationResult, pushCognitionSignal } from '../lib/api-client.js';\nimport { getBotGitEnv, getBotPushUrl, getBotGhEnv, getCoAuthorTrailer } from '../lib/github.js';\nimport {\n type LoopState,\n loadLoopState,\n saveLoopState,\n getSquadRepos,\n scoreSquads,\n checkCooldown,\n classifyRunOutcome,\n pushMemorySignals,\n slackNotify,\n computePhases,\n scoreSquadsForPhase,\n} from '../lib/squad-loop.js';\nimport {\n loadCognitionState,\n saveCognitionState,\n seedBeliefsIfEmpty,\n runCognitionCycle,\n\n} from '../lib/cognition.js';\nimport {\n type AgentFrontmatter,\n type ContextRole,\n parseAgentFrontmatter,\n extractMcpServersFromDefinition,\n loadSystemProtocol,\n gatherSquadContext,\n} from '../lib/run-context.js';\nimport { classifyAgent } from '../lib/conversation.js';\n\n// ── Operational constants (no magic numbers) ──────────────────────────\nconst CLOUD_POLL_INTERVAL_MS = 3000;\nconst CLOUD_POLL_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes max poll\nconst DEFAULT_LEARNINGS_LIMIT = 5;\nconst EXECUTION_EVENT_TIMEOUT_MS = 5000;\nconst VERIFICATION_STATE_MAX_CHARS = 2000;\nconst VERIFICATION_EXEC_TIMEOUT_MS = 30000;\nconst DRYRUN_DEF_MAX_CHARS = 500;\nconst DRYRUN_CONTEXT_MAX_CHARS = 800;\nconst DEFAULT_SCHEDULED_COOLDOWN_MS = 6 * 60 * 60 * 1000; // 6 hours\nconst DEFAULT_TIMEOUT_MINUTES = 30;\nconst SOFT_DEADLINE_RATIO = 0.7;\nconst LOG_FILE_INIT_DELAY_MS = 500;\nconst VERBOSE_COMMAND_MAX_CHARS = 50;\n\ninterface RunOptions {\n verbose?: boolean;\n dryRun?: boolean;\n agent?: string;\n timeout?: number; // minutes, default 30\n execute?: boolean;\n parallel?: boolean; // Run all agents in parallel\n lead?: boolean; // Run as lead session using Task tool for parallelization\n foreground?: boolean; // Run in foreground (deprecated, now default)\n background?: boolean; // Run in background (detached process)\n watch?: boolean; // Run in background but tail the log\n useApi?: boolean; // Use API credits instead of subscription\n effort?: EffortLevel; // Effort level: high, medium, low\n skills?: string[]; // Skills to load (skill IDs or local paths)\n trigger?: 'manual' | 'scheduled' | 'event' | 'smart'; // Trigger source for telemetry\n provider?: string; // LLM provider: anthropic, google, openai, mistral, xai, aider, ollama\n model?: string; // Model to use (Claude aliases or full model IDs like gemini-2.5-flash)\n verify?: boolean; // Post-execution verification (default true, --no-verify to skip)\n cloud?: boolean; // Dispatch to cloud worker via API instead of local execution\n conversation?: boolean; // Run squad as multi-agent conversation (default for squad runs)\n task?: string; // Founder directive — replaces lead briefing in conversation mode\n maxTurns?: number; // Max conversation turns (default: 20)\n costCeiling?: number; // Cost ceiling in USD (default: 25)\n interval?: number | string; // Autopilot: minutes between cycles\n maxParallel?: number | string; // Autopilot: max parallel squad loops\n budget?: number | string; // Autopilot: daily budget cap ($)\n once?: boolean; // Autopilot: run one cycle then exit\n phased?: boolean; // Autopilot: use dependency-based phase ordering\n eval?: boolean; // Post-run COO evaluation (default: true, --no-eval to skip)\n}\n\n/**\n * Execution context for telemetry tagging\n * Passed to Claude via environment variables for per-agent cost tracking\n */\ninterface ExecutionContext {\n squad: string;\n agent: string;\n taskType: 'evaluation' | 'execution' | 'research' | 'lead';\n trigger: 'manual' | 'scheduled' | 'event' | 'smart';\n executionId: string;\n}\n\n/**\n * Register execution context with the API for telemetry\n * This allows the API to tag incoming OTel data with correct squad/agent info\n */\nasync function registerContextWithBridge(ctx: ExecutionContext): Promise<boolean> {\n const bridgeUrl = getBridgeUrl();\n\n try {\n const response = await fetch(`${bridgeUrl}/api/context/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n execution_id: ctx.executionId,\n squad: ctx.squad,\n agent: ctx.agent,\n task_type: ctx.taskType,\n trigger: ctx.trigger,\n }),\n signal: AbortSignal.timeout(3000),\n });\n\n if (!response.ok) {\n // Non-fatal - continue even if bridge is unavailable\n return false;\n }\n return true;\n } catch (e) {\n writeLine(` ${colors.dim}warn: bridge registration failed: ${e instanceof Error ? e.message : String(e)}${RESET}`);\n return false;\n }\n}\n\n/**\n * Pre-execution gate check via bridge API.\n * Checks quota (monthly spend) and cooldown before running an agent.\n * Fails open (allows execution) if bridge is unavailable.\n */\ninterface PreflightResult {\n allowed: boolean;\n gates: {\n quota?: { ok: boolean; used: number; limit: number; remaining: number; period: string };\n cooldown?: { ok: boolean; elapsed_sec: number | null; min_gap_sec: number };\n };\n error?: string;\n}\n\nasync function checkPreflightGates(squad: string, agent: string): Promise<PreflightResult> {\n const bridgeUrl = getBridgeUrl();\n\n try {\n const response = await fetch(`${bridgeUrl}/api/execution/preflight`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ squad, agent }),\n signal: AbortSignal.timeout(3000),\n });\n\n if (!response.ok) {\n // Fail open if bridge returns error\n return { allowed: true, gates: {} };\n }\n\n return await response.json() as PreflightResult;\n } catch (e) {\n writeLine(` ${colors.dim}warn: preflight gate check failed (allowing execution): ${e instanceof Error ? e.message : String(e)}${RESET}`);\n return { allowed: true, gates: {} };\n }\n}\n\n/**\n * Fetch relevant learnings from bridge for prompt injection.\n * Returns empty array if bridge is unavailable.\n */\ninterface Learning {\n content: string;\n importance: string;\n created_at: string;\n}\n\nasync function fetchLearnings(squad: string, limit = DEFAULT_LEARNINGS_LIMIT): Promise<Learning[]> {\n const bridgeUrl = getBridgeUrl();\n\n try {\n const response = await fetch(\n `${bridgeUrl}/api/learnings/relevant?squad=${encodeURIComponent(squad)}&limit=${limit}`,\n { signal: AbortSignal.timeout(3000) }\n );\n\n if (!response.ok) {\n return [];\n }\n\n const data = await response.json() as { learnings: Learning[] };\n return data.learnings || [];\n } catch (e) {\n writeLine(` ${colors.dim}warn: learnings fetch failed: ${e instanceof Error ? e.message : String(e)}${RESET}`);\n return [];\n }\n}\n\n// loadApprovalInstructions, loadPostExecution → moved to src/lib/run-context.ts\n\n// gatherSquadContext → moved to src/lib/run-context.ts\n\n/**\n * Generate a unique execution ID for telemetry tracking\n */\nfunction generateExecutionId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `exec_${timestamp}_${random}`;\n}\n\n/**\n * Select MCP config based on squad name and context\n * Uses three-tier resolution:\n * 1. Squad context.mcp from SQUAD.md frontmatter (dynamic)\n * 2. User override at ~/.claude/mcp-configs/{squad}.json\n * 3. Legacy hardcoded mapping (backward compatibility)\n * 4. Fallback to ~/.claude.json\n */\nfunction selectMcpConfig(squadName: string, squad?: Squad | null): string {\n // Tier 1 & 2: Use new context-based resolution if squad has context.mcp\n if (squad?.context?.mcp && squad.context.mcp.length > 0) {\n return resolveMcpConfigPath(squadName, squad.context.mcp);\n }\n\n // Tier 3: Legacy hardcoded mapping (for squads without context block)\n const home = process.env.HOME || '';\n const configsDir = join(home, '.claude', 'mcp-configs');\n\n const squadConfigs: Record<string, string> = {\n website: 'website.json',\n research: 'research.json',\n intelligence: 'research.json',\n analytics: 'data.json',\n engineering: 'data.json',\n };\n\n const configFile = squadConfigs[squadName.toLowerCase()];\n if (configFile) {\n const configPath = join(configsDir, configFile);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n\n // Tier 4: No MCP config — return empty string to skip --mcp-config flag.\n // Previously fell back to ~/.claude.json but that's Claude's settings file,\n // not an MCP config, and causes claude to exit silently with no output.\n return '';\n}\n\n/**\n * Detect task type from agent name patterns\n * - *-eval, *-critic, *-review → evaluation\n * - *-lead, *-orchestrator → lead\n * - *-research, *-analyst → research\n * - everything else → execution\n */\nfunction detectTaskType(agentName: string): ExecutionContext['taskType'] {\n const name = agentName.toLowerCase();\n if (name.includes('eval') || name.includes('critic') || name.includes('review') || name.includes('test')) {\n return 'evaluation';\n }\n if (name.includes('lead') || name.includes('orchestrator')) {\n return 'lead';\n }\n if (name.includes('research') || name.includes('analyst') || name.includes('intel')) {\n return 'research';\n }\n return 'execution';\n}\n\n/** Claude Code --model flag aliases */\ntype ClaudeModelAlias = 'opus' | 'sonnet' | 'haiku';\n\n/**\n * Map full model names to Claude Code --model aliases.\n * Claude Code only accepts: opus, sonnet, haiku (not full model IDs)\n */\nfunction getClaudeModelAlias(model: string): ClaudeModelAlias | undefined {\n const lower = model.toLowerCase();\n\n // Direct aliases\n if (lower === 'opus' || lower === 'sonnet' || lower === 'haiku') {\n return lower as ClaudeModelAlias;\n }\n\n // Full model name mapping\n if (lower.includes('opus')) return 'opus';\n if (lower.includes('sonnet')) return 'sonnet';\n if (lower.includes('haiku')) return 'haiku';\n\n // Unknown Claude model - let Claude Code handle it\n return undefined;\n}\n\n/**\n * Resolve model based on squad context and task type.\n * Priority: explicit --model flag > squad context routing > undefined (provider default)\n *\n * Supports multi-provider models:\n * - Anthropic: claude-opus-4-5, claude-sonnet-4, claude-3-5-haiku, opus, sonnet, haiku\n * - Google: gemini-2.5-flash, gemini-2.5-pro, gemini-2.0-flash\n * - Others: model names passed through to provider CLI\n *\n * Routing logic:\n * - evaluation (critics, tests) → cheap model - simple validation\n * - research (analysts, intel) → default model - balanced\n * - execution (builders, fixers) → default model - balanced\n * - lead (orchestrators) → expensive model - complex coordination\n */\nfunction resolveModel(\n explicitModel: string | undefined,\n squad: Squad | null,\n taskType: ExecutionContext['taskType']\n): string | undefined {\n // Explicit --model flag always wins\n if (explicitModel) {\n return explicitModel;\n }\n\n // No squad context = let provider decide\n const modelConfig = squad?.context?.model;\n if (!modelConfig) {\n return undefined;\n }\n\n // Route by task type\n switch (taskType) {\n case 'evaluation':\n // Critics/evals are simple - use cheap model\n return modelConfig.cheap || modelConfig.default;\n case 'lead':\n // Leads need complex reasoning - use expensive model\n return modelConfig.expensive || modelConfig.default;\n case 'research':\n case 'execution':\n default:\n // Default for most tasks\n return modelConfig.default;\n }\n}\n\n/**\n * Ensure the project directory is trusted in Claude's config.\n * This prevents the workspace trust dialog from blocking autonomous execution.\n */\nfunction ensureProjectTrusted(projectPath: string): void {\n const configPath = join(process.env.HOME || '', '.claude.json');\n\n if (!existsSync(configPath)) {\n // No Claude config yet - will be created on first interactive run\n return;\n }\n\n try {\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n\n if (!config.projects) {\n config.projects = {};\n }\n\n if (!config.projects[projectPath]) {\n config.projects[projectPath] = {};\n }\n\n // Mark as trusted for autonomous execution\n if (!config.projects[projectPath].hasTrustDialogAccepted) {\n config.projects[projectPath].hasTrustDialogAccepted = true;\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n }\n } catch (e) {\n // Don't fail execution if we can't update config — the trust dialog will just appear\n writeLine(` ${colors.dim}warn: config update failed: ${e instanceof Error ? e.message : String(e)}${RESET}`);\n }\n}\n\n/**\n * Get the project root directory (where .agents/ lives)\n */\nfunction getProjectRoot(): string {\n const squadsDir = findSquadsDir();\n if (squadsDir) {\n // .agents/squads -> .agents -> project root\n return dirname(dirname(squadsDir));\n }\n return process.cwd();\n}\n\ninterface ExecutionRecord {\n squadName: string;\n agentName: string;\n executionId: string;\n startTime: string;\n endTime?: string;\n durationMs?: number;\n status: 'running' | 'completed' | 'failed';\n trigger?: 'manual' | 'scheduled' | 'event' | 'smart';\n taskType?: 'evaluation' | 'execution' | 'research' | 'lead';\n outcome?: string;\n error?: string;\n}\n\nfunction getExecutionLogPath(squadName: string, agentName: string): string | null {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return null;\n return join(memoryDir, squadName, agentName, 'executions.md');\n}\n\nfunction logExecution(record: ExecutionRecord): void {\n const logPath = getExecutionLogPath(record.squadName, record.agentName);\n if (!logPath) return;\n\n const dir = dirname(logPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n let content = '';\n if (existsSync(logPath)) {\n content = readFileSync(logPath, 'utf-8').trimEnd();\n } else {\n content = `# ${record.squadName}/${record.agentName} - Execution Log`;\n }\n\n // Structured entry format for parsing\n const entry = `\n\n---\n<!-- exec:${record.executionId} -->\n**${record.startTime}** | Status: ${record.status}\n- ID: \\`${record.executionId}\\`\n- Trigger: ${record.trigger || 'manual'}\n- Task Type: ${record.taskType || 'execution'}\n`;\n\n writeFileSync(logPath, content + entry);\n}\n\nfunction updateExecutionStatus(\n squadName: string,\n agentName: string,\n executionId: string,\n status: 'completed' | 'failed',\n details?: {\n outcome?: string;\n error?: string;\n durationMs?: number;\n }\n): void {\n const logPath = getExecutionLogPath(squadName, agentName);\n if (!logPath || !existsSync(logPath)) return;\n\n let content = readFileSync(logPath, 'utf-8');\n const endTime = new Date().toISOString();\n\n // Find and update the specific execution by ID\n const execMarker = `<!-- exec:${executionId} -->`;\n const markerIndex = content.indexOf(execMarker);\n\n if (markerIndex === -1) return;\n\n // Find the next entry marker or end of file\n const nextEntryIndex = content.indexOf('\\n---\\n', markerIndex + 1);\n const entryEnd = nextEntryIndex === -1 ? content.length : nextEntryIndex;\n\n // Extract and update the entry\n const entryStart = content.lastIndexOf('\\n---\\n', markerIndex);\n const currentEntry = content.slice(entryStart, entryEnd);\n\n // Build completion details\n const durationStr = details?.durationMs\n ? `${(details.durationMs / 1000).toFixed(1)}s`\n : 'unknown';\n\n let updatedEntry = currentEntry\n .replace(/Status: running/, `Status: ${status}`)\n + `- Completed: ${endTime}\n- Duration: ${durationStr}`;\n\n if (details?.outcome) {\n updatedEntry += `\\n- Outcome: ${details.outcome}`;\n }\n if (details?.error) {\n updatedEntry += `\\n- Error: ${details.error}`;\n }\n\n // Replace the entry in content\n content = content.slice(0, entryStart) + updatedEntry + content.slice(entryEnd);\n writeFileSync(logPath, content);\n}\n\n/**\n * Auto-commit agent work after execution completes.\n * Commits as the Agents Squads bot (if configured), pushes with bot token.\n * Falls back to user's git identity if bot not configured.\n */\nasync function autoCommitAgentWork(\n squadName: string,\n agentName: string,\n executionId: string,\n provider?: string,\n): Promise<{ committed: boolean; message?: string; error?: string }> {\n const { execSync } = await import('child_process');\n const { detectGitHubRepo } = await import('../lib/github.js');\n const projectRoot = getProjectRoot();\n\n try {\n // Check for uncommitted changes\n const status = execSync('git status --porcelain', {\n encoding: 'utf-8',\n cwd: projectRoot,\n }).trim();\n\n if (!status) {\n return { committed: false };\n }\n\n // Get bot identity for commits\n const botEnv = await getBotGitEnv();\n const execOpts = {\n cwd: projectRoot,\n env: { ...process.env, ...botEnv },\n };\n\n // Stage all changes (agent work should be committed)\n execSync('git add -A', execOpts);\n\n // Build commit message with provider-specific co-author\n // Write to temp file to avoid shell injection via squad/agent names\n const shortExecId = executionId.slice(0, 12);\n const coAuthor = getCoAuthorTrailer(provider || 'claude');\n const msgFile = join(projectRoot, '.git', 'SQUADS_COMMIT_MSG');\n writeFileSync(msgFile, `feat(${squadName}/${agentName}): execution ${shortExecId}\\n\\n${coAuthor}\\n`);\n\n // Commit using --file to avoid shell interpolation\n try {\n execSync(`git commit --file \"${msgFile}\"`, execOpts);\n } finally {\n try { unlinkSync(msgFile); } catch { /* ignore */ }\n }\n\n // Push to origin using bot token\n try {\n const { spawnSync } = await import('child_process');\n const repo = detectGitHubRepo(projectRoot);\n // Validate repo format (org/name) to prevent injection\n if (repo && /^[\\w.-]+\\/[\\w.-]+$/.test(repo)) {\n const pushUrl = await getBotPushUrl(repo);\n if (pushUrl) {\n // Use spawnSync with args array to avoid shell injection\n spawnSync('git', ['push', pushUrl, 'HEAD'], { ...execOpts, stdio: 'pipe' });\n } else {\n spawnSync('git', ['push', 'origin', 'HEAD'], { ...execOpts, stdio: 'pipe' });\n }\n } else {\n spawnSync('git', ['push', 'origin', 'HEAD'], { ...execOpts, stdio: 'pipe' });\n }\n } catch (e) {\n writeLine(` ${colors.dim}warn: git push failed (commit is still local): ${e instanceof Error ? e.message : String(e)}${RESET}`);\n }\n\n return { committed: true, message: `Committed changes from ${agentName}` };\n } catch (error) {\n return { committed: false, error: String(error) };\n }\n}\n\n/**\n * Get the timestamp of the last execution from executions.md\n */\nfunction getLastExecutionTime(squadName: string, agentName: string): Date | null {\n const logPath = getExecutionLogPath(squadName, agentName);\n if (!logPath || !existsSync(logPath)) return null;\n\n const content = readFileSync(logPath, 'utf-8');\n\n // Find all timestamps in the format **2026-01-21T14:00:02.358Z**\n const timestamps = content.match(/\\*\\*(\\d{4}-\\d{2}-\\d{2}T[\\d:.]+Z)\\*\\*/g);\n if (!timestamps || timestamps.length === 0) return null;\n\n // Get the last (most recent) timestamp\n const lastTimestamp = timestamps[timestamps.length - 1].replace(/\\*\\*/g, '');\n return new Date(lastTimestamp);\n}\n\n/**\n * Local cooldown check - works without bridge\n * Returns { ok: true } if allowed, { ok: false, ... } if blocked\n */\nfunction checkLocalCooldown(\n squadName: string,\n agentName: string,\n cooldownMs: number\n): { ok: boolean; elapsedMs?: number; cooldownMs: number } {\n const lastExec = getLastExecutionTime(squadName, agentName);\n if (!lastExec) return { ok: true, cooldownMs };\n\n const elapsedMs = Date.now() - lastExec.getTime();\n if (elapsedMs < cooldownMs) {\n return { ok: false, elapsedMs, cooldownMs };\n }\n\n return { ok: true, elapsedMs, cooldownMs };\n}\n\n/**\n * Format milliseconds as human-readable duration\n */\nfunction formatDuration(ms: number): string {\n const hours = Math.floor(ms / (60 * 60 * 1000));\n const minutes = Math.floor((ms % (60 * 60 * 1000)) / (60 * 1000));\n\n if (hours >= 24) {\n const days = Math.floor(hours / 24);\n const remainingHours = hours % 24;\n return remainingHours > 0 ? `${days}d ${remainingHours}h` : `${days}d`;\n }\n if (hours > 0) {\n return minutes > 0 ? `${hours}h ${minutes}m` : `${hours}h`;\n }\n return `${minutes}m`;\n}\n\n// extractMcpServersFromDefinition, AgentFrontmatter, parseAgentFrontmatter → moved to src/lib/run-context.ts\n\n/**\n * Emit an execution event to the API for tracking and routing.\n * Non-blocking and fail-safe — falls back to file if API unavailable.\n */\nasync function emitExecutionEvent(\n eventType: 'agent.completed' | 'agent.failed',\n data: { squad: string; agent: string; executionId: string; error?: string }\n): Promise<void> {\n const apiUrl = getApiUrl();\n\n if (apiUrl) {\n try {\n await fetch(`${apiUrl}/events/ingest`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n source: 'scheduler',\n event_type: eventType,\n data: {\n squad: data.squad,\n agent: data.agent,\n execution_id: data.executionId,\n ...(data.error ? { error: data.error } : {}),\n },\n }),\n signal: AbortSignal.timeout(EXECUTION_EVENT_TIMEOUT_MS),\n });\n return;\n } catch {\n // API unavailable — fall through to file-based event recording\n }\n }\n\n // Fallback: write event to memory file\n try {\n const memDir = findMemoryDir();\n if (!memDir) return;\n\n const eventsDir = join(memDir, data.squad, data.agent);\n if (!existsSync(eventsDir)) {\n mkdirSync(eventsDir, { recursive: true });\n }\n\n const eventsPath = join(eventsDir, 'events.md');\n const timestamp = new Date().toISOString();\n const entry = `\\n## ${timestamp}: ${eventType}\\n- execution_id: ${data.executionId}\\n${data.error ? `- error: ${data.error}\\n` : ''}`;\n\n let existing = '';\n if (existsSync(eventsPath)) {\n existing = readFileSync(eventsPath, 'utf-8');\n }\n writeFileSync(eventsPath, existing + entry);\n } catch {\n // Truly fail-safe — never block execution\n }\n}\n\n/**\n * Verify execution against acceptance criteria using a lightweight model.\n * Returns pass/fail with reason. Used by the Ralph verification loop.\n */\nasync function verifyExecution(\n squadName: string,\n agentName: string,\n criteria: string,\n options: { verbose?: boolean } = {}\n): Promise<{ passed: boolean; reason: string }> {\n const { execSync } = await import('child_process');\n const projectRoot = getProjectRoot();\n\n // Gather evidence: state file + recent commits\n let stateContent = '';\n const memDir = findMemoryDir();\n if (memDir) {\n const statePath = join(memDir, squadName, agentName, 'state.md');\n if (existsSync(statePath)) {\n stateContent = readFileSync(statePath, 'utf-8').slice(0, VERIFICATION_STATE_MAX_CHARS);\n }\n }\n\n let recentCommits = '';\n try {\n recentCommits = execSync('git log --oneline -5 --no-color', {\n encoding: 'utf-8',\n cwd: projectRoot,\n }).trim();\n } catch (e) {\n if (options.verbose) writeLine(` ${colors.dim}warn: git log failed: ${e instanceof Error ? e.message : String(e)}${RESET}`);\n recentCommits = '(no commits found)';\n }\n\n const verifyPrompt = `You are verifying whether an agent completed its task successfully.\n\nAgent: ${squadName}/${agentName}\n\n## Acceptance Criteria\n${criteria}\n\n## Evidence\n\n### Agent State File\n${stateContent || '(empty or not found)'}\n\n### Recent Git Commits\n${recentCommits}\n\n## Instructions\nEvaluate whether the acceptance criteria are met based on the evidence.\nRespond with EXACTLY one line:\nPASS: <brief reason>\nor\nFAIL: <brief reason>`;\n\n try {\n const escapedPrompt = verifyPrompt.replace(/'/g, \"'\\\\''\");\n const result = execSync(\n `unset CLAUDECODE; claude --print --model haiku -- '${escapedPrompt}'`,\n { encoding: 'utf-8', cwd: projectRoot, timeout: VERIFICATION_EXEC_TIMEOUT_MS, shell: '/bin/sh' }\n ).trim();\n\n if (options.verbose) {\n writeLine(` ${colors.dim}Verification: ${result}${RESET}`);\n }\n\n if (result.startsWith('PASS')) {\n return { passed: true, reason: result.replace(/^PASS:\\s*/, '') };\n }\n return { passed: false, reason: result.replace(/^FAIL:\\s*/, '') };\n } catch (error) {\n if (options.verbose) {\n writeLine(` ${colors.dim}Verification error (defaulting to PASS): ${error}${RESET}`);\n }\n return { passed: true, reason: 'Verification unavailable — defaulting to pass' };\n }\n}\n\n// ── Cloud Dispatch ─────────────────────────────────────────────────────\n\n/**\n * Dispatch agent execution to cloud worker via API.\n * Posts to /agent-dispatch, then polls /agent-executions for status.\n */\nasync function runCloudDispatch(\n squadName: string,\n agentName: string,\n options: RunOptions\n): Promise<void> {\n const apiUrl = getApiUrl();\n\n if (!apiUrl) {\n writeLine(` ${colors.red}${icons.error} API URL not configured${RESET}`);\n writeLine(` ${colors.dim}Run: squads config use staging (or set SQUADS_API_URL)${RESET}`);\n process.exit(1);\n }\n\n // Require auth session\n if (!isLoggedIn()) {\n writeLine(` ${colors.red}${icons.error} Not logged in${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads login\\` to authenticate before using --cloud${RESET}`);\n process.exit(1);\n }\n\n const session = loadSession();\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Use access token if available, otherwise use API key\n if (session?.accessToken) {\n headers['Authorization'] = `Bearer ${session.accessToken}`;\n }\n\n const apiKey = process.env.SQUADS_PLATFORM_API_TOKEN || process.env.SCHEDULER_API_KEY;\n if (apiKey) {\n headers['X-API-Key'] = apiKey;\n }\n\n const spinner = ora(`Dispatching ${squadName}/${agentName} to cloud...`).start();\n\n try {\n // 1. Create dispatch request\n const dispatchRes = await fetch(`${apiUrl}/agent-dispatch`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n squad: squadName,\n agent: agentName,\n trigger_type: 'manual',\n trigger_data: {\n source: 'cli',\n cloud: true,\n model: options.model,\n provider: options.provider,\n effort: options.effort,\n },\n }),\n });\n\n if (!dispatchRes.ok) {\n const error = await dispatchRes.text();\n spinner.fail(`Dispatch failed: ${dispatchRes.status}`);\n writeLine(` ${colors.dim}${error}${RESET}`);\n process.exit(1);\n }\n\n const dispatch = await dispatchRes.json() as { dispatch_id: number; status: string };\n spinner.succeed(`Dispatched to cloud`);\n\n writeLine();\n writeLine(` ${colors.cyan}Dispatch ID${RESET} ${dispatch.dispatch_id}`);\n writeLine(` ${colors.cyan}Squad${RESET} ${squadName}`);\n writeLine(` ${colors.cyan}Agent${RESET} ${agentName}`);\n writeLine();\n\n // 2. Poll for execution status\n const pollSpinner = ora('Waiting for execution to start...').start();\n const pollStart = Date.now();\n let executionId: string | null = null;\n let lastStatus = '';\n\n while (Date.now() - pollStart < CLOUD_POLL_TIMEOUT_MS) {\n try {\n const execRes = await fetch(\n `${apiUrl}/agent-executions?squad=${encodeURIComponent(squadName)}&agent=${encodeURIComponent(agentName)}&limit=1`,\n { headers },\n );\n\n if (execRes.ok) {\n const executions = await execRes.json() as Array<{\n execution_id: string;\n status: string;\n summary?: string;\n error?: string;\n duration_seconds?: number;\n cost_usd?: number;\n }>;\n\n if (executions.length > 0) {\n const exec = executions[0];\n\n // Only track executions started after our dispatch\n if (!executionId && exec.status === 'running') {\n executionId = exec.execution_id;\n pollSpinner.text = `Running (${exec.execution_id})`;\n }\n\n if (executionId && exec.execution_id === executionId) {\n if (exec.status !== lastStatus) {\n lastStatus = exec.status;\n pollSpinner.text = `Status: ${exec.status}`;\n }\n\n if (exec.status === 'completed') {\n pollSpinner.succeed('Execution completed');\n writeLine();\n writeLine(` ${colors.cyan}Execution${RESET} ${exec.execution_id}`);\n if (exec.summary) {\n writeLine(` ${colors.cyan}Summary${RESET} ${exec.summary}`);\n }\n if (exec.duration_seconds) {\n writeLine(` ${colors.cyan}Duration${RESET} ${Math.round(exec.duration_seconds)}s`);\n }\n if (exec.cost_usd) {\n writeLine(` ${colors.cyan}Cost${RESET} $${exec.cost_usd.toFixed(4)}`);\n }\n writeLine();\n return;\n }\n\n if (exec.status === 'failed') {\n pollSpinner.fail('Execution failed');\n writeLine();\n if (exec.error) {\n writeLine(` ${colors.red}Error: ${exec.error}${RESET}`);\n }\n writeLine();\n process.exit(1);\n }\n\n if (exec.status === 'cancelled') {\n pollSpinner.warn('Execution cancelled');\n return;\n }\n }\n }\n }\n } catch (e) {\n if (options.verbose) writeLine(` ${colors.dim}warn: cloud poll failed (retrying): ${e instanceof Error ? e.message : String(e)}${RESET}`);\n }\n\n await new Promise(resolve => setTimeout(resolve, CLOUD_POLL_INTERVAL_MS));\n }\n\n pollSpinner.warn('Poll timeout — execution may still be running');\n writeLine(` ${colors.dim}Check status: squads trigger status${RESET}`);\n if (executionId) {\n writeLine(` ${colors.dim}Execution ID: ${executionId}${RESET}`);\n }\n } catch (error) {\n spinner.fail('Cloud dispatch failed');\n writeLine(` ${colors.red}${error instanceof Error ? error.message : String(error)}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Check your network and SQUADS_API_URL setting${RESET}`);\n process.exit(1);\n }\n}\n\nexport async function runCommand(\n target: string | null,\n options: RunOptions\n): Promise<void> {\n const squadsDir = findSquadsDir();\n\n if (!squadsDir) {\n writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n process.exit(1);\n }\n\n // Execution is now the default behavior (no --execute flag needed)\n // --dry-run disables execution\n if (!options.dryRun && options.execute === undefined) {\n options.execute = true;\n }\n\n // MODE 1: Autopilot — no target means run all squads continuously\n if (!target) {\n await runAutopilot(squadsDir, options);\n return;\n }\n\n // Check if target uses squad/agent syntax (e.g., \"demo/researcher\")\n let squadName = target;\n let agentFromSlash: string | undefined;\n\n if (target.includes('/')) {\n const parts = target.split('/');\n squadName = parts[0];\n agentFromSlash = parts[1];\n if (!options.agent) {\n options.agent = agentFromSlash;\n }\n }\n\n // Cloud dispatch: skip local execution entirely\n if (options.cloud) {\n const agentName = options.agent || agentFromSlash;\n if (!agentName) {\n writeLine(` ${colors.red}${icons.error} --cloud requires a specific agent${RESET}`);\n writeLine(` ${colors.dim}Usage: squads run ${squadName} --cloud -a <agent>${RESET}`);\n writeLine(` ${colors.dim} or: squads run ${squadName}/<agent> --cloud${RESET}`);\n process.exit(1);\n }\n await track(Events.CLI_RUN, { type: 'cloud', target: `${squadName}/${agentName}` });\n await flushEvents();\n await runCloudDispatch(squadName, agentName, options);\n return;\n }\n\n // Check if target is a squad or an agent\n const squad = loadSquad(squadName);\n\n // Pre-flight executor check: verify CLI and auth before attempting execution\n // Only runs when we're actually going to execute (not dry-run)\n if (options.execute && !options.dryRun) {\n // Resolve the provider early so we check the right CLI\n const provider = options.provider || squad?.providers?.default || 'anthropic';\n const checksOk = await preflightExecutorCheck(provider);\n if (!checksOk) {\n process.exit(1);\n }\n }\n\n if (squad) {\n await track(Events.CLI_RUN, { type: 'squad', target: squad.name });\n await flushEvents(); // Ensure telemetry is sent before potential exit\n await runSquad(squad, squadsDir, options);\n // Post-run COO evaluation (default on, --no-eval to skip)\n await runPostEvaluation([squad.name], options);\n } else {\n // Try to find as an agent\n const agents = listAgents(squadsDir);\n const agent = agents.find(a => a.name === target);\n\n if (agent && agent.filePath) {\n // Extract squad name from path\n const pathParts = agent.filePath.split('/');\n const squadIdx = pathParts.indexOf('squads');\n const resolvedSquadName = squadIdx >= 0 ? pathParts[squadIdx + 1] : 'unknown';\n await runAgent(agent.name, agent.filePath, resolvedSquadName, options);\n // Post-run COO evaluation for the squad this agent belongs to\n await runPostEvaluation([resolvedSquadName], options);\n } else {\n writeLine(` ${colors.red}Squad or agent \"${target}\" not found${RESET}`);\n const similar = findSimilarSquads(target, listSquads(squadsDir));\n if (similar.length > 0) {\n writeLine(` ${colors.dim}Did you mean: ${similar.join(', ')}?${RESET}`);\n }\n writeLine(` ${colors.dim}Run \\`squads status\\` to see available squads and agents.${RESET}`);\n process.exit(1);\n }\n }\n}\n\nasync function runSquad(\n squad: ReturnType<typeof loadSquad>,\n squadsDir: string,\n options: RunOptions\n): Promise<void> {\n if (!squad) return;\n\n // Inherit effort from squad config if not provided via CLI\n if (!options.effort && squad.effort) {\n options.effort = squad.effort;\n }\n\n const startTime = new Date().toISOString();\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}run${RESET} ${colors.cyan}${squad.name}${RESET}`);\n writeLine();\n if (squad.mission) {\n writeLine(` ${colors.dim}${squad.mission}${RESET}`);\n writeLine();\n }\n writeLine(` ${colors.dim}Started: ${startTime}${RESET}`);\n writeLine();\n\n // LEAD MODE: Single orchestrator session using Task tool for parallelization\n if (options.lead) {\n await runLeadMode(squad, squadsDir, options);\n return;\n }\n\n // PARALLEL EXECUTION: --parallel --execute runs all agents simultaneously\n if (options.parallel) {\n const agentFiles = squad.agents\n .map(a => ({\n name: a.name,\n path: join(squadsDir, squad.dir, `${a.name}.md`)\n }))\n .filter(a => existsSync(a.path));\n\n if (agentFiles.length === 0) {\n writeLine(` ${icons.error} ${colors.red}No agent files found${RESET}`);\n return;\n }\n\n writeLine(` ${bold}Parallel execution${RESET} ${colors.dim}${agentFiles.length} agents${RESET}`);\n writeLine();\n\n if (!options.execute) {\n // Preview mode\n for (const agent of agentFiles) {\n writeLine(` ${icons.empty} ${colors.cyan}${agent.name}${RESET}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Launch all agents in parallel:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} --parallel`);\n writeLine();\n return;\n }\n\n // Execute all in parallel\n writeLine(` ${gradient('Launching')} ${agentFiles.length} agents in parallel...`);\n writeLine();\n\n const launches = agentFiles.map(agent =>\n runAgent(agent.name, agent.path, squad.dir, options)\n );\n\n await Promise.all(launches);\n\n writeLine();\n writeLine(` ${icons.success} All ${agentFiles.length} agents launched`);\n writeLine(` ${colors.dim}Monitor: tmux ls | grep squads-${squad.name}${RESET}`);\n writeLine(` ${colors.dim}Attach: tmux attach -t <session>${RESET}`);\n writeLine();\n return;\n }\n\n // If there's a pipeline, run agents in order\n if (squad.pipelines.length > 0) {\n const pipeline = squad.pipelines[0];\n writeLine(` ${bold}Pipeline${RESET} ${colors.dim}${pipeline.agents.join(' → ')}${RESET}`);\n writeLine();\n\n for (let i = 0; i < pipeline.agents.length; i++) {\n const agentName = pipeline.agents[i];\n const agentPath = join(squadsDir, squad.dir, `${agentName}.md`);\n\n if (existsSync(agentPath)) {\n writeLine(` ${colors.dim}[${i + 1}/${pipeline.agents.length}]${RESET}`);\n await runAgent(agentName, agentPath, squad.dir, options);\n writeLine();\n } else {\n writeLine(` ${icons.warning} ${colors.yellow}Agent ${agentName} not found, skipping${RESET}`);\n }\n }\n } else {\n // If specific agent requested via -a flag, run that agent\n if (options.agent) {\n const agentPath = join(squadsDir, squad.dir, `${options.agent}.md`);\n if (existsSync(agentPath)) {\n await runAgent(options.agent, agentPath, squad.dir, options);\n } else {\n writeLine(` ${icons.error} ${colors.red}Agent ${options.agent} not found${RESET}`);\n return;\n }\n } else {\n // Default: Run squad as multi-agent conversation\n // Lead briefs → scanners discover → workers execute → lead reviews → converge\n if (options.execute) {\n writeLine(` ${bold}Conversation mode${RESET} ${colors.dim}(lead → scan → work → review → verify)${RESET}`);\n writeLine();\n\n const convOptions: ConversationOptions = {\n task: options.task,\n maxTurns: options.maxTurns,\n costCeiling: options.costCeiling,\n verbose: options.verbose,\n model: options.model,\n };\n\n // Report execution start to API (fire-and-forget on failure)\n const apiExecId = await reportExecutionStart(squad.name, 'conversation', `conv-${Date.now()}`);\n\n const result = await runConversation(squad, convOptions);\n\n // Save transcript\n const transcriptPath = saveTranscript(result.transcript);\n\n // Report conversation result to API (fire-and-forget)\n if (apiExecId) {\n reportConversationResult(apiExecId, {\n turnCount: result.turnCount,\n totalCost: result.totalCost,\n converged: result.converged,\n reason: result.reason,\n agentsInvolved: [...new Set(result.transcript.turns.map(t => t.agent))],\n });\n }\n\n // Push conversation signal to cognition engine (fire-and-forget)\n pushCognitionSignal({\n source: 'execution',\n signal_type: result.converged ? 'conversation_converged' : 'conversation_stopped',\n value: result.totalCost,\n unit: 'usd',\n data: {\n turn_count: result.turnCount,\n converged: result.converged,\n reason: result.reason,\n agents_involved: [...new Set(result.transcript.turns.map(t => t.agent))],\n },\n entity_type: 'squad',\n entity_id: squad.name,\n confidence: 0.9,\n });\n\n writeLine();\n writeLine(` ${result.converged ? icons.success : icons.warning} ${result.converged ? 'Converged' : 'Stopped'}: ${result.reason}`);\n writeLine(` ${colors.dim}Turns: ${result.turnCount} | Cost: ~$${result.totalCost.toFixed(2)}${RESET}`);\n if (transcriptPath) {\n writeLine(` ${colors.dim}Transcript: ${transcriptPath}${RESET}`);\n }\n writeLine();\n } else {\n // Dry-run: show what would happen\n writeLine(` ${colors.dim}Default mode: conversation (lead → scan → work → review → verify)${RESET}`);\n writeLine();\n for (const agent of squad.agents) {\n writeLine(` ${icons.empty} ${colors.cyan}${agent.name}${RESET} ${colors.dim}${agent.role}${RESET}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Run conversation:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} --task \"review and merge open PRs\"`);\n writeLine();\n writeLine(` ${colors.dim}Run single agent:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} -a ${colors.cyan}<agent>${RESET}`);\n }\n }\n }\n\n writeLine();\n writeLine(` ${colors.dim}After execution, record outcome:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads feedback add ${colors.cyan}${squad.name}${RESET} ${colors.cyan}<1-5>${RESET} ${colors.cyan}\"<feedback>\"${RESET}`);\n writeLine();\n}\n\n// ── Post-run evaluation ─────────────────────────────────────────────\n// After any squad run, dispatch the COO (company-lead) to evaluate outputs.\n// This is the feedback loop that makes the system learn.\n\nconst EVAL_TIMEOUT_MINUTES = 15;\n\n/**\n * Run the COO evaluation after squad execution.\n * Dispatches company-lead with a scoped evaluation task for the squads that just ran.\n * Generates feedback.md and active-work.md per squad.\n */\nasync function runPostEvaluation(\n squadsRun: string[],\n options: RunOptions,\n): Promise<void> {\n // Skip if running company squad itself (prevent recursion)\n if (squadsRun.length === 1 && squadsRun[0] === 'company') return;\n // Skip if evaluation disabled\n if (options.eval === false) return;\n // Skip dry-run\n if (options.dryRun) return;\n // Skip background runs — evaluation needs foreground context\n if (options.background) return;\n\n const squadsDir = findSquadsDir();\n if (!squadsDir) return;\n\n // Find company-lead agent\n const cooPath = join(squadsDir, 'company', 'company-lead.md');\n if (!existsSync(cooPath)) {\n if (options.verbose) {\n writeLine(` ${colors.dim}Skipping evaluation: company-lead.md not found${RESET}`);\n }\n return;\n }\n\n const squadList = squadsRun.join(', ');\n writeLine();\n writeLine(` ${gradient('eval')} ${colors.dim}COO evaluating: ${squadList}${RESET}`);\n\n const evalTask = `Post-run evaluation for: ${squadList}.\n\n## Evaluation Process\n\nFor each squad (${squadList}):\n\n### 1. Read previous feedback FIRST\nRead \\`.agents/memory/{squad}/feedback.md\\` if it exists. Note the previous grade, identified patterns, and priorities. This is your baseline — you are measuring CHANGE, not just current state.\n\n### 2. Gather current evidence\n- PRs (last 7 days): \\`gh pr list --state all --limit 20 --json number,title,state,mergedAt,createdAt\\`\n- Recent commits (last 7 days): \\`gh api repos/{owner}/{repo}/commits?since=YYYY-MM-DDT00:00:00Z&per_page=20 --jq '.[].commit.message'\\`\n- Open issues: \\`gh issue list --state open --limit 15 --json number,title,labels\\`\n- Read \\`.agents/memory/{squad}/priorities.md\\` and \\`.agents/memory/company/directives.md\\`\n- Read \\`.agents/memory/{squad}/active-work.md\\` (previous cycle's work tracking)\n\n### 3. Write feedback.md (APPEND history, don't overwrite)\n\\`\\`\\`markdown\n# Feedback — {squad}\n\n## Current Assessment (YYYY-MM-DD): [A-F]\nMerge rate: X% | Noise ratio: Y% | Priority alignment: Z%\n\n## Trajectory: [improving | stable | declining | new]\nPrevious grade: [grade] → Current: [grade]. [1-line explanation of why]\n\n## Valuable (continue)\n- [specific PR/issue that advanced priorities]\n\n## Noise (stop)\n- [specific anti-pattern observed]\n\n## Next Cycle Priorities\n1. [specific actionable item]\n\n## History\n| Date | Grade | Key Signal |\n|------|-------|------------|\n| YYYY-MM-DD | X | [what drove this grade] |\n[keep last 10 entries, append new row]\n\\`\\`\\`\n\n### 4. Write active-work.md\n\\`\\`\\`markdown\n# Active Work — {squad} (YYYY-MM-DD)\n## Continue (open PRs)\n- #{number}: {title} — {status/next action}\n## Backlog (assigned issues)\n- #{number}: {title} — {priority}\n## Do NOT Create\n- {description of known duplicate patterns from feedback history}\n\\`\\`\\`\n\n### 5. Commit to hq main\n${squadsRun.length > 1 ? `\n### 6. Cross-squad assessment\nEvaluate how outputs from ${squadList} connect:\n- Duplicated efforts across squads?\n- Missing handoffs (one squad's output should feed another)?\n- Coordination gaps (conflicting PRs, redundant issues)?\n- Combined trajectory: is the org getting more effective or more noisy?\nWrite cross-squad findings to \\`.agents/memory/company/cross-squad-review.md\\`.\n` : ''}\nCRITICAL: You are measuring DIRECTION not just position. A C-grade squad improving from F is better than a B-grade squad declining from A. The history table IS the feedback loop — agents read it next cycle.`;\n\n await runAgent('company-lead', cooPath, 'company', {\n ...options,\n task: evalTask,\n timeout: EVAL_TIMEOUT_MINUTES,\n eval: false, // prevent recursion\n trigger: 'manual',\n });\n}\n\n// ── Autopilot mode ──────────────────────────────────────────────────\n// When `squads run` is called with no target, it becomes the daemon:\n// score all squads, dispatch the full loop (scanner→lead→worker→verifier)\n// for top-priority squads, push cognition signals, repeat.\n\n// Default cooldowns per agent role (ms)\nconst ROLE_COOLDOWNS: Record<string, number> = {\n scanner: 60 * 60 * 1000, // 1h — fast, cheap\n lead: 4 * 60 * 60 * 1000, // 4h — orchestration\n worker: 30 * 60 * 1000, // 30m — if work exists\n verifier: 30 * 60 * 1000, // 30m — follows workers\n 'issue-solver': 30 * 60 * 1000, // 30m — default worker\n};\n\n/**\n * Classify an agent's role from its name.\n * Uses classifyAgent from conversation.ts, falls back to 'worker'.\n */\nfunction classifyAgentRole(name: string): string {\n return classifyAgent(name) ?? 'worker';\n}\n\n/**\n * Autopilot: continuous loop that scores squads and dispatches full squad loops.\n * Replaces the daemon command — same state file, same scoring, but dispatches\n * the full agent roster instead of just issue-solver.\n */\nasync function runAutopilot(\n squadsDir: string,\n options: RunOptions,\n): Promise<void> {\n const interval = parseInt(String(options.interval || '30'), 10);\n const maxParallel = parseInt(String(options.maxParallel || '2'), 10);\n const budget = parseFloat(String(options.budget || '0'));\n const once = !!options.once;\n\n // Seed cognition beliefs on first run\n const cognitionState = loadCognitionState();\n seedBeliefsIfEmpty(cognitionState);\n saveCognitionState(cognitionState);\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}autopilot${RESET}`);\n writeLine(` ${colors.dim}Interval: ${interval}m | Parallel: ${maxParallel} | Budget: ${budget > 0 ? '$' + budget + '/day' : 'unlimited'}${RESET}`);\n writeLine(` ${colors.dim}Cognition: ${cognitionState.beliefs.length} beliefs, ${cognitionState.signals.length} signals${RESET}`);\n writeLine();\n\n let running = true;\n const handleSignal = () => { running = false; };\n process.on('SIGINT', handleSignal);\n process.on('SIGTERM', handleSignal);\n\n while (running) {\n const cycleStart = Date.now();\n const state = loadLoopState();\n\n // Reset daily cost at midnight\n const today = new Date().toISOString().slice(0, 10);\n if (state.dailyCostDate !== today) {\n state.dailyCost = 0;\n state.dailyCostDate = today;\n }\n\n // Budget check\n if (budget > 0 && state.dailyCost >= budget) {\n writeLine(` ${icons.warning} ${colors.yellow}Daily budget reached ($${state.dailyCost.toFixed(2)}/$${budget})${RESET}`);\n saveLoopState(state);\n if (once) break;\n await sleep(interval * 60 * 1000);\n continue;\n }\n\n writeLine(` ${colors.dim}── Cycle ${new Date().toLocaleTimeString()} ──${RESET}`);\n\n // Get bot env for GitHub API calls\n let ghEnv: Record<string, string> = {};\n try { ghEnv = await getBotGhEnv(); } catch { /* use default */ }\n\n // Score squads\n const squadRepos = getSquadRepos();\n\n let dispatchedSquadNames: string[];\n const failed: string[] = [];\n const completed: string[] = [];\n\n if (options.phased) {\n // ── Phased dispatch: execute squads in dependency order ──\n const phases = computePhases();\n const phaseCount = phases.size;\n writeLine(` ${colors.dim}Phased mode: ${phaseCount} phase(s)${RESET}`);\n\n dispatchedSquadNames = [];\n\n for (const [phaseNum, phaseSquads] of phases) {\n writeLine(` ${colors.dim}── Phase ${phaseNum} (${phaseSquads.join(', ')}) ──${RESET}`);\n\n // Score only squads in this phase\n const phaseSignals = scoreSquadsForPhase(phaseSquads, state, squadRepos, ghEnv);\n const phaseDispatch = phaseSignals\n .filter(s => s.score > 0)\n .slice(0, maxParallel);\n\n if (phaseDispatch.length === 0) {\n writeLine(` ${colors.dim}No squads need attention in this phase${RESET}`);\n continue;\n }\n\n for (const sig of phaseDispatch) {\n writeLine(` ${colors.cyan}${sig.squad}${RESET} (score: ${sig.score}) — ${sig.reason}`);\n }\n\n if (options.dryRun) {\n continue;\n }\n\n // Dispatch phase squads in parallel, wait for all before next phase\n const phaseResults = await Promise.allSettled(\n phaseDispatch.map(sig => {\n const squad = loadSquad(sig.squad);\n if (!squad) return Promise.resolve();\n return runSquadLoop(squad, squadsDir, state, ghEnv, options);\n })\n );\n\n for (let i = 0; i < phaseResults.length; i++) {\n const name = phaseDispatch[i].squad;\n dispatchedSquadNames.push(name);\n if (phaseResults[i].status === 'rejected') {\n failed.push(name);\n state.failCounts[name] = (state.failCounts[name] || 0) + 1;\n } else {\n completed.push(name);\n delete state.failCounts[name];\n }\n }\n }\n\n if (options.dryRun) {\n writeLine(` ${colors.yellow}[DRY RUN] Would dispatch above squads in phase order${RESET}`);\n saveLoopState(state);\n if (once) break;\n await sleep(interval * 60 * 1000);\n continue;\n }\n } else {\n // ── Flat dispatch: score-based, no phase ordering ──\n const signals = scoreSquads(state, squadRepos, ghEnv);\n\n if (signals.length === 0 || signals.every(s => s.score <= 0)) {\n writeLine(` ${colors.dim}No squads need attention${RESET}`);\n saveLoopState(state);\n if (once) break;\n await sleep(interval * 60 * 1000);\n continue;\n }\n\n // Pick top N squads to dispatch\n const toDispatch = signals\n .filter(s => s.score > 0)\n .slice(0, maxParallel);\n\n writeLine(` ${colors.dim}Dispatching ${toDispatch.length} squad(s):${RESET}`);\n for (const sig of toDispatch) {\n writeLine(` ${colors.cyan}${sig.squad}${RESET} (score: ${sig.score}) — ${sig.reason}`);\n }\n\n if (options.dryRun) {\n writeLine(` ${colors.yellow}[DRY RUN] Would dispatch above squads${RESET}`);\n saveLoopState(state);\n if (once) break;\n await sleep(interval * 60 * 1000);\n continue;\n }\n\n // Dispatch squad loops in parallel\n const results = await Promise.allSettled(\n toDispatch.map(sig => {\n const squad = loadSquad(sig.squad);\n if (!squad) return Promise.resolve();\n return runSquadLoop(squad, squadsDir, state, ghEnv, options);\n })\n );\n\n for (let i = 0; i < results.length; i++) {\n const r = results[i];\n const name = toDispatch[i].squad;\n if (r.status === 'rejected') {\n failed.push(name);\n state.failCounts[name] = (state.failCounts[name] || 0) + 1;\n } else {\n completed.push(name);\n delete state.failCounts[name];\n }\n }\n\n dispatchedSquadNames = toDispatch.map(s => s.squad);\n }\n\n // Estimate cost (rough: $1 per squad loop)\n const cycleCost = dispatchedSquadNames.length * 1.0;\n state.dailyCost += cycleCost;\n\n // Push memory signals for dispatched squads\n await pushMemorySignals(dispatchedSquadNames, state, !!options.verbose);\n\n // Trim and save state\n state.recentRuns = state.recentRuns.slice(-100);\n state.lastCycle = new Date().toISOString();\n saveLoopState(state);\n\n // Slack: only on failures\n if (failed.length > 0) {\n slackNotify([\n `*Autopilot cycle — failures*`,\n `Failed: ${failed.join(', ')}`,\n `Completed: ${completed.join(', ')}`,\n `Daily: $${state.dailyCost.toFixed(2)}${budget > 0 ? '/$' + budget : ''}`,\n ].join('\\n'));\n }\n\n // Escalate persistent failures\n for (const [key, count] of Object.entries(state.failCounts)) {\n if (count >= 3) {\n slackNotify(`🚨 *Escalation*: ${key} has failed ${count} times consecutively.`);\n }\n }\n\n // ── Post-run COO evaluation ──\n // Evaluate outputs from all dispatched squads (skips if company was the only one)\n if (dispatchedSquadNames.length > 0) {\n await runPostEvaluation(dispatchedSquadNames, options);\n }\n\n // ── Cognition: learn from this cycle ──\n // Ingest memory → synthesize signals → evaluate decisions → reflect\n writeLine(` ${colors.dim}Cognition cycle...${RESET}`);\n const cognitionResult = await runCognitionCycle(dispatchedSquadNames, !!options.verbose);\n if (cognitionResult.signalsIngested > 0 || cognitionResult.beliefsUpdated > 0 || cognitionResult.reflected) {\n writeLine(` ${colors.dim}🧠 ${cognitionResult.signalsIngested} signals → ${cognitionResult.beliefsUpdated} beliefs updated${cognitionResult.reflected ? ' → reflected' : ''}${RESET}`);\n }\n\n const elapsed = ((Date.now() - cycleStart) / 1000).toFixed(0);\n writeLine(` ${colors.dim}Cycle done in ${elapsed}s | Daily: $${state.dailyCost.toFixed(2)}${RESET}`);\n writeLine();\n\n if (once) break;\n await sleep(interval * 60 * 1000);\n }\n\n process.off('SIGINT', handleSignal);\n process.off('SIGTERM', handleSignal);\n}\n\n/**\n * Run the full squad loop: scanner → lead → worker → verifier.\n * Each step checks cooldowns and pushes cognition signals.\n * This is the core intelligence loop.\n */\nasync function runSquadLoop(\n squad: NonNullable<ReturnType<typeof loadSquad>>,\n squadsDir: string,\n state: LoopState,\n ghEnv: Record<string, string>,\n options: RunOptions,\n): Promise<void> {\n writeLine(` ${gradient('▸')} ${colors.cyan}${squad.name}${RESET} — full loop`);\n\n // Discover agents and classify by role\n const agentsByRole: Record<string, Array<{ name: string; path: string }>> = {\n scanner: [],\n lead: [],\n worker: [],\n verifier: [],\n };\n\n for (const agent of squad.agents) {\n const role = classifyAgentRole(agent.name);\n const agentPath = join(squadsDir, squad.dir, `${agent.name}.md`);\n if (existsSync(agentPath)) {\n agentsByRole[role].push({ name: agent.name, path: agentPath });\n }\n }\n\n const loopSteps: Array<{ role: string; agents: Array<{ name: string; path: string }> }> = [\n { role: 'scanner', agents: agentsByRole.scanner },\n { role: 'lead', agents: agentsByRole.lead },\n { role: 'worker', agents: agentsByRole.worker },\n { role: 'verifier', agents: agentsByRole.verifier },\n ];\n\n for (const step of loopSteps) {\n if (step.agents.length === 0) continue;\n\n for (const agent of step.agents) {\n const cooldownMs = ROLE_COOLDOWNS[step.role] || ROLE_COOLDOWNS.worker;\n if (!checkCooldown(state, squad.name, agent.name, cooldownMs)) {\n if (options.verbose) {\n writeLine(` ${colors.dim}↳ ${agent.name} (${step.role}) — in cooldown, skip${RESET}`);\n }\n continue;\n }\n\n writeLine(` ${colors.dim}↳ ${agent.name} (${step.role})${RESET}`);\n\n const startMs = Date.now();\n try {\n // For workers with no specific agent flag, use conversation mode\n // For scanners/leads/verifiers, run as direct agent\n if (step.role === 'worker' && step.agents.length > 1) {\n // Multiple workers → conversation mode coordinates them\n const convOptions: ConversationOptions = {\n task: options.task,\n maxTurns: options.maxTurns || 20,\n costCeiling: options.costCeiling || 25,\n verbose: options.verbose,\n model: options.model,\n };\n await runConversation(squad, convOptions);\n } else {\n await runAgent(agent.name, agent.path, squad.dir, {\n ...options,\n background: false,\n watch: false,\n execute: true,\n });\n }\n\n const durationMs = Date.now() - startMs;\n const outcome = classifyRunOutcome(0, durationMs);\n\n // Update cooldown\n state.cooldowns[`${squad.name}:${agent.name}`] = Date.now();\n\n // Record run\n state.recentRuns.push({\n squad: squad.name,\n agent: agent.name,\n at: new Date().toISOString(),\n result: outcome === 'skipped' ? 'completed' : outcome,\n durationMs,\n });\n\n // Push cognition signal\n pushCognitionSignal({\n source: 'execution',\n signal_type: `${step.role}_${outcome}`,\n value: durationMs / 1000,\n unit: 'seconds',\n data: {\n squad: squad.name,\n agent: agent.name,\n role: step.role,\n duration_ms: durationMs,\n },\n entity_type: 'agent',\n entity_id: `${squad.name}/${agent.name}`,\n confidence: 0.9,\n });\n\n if (outcome === 'skipped') {\n writeLine(` ${colors.dim}↳ ${agent.name} — phantom (${(durationMs / 1000).toFixed(0)}s), skipped${RESET}`);\n }\n\n // If this was a worker step, break after first conversation\n if (step.role === 'worker' && step.agents.length > 1) break;\n\n } catch (err) {\n const durationMs = Date.now() - startMs;\n state.cooldowns[`${squad.name}:${agent.name}`] = Date.now();\n state.recentRuns.push({\n squad: squad.name,\n agent: agent.name,\n at: new Date().toISOString(),\n result: 'failed',\n durationMs,\n });\n\n writeLine(` ${colors.red}↳ ${agent.name} failed: ${err instanceof Error ? err.message : 'unknown'}${RESET}`);\n }\n }\n }\n\n writeLine(` ${colors.dim}↳ ${squad.name} loop complete${RESET}`);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Lead mode: Single orchestrator session that uses Task tool for parallel work.\n * Benefits over --parallel:\n * - Single session overhead vs N sessions\n * - Lead coordinates and routes work intelligently\n * - Task agents share context when needed\n * - Better parallelization (Claude's native Task tool)\n */\nasync function runLeadMode(\n squad: ReturnType<typeof loadSquad>,\n squadsDir: string,\n options: RunOptions\n): Promise<void> {\n if (!squad) return;\n\n const agentFiles = squad.agents\n .map(a => ({\n name: a.name,\n path: join(squadsDir, squad.dir, `${a.name}.md`),\n role: a.role || '',\n }))\n .filter(a => existsSync(a.path));\n\n if (agentFiles.length === 0) {\n writeLine(` ${icons.error} ${colors.red}No agent files found${RESET}`);\n return;\n }\n\n writeLine(` ${bold}Lead mode${RESET} ${colors.dim}orchestrating ${agentFiles.length} agents${RESET}`);\n writeLine();\n\n // List available agents\n for (const agent of agentFiles) {\n writeLine(` ${icons.empty} ${colors.cyan}${agent.name}${RESET} ${colors.dim}${agent.role}${RESET}`);\n }\n writeLine();\n\n if (!options.execute) {\n writeLine(` ${colors.dim}Launch lead session:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squad.name}${RESET} --lead`);\n writeLine();\n return;\n }\n\n // Build the lead prompt\n const timeoutMins = options.timeout || DEFAULT_TIMEOUT_MINUTES;\n const agentList = agentFiles.map(a => `- ${a.name}: ${a.role}`).join('\\n');\n const agentPaths = agentFiles.map(a => `- ${a.name}: ${a.path}`).join('\\n');\n\n const prompt = `You are the Lead of the ${squad.name} squad.\n\n## Mission\n${squad.mission || 'Execute squad operations efficiently.'}\n\n## Available Agents\n${agentList}\n\n## Agent Definition Files\n${agentPaths}\n\n## Your Role as Lead\n\n1. **Assess the situation**: Check for pending work:\n - Run \\`gh issue list --repo agents-squads/hq --label squad:${squad.name}\\` for assigned issues\n - Check .agents/memory/${squad.dir}/ for squad state and pending tasks\n - Review recent activity with \\`git log --oneline -10\\`\n\n2. **Delegate work using Task tool**: For each piece of work:\n - Use the Task tool with subagent_type=\"general-purpose\"\n - Include the agent definition file path in the prompt\n - Spawn multiple Task agents IN PARALLEL when work is independent\n - Example: \"Read ${agentFiles[0]?.path || 'agent.md'} and execute its instructions for [specific task]\"\n\n3. **Coordinate parallel execution**:\n - Independent tasks → spawn Task agents in parallel (single message, multiple tool calls)\n - Dependent tasks → run sequentially\n - Monitor progress and handle failures\n\n4. **Report and update memory**:\n - Update .agents/memory/${squad.dir}/state.md with completed work\n - Log learnings to learnings.md\n - Create issues for follow-up work if needed\n\n## Time Budget\nYou have ${timeoutMins} minutes. Prioritize high-impact work.\n\n## Critical Instructions\n- Use Task tool for delegation, NOT direct execution of agent work\n- Spawn parallel Task agents when work is independent\n- When done, type /exit to end the session\n- Do NOT wait for user input - work autonomously\n\n## Async Mode (CRITICAL)\nThis is ASYNC execution - Task agents must be fully autonomous:\n- **Findings** → Create GitHub issues (gh issue create)\n- **Code changes** → Create PRs (gh pr create)\n- **Analysis results** → Write to .agents/outputs/ or memory files\n- **NEVER wait for human review** - complete the work and move on\n- **NEVER ask clarifying questions** - make reasonable decisions\n\nInstruct each Task agent: \"Work autonomously. Output findings to GitHub issues. Output code changes as PRs. Do not wait for review.\"\n\nBegin by assessing pending work, then delegate to agents via Task tool.`;\n\n // Determine provider\n const provider = options.provider || squad?.providers?.default || 'anthropic';\n const isAnthropic = provider === 'anthropic';\n\n if (isAnthropic) {\n const claudeAvailable = await checkClaudeCliAvailable();\n if (!claudeAvailable) {\n writeLine(` ${colors.yellow}Claude CLI not found${RESET}`);\n writeLine(` ${colors.dim}Install: npm install -g @anthropic-ai/claude-code${RESET}`);\n return;\n }\n } else {\n if (!isProviderCLIAvailable(provider)) {\n const cliConfig = getCLIConfig(provider);\n writeLine(` ${colors.yellow}${cliConfig?.displayName || provider} CLI not found${RESET}`);\n if (cliConfig?.install) {\n writeLine(` ${colors.dim}Install: ${cliConfig.install}${RESET}`);\n }\n return;\n }\n }\n\n // Determine execution mode (foreground is default, background is opt-in)\n const isBackground = options.background === true && !options.watch;\n const isWatch = options.watch === true;\n const isForeground = !isBackground && !isWatch;\n\n const modeText = isBackground ? ' (background)' : isWatch ? ' (watch)' : '';\n const providerDisplay = isAnthropic ? 'Claude' : (getCLIConfig(provider)?.displayName || provider);\n writeLine(` ${gradient('Launching')} lead session${modeText} with ${providerDisplay}...`);\n writeLine();\n\n try {\n // Find lead agent name from agent files or use default\n const leadAgentName = agentFiles.find(a => a.name.includes('lead'))?.name || `${squad.dir}-lead`;\n\n let result: string;\n if (isAnthropic) {\n result = await executeWithClaude(prompt, {\n verbose: options.verbose,\n timeoutMinutes: timeoutMins,\n foreground: options.foreground,\n background: options.background,\n watch: options.watch,\n useApi: options.useApi,\n effort: options.effort,\n skills: options.skills,\n trigger: options.trigger || 'manual',\n squadName: squad.dir,\n agentName: leadAgentName,\n model: options.model,\n });\n } else {\n result = await executeWithProvider(provider, prompt, {\n verbose: options.verbose,\n foreground: isForeground || isWatch,\n squadName: squad.dir,\n agentName: leadAgentName,\n });\n }\n\n if (isForeground || isWatch) {\n writeLine();\n writeLine(` ${icons.success} Lead session completed`);\n } else {\n writeLine(` ${icons.success} Lead session launched in background`);\n writeLine(` ${colors.dim}${result}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}The lead will:${RESET}`);\n writeLine(` ${colors.dim} 1. Assess pending work (issues, memory)${RESET}`);\n writeLine(` ${colors.dim} 2. Spawn Task agents for parallel execution${RESET}`);\n writeLine(` ${colors.dim} 3. Coordinate and report results${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Monitor: squads workers${RESET}`);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n writeLine(` ${icons.error} ${colors.red}Failed to launch agent${RESET}`);\n writeLine(` ${colors.dim}${msg}${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads doctor\\` to check your setup.${RESET}`);\n }\n}\n\nasync function runAgent(\n agentName: string,\n agentPath: string,\n squadName: string,\n options: RunOptions & { execute?: boolean }\n): Promise<void> {\n const spinner = ora(`Running agent: ${agentName}`).start();\n const startMs = Date.now();\n const startTime = new Date(startMs).toISOString();\n const executionId = generateExecutionId();\n const taskType = detectTaskType(agentName);\n\n const definition = loadAgentDefinition(agentPath);\n\n // Fetch learnings from bridge (needed for both dry-run preview and real execution)\n const learnings = await fetchLearnings(squadName);\n const learningContext = learnings.length > 0\n ? `\\n## Learnings from Previous Runs\\n${learnings.map(l => `- ${l.content}`).join('\\n')}\\n`\n : '';\n\n if (options.dryRun) {\n spinner.info(`[DRY RUN] Would run ${agentName}`);\n // Show context that would be injected (with role-based gating)\n const dryRunAgentRole = classifyAgent(agentName);\n const dryRunContextRole: ContextRole = agentName.includes('company-lead') ? 'coo'\n : (dryRunAgentRole as ContextRole | null) ?? 'worker';\n const dryRunContext = gatherSquadContext(squadName, agentName, {\n verbose: options.verbose, agentPath, role: dryRunContextRole\n });\n if (options.verbose) {\n writeLine(` ${colors.dim}Agent definition:${RESET}`);\n writeLine(` ${colors.dim}${definition.slice(0, DRYRUN_DEF_MAX_CHARS)}...${RESET}`);\n if (learnings.length > 0) {\n writeLine(` ${colors.dim}Learnings: ${learnings.length} from bridge${RESET}`);\n }\n if (dryRunContext || learningContext) {\n const fullContext = `${dryRunContext}${learningContext}`;\n writeLine();\n writeLine(` ${colors.cyan}Context to inject (${Math.ceil(fullContext.length / 4)} tokens):${RESET}`);\n writeLine(` ${colors.dim}${fullContext.slice(0, DRYRUN_CONTEXT_MAX_CHARS)}...${RESET}`);\n }\n }\n return;\n }\n\n // Pre-execution permission validation (Phase 3)\n const squadsDir = findSquadsDir();\n if (squadsDir) {\n const squadFilePath = join(squadsDir, squadName, 'SQUAD.md');\n if (existsSync(squadFilePath)) {\n const squadContent = readFileSync(squadFilePath, 'utf-8');\n const permContext = buildContextFromSquad(squadName, squadContent, agentName);\n\n // Build execution request from agent definition\n // For now, we validate MCP servers mentioned in the agent definition\n const mcpServers = extractMcpServersFromDefinition(definition);\n const execRequest: ExecutionRequest = {\n mcpServers\n };\n\n const permResult = validateExecution(permContext, execRequest);\n\n if (permResult.violations.length > 0) {\n spinner.stop();\n const violationLines = formatViolations(permResult);\n for (const line of violationLines) {\n writeLine(` ${line}`);\n }\n writeLine();\n\n if (!permResult.allowed) {\n writeLine(` ${colors.red}Execution blocked due to permission violations.${RESET}`);\n writeLine(` ${colors.dim}Configure permissions in ${squadFilePath}${RESET}`);\n return;\n }\n }\n }\n }\n\n // Preflight gate check (quota, cooldown) via bridge API\n const preflight = await checkPreflightGates(squadName, agentName);\n\n if (!preflight.allowed) {\n spinner.stop();\n writeLine();\n writeLine(` ${colors.red}${icons.error} Execution blocked by preflight gates${RESET}`);\n\n if (preflight.gates.quota && !preflight.gates.quota.ok) {\n writeLine(` ${colors.dim}Quota: $${preflight.gates.quota.used.toFixed(2)}/$${preflight.gates.quota.limit}/mo limit exceeded${RESET}`);\n }\n\n if (preflight.gates.cooldown && !preflight.gates.cooldown.ok) {\n const elapsed = preflight.gates.cooldown.elapsed_sec;\n const minGap = preflight.gates.cooldown.min_gap_sec;\n writeLine(` ${colors.dim}Cooldown: ${elapsed}s since last run (min: ${minGap}s)${RESET}`);\n }\n\n writeLine();\n return;\n }\n\n // Show preflight status in verbose mode\n if (options.verbose && Object.keys(preflight.gates).length > 0) {\n writeLine(` ${colors.dim}Preflight: quota ${preflight.gates.quota?.ok ? '✓' : '✗'} cooldown ${preflight.gates.cooldown?.ok ? '✓' : '✗'}${RESET}`);\n }\n\n // Local cooldown check (when bridge is unavailable or has no execution history)\n // Skip for manual triggers - only enforce for scheduled/cron runs\n const isScheduledRun = options.trigger === 'scheduled' || options.trigger === 'smart';\n const bridgeHasNoHistory = preflight.gates.cooldown?.elapsed_sec === null;\n if (isScheduledRun && (!preflight.gates.cooldown || bridgeHasNoHistory)) {\n // Read cooldown from agent frontmatter, fall back to default\n const frontmatterForCooldown = parseAgentFrontmatter(agentPath);\n const cooldownMs = frontmatterForCooldown.cooldown\n ? (parseCooldown(frontmatterForCooldown.cooldown) || DEFAULT_SCHEDULED_COOLDOWN_MS)\n : DEFAULT_SCHEDULED_COOLDOWN_MS;\n const localCooldown = checkLocalCooldown(squadName, agentName, cooldownMs);\n\n if (!localCooldown.ok) {\n spinner.stop();\n writeLine();\n writeLine(` ${colors.yellow}${icons.warning} Skipping: cooldown not elapsed${RESET}`);\n writeLine(` ${colors.dim}Last run: ${formatDuration(localCooldown.elapsedMs!)} ago (cooldown: ${formatDuration(localCooldown.cooldownMs)})${RESET}`);\n writeLine();\n return;\n }\n\n if (options.verbose) {\n writeLine(` ${colors.dim}Local cooldown: ✓ (${formatDuration(localCooldown.elapsedMs || 0)} since last run)${RESET}`);\n }\n }\n\n // Log execution start\n logExecution({\n squadName,\n agentName,\n executionId,\n startTime,\n status: 'running',\n trigger: options.trigger || 'manual',\n taskType,\n });\n\n if (options.verbose && learnings.length > 0) {\n writeLine(` ${colors.dim}Injecting ${learnings.length} learnings${RESET}`);\n }\n\n // Load system protocol (SYSTEM.md, replaces legacy approval + post-execution)\n const systemProtocol = loadSystemProtocol();\n const systemContext = systemProtocol ? `\\n${systemProtocol}\\n` : '';\n\n // Derive context role from agent name for role-based context gating\n const agentRole = classifyAgent(agentName);\n const contextRole: ContextRole = agentName.includes('company-lead') ? 'coo'\n : (agentRole as ContextRole | null) ?? 'worker';\n\n // Gather squad context (role-based: scanners get minimal, leads get everything)\n const squadContext = gatherSquadContext(squadName, agentName, {\n verbose: options.verbose, agentPath, role: contextRole\n });\n\n // Fetch cognition beliefs for prompt injection (Reflexion pattern)\n let cognitionContext = '';\n try {\n const { loadSession } = await import('../lib/auth.js');\n const { getApiUrl } = await import('../lib/env-config.js');\n const session = loadSession();\n if (session?.accessToken && session.status === 'active') {\n const safeSquadName = encodeURIComponent(squadName);\n const res = await fetch(`${getApiUrl()}/cognition/context/squad:${safeSquadName}`, {\n headers: { Authorization: `Bearer ${session.accessToken}` },\n signal: AbortSignal.timeout(3000),\n });\n if (res.ok) {\n const data = await res.json() as { markdown: string };\n if (data.markdown && !data.markdown.includes('No cognition data')) {\n cognitionContext = `\\n${data.markdown}\\n`;\n if (options.verbose) {\n writeLine(` ${colors.dim}Injecting cognition beliefs${RESET}`);\n }\n }\n }\n }\n } catch (e) {\n if (options.verbose) writeLine(` ${colors.dim}warn: cognition fetch failed: ${e instanceof Error ? e.message : String(e)}${RESET}`);\n }\n\n // Generate the Claude Code prompt with timeout awareness\n const timeoutMins = options.timeout || DEFAULT_TIMEOUT_MINUTES;\n const taskDirective = options.task\n ? `\\n## TASK DIRECTIVE (overrides default behavior)\\n${options.task}\\n`\n : '';\n const prompt = `Execute the ${agentName} agent from squad ${squadName}.\n\nRead the agent definition at ${agentPath} and follow its instructions exactly.\n${taskDirective}\nThe agent definition contains:\n- Purpose/role\n- Tools it can use (MCP servers, skills)\n- Step-by-step instructions\n- Expected output format\n\nTOOL PREFERENCE: Always prefer CLI tools over MCP servers when both can accomplish the task:\n- Use \\`squads\\` CLI for squad operations (run, memory, status, feedback)\n- Use \\`gh\\` CLI for GitHub (issues, PRs, repos)\n- Use \\`git\\` CLI for version control\n- Use Bash for file operations, builds, tests\n- Only use MCP tools when CLI cannot do it or MCP is significantly better\n${systemContext}${squadContext}${cognitionContext}${learningContext}\nTIME LIMIT: You have ${timeoutMins} minutes. Work efficiently:\n- Focus on the most important tasks first\n- If a task is taking too long, move on and note it for next run\n- Aim to complete within ${Math.floor(timeoutMins * SOFT_DEADLINE_RATIO)} minutes`;\n\n // Resolve provider with full chain:\n // 1. Agent config (from agent file frontmatter/header)\n // 2. CLI option (--provider flag)\n // 3. Squad default (from SQUAD.md providers.default)\n // 4. Fallback to 'anthropic'\n const agentProvider = parseAgentProvider(agentPath);\n const squad = loadSquad(squadName);\n const squadDefaultProvider = squad?.providers?.default;\n\n const provider = agentProvider || options.provider || squadDefaultProvider || 'anthropic';\n const isAnthropic = provider === 'anthropic';\n\n if (options.verbose && (agentProvider || squadDefaultProvider)) {\n writeLine(` ${colors.dim}Provider resolution:${RESET}`);\n if (agentProvider) writeLine(` ${colors.dim}Agent: ${agentProvider}${RESET}`);\n if (options.provider) writeLine(` ${colors.dim}CLI: ${options.provider}${RESET}`);\n if (squadDefaultProvider) writeLine(` ${colors.dim}Squad: ${squadDefaultProvider}${RESET}`);\n writeLine(` ${colors.dim}→ Using: ${provider}${RESET}`);\n }\n\n // Check CLI availability\n const cliAvailable = isAnthropic\n ? await checkClaudeCliAvailable()\n : isProviderCLIAvailable(provider);\n\n if (options.execute && cliAvailable) {\n const cliConfig = getCLIConfig(provider);\n const cliName = cliConfig?.displayName || provider;\n\n // Determine execution mode (foreground is default, background is opt-in)\n const isBackground = options.background === true && !options.watch;\n const isWatch = options.watch === true;\n const isForeground = !isBackground && !isWatch;\n\n spinner.text = isBackground\n ? `Launching ${agentName} with ${cliName} in background...`\n : isWatch\n ? `Starting ${agentName} with ${cliName} (watch mode)...`\n : `Running ${agentName} with ${cliName}...`;\n\n // Parse frontmatter for verification criteria (Ralph loop)\n const frontmatter = parseAgentFrontmatter(agentPath);\n const hasCriteria = !!frontmatter.acceptance_criteria && options.verify !== false;\n const maxRetries = frontmatter.max_retries ?? 2;\n let currentPrompt = prompt;\n\n for (let attempt = 0; attempt <= (hasCriteria ? maxRetries : 0); attempt++) {\n try {\n let result: string;\n\n if (isAnthropic) {\n result = await executeWithClaude(currentPrompt, {\n verbose: options.verbose,\n timeoutMinutes: options.timeout || 30,\n foreground: options.foreground,\n background: options.background,\n watch: options.watch,\n useApi: options.useApi,\n effort: options.effort,\n skills: options.skills,\n trigger: options.trigger || 'manual',\n squadName,\n agentName,\n model: options.model,\n });\n } else {\n result = await executeWithProvider(provider, currentPrompt, {\n verbose: options.verbose,\n foreground: !isBackground,\n squadName,\n agentName,\n });\n }\n\n // Ralph loop: verify foreground execution against acceptance criteria\n if (hasCriteria && (isForeground || isWatch)) {\n const verification = await verifyExecution(\n squadName, agentName, frontmatter.acceptance_criteria!, { verbose: options.verbose }\n );\n if (!verification.passed && attempt < maxRetries) {\n writeLine(` ${colors.yellow}Verification: FAIL - ${verification.reason}${RESET}`);\n writeLine(` ${colors.dim}Retrying (${attempt + 1}/${maxRetries})...${RESET}`);\n currentPrompt = `${prompt}\\n\\n## PREVIOUS ATTEMPT FAILED\\nVerification found: ${verification.reason}\\nPlease address this issue and try again.`;\n continue;\n }\n if (verification.passed) {\n writeLine(` ${colors.green}Verification: PASS - ${verification.reason}${RESET}`);\n }\n }\n\n // Emit completion event (non-blocking)\n emitExecutionEvent('agent.completed', {\n squad: squadName, agent: agentName, executionId,\n }).catch(() => {});\n\n if (isForeground || isWatch) {\n spinner.succeed(`Agent ${agentName} completed (${cliName})`);\n } else {\n spinner.succeed(`Agent ${agentName} launched in background (${cliName})`);\n writeLine(` ${colors.dim}${result}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Monitor:${RESET} squads workers`);\n writeLine(` ${colors.dim}Memory:${RESET} squads memory show ${squadName}`);\n }\n break; // Success — exit retry loop\n } catch (error) {\n // Emit failure event (non-blocking)\n emitExecutionEvent('agent.failed', {\n squad: squadName, agent: agentName, executionId, error: String(error),\n }).catch(() => {});\n\n spinner.fail(`Agent ${agentName} failed to launch`);\n updateExecutionStatus(squadName, agentName, executionId, 'failed', {\n error: String(error),\n durationMs: Date.now() - startMs,\n });\n const msg = error instanceof Error ? error.message : String(error);\n const isLikelyBug = error instanceof ReferenceError || error instanceof TypeError || error instanceof SyntaxError;\n writeLine(` ${colors.red}${msg}${RESET}`);\n writeLine();\n if (isLikelyBug) {\n writeLine(` ${colors.yellow}This looks like a bug. Please try:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads doctor ${colors.dim}— check your setup${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads update ${colors.dim}— get the latest fixes${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}If the problem persists, file an issue:${RESET}`);\n writeLine(` ${colors.dim}https://github.com/agents-squads/squads-cli/issues${RESET}`);\n } else {\n writeLine(` ${colors.dim}Run \\`squads doctor\\` to check your setup, or \\`squads run ${agentName} --verbose\\` for details.${RESET}`);\n }\n break; // Error — exit retry loop\n }\n }\n } else {\n // Show instructions for manual execution\n spinner.succeed(`Agent ${agentName} ready`);\n writeLine(` ${colors.dim}Execution logged: ${startTime}${RESET}`);\n\n if (!cliAvailable) {\n const cliConfig = getCLIConfig(provider);\n writeLine();\n writeLine(` ${colors.yellow}${cliConfig?.command || provider} CLI not found${RESET}`);\n writeLine(` ${colors.dim}Install: ${cliConfig?.install || 'squads providers'}${RESET}`);\n }\n\n writeLine();\n writeLine(` ${colors.dim}To launch as background task:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squadName}${RESET} -a ${colors.cyan}${agentName}${RESET}`);\n if (provider !== 'anthropic') {\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}${squadName}${RESET} -a ${colors.cyan}${agentName}${RESET} --provider=${provider}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Or run interactively:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} Run the ${colors.cyan}${agentName}${RESET} agent from ${agentPath}`);\n }\n}\n\nasync function checkClaudeCliAvailable(): Promise<boolean> {\n return new Promise((resolve) => {\n const check = spawn('which', ['claude'], { stdio: 'pipe' });\n check.on('close', (code) => resolve(code === 0));\n check.on('error', () => resolve(false));\n });\n}\n\n/**\n * Pre-flight check for the executor (Claude Code or other provider CLI).\n * Runs once at the start of `squads run` before any agent execution.\n * Checks:\n * 1. CLI binary is available on PATH\n * 2. Authentication looks configured (credentials file or API key)\n * Skippable with SQUADS_SKIP_CHECKS=1 env var (for CI/CD).\n * Returns true if checks pass (or are skipped), false if execution should abort.\n */\nasync function preflightExecutorCheck(provider: string): Promise<boolean> {\n // Allow skipping for CI/CD or advanced users\n if (process.env.SQUADS_SKIP_CHECKS === '1') {\n return true;\n }\n\n const isAnthropic = provider === 'anthropic';\n\n // --- Check 1: CLI binary on PATH ---\n let cliFound: boolean;\n\n if (isAnthropic) {\n cliFound = await checkClaudeCliAvailable();\n } else {\n cliFound = isProviderCLIAvailable(provider);\n }\n\n if (!cliFound) {\n const cliConfig = getCLIConfig(provider);\n const cliName = cliConfig?.command || provider;\n const installCmd = cliConfig?.install || `See ${provider} documentation`;\n\n writeLine();\n writeLine(` ${icons.error} ${colors.red}${cliName} CLI not found${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}The ${cliName} command is required to run agents but was not found on your PATH.${RESET}`);\n writeLine();\n writeLine(` ${colors.cyan}Install:${RESET} ${installCmd}`);\n writeLine();\n writeLine(` ${colors.dim}Skip this check: SQUADS_SKIP_CHECKS=1 squads run ...${RESET}`);\n writeLine();\n return false;\n }\n\n // Auth check removed: Claude CLI handles its own auth errors with clear messages.\n // Pre-checking here caused false warnings for OAuth users (keychain auth works\n // without .credentials.json or ANTHROPIC_API_KEY). See #520.\n\n return true;\n}\n\ninterface ExecuteWithClaudeOptions {\n verbose?: boolean;\n timeoutMinutes?: number;\n foreground?: boolean; // Deprecated, now default\n background?: boolean; // Opt-in background mode\n watch?: boolean; // Background but tail log\n useApi?: boolean;\n effort?: EffortLevel;\n skills?: string[];\n trigger?: ExecutionContext['trigger'];\n squadName: string;\n agentName: string;\n model?: string; // Model to use (Claude aliases or full model IDs like gemini-2.5-flash)\n}\n\n/** Build agent environment variables for Claude execution */\nfunction buildAgentEnv(\n baseEnv: Record<string, string>,\n execContext: ExecutionContext,\n options?: { effort?: EffortLevel; skills?: string[]; includeOtel?: boolean; ghToken?: string }\n): Record<string, string> {\n // Strip CLAUDECODE to allow spawning claude from within a Claude Code session\n const { CLAUDECODE: _, ...cleanEnv } = baseEnv;\n const env: Record<string, string> = {\n ...cleanEnv,\n SQUADS_SQUAD: execContext.squad,\n SQUADS_AGENT: execContext.agent,\n SQUADS_TASK_TYPE: execContext.taskType,\n SQUADS_TRIGGER: execContext.trigger,\n SQUADS_EXECUTION_ID: execContext.executionId,\n BRIDGE_API: getBridgeUrl(),\n };\n\n // Inject bot GH_TOKEN so agents create PRs/issues as the bot identity,\n // not the user's personal gh auth. This enables founder to review/approve.\n if (options?.ghToken) env.GH_TOKEN = options.ghToken;\n\n if (options?.includeOtel) {\n env.OTEL_RESOURCE_ATTRIBUTES = `squads.squad=${execContext.squad},squads.agent=${execContext.agent},squads.task_type=${execContext.taskType},squads.trigger=${execContext.trigger},squads.execution_id=${execContext.executionId}`;\n }\n\n if (options?.effort) env.CLAUDE_EFFORT = options.effort;\n if (options?.skills && options.skills.length > 0) env.CLAUDE_SKILLS = options.skills.join(',');\n\n return env;\n}\n\n/** Log verbose execution config (shared by foreground and background modes) */\nfunction logVerboseExecution(config: {\n projectRoot: string;\n mode: string;\n useApi?: boolean;\n execContext: ExecutionContext;\n effort?: EffortLevel;\n skills?: string[];\n resolvedModel?: string;\n claudeModelAlias?: string;\n explicitModel?: string;\n logFile?: string;\n mcpConfigPath?: string;\n}): void {\n writeLine(` ${colors.dim}Project: ${config.projectRoot}${RESET}`);\n writeLine(` ${colors.dim}Mode: ${config.mode}${RESET}`);\n if (config.logFile) writeLine(` ${colors.dim}Log: ${config.logFile}${RESET}`);\n if (config.mcpConfigPath) writeLine(` ${colors.dim}MCP config: ${config.mcpConfigPath}${RESET}`);\n if (config.useApi !== undefined) writeLine(` ${colors.dim}Auth: ${config.useApi ? 'API credits' : 'subscription'}${RESET}`);\n writeLine(` ${colors.dim}Execution: ${config.execContext.executionId}${RESET}`);\n writeLine(` ${colors.dim}Task type: ${config.execContext.taskType}${RESET}`);\n writeLine(` ${colors.dim}Trigger: ${config.execContext.trigger}${RESET}`);\n if (config.effort) writeLine(` ${colors.dim}Effort: ${config.effort}${RESET}`);\n if (config.skills && config.skills.length > 0) writeLine(` ${colors.dim}Skills: ${config.skills.join(', ')}${RESET}`);\n if (config.resolvedModel || config.claudeModelAlias) {\n const source = config.explicitModel ? 'explicit' : 'auto-routed';\n const displayModel = config.resolvedModel || config.claudeModelAlias;\n writeLine(` ${colors.dim}Model: ${displayModel} (${source})${RESET}`);\n }\n}\n\n/** Resolve the target repo root from the squad's repo field (e.g. \"org/squads-cli\" → sibling dir) */\nfunction resolveTargetRepoRoot(projectRoot: string, squad: Squad | null): string {\n if (!squad?.repo) return projectRoot;\n const repoName = squad.repo.split('/').pop();\n if (!repoName) return projectRoot;\n const candidatePath = join(projectRoot, '..', repoName);\n return existsSync(candidatePath) ? candidatePath : projectRoot;\n}\n\n/** Create an isolated worktree for agent execution (Node.js-based, for foreground mode) */\nfunction createAgentWorktree(projectRoot: string, squadName: string, agentName: string): string {\n const timestamp = Date.now();\n const branchName = `agent/${squadName}/${agentName}-${timestamp}`;\n const worktreePath = join(projectRoot, '..', '.worktrees', `${squadName}-${agentName}-${timestamp}`);\n\n try {\n mkdirSync(join(projectRoot, '..', '.worktrees'), { recursive: true });\n execSync(`git worktree add '${worktreePath}' -b '${branchName}' HEAD`, { cwd: projectRoot, stdio: 'pipe' });\n return worktreePath;\n } catch (e) {\n writeLine(` ${colors.dim}warn: worktree creation failed, using project root: ${e instanceof Error ? e.message : String(e)}${RESET}`);\n return projectRoot;\n }\n}\n\n/** Remove a worktree and its branch after agent execution completes */\nfunction cleanupWorktree(worktreePath: string, projectRoot: string): void {\n if (worktreePath === projectRoot) return; // fallback mode, nothing to clean\n\n try {\n // Extract branch name from worktree before removing\n const branchInfo = execSync(`git -C '${projectRoot}' worktree list --porcelain`, { encoding: 'utf-8' });\n let branchName = '';\n const lines = branchInfo.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n if (lines[i] === `worktree ${worktreePath}` && i + 2 < lines.length) {\n const branchLine = lines[i + 2]; // \"branch refs/heads/...\"\n if (branchLine.startsWith('branch refs/heads/')) {\n branchName = branchLine.replace('branch refs/heads/', '');\n }\n break;\n }\n }\n\n // Remove worktree\n execSync(`git -C '${projectRoot}' worktree remove '${worktreePath}' --force`, { stdio: 'pipe' });\n\n // Delete the agent branch (only agent/* branches, safety check)\n if (branchName && branchName.startsWith('agent/')) {\n execSync(`git -C '${projectRoot}' branch -D '${branchName}'`, { stdio: 'pipe' });\n }\n } catch {\n // Non-critical — worktree prune will catch it later\n }\n}\n\n/** Build shell script for detached execution with worktree isolation */\nfunction buildDetachedShellScript(config: {\n projectRoot: string;\n squadName: string;\n agentName: string;\n timestamp: number;\n claudeModelAlias?: string;\n escapedPrompt: string;\n logFile: string;\n pidFile: string;\n}): string {\n const modelFlag = config.claudeModelAlias ? `--model ${config.claudeModelAlias}` : '';\n const branchName = `agent/${config.squadName}/${config.agentName}-${config.timestamp}`;\n const worktreeDir = `${config.projectRoot}/../.worktrees/${config.squadName}-${config.agentName}-${config.timestamp}`;\n const cleanup = `if [ \"\\${WORK_DIR}\" != '${config.projectRoot}' ]; then git -C '${config.projectRoot}' worktree remove \"\\${WORK_DIR}\" --force 2>/dev/null; BRANCH='${branchName}'; git -C '${config.projectRoot}' branch -D \"\\${BRANCH}\" 2>/dev/null; fi`;\n const script = `mkdir -p '${config.projectRoot}/../.worktrees'; WORK_DIR='${config.projectRoot}'; if git -C '${config.projectRoot}' worktree add '${worktreeDir}' -b '${branchName}' HEAD 2>/dev/null; then WORK_DIR='${worktreeDir}'; fi; cd \"\\${WORK_DIR}\"; unset CLAUDECODE; claude --print --dangerously-skip-permissions --disable-slash-commands ${modelFlag} -- '${config.escapedPrompt}' > '${config.logFile}' 2>&1; ${cleanup}`;\n return `echo $$ > '${config.pidFile}'; ${script}`;\n}\n\n/** Prepare log directory and file paths for detached execution */\nfunction prepareLogFiles(projectRoot: string, squadName: string, agentName: string, timestamp: number): { logDir: string; logFile: string; pidFile: string } {\n const logDir = join(projectRoot, '.agents', 'logs', squadName);\n const logFile = join(logDir, `${agentName}-${timestamp}.log`);\n const pidFile = join(logDir, `${agentName}-${timestamp}.pid`);\n\n if (!existsSync(logDir)) {\n mkdirSync(logDir, { recursive: true });\n }\n\n return { logDir, logFile, pidFile };\n}\n\n/** Execute Claude in foreground mode (direct stdio, default) */\nfunction executeForeground(config: {\n prompt: string;\n claudeArgs: string[];\n agentEnv: Record<string, string>;\n projectRoot: string;\n squadName: string;\n agentName: string;\n execContext: ExecutionContext;\n startMs: number;\n provider?: string;\n}): Promise<string> {\n const workDir = createAgentWorktree(config.projectRoot, config.squadName, config.agentName);\n\n return new Promise((resolve, reject) => {\n const claude = spawn('claude', config.claudeArgs, {\n stdio: 'inherit',\n cwd: workDir,\n env: config.agentEnv,\n });\n\n claude.on('close', async (code) => {\n const durationMs = Date.now() - config.startMs;\n\n if (code === 0) {\n updateExecutionStatus(config.squadName, config.agentName, config.execContext.executionId, 'completed', {\n outcome: 'Session completed successfully',\n durationMs,\n });\n\n const commitResult = await autoCommitAgentWork(config.squadName, config.agentName, config.execContext.executionId, config.provider);\n if (commitResult.committed) {\n writeLine();\n writeLine(` ${colors.green}Auto-committed agent work${RESET}`);\n }\n\n cleanupWorktree(workDir, config.projectRoot);\n resolve('Session completed');\n } else {\n updateExecutionStatus(config.squadName, config.agentName, config.execContext.executionId, 'failed', {\n error: `Claude exited with code ${code}`,\n durationMs,\n });\n cleanupWorktree(workDir, config.projectRoot);\n reject(new Error(`Claude exited with code ${code}`));\n }\n });\n\n claude.on('error', (err) => {\n const durationMs = Date.now() - config.startMs;\n updateExecutionStatus(config.squadName, config.agentName, config.execContext.executionId, 'failed', {\n error: String(err),\n durationMs,\n });\n cleanupWorktree(workDir, config.projectRoot);\n reject(err);\n });\n });\n}\n\n/** Execute Claude in watch mode (background + tail log) */\nasync function executeWatch(config: {\n projectRoot: string;\n agentEnv: Record<string, string>;\n logFile: string;\n wrapperScript: string;\n}): Promise<string> {\n const child = spawn('sh', ['-c', config.wrapperScript], {\n cwd: config.projectRoot,\n detached: true,\n stdio: 'ignore',\n env: config.agentEnv,\n });\n child.unref();\n\n await new Promise(resolve => setTimeout(resolve, LOG_FILE_INIT_DELAY_MS));\n\n writeLine(` ${colors.dim}Tailing log (Ctrl+C to stop watching, agent continues)...${RESET}`);\n writeLine();\n\n const tail = spawn('tail', ['-f', config.logFile], { stdio: 'inherit' });\n\n process.on('SIGINT', () => {\n tail.kill();\n writeLine();\n writeLine(` ${colors.dim}Stopped watching. Agent continues in background.${RESET}`);\n writeLine(` ${colors.dim}Resume: tail -f ${config.logFile}${RESET}`);\n process.exit(0);\n });\n\n return new Promise((resolve) => {\n tail.on('close', () => {\n resolve(`Agent running in background. Log: ${config.logFile}`);\n });\n });\n}\n\nasync function executeWithClaude(\n prompt: string,\n options: ExecuteWithClaudeOptions\n): Promise<string> {\n const {\n verbose,\n timeoutMinutes: _timeoutMinutes = 30,\n foreground,\n background,\n watch,\n useApi,\n effort,\n skills,\n trigger = 'manual',\n squadName,\n agentName,\n model,\n } = options;\n\n // Determine execution mode\n const runInBackground = background === true && !watch;\n const runInWatch = watch === true;\n const runInForeground = !runInBackground && !runInWatch;\n\n const startMs = Date.now();\n const projectRoot = getProjectRoot();\n ensureProjectTrusted(projectRoot);\n\n // Resolve model and provider\n const squad = squadName !== 'unknown' ? loadSquad(squadName) : null;\n const mcpConfigPath = selectMcpConfig(squadName, squad);\n const taskType = detectTaskType(agentName);\n const resolvedModel = resolveModel(model, squad, taskType);\n const provider = resolvedModel ? detectProviderFromModel(resolvedModel) : 'anthropic';\n\n // Resolve target repo for worktree creation (squad.repo → sibling dir)\n const targetRepoRoot = resolveTargetRepoRoot(projectRoot, squad);\n\n // Delegate to non-Anthropic providers\n if (provider !== 'anthropic' && provider !== 'unknown') {\n if (verbose) {\n const source = model ? 'explicit' : 'auto-routed';\n writeLine(` ${colors.dim}Model: ${resolvedModel} (${source})${RESET}`);\n writeLine(` ${colors.dim}Provider: ${provider}${RESET}`);\n }\n return executeWithProvider(provider, prompt, {\n verbose, foreground, cwd: targetRepoRoot, squadName, agentName,\n });\n }\n\n const claudeModelAlias = resolvedModel ? getClaudeModelAlias(resolvedModel) : undefined;\n\n const execContext: ExecutionContext = {\n squad: squadName, agent: agentName, taskType, trigger,\n executionId: generateExecutionId(),\n };\n\n // Build base env: remove ANTHROPIC_API_KEY unless --use-api, remove CLAUDECODE\n const { ANTHROPIC_API_KEY: _apiKey, CLAUDECODE: _claudeCode, ...envWithoutApiKey } = process.env;\n const spawnEnv = useApi\n ? (() => { const { CLAUDECODE: _, ...rest } = process.env; return rest; })()\n : envWithoutApiKey;\n\n const escapedPrompt = prompt.replace(/'/g, \"'\\\\''\");\n\n await registerContextWithBridge(execContext);\n\n // Get bot token so agents create PRs/issues as bot identity (not user's personal gh auth)\n let botGhToken: string | undefined;\n try {\n const ghEnv = await getBotGhEnv();\n botGhToken = ghEnv.GH_TOKEN;\n } catch { /* graceful: falls back to user's gh auth */ }\n\n // ── Foreground mode ──────────────────────────────────────────────────\n if (runInForeground) {\n if (verbose) {\n logVerboseExecution({\n projectRoot, mode: 'foreground', useApi, execContext,\n effort, skills, resolvedModel, claudeModelAlias, explicitModel: model,\n });\n }\n\n // Build claude args as array to avoid shell escaping issues with large prompts\n const claudeArgs: string[] = [];\n if (!process.stdin.isTTY) claudeArgs.push('--print');\n claudeArgs.push('--dangerously-skip-permissions');\n claudeArgs.push('--disable-slash-commands');\n if (mcpConfigPath) claudeArgs.push('--mcp-config', mcpConfigPath);\n if (claudeModelAlias) claudeArgs.push('--model', claudeModelAlias);\n claudeArgs.push('--', prompt);\n\n const agentEnv = buildAgentEnv(spawnEnv as Record<string, string>, execContext, {\n effort, skills, includeOtel: true, ghToken: botGhToken,\n });\n\n return executeForeground({\n prompt, claudeArgs, agentEnv, projectRoot: targetRepoRoot,\n squadName, agentName, execContext, startMs, provider,\n });\n }\n\n // ── Detached modes (watch + background) ──────────────────────────────\n const timestamp = Date.now();\n const { logFile, pidFile } = prepareLogFiles(projectRoot, squadName, agentName, timestamp);\n const agentEnv = buildAgentEnv(spawnEnv as Record<string, string>, execContext, {\n effort, skills, includeOtel: !runInWatch, ghToken: botGhToken,\n });\n\n const wrapperScript = buildDetachedShellScript({\n projectRoot: targetRepoRoot, squadName, agentName, timestamp,\n claudeModelAlias, escapedPrompt, logFile, pidFile,\n });\n\n if (runInWatch) {\n if (verbose) {\n logVerboseExecution({\n projectRoot, mode: 'watch (background + tail)',\n execContext, logFile,\n });\n }\n\n return executeWatch({ projectRoot: targetRepoRoot, agentEnv, logFile, wrapperScript });\n }\n\n // ── Background mode ──────────────────────────────────────────────────\n if (verbose) {\n logVerboseExecution({\n projectRoot, mode: 'background', useApi, execContext,\n effort, skills, resolvedModel, claudeModelAlias,\n explicitModel: model, logFile, mcpConfigPath,\n });\n }\n\n const child = spawn('sh', ['-c', wrapperScript], {\n cwd: targetRepoRoot,\n detached: true,\n stdio: 'ignore',\n env: agentEnv,\n });\n child.unref();\n\n if (verbose) {\n writeLine(` ${colors.dim}Monitor: tail -f ${logFile}${RESET}`);\n }\n\n return `Log: ${logFile}. Monitor: tail -f ${logFile}`;\n}\n\n/**\n * Execute agent with a non-Anthropic LLM CLI provider.\n *\n * Supports: google (gemini), openai (codex), mistral (vibe), xai (grok), aider, ollama\n *\n * Unlike executeWithClaude which has full session management,\n * other CLIs run in simpler non-interactive mode.\n */\nasync function executeWithProvider(\n provider: string,\n prompt: string,\n options: {\n verbose?: boolean;\n foreground?: boolean;\n cwd?: string;\n squadName?: string;\n agentName?: string;\n }\n): Promise<string> {\n const cliConfig = getCLIConfig(provider);\n\n if (!cliConfig) {\n throw new Error(`Unknown provider: ${provider}. Run 'squads providers' to see available providers.`);\n }\n\n if (!isProviderCLIAvailable(provider)) {\n throw new Error(`CLI '${cliConfig.command}' not found. Install: ${cliConfig.install}`);\n }\n\n const projectRoot = options.cwd || getProjectRoot();\n const squadName = options.squadName || 'unknown';\n const agentName = options.agentName || 'unknown';\n const timestamp = Date.now();\n\n // Build clean env: remove CLAUDECODE to allow nesting, pass squad context\n const { CLAUDECODE: _claudeCode, ...cleanEnv } = process.env;\n const providerEnv = {\n ...cleanEnv,\n SQUADS_SQUAD: squadName,\n SQUADS_AGENT: agentName,\n SQUADS_PROVIDER: provider,\n };\n\n // Create isolated worktree for this agent (same pattern as executeWithClaude)\n const branchName = `agent/${squadName}/${agentName}-${timestamp}`;\n const worktreePath = join(projectRoot, '..', '.worktrees', `${squadName}-${agentName}-${timestamp}`);\n let workDir = projectRoot;\n try {\n mkdirSync(join(projectRoot, '..', '.worktrees'), { recursive: true });\n execSync(`git worktree add '${worktreePath}' -b '${branchName}' HEAD`, { cwd: projectRoot, stdio: 'pipe' });\n workDir = worktreePath;\n } catch (e) {\n writeLine(` ${colors.dim}warn: worktree creation failed, using project root: ${e instanceof Error ? e.message : String(e)}${RESET}`);\n }\n\n // Copy .agents directory into worktree so sandboxed providers can access\n // agent definitions, memory, and config files. Providers like Gemini restrict\n // file reads to the workspace directory, so these must be local.\n let effectivePrompt = prompt;\n if (workDir !== projectRoot) {\n const agentsDir = join(projectRoot, '.agents');\n const targetAgentsDir = join(workDir, '.agents');\n if (existsSync(agentsDir) && !existsSync(targetAgentsDir)) {\n try {\n cpSync(agentsDir, targetAgentsDir, { recursive: true });\n } catch (e) {\n writeLine(` ${colors.dim}warn: .agents copy failed: ${e instanceof Error ? e.message : String(e)}${RESET}`);\n }\n }\n // Rewrite absolute paths in prompt so sandboxed providers can resolve them\n effectivePrompt = prompt.replaceAll(projectRoot, workDir);\n }\n\n const args = cliConfig.buildArgs(effectivePrompt);\n\n if (options.verbose) {\n writeLine(` ${colors.dim}Provider: ${cliConfig.displayName}${RESET}`);\n writeLine(` ${colors.dim}Command: ${cliConfig.command} ${args.join(' ').slice(0, VERBOSE_COMMAND_MAX_CHARS)}...${RESET}`);\n writeLine(` ${colors.dim}CWD: ${workDir}${RESET}`);\n if (workDir !== projectRoot) {\n writeLine(` ${colors.dim}Worktree: ${branchName}${RESET}`);\n }\n }\n\n // Foreground mode: run directly in terminal\n if (options.foreground) {\n return new Promise((resolve, reject) => {\n const proc = spawn(cliConfig.command, args, {\n stdio: 'inherit',\n cwd: workDir,\n env: providerEnv,\n });\n\n proc.on('close', (code) => {\n cleanupWorktree(workDir, projectRoot);\n if (code === 0) {\n resolve('Session completed');\n } else {\n reject(new Error(`${cliConfig.command} exited with code ${code}`));\n }\n });\n\n proc.on('error', (err) => {\n cleanupWorktree(workDir, projectRoot);\n reject(err);\n });\n });\n }\n\n // Background mode: run detached with log file (matches executeWithClaude pattern)\n const logDir = join(projectRoot, '.agents', 'logs', squadName);\n const logFile = join(logDir, `${agentName}-${timestamp}.log`);\n const pidFile = join(logDir, `${agentName}-${timestamp}.pid`);\n\n if (!existsSync(logDir)) {\n mkdirSync(logDir, { recursive: true });\n }\n\n const escapedPrompt = effectivePrompt.replace(/'/g, \"'\\\\''\");\n const providerArgs = cliConfig.buildArgs(escapedPrompt).map(a => `'${a}'`).join(' ');\n const cleanupCmd = workDir !== projectRoot\n ? `; git -C '${projectRoot}' worktree remove '${workDir}' --force 2>/dev/null; git -C '${projectRoot}' branch -D '${branchName}' 2>/dev/null`\n : '';\n const shellScript = `cd '${workDir}' && ${cliConfig.command} ${providerArgs} > '${logFile}' 2>&1${cleanupCmd}`;\n const wrapperScript = `echo $$ > '${pidFile}'; ${shellScript}`;\n\n const child = spawn('sh', ['-c', wrapperScript], {\n cwd: workDir,\n detached: true,\n stdio: 'ignore',\n env: providerEnv,\n });\n\n child.unref();\n\n if (options.verbose) {\n writeLine(` ${colors.dim}Log: ${logFile}${RESET}`);\n writeLine(` ${colors.dim}PID file: ${pidFile}${RESET}`);\n }\n\n return `Log: ${logFile}. Monitor: tail -f ${logFile}`;\n}\n\nexport async function runSquadCommand(\n squadName: string,\n options: RunOptions\n): Promise<void> {\n return runCommand(squadName, options);\n}\n","/**\n * Permission Engine for Squad Execution\n *\n * Phase 3 of the Squads as Execution Contexts RFC (#110)\n *\n * Validates execution requests against squad-defined permissions:\n * - Bash command allowlists\n * - File path permissions (read/write globs)\n * - MCP server allow/deny lists\n *\n * Supports three enforcement modes:\n * - warn: Log violations, continue execution\n * - strict: Block on any violation\n * - audit: Log to trail, continue execution\n */\n\nimport { minimatch } from 'minimatch';\n\nexport type EnforcementMode = 'warn' | 'strict' | 'audit';\n\n/**\n * Squad context for permission validation\n * Populated from SQUAD.md context YAML block (Phase 1)\n */\nexport interface SquadContext {\n squad: string;\n agent?: string;\n\n permissions: {\n mode: EnforcementMode;\n bash: string[]; // Allowed bash commands (e.g., ['npm', 'git', 'vercel'])\n write: string[]; // Write path globs (e.g., ['agents-squads-web/**'])\n read: string[]; // Read path globs (e.g., ['hq/.agents/**'])\n mcp: {\n allow: string[]; // Allowed MCP servers\n deny: string[]; // Denied MCP servers (takes precedence)\n };\n };\n}\n\n/**\n * Execution request to validate\n */\nexport interface ExecutionRequest {\n // Bash commands the agent might run\n bashCommands?: string[];\n\n // File paths to write\n writePaths?: string[];\n\n // File paths to read\n readPaths?: string[];\n\n // MCP servers to use\n mcpServers?: string[];\n}\n\n/**\n * Result of permission validation\n */\nexport interface PermissionResult {\n allowed: boolean;\n violations: PermissionViolation[];\n mode: EnforcementMode;\n}\n\n/**\n * Details of a permission violation\n */\nexport interface PermissionViolation {\n type: 'bash' | 'write' | 'read' | 'mcp';\n requested: string;\n reason: string;\n severity: 'error' | 'warning';\n}\n\n/**\n * Default permissive context for squads without explicit permissions\n */\nexport function getDefaultContext(squad: string, agent?: string): SquadContext {\n return {\n squad,\n agent,\n permissions: {\n mode: 'warn',\n bash: ['*'], // All commands allowed by default\n write: ['**'], // All paths writable by default\n read: ['**'], // All paths readable by default\n mcp: {\n allow: ['*'], // All MCP servers allowed\n deny: []\n }\n }\n };\n}\n\n/**\n * Check if a bash command is allowed\n */\nfunction validateBashCommand(\n command: string,\n allowedCommands: string[]\n): PermissionViolation | null {\n // Extract the base command (first word)\n const baseCommand = command.trim().split(/\\s+/)[0];\n\n // Check if wildcard allows all\n if (allowedCommands.includes('*')) {\n return null;\n }\n\n // Check if command is in allowlist\n const isAllowed = allowedCommands.some(allowed => {\n if (allowed === baseCommand) return true;\n // Support glob patterns\n if (allowed.includes('*')) {\n return minimatch(baseCommand, allowed);\n }\n return false;\n });\n\n if (!isAllowed) {\n return {\n type: 'bash',\n requested: baseCommand,\n reason: `Bash command '${baseCommand}' not in allowlist: [${allowedCommands.join(', ')}]`,\n severity: 'error'\n };\n }\n\n return null;\n}\n\n/**\n * Check if a file path matches any of the allowed globs\n */\nfunction validateFilePath(\n path: string,\n allowedGlobs: string[],\n operation: 'read' | 'write'\n): PermissionViolation | null {\n // Wildcard allows all\n if (allowedGlobs.includes('**') || allowedGlobs.includes('*')) {\n return null;\n }\n\n // Check against each glob\n const isAllowed = allowedGlobs.some(glob => minimatch(path, glob));\n\n if (!isAllowed) {\n return {\n type: operation,\n requested: path,\n reason: `${operation === 'write' ? 'Write' : 'Read'} to '${path}' not allowed. Permitted paths: [${allowedGlobs.join(', ')}]`,\n severity: 'error'\n };\n }\n\n return null;\n}\n\n/**\n * Check if an MCP server is allowed\n */\nfunction validateMcpServer(\n server: string,\n allow: string[],\n deny: string[]\n): PermissionViolation | null {\n // Deny list takes precedence\n const isDenied = deny.some(pattern => {\n if (pattern === server) return true;\n if (pattern.includes('*')) return minimatch(server, pattern);\n return false;\n });\n\n if (isDenied) {\n return {\n type: 'mcp',\n requested: server,\n reason: `MCP server '${server}' is explicitly denied`,\n severity: 'error'\n };\n }\n\n // Check allow list\n if (allow.includes('*')) {\n return null;\n }\n\n const isAllowed = allow.some(pattern => {\n if (pattern === server) return true;\n if (pattern.includes('*')) return minimatch(server, pattern);\n return false;\n });\n\n if (!isAllowed) {\n return {\n type: 'mcp',\n requested: server,\n reason: `MCP server '${server}' not in allowlist: [${allow.join(', ')}]`,\n severity: 'error'\n };\n }\n\n return null;\n}\n\n/**\n * Main validation function\n *\n * Validates an execution request against the squad's permission context\n */\nexport function validateExecution(\n context: SquadContext,\n request: ExecutionRequest\n): PermissionResult {\n const violations: PermissionViolation[] = [];\n\n // Validate bash commands\n if (request.bashCommands) {\n for (const cmd of request.bashCommands) {\n const violation = validateBashCommand(cmd, context.permissions.bash);\n if (violation) {\n violations.push(violation);\n }\n }\n }\n\n // Validate write paths\n if (request.writePaths) {\n for (const path of request.writePaths) {\n const violation = validateFilePath(path, context.permissions.write, 'write');\n if (violation) {\n violations.push(violation);\n }\n }\n }\n\n // Validate read paths\n if (request.readPaths) {\n for (const path of request.readPaths) {\n const violation = validateFilePath(path, context.permissions.read, 'read');\n if (violation) {\n violations.push(violation);\n }\n }\n }\n\n // Validate MCP servers\n if (request.mcpServers) {\n for (const server of request.mcpServers) {\n const violation = validateMcpServer(\n server,\n context.permissions.mcp.allow,\n context.permissions.mcp.deny\n );\n if (violation) {\n violations.push(violation);\n }\n }\n }\n\n // Determine if execution is allowed based on mode\n const hasErrors = violations.some(v => v.severity === 'error');\n const allowed = context.permissions.mode !== 'strict' || !hasErrors;\n\n return {\n allowed,\n violations,\n mode: context.permissions.mode\n };\n}\n\n/**\n * Format violations for display\n */\nexport function formatViolations(result: PermissionResult): string[] {\n const lines: string[] = [];\n\n if (result.violations.length === 0) {\n return lines;\n }\n\n const modeLabel = {\n warn: '⚠️ PERMISSION WARNING',\n strict: '🚫 PERMISSION DENIED',\n audit: '📝 PERMISSION AUDIT'\n }[result.mode];\n\n lines.push(modeLabel);\n lines.push('');\n\n for (const v of result.violations) {\n const icon = v.severity === 'error' ? '✗' : '⚠';\n lines.push(` ${icon} [${v.type}] ${v.reason}`);\n }\n\n if (result.mode === 'warn') {\n lines.push('');\n lines.push(' Continuing with warnings (mode: warn)');\n } else if (result.mode === 'audit') {\n lines.push('');\n lines.push(' Logged for audit, continuing (mode: audit)');\n } else if (!result.allowed) {\n lines.push('');\n lines.push(' Execution blocked (mode: strict)');\n }\n\n return lines;\n}\n\n/**\n * Parse permissions YAML block from SQUAD.md content\n *\n * Expected format in SQUAD.md:\n * ```yaml\n * permissions:\n * mode: warn | strict | audit\n * bash: [npm, git, vercel]\n * write: [agents-squads-web/**]\n * read: [hq/.agents/**]\n * mcp:\n * allow: [chrome-devtools, firecrawl]\n * deny: [restricted-server]\n * ```\n */\nexport function parsePermissionsYaml(content: string): Partial<SquadContext['permissions']> | null {\n // Find YAML code block\n const yamlMatch = content.match(/```ya?ml\\n([\\s\\S]*?)```/);\n if (!yamlMatch) return null;\n\n const yamlContent = yamlMatch[1];\n\n // Simple YAML parsing for permissions block\n const permissions: Partial<SquadContext['permissions']> = {};\n\n // Parse mode\n const modeMatch = yamlContent.match(/^\\s*mode:\\s*(warn|strict|audit)/m);\n if (modeMatch) {\n permissions.mode = modeMatch[1] as EnforcementMode;\n }\n\n // Parse bash allowlist\n const bashMatch = yamlContent.match(/^\\s*bash:\\s*\\[(.*?)\\]/m);\n if (bashMatch) {\n permissions.bash = bashMatch[1].split(',').map(s => s.trim());\n }\n\n // Parse write globs\n const writeMatch = yamlContent.match(/^\\s*write:\\s*\\[(.*?)\\]/m);\n if (writeMatch) {\n permissions.write = writeMatch[1].split(',').map(s => s.trim());\n }\n\n // Parse read globs\n const readMatch = yamlContent.match(/^\\s*read:\\s*\\[(.*?)\\]/m);\n if (readMatch) {\n permissions.read = readMatch[1].split(',').map(s => s.trim());\n }\n\n // Parse MCP allow/deny\n const mcpAllowMatch = yamlContent.match(/^\\s*allow:\\s*\\[(.*?)\\]/m);\n const mcpDenyMatch = yamlContent.match(/^\\s*deny:\\s*\\[(.*?)\\]/m);\n\n if (mcpAllowMatch || mcpDenyMatch) {\n permissions.mcp = {\n allow: mcpAllowMatch ? mcpAllowMatch[1].split(',').map(s => s.trim()) : ['*'],\n deny: mcpDenyMatch ? mcpDenyMatch[1].split(',').map(s => s.trim()) : []\n };\n }\n\n return Object.keys(permissions).length > 0 ? permissions : null;\n}\n\n/**\n * Build a SquadContext from SQUAD.md content\n */\nexport function buildContextFromSquad(\n squadName: string,\n squadContent: string,\n agentName?: string\n): SquadContext {\n // Start with defaults\n const context = getDefaultContext(squadName, agentName);\n\n // Parse permissions from content\n const parsed = parsePermissionsYaml(squadContent);\n\n if (parsed) {\n if (parsed.mode) context.permissions.mode = parsed.mode;\n if (parsed.bash) context.permissions.bash = parsed.bash;\n if (parsed.write) context.permissions.write = parsed.write;\n if (parsed.read) context.permissions.read = parsed.read;\n if (parsed.mcp) context.permissions.mcp = parsed.mcp;\n }\n\n return context;\n}\n","/**\n * Squad Conversation Workflow — Orchestrates multi-agent conversations.\n *\n * Lead briefs → scanners discover → workers execute → lead reviews →\n * loop until convergence or budget exhausted.\n *\n * CLI manages turns (deterministic), lead manages content (creative).\n */\n\nimport { join } from 'path';\nimport { existsSync, writeFileSync, mkdirSync } from 'fs';;\nimport { execSync, exec } from 'child_process';;\n\nimport {\n type AgentRole,\n type Transcript,\n classifyAgent,\n modelForRole,\n createTranscript,\n serializeTranscript,\n addTurn,\n detectConvergence,\n estimateTurnCost,\n} from './conversation.js';\nimport {\n type Squad,\n findSquadsDir,\n} from './squad-parser.js';\nimport {\n type ContextRole,\n gatherSquadContext,\n} from './run-context.js';\n\n// =============================================================================\n// Configuration\n// =============================================================================\n\nexport interface ConversationOptions {\n /** Override lead's briefing with a founder directive */\n task?: string;\n /** Maximum turns before stopping (default: 20) */\n maxTurns?: number;\n /** Cost ceiling in USD (default: 25) */\n costCeiling?: number;\n /** Verbose logging */\n verbose?: boolean;\n /** Model override for all agents */\n model?: string;\n}\n\nconst DEFAULT_MAX_TURNS = 20;\nconst DEFAULT_COST_CEILING = 25;\n\n// =============================================================================\n// Agent Turn Execution\n// =============================================================================\n\ninterface AgentTurnConfig {\n agentName: string;\n agentPath: string;\n role: AgentRole;\n squadName: string;\n model: string;\n transcript: Transcript;\n task?: string;\n /** Working directory for the agent process (defaults to process.cwd()) */\n cwd?: string;\n}\n\n/**\n * Execute a single agent turn via `claude --print`.\n * Returns the agent's text output.\n */\nfunction executeAgentTurn(config: AgentTurnConfig): string {\n const { agentName, agentPath, role, squadName, model: _model, transcript, task } = config;\n\n // Build the prompt: agent definition + squad context + transcript context + role instructions\n const transcriptContext = serializeTranscript(transcript);\n\n // Inject role-based squad context (priorities, feedback, active work, etc.)\n const contextRole: ContextRole = agentName.includes('company-lead') ? 'coo' : (role as ContextRole);\n const squadContext = gatherSquadContext(squadName, agentName, {\n agentPath, role: contextRole\n });\n\n let roleInstructions: string;\n switch (role) {\n case 'lead':\n if (transcript.turns.length === 0 && task) {\n // First turn with founder directive — replaces lead briefing\n roleInstructions = `## Founder Directive\\n\\n${task}\\n\\nBrief the team on this directive. Set priorities and assign work.`;\n } else if (transcript.turns.length === 0) {\n roleInstructions = `## Your Role: Lead\\n\\nYou are starting a new squad session. Brief the team:\\n1. Review open issues and PRs\\n2. Set priorities for this session\\n3. Assign work to workers\\n4. Be specific about what each worker should do`;\n } else {\n roleInstructions = `## Your Role: Lead (Review)\\n\\nReview the work done so far. Either:\\n- Request specific changes from workers\\n- Approve and signal completion if quality is sufficient\\n- Merge PRs using \\`gh pr merge --squash --delete-branch --auto\\` (waits for required checks)`;\n }\n break;\n case 'scanner':\n roleInstructions = `## Your Role: Scanner\\n\\nScan for issues, gaps, and opportunities. Report findings concisely. Do NOT fix anything — just discover and report.`;\n break;\n case 'worker':\n roleInstructions = `## Your Role: Worker\\n\\nExecute the work assigned by the lead. Create branches, write code, open PRs to develop. Be focused and efficient.`;\n break;\n case 'verifier':\n roleInstructions = `## Your Role: Verifier\\n\\nVerify that work meets quality standards. Check PRs, run tests, validate output. Report pass/fail with specifics.`;\n break;\n }\n\n const prompt = `You are ${agentName} (${role}) in squad ${squadName}.\n\nRead your full agent definition at ${agentPath} and follow its instructions.\n\n${roleInstructions}\n${squadContext}\n${transcriptContext}\n\nIMPORTANT:\n- Be concise. Your output becomes part of a shared transcript.\n- Reference specific issue numbers, PR numbers, and file paths.\n- If you create a PR, include the PR number in your output.\n- If there's nothing to do, say \"Nothing to do\" clearly.\n- When done, summarize what you did in 2-3 sentences.`;\n\n // Resolve model: CLI override > role default\n const resolvedModel = config.model || modelForRole(role);\n\n // Execute via claude --print (captures output)\n // Strip CLAUDECODE and ANTHROPIC_API_KEY so child process uses Max subscription\n const { CLAUDECODE: _cc, ANTHROPIC_API_KEY: _ak, ...cleanEnv } = process.env;\n const escapedPrompt = prompt.replace(/'/g, \"'\\\\''\");\n\n try {\n const output = execSync(\n `claude --print --dangerously-skip-permissions --model ${resolvedModel} -- '${escapedPrompt}'`,\n {\n cwd: config.cwd || process.cwd(),\n timeout: 15 * 60 * 1000, // 15 min per turn\n maxBuffer: 10 * 1024 * 1024, // 10MB\n encoding: 'utf-8',\n env: cleanEnv,\n }\n );\n return output.trim();\n } catch (err: unknown) {\n const error = err as { stdout?: string; stderr?: string; message?: string };\n // If the command produced output before failing, use it\n if (error.stdout && error.stdout.trim().length > 0) {\n return error.stdout.trim();\n }\n return `[ERROR] Agent ${agentName} failed: ${error.message || 'unknown error'}`;\n }\n}\n\n/**\n * Async version of executeAgentTurn for parallel execution.\n * Same logic, but returns a Promise instead of blocking.\n */\nfunction executeAgentTurnAsync(config: AgentTurnConfig): Promise<string> {\n const { agentName, agentPath, role, squadName, model: _model, transcript, task } = config;\n\n let roleInstructions = '';\n switch (role) {\n case 'lead':\n roleInstructions = task\n ? `FOUNDER DIRECTIVE: ${task}\\n\\nBrief the team on this directive. Assign specific tasks to scanners and workers.`\n : 'Review the conversation so far. Assess worker output. Direct next actions or declare convergence.';\n break;\n case 'scanner':\n roleInstructions = 'Scan for issues, data, or signals relevant to the lead\\'s brief. Report findings concisely.';\n break;\n case 'worker':\n roleInstructions = 'Execute the specific task assigned by the lead. Produce concrete output (PRs, issues, content, analysis).';\n break;\n case 'verifier':\n roleInstructions = 'Verify the worker\\'s output meets quality standards. Check for errors, omissions, and alignment with goals.';\n break;\n }\n\n const transcriptContext = transcript.turns.length > 0\n ? `\\n== CONVERSATION SO FAR ==\\n${serializeTranscript(transcript)}\\n== END CONVERSATION ==`\n : '';\n\n const resolvedModel = config.model || modelForRole(role);\n const prompt = `You are ${agentName} (${role}) in squad ${squadName}.\n\nRead your full agent definition at ${agentPath} and follow its instructions.\n\n${roleInstructions}\n\n${transcriptContext}\n\nIMPORTANT:\n- Be concise. Your output becomes part of a shared transcript.\n- Reference specific issue numbers, PR numbers, and file paths.\n- If you create a PR, include the PR number in your output.\n- If there's nothing to do, say \"Nothing to do\" clearly.\n- When done, summarize what you did in 2-3 sentences.`;\n\n const escapedPrompt = prompt.replace(/'/g, \"'\\\\''\");\n const { CLAUDECODE: _cc2, ANTHROPIC_API_KEY: _ak2, ...cleanEnvAsync } = process.env;\n\n return new Promise((resolve) => {\n exec(\n `claude --print --dangerously-skip-permissions --model ${resolvedModel} -- '${escapedPrompt}'`,\n {\n cwd: config.cwd || process.cwd(),\n timeout: 15 * 60 * 1000,\n maxBuffer: 10 * 1024 * 1024,\n encoding: 'utf-8',\n env: cleanEnvAsync,\n },\n (error: Error | null, stdout: string, _stderr: string) => {\n if (stdout && stdout.trim().length > 0) {\n resolve(stdout.trim());\n } else if (error) {\n resolve(`[ERROR] Agent ${agentName} failed: ${error.message || 'unknown error'}`);\n } else {\n resolve('[No output]');\n }\n }\n );\n });\n}\n\n// =============================================================================\n// Conversation Orchestrator\n// =============================================================================\n\ninterface ClassifiedAgent {\n name: string;\n role: AgentRole;\n path: string;\n}\n\n/**\n * Build the turn order for a squad conversation.\n * Returns agents grouped by role in execution order.\n */\nfunction buildTurnPlan(squad: Squad, squadsDir: string): ClassifiedAgent[] {\n const agents: ClassifiedAgent[] = [];\n\n for (const agent of squad.agents) {\n const role = classifyAgent(agent.name, agent.role);\n if (!role) continue; // Unclassified agents are excluded\n\n const agentPath = join(squadsDir, squad.dir, `${agent.name}.md`);\n if (!existsSync(agentPath)) continue;\n\n agents.push({ name: agent.name, role, path: agentPath });\n }\n\n return agents;\n}\n\nexport interface ConversationResult {\n transcript: Transcript;\n turnCount: number;\n totalCost: number;\n converged: boolean;\n reason: string;\n}\n\n/**\n * Run a full squad conversation.\n *\n * Turn order per cycle:\n * 1. Lead briefs (or founder directive on first turn)\n * 2. Scanners discover (parallel-safe but run sequentially for simplicity)\n * 3. Workers execute\n * 4. Lead reviews\n * 5. Verifiers check (if workers produced output)\n * 6. Check convergence → loop or exit\n */\nexport async function runConversation(\n squad: Squad,\n options: ConversationOptions = {},\n): Promise<ConversationResult> {\n const squadsDir = findSquadsDir();\n if (!squadsDir) {\n return {\n transcript: createTranscript(squad.name),\n turnCount: 0,\n totalCost: 0,\n converged: true,\n reason: 'No squads directory found',\n };\n }\n\n const maxTurns = options.maxTurns || DEFAULT_MAX_TURNS;\n const costCeiling = options.costCeiling || DEFAULT_COST_CEILING;\n const transcript = createTranscript(squad.name);\n\n // Resolve squad's working directory from repo field (e.g. \"org/squads-cli\" → sibling repo dir)\n // squadsDir = /path/to/hq/.agents/squads → go up 3 levels to get parent of project root\n let squadCwd = process.cwd();\n if (squad.repo) {\n const repoName = squad.repo.split('/').pop();\n if (repoName) {\n const reposRoot = join(squadsDir, '..', '..', '..');\n const candidatePath = join(reposRoot, repoName);\n if (existsSync(candidatePath)) {\n squadCwd = candidatePath;\n }\n }\n }\n\n // Classify all agents\n const allAgents = buildTurnPlan(squad, squadsDir);\n const leads = allAgents.filter(a => a.role === 'lead');\n const scanners = allAgents.filter(a => a.role === 'scanner');\n const workers = allAgents.filter(a => a.role === 'worker');\n const verifiers = allAgents.filter(a => a.role === 'verifier');\n\n if (leads.length === 0) {\n return {\n transcript,\n turnCount: 0,\n totalCost: 0,\n converged: true,\n reason: 'No lead agent found — cannot orchestrate conversation',\n };\n }\n\n const lead = leads[0]; // Primary lead\n const log = (msg: string) => {\n if (options.verbose) {\n const ts = new Date().toISOString().slice(11, 19);\n process.stderr.write(` [${ts}] ${msg}\\n`);\n }\n };\n\n log(`Conversation: ${squad.name} | ${allAgents.length} agents | max ${maxTurns} turns | $${costCeiling} ceiling`);\n log(` Lead: ${lead.name} | Scanners: ${scanners.map(s => s.name).join(', ') || 'none'} | Workers: ${workers.map(w => w.name).join(', ') || 'none'} | Verifiers: ${verifiers.map(v => v.name).join(', ') || 'none'}`);\n\n // === CYCLE LOOP ===\n let cycleCount = 0;\n const MAX_CYCLES = 5; // Safety: max 5 full cycles (lead→scan→work→review→verify)\n\n while (cycleCount < MAX_CYCLES) {\n cycleCount++;\n log(`\\n--- Cycle ${cycleCount} ---`);\n\n // Step 1: Lead briefs\n log(`Turn ${transcript.turns.length + 1}: ${lead.name} (lead)`);\n const leadOutput = executeAgentTurn({\n agentName: lead.name,\n agentPath: lead.path,\n role: 'lead',\n squadName: squad.name,\n model: options.model || modelForRole('lead'),\n transcript,\n task: cycleCount === 1 ? options.task : undefined,\n cwd: squadCwd,\n });\n addTurn(transcript, lead.name, 'lead', leadOutput, estimateTurnCost(options.model || 'sonnet'));\n\n // Check convergence after lead\n let conv = detectConvergence(transcript, maxTurns, costCeiling);\n if (conv.converged) {\n log(`Converged after lead: ${conv.reason}`);\n return { transcript, turnCount: transcript.turns.length, totalCost: transcript.totalCost, converged: true, reason: conv.reason };\n }\n\n // Step 2: Scanners (only on first cycle) — run in parallel\n if (cycleCount === 1 && scanners.length > 0) {\n if (scanners.length === 1) {\n log(`Turn ${transcript.turns.length + 1}: ${scanners[0].name} (scanner)`);\n const output = executeAgentTurn({\n agentName: scanners[0].name,\n agentPath: scanners[0].path,\n role: 'scanner',\n squadName: squad.name,\n model: options.model || modelForRole('scanner'),\n transcript,\n cwd: squadCwd,\n });\n addTurn(transcript, scanners[0].name, 'scanner', output, estimateTurnCost(options.model || 'haiku'));\n } else {\n log(`Turns ${transcript.turns.length + 1}-${transcript.turns.length + scanners.length}: ${scanners.map(s => s.name).join(', ')} (scanners, parallel)`);\n const scannerPromises = scanners.map(scanner =>\n executeAgentTurnAsync({\n agentName: scanner.name,\n agentPath: scanner.path,\n role: 'scanner',\n squadName: squad.name,\n model: options.model || modelForRole('scanner'),\n transcript, // snapshot — all scanners see same context\n cwd: squadCwd,\n }).then(output => ({ agent: scanner, output }))\n );\n const scannerResults = await Promise.all(scannerPromises);\n for (const { agent, output } of scannerResults) {\n addTurn(transcript, agent.name, 'scanner', output, estimateTurnCost(options.model || 'haiku'));\n }\n }\n\n conv = detectConvergence(transcript, maxTurns, costCeiling);\n if (conv.converged) {\n return { transcript, turnCount: transcript.turns.length, totalCost: transcript.totalCost, converged: true, reason: conv.reason };\n }\n }\n\n // Step 3: Workers execute — run in parallel if multiple\n if (workers.length === 1) {\n log(`Turn ${transcript.turns.length + 1}: ${workers[0].name} (worker)`);\n const output = executeAgentTurn({\n agentName: workers[0].name,\n agentPath: workers[0].path,\n role: 'worker',\n squadName: squad.name,\n model: options.model || modelForRole('worker'),\n transcript,\n cwd: squadCwd,\n });\n if (output.startsWith('[ERROR]')) {\n process.stderr.write(` [WARN] Worker ${workers[0].name} errored: ${output}\\n`);\n }\n addTurn(transcript, workers[0].name, 'worker', output, estimateTurnCost(options.model || 'sonnet'));\n } else if (workers.length > 1) {\n log(`Turns ${transcript.turns.length + 1}-${transcript.turns.length + workers.length}: ${workers.map(w => w.name).join(', ')} (workers, parallel)`);\n const workerPromises = workers.map(worker =>\n executeAgentTurnAsync({\n agentName: worker.name,\n agentPath: worker.path,\n role: 'worker',\n squadName: squad.name,\n model: options.model || modelForRole('worker'),\n transcript, // snapshot — all workers see same context\n cwd: squadCwd,\n }).then(output => ({ agent: worker, output }))\n );\n const workerResults = await Promise.all(workerPromises);\n for (const { agent, output } of workerResults) {\n if (output.startsWith('[ERROR]')) {\n process.stderr.write(` [WARN] Worker ${agent.name} errored: ${output}\\n`);\n }\n addTurn(transcript, agent.name, 'worker', output, estimateTurnCost(options.model || 'sonnet'));\n }\n }\n\n conv = detectConvergence(transcript, maxTurns, costCeiling);\n if (conv.converged) {\n return { transcript, turnCount: transcript.turns.length, totalCost: transcript.totalCost, converged: true, reason: conv.reason };\n }\n\n // Step 4: Lead reviews worker output\n log(`Turn ${transcript.turns.length + 1}: ${lead.name} (lead review)`);\n const reviewOutput = executeAgentTurn({\n agentName: lead.name,\n agentPath: lead.path,\n role: 'lead',\n squadName: squad.name,\n model: options.model || modelForRole('lead'),\n transcript,\n cwd: squadCwd,\n });\n addTurn(transcript, lead.name, 'lead', reviewOutput, estimateTurnCost(options.model || 'sonnet'));\n\n conv = detectConvergence(transcript, maxTurns, costCeiling);\n if (conv.converged) {\n return { transcript, turnCount: transcript.turns.length, totalCost: transcript.totalCost, converged: true, reason: conv.reason };\n }\n\n // Step 5: Verifiers — run in parallel if multiple\n if (verifiers.length === 1) {\n log(`Turn ${transcript.turns.length + 1}: ${verifiers[0].name} (verifier)`);\n const output = executeAgentTurn({\n agentName: verifiers[0].name,\n agentPath: verifiers[0].path,\n role: 'verifier',\n squadName: squad.name,\n model: options.model || modelForRole('verifier'),\n transcript,\n cwd: squadCwd,\n });\n addTurn(transcript, verifiers[0].name, 'verifier', output, estimateTurnCost(options.model || 'haiku'));\n } else if (verifiers.length > 1) {\n log(`Turns ${transcript.turns.length + 1}-${transcript.turns.length + verifiers.length}: ${verifiers.map(v => v.name).join(', ')} (verifiers, parallel)`);\n const verifierPromises = verifiers.map(verifier =>\n executeAgentTurnAsync({\n agentName: verifier.name,\n agentPath: verifier.path,\n role: 'verifier',\n squadName: squad.name,\n model: options.model || modelForRole('verifier'),\n transcript,\n cwd: squadCwd,\n }).then(output => ({ agent: verifier, output }))\n );\n const verifierResults = await Promise.all(verifierPromises);\n for (const { agent, output } of verifierResults) {\n addTurn(transcript, agent.name, 'verifier', output, estimateTurnCost(options.model || 'haiku'));\n }\n }\n\n if (verifiers.length > 0) {\n conv = detectConvergence(transcript, maxTurns, costCeiling);\n if (conv.converged) {\n return { transcript, turnCount: transcript.turns.length, totalCost: transcript.totalCost, converged: true, reason: conv.reason };\n }\n }\n }\n\n return {\n transcript,\n turnCount: transcript.turns.length,\n totalCost: transcript.totalCost,\n converged: false,\n reason: `Max cycles reached (${MAX_CYCLES})`,\n };\n}\n\n// =============================================================================\n// Transcript Persistence\n// =============================================================================\n\n/** Save conversation transcript to .agents/conversations/{squad}/ */\nexport function saveTranscript(transcript: Transcript): string | null {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return null;\n\n const convDir = join(squadsDir, '..', 'conversations', transcript.squad);\n if (!existsSync(convDir)) {\n mkdirSync(convDir, { recursive: true });\n }\n\n const id = Date.now().toString(36);\n const filePath = join(convDir, `${id}.md`);\n\n const lines = [\n `# Conversation: ${transcript.squad}`,\n `Started: ${transcript.startedAt}`,\n `Turns: ${transcript.turns.length}`,\n `Estimated cost: $${transcript.totalCost.toFixed(2)}`,\n '',\n '---',\n '',\n ];\n\n for (const turn of transcript.turns) {\n lines.push(`## ${turn.agent} (${turn.role}) — ${turn.timestamp}`);\n lines.push('');\n lines.push(turn.content);\n lines.push('');\n lines.push('---');\n lines.push('');\n }\n\n writeFileSync(filePath, lines.join('\\n'));\n return filePath;\n}\n","/**\n * Squad Conversation Protocol — Types, transcript management, and convergence detection.\n *\n * Agents share a conversation transcript. Lead briefs first, workers execute,\n * lead iterates with workers until quality converges, verifiers check final output.\n * CLI manages turns (deterministic), lead manages content (creative).\n */\n\n// =============================================================================\n// Agent Classification\n// =============================================================================\n\nexport type AgentRole = 'lead' | 'scanner' | 'worker' | 'verifier';\n\n/**\n * Classify an agent into a conversation role.\n * Primary: uses the role field from SQUAD.md agents table.\n * Fallback: matches against agent name (for squads without role descriptions).\n */\nexport function classifyAgent(agentName: string, roleDescription?: string): AgentRole | null {\n // Primary: parse the role description from SQUAD.md\n if (roleDescription) {\n const lower = roleDescription.toLowerCase();\n if (lower.includes('orchestrat') || lower.includes('triage') || lower.includes('coordinat')) return 'lead';\n if (lower.includes('scan') || lower.includes('monitor') || lower.includes('detect')) return 'scanner';\n if (lower.includes('verif') || lower.includes('review') || lower.includes('check') || lower.includes('critic')) return 'verifier';\n // Any role description that doesn't match above = worker (the default doer)\n return 'worker';\n }\n\n // Fallback: match against agent name (lead checked first to avoid substring collisions)\n const name = agentName.toLowerCase();\n if (name.includes('lead') || name.includes('orchestrator')) return 'lead';\n if (name.includes('scanner') || name.includes('scout') || name.includes('monitor')) return 'scanner';\n if (name.includes('verifier') || name.includes('critic') || name.includes('reviewer')) return 'verifier';\n if (name.includes('worker') || name.includes('solver') || name.includes('builder')) return 'worker';\n\n return null; // Unclassified — excluded from conversation\n}\n\n/** Map roles to model tiers for cost routing */\nexport function modelForRole(role: AgentRole): string {\n switch (role) {\n case 'lead': return 'sonnet';\n case 'worker': return 'sonnet';\n case 'scanner': return 'haiku';\n case 'verifier': return 'haiku';\n }\n}\n\n// =============================================================================\n// Transcript\n// =============================================================================\n\nexport interface Turn {\n /** Which agent produced this turn */\n agent: string;\n /** Classified role */\n role: AgentRole;\n /** The agent's full output */\n content: string;\n /** Timestamp */\n timestamp: string;\n /** Estimated cost for this turn */\n estimatedCost: number;\n}\n\nexport interface Transcript {\n squad: string;\n turns: Turn[];\n startedAt: string;\n /** Running cost estimate */\n totalCost: number;\n}\n\nexport function createTranscript(squad: string): Transcript {\n return {\n squad,\n turns: [],\n startedAt: new Date().toISOString(),\n totalCost: 0,\n };\n}\n\n/** Serialize transcript for prompt injection.\n * Compacts after 5 turns: keeps first brief + last lead review (natural summary)\n * + turns since that review. The lead review already summarizes prior work,\n * so it acts as a compaction point — no information lost, just compressed.\n */\nexport function serializeTranscript(transcript: Transcript): string {\n if (transcript.turns.length === 0) return '';\n\n let turns = transcript.turns;\n if (turns.length > 5) {\n const firstBrief = turns[0];\n\n // Find last lead review (any lead turn after the first brief)\n let lastReviewIdx = -1;\n for (let i = turns.length - 1; i > 0; i--) {\n if (turns[i].role === 'lead') {\n lastReviewIdx = i;\n break;\n }\n }\n\n if (lastReviewIdx > 0) {\n // First brief + last lead review + everything after it\n turns = [firstBrief, ...turns.slice(lastReviewIdx)];\n } else {\n // No lead review yet — keep first brief + last 3\n turns = [firstBrief, ...turns.slice(-3)];\n }\n }\n\n const lines = ['## Conversation So Far\\n'];\n if (turns.length < transcript.turns.length) {\n lines.push(`*(${transcript.turns.length - turns.length} earlier turns compacted — lead review below summarizes prior work)*\\n`);\n }\n for (const turn of turns) {\n lines.push(`### ${turn.agent} (${turn.role}) — ${turn.timestamp}`);\n lines.push(turn.content);\n lines.push('');\n }\n return lines.join('\\n');\n}\n\nexport function addTurn(\n transcript: Transcript,\n agent: string,\n role: AgentRole,\n content: string,\n estimatedCost: number,\n): void {\n transcript.turns.push({\n agent,\n role,\n content,\n timestamp: new Date().toISOString(),\n estimatedCost,\n });\n transcript.totalCost += estimatedCost;\n}\n\n// =============================================================================\n// Convergence Detection\n// =============================================================================\n\n/** Phrases that indicate work is done (matched case-insensitively via includes) */\nconst CONVERGENCE_PHRASES = [\n 'pr created', 'pr merged',\n 'issue closed', 'issue resolved',\n 'all tasks complete', 'all items complete', 'all issues resolved',\n 'nothing left to do', 'nothing remaining',\n 'session complete',\n 'queue empty',\n 'no open issues', 'no pending tasks', 'no pending issues',\n];\n\n/** Phrases in a verifier turn that signal approval → converge */\nconst VERIFIER_APPROVAL_PHRASES = [\n 'approved', 'lgtm', 'looks good',\n 'all checks pass', 'all tests pass', 'tests pass',\n 'passed', 'quality standards met',\n];\n\n/** Phrases in a verifier turn that signal rejection → continue cycle */\nconst VERIFIER_REJECTION_PHRASES = [\n 'failed', 'rejected', 'needs fixes', 'needs changes',\n 'does not pass', 'did not pass', 'failing',\n];\n\n/** Phrases from a lead turn that signal the session is done — hard stop */\nconst LEAD_COMPLETION_PHRASES = [\n 'session complete', 'session is complete',\n 'nothing to do', 'nothing more to do', 'nothing left to do',\n 'all work is done', 'all work complete', 'work is complete', 'work is done',\n 'all tasks complete', 'all tasks done',\n 'approved', 'approving',\n 'declaring convergence', 'signaling convergence', 'signal convergence',\n 'no further action', 'no further work', 'no action needed', 'no actions needed',\n 'wrapping up', 'closing out',\n 'conversation complete', 'cycle complete',\n];\n\n/** Phrases that indicate more work needed */\nconst CONTINUATION_PHRASES = [\n 'needs review', 'needs feedback', 'needs input', 'need clarification',\n 'todo', 'fixme', 'blocked',\n 'waiting for', 'waiting on',\n 'will continue', 'will proceed', 'will work on',\n 'next step',\n 'in progress',\n];\n\nexport interface ConvergenceResult {\n converged: boolean;\n reason: string;\n}\n\n/**\n * Detect if the conversation has converged.\n * Continuation signals beat convergence signals (bias toward more work).\n */\nexport function detectConvergence(\n transcript: Transcript,\n maxTurns: number,\n costCeiling: number,\n): ConvergenceResult {\n // Hard limits\n if (transcript.turns.length >= maxTurns) {\n return { converged: true, reason: `Max turns reached (${maxTurns})` };\n }\n if (transcript.totalCost >= costCeiling) {\n return { converged: true, reason: `Cost ceiling reached ($${transcript.totalCost.toFixed(2)}/$${costCeiling})` };\n }\n\n // Check last turn content\n if (transcript.turns.length === 0) {\n return { converged: false, reason: 'No turns yet' };\n }\n\n const lastTurn = transcript.turns[transcript.turns.length - 1];\n const content = lastTurn.content;\n const lower = content.toLowerCase();\n\n // Verifier turns: check approval/rejection before generic signals\n if (lastTurn.role === 'verifier') {\n const rejected = VERIFIER_REJECTION_PHRASES.some(phrase => lower.includes(phrase));\n if (rejected) {\n return { converged: false, reason: 'Verifier rejected — continuing cycle' };\n }\n const approved = VERIFIER_APPROVAL_PHRASES.some(phrase => lower.includes(phrase));\n if (approved) {\n return { converged: true, reason: 'Verifier approved' };\n }\n }\n\n // Lead completion: hard stop when lead signals the session is done.\n // Checked before continuation phrases — lead saying \"done\" overrides stale\n // continuation signals (e.g. \"will proceed to close\" shouldn't keep running).\n if (lastTurn.role === 'lead') {\n const leadDone = LEAD_COMPLETION_PHRASES.some(phrase => lower.includes(phrase));\n if (leadDone) {\n return { converged: true, reason: 'Lead signaled completion' };\n }\n }\n\n // Continuation signals beat generic convergence (bias toward completing work)\n const hasContinuation = CONTINUATION_PHRASES.some(phrase => lower.includes(phrase));\n if (hasContinuation) {\n return { converged: false, reason: 'Continuation signal detected' };\n }\n\n const hasConvergence = CONVERGENCE_PHRASES.some(phrase => lower.includes(phrase));\n if (hasConvergence) {\n return { converged: true, reason: 'Convergence signal detected' };\n }\n\n return { converged: false, reason: 'No signals detected, continuing' };\n}\n\n// =============================================================================\n// Cost Estimation\n// =============================================================================\n\n/** Rough cost estimates per model per turn (input + output) */\nconst COST_PER_TURN: Record<string, number> = {\n opus: 2.50,\n sonnet: 0.75,\n haiku: 0.10,\n};\n\nexport function estimateTurnCost(model: string): number {\n const key = model.includes('opus') ? 'opus'\n : model.includes('haiku') ? 'haiku'\n : 'sonnet';\n return COST_PER_TURN[key] || COST_PER_TURN.sonnet;\n}\n","/**\n * run-context.ts\n *\n * Helpers for building agent execution context and parsing agent definitions.\n * Extracted from src/commands/run.ts to reduce its size.\n *\n * Context cascade (role-based, priority-ordered):\n * SYSTEM.md (immutable, outside budget)\n * 1. SQUAD.md — mission + goals + output format\n * 2. priorities.md — current operational priorities\n * 3. directives.md — company-wide strategic overlay\n * 4. feedback.md — last cycle evaluation\n * 5. state.md — agent's memory from last execution\n * 6. active-work.md — open PRs and issues\n * 7. Agent briefs — agent-level briefing files\n * 8. Squad briefs — squad-level briefing files\n * 9. Daily briefing — org-wide daily briefing\n * 10. Cross-squad learnings — shared learnings from other squads\n *\n * Sections load in priority order. When budget is exhausted, later sections drop.\n * Role determines which sections are included and the total token budget.\n */\n\nimport { join, dirname } from 'path';\nimport { existsSync, readFileSync, readdirSync } from 'fs';\nimport { findSquadsDir } from './squad-parser.js';\nimport { findMemoryDir } from './memory.js';\nimport { colors, RESET, writeLine } from './terminal.js';\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport type ContextRole = 'scanner' | 'worker' | 'lead' | 'coo';\n\n// ── Token Budgets (chars, ~4 chars/token) ────────────────────────────\n\nconst ROLE_BUDGETS: Record<ContextRole, number> = {\n scanner: 4000, // ~1000 tokens — identity + priorities + state\n worker: 12000, // ~3000 tokens — + directives, feedback, active-work\n lead: 24000, // ~6000 tokens — all sections\n coo: 32000, // ~8000 tokens — all sections + expanded\n};\n\n/**\n * Which sections each role gets access to.\n * Numbers correspond to section order in the cascade.\n */\nconst ROLE_SECTIONS: Record<ContextRole, Set<number>> = {\n scanner: new Set([1, 2, 5]), // SQUAD.md, priorities, state\n worker: new Set([1, 2, 3, 4, 5, 6]), // + directives, feedback, active-work\n lead: new Set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), // all sections\n coo: new Set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), // all sections + expanded budget\n};\n\n// ── Agent Frontmatter ─────────────────────────────────────────────────\n\n/**\n * Parsed fields from an agent definition's YAML frontmatter.\n */\nexport interface AgentFrontmatter {\n context_from?: string[];\n acceptance_criteria?: string;\n max_retries?: number;\n cooldown?: string;\n}\n\n/**\n * Parse frontmatter fields from an agent definition file.\n * Handles non-standard format where frontmatter appears after a heading.\n */\nexport function parseAgentFrontmatter(agentPath: string): AgentFrontmatter {\n if (!agentPath || !existsSync(agentPath)) return {};\n\n let content: string;\n try {\n content = readFileSync(agentPath, 'utf-8');\n } catch {\n return {};\n }\n if (!content) return {};\n const lines = content.split('\\n');\n let inFrontmatter = false;\n const yamlLines: string[] = [];\n\n for (const line of lines) {\n if (line.trim() === '---') {\n if (inFrontmatter) break;\n inFrontmatter = true;\n continue;\n }\n if (inFrontmatter) {\n yamlLines.push(line);\n }\n }\n\n if (yamlLines.length === 0) return {};\n\n const yaml = yamlLines.join('\\n');\n const result: AgentFrontmatter = {};\n\n // context_from: [operations, finance, product, growth]\n const contextMatch = yaml.match(/context_from:\\s*\\[([^\\]]+)\\]/);\n if (contextMatch) {\n result.context_from = contextMatch[1].split(',').map(s => s.trim());\n }\n\n // acceptance_criteria: |\\n - criteria1\\n - criteria2\n const criteriaMatch = yaml.match(/acceptance_criteria:\\s*\\|\\n((?:\\s+.+\\n?)*)/);\n if (criteriaMatch) {\n result.acceptance_criteria = criteriaMatch[1].replace(/^ {2}/gm, '').trim();\n }\n\n // max_retries: 2\n const retriesMatch = yaml.match(/max_retries:\\s*(\\d+)/);\n if (retriesMatch) {\n result.max_retries = parseInt(retriesMatch[1], 10);\n }\n\n // cooldown: \"30m\" or \"6h\" or \"2 hours\"\n const cooldownMatch = yaml.match(/cooldown:\\s*[\"']?([^\"'\\n]+)[\"']?/);\n if (cooldownMatch) {\n result.cooldown = cooldownMatch[1].trim();\n }\n\n return result;\n}\n\n// ── MCP Server Discovery ──────────────────────────────────────────────\n\n/**\n * Extract MCP servers mentioned in an agent definition.\n * Looks for patterns like: mcp-server-name, chrome-devtools, firecrawl, etc.\n */\nexport function extractMcpServersFromDefinition(definition: string): string[] {\n const servers: Set<string> = new Set();\n\n // Common MCP server patterns\n const knownServers = [\n 'chrome-devtools',\n 'firecrawl',\n 'context7',\n 'huggingface',\n ];\n\n // Check for known servers in the definition\n for (const server of knownServers) {\n if (definition.toLowerCase().includes(server)) {\n servers.add(server);\n }\n }\n\n // Look for mcp: blocks in YAML\n const mcpMatch = definition.match(/mcp:\\s*\\n((?:\\s*-\\s*\\S+\\s*\\n?)+)/i);\n if (mcpMatch) {\n const lines = mcpMatch[1].split('\\n');\n for (const line of lines) {\n const serverMatch = line.match(/^\\s*-\\s*(\\S+)/);\n if (serverMatch) {\n servers.add(serverMatch[1]);\n }\n }\n }\n\n return Array.from(servers);\n}\n\n// ── Shared Config File Reader ─────────────────────────────────────────\n\n/**\n * Read a config file relative to the .agents directory.\n * Returns file content trimmed, or empty string if missing/unreadable.\n */\nfunction readAgentsFile(relativePath: string, warnLabel: string): string {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return '';\n\n const filePath = join(dirname(squadsDir), relativePath);\n if (!existsSync(filePath)) return '';\n\n try {\n return readFileSync(filePath, 'utf-8').trim();\n } catch (e) {\n writeLine(` ${colors.dim}warn: failed reading ${warnLabel}: ${e instanceof Error ? e.message : String(e)}${RESET}`);\n return '';\n }\n}\n\n// ── System Protocol ───────────────────────────────────────────────────\n\n/**\n * Load SYSTEM.md — the single base protocol for all agents.\n * Replaces the old approval-instructions.md + post-execution.md split.\n * Falls back to legacy approval-instructions.md if SYSTEM.md doesn't exist.\n */\nexport function loadSystemProtocol(): string {\n const systemMd = readAgentsFile('config/SYSTEM.md', 'SYSTEM.md');\n if (systemMd) return systemMd;\n\n // Fallback to legacy approval-instructions.md\n return loadApprovalInstructions();\n}\n\n/**\n * Legacy: load approval instructions. Kept for backward compat — prefer SYSTEM.md.\n * @deprecated Absorbed into SYSTEM.md. Used as fallback when SYSTEM.md absent.\n */\nexport function loadApprovalInstructions(): string {\n return readAgentsFile('config/approval-instructions.md', 'approval instructions');\n}\n\n/**\n * Legacy: load post-execution instructions.\n * @deprecated Absorbed into SYSTEM.md. Used as fallback when SYSTEM.md absent.\n */\nexport function loadPostExecution(squadName: string, agentName: string): string {\n const template = readAgentsFile('config/post-execution.md', 'post-execution template');\n if (template) {\n return template\n .replace(/\\{\\{squadName\\}\\}/g, squadName)\n .replace(/\\{\\{agentName\\}\\}/g, agentName);\n }\n return '';\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────\n\n/** Safely read a file, returning empty string on failure */\nfunction safeRead(path: string): string {\n try {\n return existsSync(path) ? readFileSync(path, 'utf-8').trim() : '';\n } catch {\n return '';\n }\n}\n\n/** Read all .md files from a directory, concatenated */\nfunction readDirMd(dirPath: string, maxChars: number): string {\n if (!existsSync(dirPath)) return '';\n try {\n const files = readdirSync(dirPath).filter(f => f.endsWith('.md')).sort();\n const parts: string[] = [];\n let totalChars = 0;\n for (const file of files) {\n const content = safeRead(join(dirPath, file));\n if (!content) continue;\n if (totalChars + content.length > maxChars) break;\n parts.push(content);\n totalChars += content.length;\n }\n return parts.join('\\n\\n');\n } catch {\n return '';\n }\n}\n\n// ── Squad Context Assembly ────────────────────────────────────────────\n\n/**\n * Gather squad context for prompt injection.\n *\n * Role-based context cascade (10 sections, priority-ordered):\n * Sections load in order until the token budget is exhausted.\n * Missing files are skipped gracefully — no crashes on first run or new squads.\n */\nexport function gatherSquadContext(\n squadName: string,\n agentName: string,\n options: { verbose?: boolean; maxTokens?: number; agentPath?: string; role?: ContextRole } = {}\n): string {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return '';\n\n const memoryDir = findMemoryDir();\n const role = options.role || 'worker';\n const budget = options.maxTokens ? options.maxTokens * 4 : ROLE_BUDGETS[role];\n const allowedSections = ROLE_SECTIONS[role];\n const sections: string[] = [];\n let usedChars = 0;\n\n /** Try to add a section. Returns true if added, false if budget exceeded or not allowed. */\n function addSection(sectionNum: number, header: string, content: string, maxChars?: number): boolean {\n if (!allowedSections.has(sectionNum)) return false;\n if (!content) return false;\n\n let text = content;\n const cap = maxChars || (budget - usedChars);\n if (text.length > cap) {\n text = text.substring(0, cap) + '\\n...';\n }\n\n if (usedChars + text.length > budget) {\n // Budget exhausted — drop this and all later sections\n if (options.verbose) {\n writeLine(` ${colors.dim}Context budget exhausted at section ${sectionNum} (${header})${RESET}`);\n }\n return false;\n }\n\n sections.push(`## ${header}\\n${text}`);\n usedChars += text.length;\n return true;\n }\n\n // ── Section 1: SQUAD.md ──\n const squadFile = join(squadsDir, squadName, 'SQUAD.md');\n if (existsSync(squadFile)) {\n try {\n const content = readFileSync(squadFile, 'utf-8');\n // Extract mission section; fall back to first N chars\n const missionMatch = content.match(/## Mission[\\s\\S]*?(?=\\n## |$)/i);\n const squad = missionMatch ? missionMatch[0] : content.substring(0, 2000);\n addSection(1, `Squad: ${squadName}`, squad.trim());\n } catch (e) {\n if (options.verbose) writeLine(` ${colors.dim}warn: failed reading SQUAD.md: ${e instanceof Error ? e.message : String(e)}${RESET}`);\n }\n }\n\n // ── Section 2: priorities.md (fallback to goals.md for backward compat) ──\n if (memoryDir) {\n const prioritiesFile = join(memoryDir, squadName, 'priorities.md');\n const goalsFile = join(memoryDir, squadName, 'goals.md');\n const file = existsSync(prioritiesFile) ? prioritiesFile : goalsFile;\n const content = safeRead(file);\n if (content) {\n addSection(2, 'Priorities', content);\n }\n }\n\n // ── Section 3: directives.md ──\n if (memoryDir) {\n const directivesFile = join(memoryDir, 'company', 'directives.md');\n const content = safeRead(directivesFile);\n if (content) {\n addSection(3, 'Directives', content);\n }\n }\n\n // ── Section 4: feedback.md ──\n if (memoryDir) {\n const feedbackFile = join(memoryDir, squadName, 'feedback.md');\n const content = safeRead(feedbackFile);\n if (content) {\n addSection(4, 'Feedback', content);\n }\n }\n\n // ── Section 5: state.md ──\n if (memoryDir) {\n const stateFile = join(memoryDir, squadName, agentName, 'state.md');\n const content = safeRead(stateFile);\n if (content) {\n // Scanner gets capped state, lead/coo get full\n const stateCap = role === 'scanner' ? 2000 : undefined;\n addSection(5, 'Previous State', content, stateCap);\n }\n }\n\n // ── Section 6: active-work.md ──\n if (memoryDir) {\n const activeWorkFile = join(memoryDir, squadName, 'active-work.md');\n const content = safeRead(activeWorkFile);\n if (content) {\n addSection(6, 'Active Work', content);\n }\n }\n\n // ── Section 7: Agent briefs ──\n if (memoryDir) {\n const briefsDir = join(memoryDir, squadName, agentName, 'briefs');\n const content = readDirMd(briefsDir, 3000);\n if (content) {\n addSection(7, 'Agent Briefs', content);\n }\n }\n\n // ── Section 8: Squad briefs ──\n if (memoryDir) {\n const briefsDir = join(memoryDir, squadName, '_briefs');\n const content = readDirMd(briefsDir, 3000);\n if (content) {\n addSection(8, 'Squad Briefs', content);\n }\n }\n\n // ── Section 9: Daily briefing ──\n if (memoryDir) {\n const dailyFile = join(memoryDir, 'daily-briefing.md');\n const content = safeRead(dailyFile);\n if (content) {\n addSection(9, 'Daily Briefing', content);\n }\n }\n\n // ── Section 10: Cross-squad learnings ──\n if (memoryDir) {\n // Load from context_from squads if defined in agent frontmatter\n const frontmatter = options.agentPath ? parseAgentFrontmatter(options.agentPath) : {};\n const contextSquads = frontmatter.context_from || [];\n const learningParts: string[] = [];\n for (const ctx of contextSquads) {\n const learningsFile = join(memoryDir, ctx, 'shared', 'learnings.md');\n const content = safeRead(learningsFile);\n if (content) {\n learningParts.push(`### ${ctx}\\n${content}`);\n }\n }\n if (learningParts.length > 0) {\n addSection(10, 'Cross-Squad Learnings', learningParts.join('\\n\\n'));\n }\n }\n\n if (sections.length === 0) return '';\n\n if (options.verbose) {\n writeLine(` ${colors.dim}Context: ${sections.length} sections, ~${Math.ceil(usedChars / 4)} tokens (${role} role, budget: ~${Math.ceil(budget / 4)})${RESET}`);\n }\n\n return `\\n# CONTEXT\\n${sections.join('\\n\\n')}\\n`;\n}\n","/**\n * Thin API client for reporting executions to the Squads API.\n * All calls are fire-and-forget with timeouts — preserves offline-first behavior.\n */\n\nimport { loadSession } from './auth.js';\nimport { getApiUrl } from './env-config.js';\n\nconst API_TIMEOUT_MS = 5000;\n\nfunction getApiConfig(): { apiUrl: string; token: string } | null {\n const session = loadSession();\n if (!session?.accessToken || session.status !== 'active') return null;\n\n const apiUrl = getApiUrl();\n return { apiUrl, token: session.accessToken };\n}\n\nasync function apiRequest(\n path: string,\n method: 'POST' | 'PATCH',\n body: Record<string, unknown>,\n): Promise<boolean> {\n const config = getApiConfig();\n if (!config) return false;\n\n try {\n const response = await fetch(`${config.apiUrl}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.token}`,\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(API_TIMEOUT_MS),\n });\n return response.ok;\n } catch {\n return false; // Silent failure — offline-first\n }\n}\n\n/**\n * Report execution start to the API.\n * Non-blocking: returns a promise that resolves to the API execution_id or null.\n */\nexport async function reportExecutionStart(\n squad: string,\n agent: string,\n executionId: string,\n metadata?: {\n trigger?: string;\n model?: string;\n brief?: string;\n },\n): Promise<string | null> {\n const config = getApiConfig();\n if (!config) return null;\n\n try {\n const response = await fetch(`${config.apiUrl}/agent-executions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.token}`,\n },\n body: JSON.stringify({\n squad,\n agent,\n executor: 'cli',\n brief: metadata?.brief,\n model: metadata?.model,\n metadata: {\n local_execution_id: executionId,\n trigger: metadata?.trigger || 'manual',\n },\n }),\n signal: AbortSignal.timeout(API_TIMEOUT_MS),\n });\n\n if (!response.ok) return null;\n const data = await response.json() as { execution_id: string };\n return data.execution_id;\n } catch {\n return null;\n }\n}\n\n/**\n * Report execution completion to the API.\n * Non-blocking: fire-and-forget.\n */\nexport async function reportExecutionComplete(\n executionId: string,\n status: 'completed' | 'failed',\n details?: {\n summary?: string;\n error?: string;\n durationMs?: number;\n },\n): Promise<boolean> {\n return apiRequest(`/agent-executions/${executionId}`, 'PATCH', {\n status,\n ...(details?.summary ? { summary: details.summary } : {}),\n ...(details?.error ? { error: details.error } : {}),\n });\n}\n\n/**\n * Report conversation result to the API.\n * Extends execution with conversation-specific data in extra_data.\n * Non-blocking: fire-and-forget.\n */\nexport async function reportConversationResult(\n executionId: string,\n result: {\n turnCount: number;\n totalCost: number;\n converged: boolean;\n reason: string;\n agentsInvolved: string[];\n },\n): Promise<boolean> {\n return apiRequest(`/agent-executions/${executionId}`, 'PATCH', {\n status: result.converged ? 'completed' : 'stopped',\n summary: `${result.converged ? 'Converged' : 'Stopped'}: ${result.reason}`,\n cost_usd: result.totalCost,\n extra_data: {\n conversation: {\n turn_count: result.turnCount,\n total_cost: result.totalCost,\n converged: result.converged,\n reason: result.reason,\n agents_involved: result.agentsInvolved,\n },\n },\n });\n}\n\n\n/**\n * Push a cognition signal to the API.\n * Fire-and-forget — returns true on success, false on failure.\n */\nexport async function pushCognitionSignal(signal: {\n source: string;\n signal_type: string;\n value?: number;\n unit?: string;\n data?: Record<string, unknown>;\n entity_type?: string;\n entity_id?: string;\n confidence?: number;\n}): Promise<boolean> {\n return apiRequest('/cognition/signals', 'POST', signal);\n}\n\n/**\n * Ingest a memory file into the cognition engine.\n * Fire-and-forget — returns result or null on failure.\n */\nexport async function ingestMemorySignal(body: {\n squad: string;\n agent: string;\n file_type: 'state' | 'learnings' | 'executions' | 'events' | 'directives';\n content: string;\n content_hash: string;\n}): Promise<{ status: string; signals_created?: number } | null> {\n const config = getApiConfig();\n if (!config) return null;\n\n try {\n const response = await fetch(`${config.apiUrl}/cognition/signals/ingest-memory`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.token}`,\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(API_TIMEOUT_MS),\n });\n if (!response.ok) return null;\n return await response.json() as { status: string; signals_created?: number };\n } catch {\n return null; // Silent failure — offline-first\n }\n}\n","/**\n * squad-loop — shared state, scoring, and utility logic for the daemon\n * and any other command that needs squad-loop intelligence.\n *\n * Extracted from daemon.ts so that `squads run` can reuse the same\n * state management, scoring, cooldowns, and post-run reactions.\n */\n\nimport { createHash } from 'crypto';\nimport { execSync } from 'child_process';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport {\n findSquadsDir,\n listSquads,\n loadSquad,\n type Squad,\n} from './squad-parser.js';\nimport { findMemoryDir } from './memory.js';\nimport { getOutcomeScoreModifier } from './outcomes.js';\nimport { ingestMemorySignal } from './api-client.js';\nimport {\n colors,\n RESET,\n writeLine,\n} from './terminal.js';\n\n// ── Constants ────────────────────────────────────────────────────────\n\n/** Runs completing faster than this are phantom (no real work done). */\nexport const PHANTOM_THRESHOLD_MS = 5000;\n\n/** Minimum duration to consider a run as real work (used by daemon). */\nexport const MIN_PHANTOM_DURATION_MS = 30 * 1000;\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport interface GhIssue {\n number: number;\n title: string;\n labels: string[];\n repo: string;\n}\n\nexport interface SquadSignal {\n squad: string;\n score: number; // 0-100 urgency\n reason: string;\n agent?: string; // specific agent to run, or undefined for squad conversation\n issues: GhIssue[];\n}\n\nexport interface ReviewComment {\n author: string;\n body: string;\n path?: string;\n createdAt: string;\n}\n\nexport interface PRWithReviews {\n number: number;\n title: string;\n branch: string;\n repo: string;\n comments: ReviewComment[];\n}\n\nexport type MemoryFileType = 'state' | 'learnings' | 'executions' | 'events' | 'directives';\n\nexport const INGESTIBLE_FILES: MemoryFileType[] = ['state', 'learnings', 'executions'];\n\n// ── Loop State ───────────────────────────────────────────────────────\n\nconst STATE_DIR = join(homedir(), '.squads', 'daemon');\nconst STATE_FILE = join(STATE_DIR, 'state.json');\n\nexport interface LoopState {\n lastCycle: string;\n dailyCost: number;\n dailyCostDate: string;\n recentRuns: Array<{\n squad: string;\n agent: string;\n at: string;\n result: 'completed' | 'failed' | 'timeout';\n durationMs: number;\n }>;\n failCounts: Record<string, number>; // squad:agent → consecutive failures\n memoryHashes: Record<string, string>; // squad/agent/file_type → content hash\n cooldowns: Record<string, number>; // squad:agent → timestamp of last dispatch\n}\n\nexport function defaultState(): LoopState {\n return {\n lastCycle: '',\n dailyCost: 0,\n dailyCostDate: new Date().toISOString().slice(0, 10),\n recentRuns: [],\n failCounts: {},\n memoryHashes: {},\n cooldowns: {},\n };\n}\n\nexport function loadLoopState(): LoopState {\n if (!existsSync(STATE_DIR)) mkdirSync(STATE_DIR, { recursive: true });\n if (!existsSync(STATE_FILE)) return defaultState();\n try {\n const raw = JSON.parse(readFileSync(STATE_FILE, 'utf-8'));\n // Ensure new fields exist for backward compatibility\n if (!raw.cooldowns) raw.cooldowns = {};\n if (!raw.memoryHashes) raw.memoryHashes = {};\n return raw as LoopState;\n } catch {\n return defaultState();\n }\n}\n\nexport function saveLoopState(state: LoopState): void {\n if (!existsSync(STATE_DIR)) mkdirSync(STATE_DIR, { recursive: true });\n writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));\n}\n\n// ── Outcome classification ───────────────────────────────────────────\n\n/**\n * Classify how a run ended based on exit code and wall-clock duration.\n *\n * - completed: exit 0 and ran long enough to do real work\n * - failed: non-zero exit\n * - skipped: exit 0 but finished suspiciously fast (phantom)\n */\nexport function classifyRunOutcome(\n exitCode: number,\n durationMs: number,\n): 'completed' | 'failed' | 'skipped' {\n if (exitCode !== 0) return 'failed';\n if (durationMs < MIN_PHANTOM_DURATION_MS) return 'skipped';\n return 'completed';\n}\n\n// ── Cooldowns ────────────────────────────────────────────────────────\n\n/**\n * Check whether a squad/agent pair is still in cooldown.\n * Returns true if the pair can run (cooldown expired or never set).\n */\nexport function checkCooldown(\n state: LoopState,\n squad: string,\n agentType: string,\n cooldownMs: number,\n): boolean {\n const key = `${squad}:${agentType}`;\n const lastDispatch = state.cooldowns[key];\n if (lastDispatch === undefined) return true;\n return Date.now() - lastDispatch >= cooldownMs;\n}\n\n// ── Intelligence: GitHub queries ─────────────────────────────────────\n\nexport function getOpenIssues(repo: string, ghEnv: Record<string, string> = {}): GhIssue[] {\n try {\n const raw = execSync(\n `gh issue list -R ${repo} --state open --json number,title,labels --limit 20`,\n { encoding: 'utf-8', timeout: 15000, stdio: ['pipe', 'pipe', 'pipe'], env: { ...process.env, ...ghEnv } },\n );\n const issues = JSON.parse(raw) as Array<{\n number: number;\n title: string;\n labels: Array<{ name: string }>;\n }>;\n return issues.map(i => ({\n number: i.number,\n title: i.title,\n labels: i.labels.map(l => l.name),\n repo,\n }));\n } catch {\n return [];\n }\n}\n\nexport function getOpenPRs(\n repo: string,\n ghEnv: Record<string, string> = {},\n): Array<{ number: number; title: string; branch: string; checks: string }> {\n try {\n const raw = execSync(\n `gh pr list -R ${repo} --state open --json number,title,headRefName,statusCheckRollup --limit 10`,\n { encoding: 'utf-8', timeout: 15000, stdio: ['pipe', 'pipe', 'pipe'], env: { ...process.env, ...ghEnv } },\n );\n const prs = JSON.parse(raw) as Array<{\n number: number;\n title: string;\n headRefName: string;\n statusCheckRollup: Array<{ conclusion: string }> | null;\n }>;\n return prs.map(pr => ({\n number: pr.number,\n title: pr.title,\n branch: pr.headRefName,\n checks: pr.statusCheckRollup?.every(c => c.conclusion === 'SUCCESS') ? 'passing' : 'pending',\n }));\n } catch {\n return [];\n }\n}\n\n// ── Execution helpers ────────────────────────────────────────────────\n\nexport function getLastRunAge(squad: string, agent: string): number | null {\n const memDir = findMemoryDir();\n if (!memDir) return null;\n\n const execPath = join(memDir, squad, agent, 'executions.md');\n if (!existsSync(execPath)) return null;\n\n try {\n const content = readFileSync(execPath, 'utf-8');\n // Find the last timestamp\n const timestamps = content.match(/\\*\\*(\\d{4}-\\d{2}-\\d{2}T[\\d:.]+Z?)\\*\\*/g);\n if (!timestamps || timestamps.length === 0) return null;\n\n const last = timestamps[timestamps.length - 1].replace(/\\*\\*/g, '');\n const lastDate = new Date(last);\n return Date.now() - lastDate.getTime();\n } catch {\n return null;\n }\n}\n\n// ── Escalation check ────────────────────────────────────────────────\n\n/**\n * Check if a squad has unresolved escalations (blocked/needs-human issues).\n * If so, the squad should be paused — no point dispatching agents that can't work.\n */\nexport function hasUnresolvedEscalation(\n repo: string,\n ghEnv: Record<string, string> = {},\n): { blocked: boolean; issue?: { number: number; title: string } } {\n try {\n const raw = execSync(\n `gh issue list -R ${repo} --label \"blocked\" --state open --json number,title --limit 1`,\n { encoding: 'utf-8', timeout: 15000, stdio: ['pipe', 'pipe', 'pipe'], env: { ...process.env, ...ghEnv } },\n );\n const issues = JSON.parse(raw) as Array<{ number: number; title: string }>;\n if (issues.length > 0) {\n return { blocked: true, issue: issues[0] };\n }\n\n // Also check needs-human label\n const raw2 = execSync(\n `gh issue list -R ${repo} --label \"needs-human\" --state open --json number,title --limit 1`,\n { encoding: 'utf-8', timeout: 15000, stdio: ['pipe', 'pipe', 'pipe'], env: { ...process.env, ...ghEnv } },\n );\n const issues2 = JSON.parse(raw2) as Array<{ number: number; title: string }>;\n if (issues2.length > 0) {\n return { blocked: true, issue: issues2[0] };\n }\n\n return { blocked: false };\n } catch {\n return { blocked: false }; // Can't check = assume not blocked\n }\n}\n\n// ── Squad scoring ────────────────────────────────────────────────────\n\n/**\n * Build squad→repo mapping dynamically from SQUAD.md `repo:` fields.\n * Falls back to detecting org from git remote + squad name conventions.\n */\nexport function getSquadRepos(): Record<string, string> {\n const repos: Record<string, string> = {};\n const squadsDir = findSquadsDir();\n if (!squadsDir) return repos;\n\n try {\n const squads = listSquads(squadsDir);\n for (const squad of squads) {\n const squadMd = join(squadsDir, squad, 'SQUAD.md');\n if (!existsSync(squadMd)) continue;\n\n const content = readFileSync(squadMd, 'utf-8');\n const repoMatch = content.match(/^repo:\\s*(.+)/m);\n if (repoMatch) {\n repos[squad] = repoMatch[1].trim();\n }\n }\n } catch {\n // Fall back to empty — scoring will skip squads without repos\n }\n\n return repos;\n}\n\nexport function scoreSquads(\n state: LoopState,\n squadRepos: Record<string, string>,\n ghEnv: Record<string, string> = {},\n): SquadSignal[] {\n const signals: SquadSignal[] = [];\n const squadsDir = findSquadsDir();\n if (!squadsDir) return signals;\n\n let squads: string[];\n try {\n squads = listSquads(squadsDir);\n } catch {\n return signals;\n }\n\n for (const squadName of squads) {\n try {\n const repo = squadRepos[squadName];\n\n // Skip squads with unresolved escalations — don't waste tokens\n if (repo) {\n const escalation = hasUnresolvedEscalation(repo, ghEnv);\n if (escalation.blocked) {\n signals.push({\n squad: squadName,\n score: 0,\n reason: `PAUSED: unresolved escalation #${escalation.issue?.number} — ${escalation.issue?.title}`,\n issues: [],\n });\n continue;\n }\n }\n\n const issues = repo ? getOpenIssues(repo, ghEnv) : [];\n\n let score = 0;\n let reason = '';\n const CONVERSATION_ISSUE_THRESHOLD = 3;\n const CONVERSATION_COOLDOWN_MS = 48 * 60 * 60 * 1000;\n const lastConvAge = getLastRunAge(squadName, 'conversation');\n const conversationStale =\n lastConvAge === null || lastConvAge > CONVERSATION_COOLDOWN_MS;\n const useConversation =\n issues.length >= CONVERSATION_ISSUE_THRESHOLD && conversationStale;\n\n const targetAgent: string | undefined = useConversation\n ? undefined\n : 'issue-solver';\n\n if (repo) {\n const p0Issues = issues.filter(i =>\n i.labels.some(l => l.includes('P0') || l.includes('priority:P0')),\n );\n const p1Issues = issues.filter(i =>\n i.labels.some(l => l.includes('P1') || l.includes('priority:P1')),\n );\n\n if (p0Issues.length > 0) {\n score += 80;\n reason = `${p0Issues.length} P0 issues: ${p0Issues[0].title}`;\n } else if (p1Issues.length > 0) {\n score += 60;\n reason = `${p1Issues.length} P1 issues: ${p1Issues[0].title}`;\n } else if (issues.length > 0) {\n score += 30;\n reason = `${issues.length} open issues`;\n }\n } else {\n reason = 'no repo configured — staleness-based dispatch';\n }\n\n if (useConversation) {\n score += 10;\n reason += ' → conversation mode';\n }\n\n const agentForStaleness = targetAgent ?? 'conversation';\n const lastAge = getLastRunAge(squadName, agentForStaleness);\n if (lastAge !== null) {\n const hoursAgo = lastAge / (1000 * 60 * 60);\n if (hoursAgo > 48) {\n score += 20;\n reason += ` (stale: ${Math.floor(hoursAgo)}h since last run)`;\n } else if (hoursAgo > 24) {\n score += 10;\n reason += ` (${Math.floor(hoursAgo)}h since last run)`;\n } else if (hoursAgo < 2) {\n score -= 30;\n reason += ` (ran ${Math.floor(hoursAgo * 60)}m ago)`;\n }\n } else if (!repo) {\n score += 15;\n reason += ' (never run)';\n }\n\n const failKey = `${squadName}:${agentForStaleness}`;\n const failures = state.failCounts[failKey] || 0;\n if (failures >= 3) {\n score -= 40;\n reason += ` (${failures} consecutive failures — needs human)`;\n } else if (failures >= 1) {\n score -= 10 * failures;\n }\n\n const outcomeModifier = getOutcomeScoreModifier(squadName, agentForStaleness);\n if (outcomeModifier !== 0) {\n score += outcomeModifier;\n reason += ` (outcome: ${outcomeModifier > 0 ? '+' : ''}${outcomeModifier})`;\n }\n\n if (score > 0 && (issues.length > 0 || !repo)) {\n signals.push({ squad: squadName, score, reason, agent: targetAgent, issues });\n }\n } catch {\n continue;\n }\n }\n\n signals.sort((a, b) => b.score - a.score);\n return signals;\n}\n\n// ── Post-run reactions ───────────────────────────────────────────────\n\nexport function checkNewPRs(\n repo: string,\n sinceMins: number = 30,\n ghEnv: Record<string, string> = {},\n): Array<{ number: number; title: string }> {\n try {\n const raw = execSync(\n `gh pr list -R ${repo} --state open --json number,title,createdAt --limit 5`,\n { encoding: 'utf-8', timeout: 15000, stdio: ['pipe', 'pipe', 'pipe'], env: { ...process.env, ...ghEnv } },\n );\n const prs = JSON.parse(raw) as Array<{ number: number; title: string; createdAt: string }>;\n const cutoff = Date.now() - sinceMins * 60 * 1000;\n return prs.filter(pr => new Date(pr.createdAt).getTime() > cutoff);\n } catch {\n return [];\n }\n}\n\n/**\n * Get open PRs with unaddressed review comments (from Gemini, humans, etc).\n * Skips comments from our own bot to avoid feedback loops.\n */\nexport function getPRsWithReviewFeedback(\n repo: string,\n ghEnv: Record<string, string> = {},\n): PRWithReviews[] {\n try {\n const prsRaw = execSync(\n `gh pr list -R ${repo} --state open --author \"agents-squads[bot]\" --json number,title,headRefName --limit 10`,\n { encoding: 'utf-8', timeout: 15000, stdio: ['pipe', 'pipe', 'pipe'], env: { ...process.env, ...ghEnv } },\n );\n const prs = JSON.parse(prsRaw) as Array<{ number: number; title: string; headRefName: string }>;\n\n const results: PRWithReviews[] = [];\n\n for (const pr of prs) {\n try {\n const reviewsRaw = execSync(\n `gh api repos/${repo}/pulls/${pr.number}/comments --jq '.[] | {author: .user.login, body: .body, path: .path, createdAt: .created_at}'`,\n { encoding: 'utf-8', timeout: 15000, stdio: ['pipe', 'pipe', 'pipe'], env: { ...process.env, ...ghEnv } },\n );\n\n const issueCommentsRaw = execSync(\n `gh api repos/${repo}/issues/${pr.number}/comments --jq '.[] | {author: .user.login, body: .body, createdAt: .created_at}'`,\n { encoding: 'utf-8', timeout: 15000, stdio: ['pipe', 'pipe', 'pipe'], env: { ...process.env, ...ghEnv } },\n );\n\n const comments: ReviewComment[] = [];\n\n for (const line of [...reviewsRaw.split('\\n'), ...issueCommentsRaw.split('\\n')]) {\n if (!line.trim()) continue;\n try {\n const comment = JSON.parse(line) as ReviewComment;\n if (comment.author === 'agents-squads[bot]') continue;\n comments.push(comment);\n } catch {\n continue;\n }\n }\n\n if (comments.length > 0) {\n results.push({\n number: pr.number,\n title: pr.title,\n branch: pr.headRefName,\n repo,\n comments,\n });\n }\n } catch {\n continue;\n }\n }\n\n return results;\n } catch {\n return [];\n }\n}\n\n/**\n * Build a task directive from review feedback for an agent to address.\n */\nexport function buildReviewTask(pr: PRWithReviews): string {\n const commentSummary = pr.comments\n .map(c => {\n const location = c.path ? ` (${c.path})` : '';\n return `- ${c.author}${location}: ${c.body.slice(0, 300)}`;\n })\n .join('\\n');\n\n return [\n `Address review feedback on PR #${pr.number}: ${pr.title}`,\n `Branch: ${pr.branch}`,\n ``,\n `Review comments to address:`,\n commentSummary,\n ``,\n `Checkout the branch, fix the issues, commit, and push.`,\n ].join('\\n');\n}\n\n// ── Slack ────────────────────────────────────────────────────────────\n\nexport async function slackNotify(message: string): Promise<void> {\n try {\n const envPath = join(homedir(), 'agents-squads', 'hq', '.env');\n if (!existsSync(envPath)) return;\n\n const env = readFileSync(envPath, 'utf-8');\n const tokenMatch = env.match(/SLACK_BOT_TOKEN=(.+)/);\n if (!tokenMatch) return;\n\n const token = tokenMatch[1].trim();\n const founderId = 'U0A6NQ3U0JG';\n\n await fetch('https://slack.com/api/chat.postMessage', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ channel: founderId, text: message }),\n signal: AbortSignal.timeout(10000),\n });\n } catch {\n // Silent — Slack is best-effort\n }\n}\n\n// ── Memory ingestion ─────────────────────────────────────────────────\n\n/**\n * Push changed memory files to the cognition engine.\n * Reads agent memory files (state, learnings, executions) for squads that ran,\n * computes content hash, and POSTs to API if changed since last push.\n * Fire-and-forget — never blocks the cycle.\n */\nexport async function pushMemorySignals(\n squads: string[],\n state: LoopState,\n verbose: boolean,\n): Promise<void> {\n const memDir = findMemoryDir();\n if (!memDir) return;\n\n // Initialize memoryHashes if missing (backward compat with old state files)\n if (!state.memoryHashes) {\n state.memoryHashes = {};\n }\n\n const promises: Promise<void>[] = [];\n\n for (const squad of squads) {\n const squadPath = join(memDir, squad);\n if (!existsSync(squadPath)) continue;\n\n let agents: string[];\n try {\n agents = readdirSync(squadPath, { withFileTypes: true })\n .filter(e => e.isDirectory())\n .map(e => e.name);\n } catch {\n continue;\n }\n\n for (const agent of agents) {\n for (const fileType of INGESTIBLE_FILES) {\n const filePath = join(squadPath, agent, `${fileType}.md`);\n if (!existsSync(filePath)) continue;\n\n let content: string;\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch {\n continue;\n }\n\n if (!content.trim()) continue;\n\n const hash = createHash('sha256').update(content).digest('hex').slice(0, 16);\n const key = `${squad}/${agent}/${fileType}`;\n\n if (state.memoryHashes[key] === hash) continue;\n\n const p = ingestMemorySignal({\n squad,\n agent,\n file_type: fileType,\n content,\n content_hash: hash,\n }).then((result) => {\n if (result) {\n state.memoryHashes[key] = hash;\n if (verbose && result.status === 'ingested') {\n writeLine(` ${colors.dim}Memory: ${key} → ${result.signals_created || 0} signals${RESET}`);\n }\n }\n }).catch(() => {\n // Silent — memory ingestion is best-effort\n });\n\n promises.push(p);\n }\n }\n }\n\n if (promises.length > 0) {\n await Promise.race([\n Promise.allSettled(promises),\n new Promise<void>(resolve => setTimeout(resolve, 10000)),\n ]);\n }\n}\n\n// ── Phase Computation ─────────────────────────────────────────────────\n\n/**\n * Compute execution phases from squad depends_on declarations.\n * Performs topological sort with cycle detection.\n *\n * Rules:\n * - No depends_on = phase 0 (runs first)\n * - depends_on: [\"*\"] = last phase (evaluation)\n * - Circular deps = grouped into same phase\n * - Missing deps = warned and ignored\n *\n * @returns Map from phase number to array of squad names in that phase\n */\nexport function computePhases(squadNames?: string[]): Map<number, string[]> {\n const squadsDir = findSquadsDir();\n if (!squadsDir) return new Map([[0, squadNames || []]]);\n\n // Load all squads and their depends_on\n const names = squadNames || listSquads(squadsDir);\n const deps = new Map<string, string[]>();\n const starSquads: string[] = []; // depends_on: [\"*\"]\n\n for (const name of names) {\n const squad = loadSquad(name);\n if (!squad) continue;\n\n if (squad.depends_on && squad.depends_on.length === 1 && squad.depends_on[0] === '*') {\n starSquads.push(name);\n continue;\n }\n\n // Filter out deps that reference squads not in our set\n const validDeps = (squad.depends_on || []).filter(d => names.includes(d));\n if (squad.depends_on) {\n const invalid = squad.depends_on.filter(d => d !== '*' && !names.includes(d));\n if (invalid.length > 0) {\n writeLine(` ${colors.dim}warn: ${name} depends_on unknown squads: ${invalid.join(', ')}${RESET}`);\n }\n }\n deps.set(name, validDeps);\n }\n\n // Topological sort with cycle detection (Kahn's algorithm)\n const inDegree = new Map<string, number>();\n const adjList = new Map<string, string[]>(); // dep -> dependents\n\n for (const [squad, squadDeps] of deps) {\n if (!inDegree.has(squad)) inDegree.set(squad, 0);\n for (const dep of squadDeps) {\n if (!adjList.has(dep)) adjList.set(dep, []);\n adjList.get(dep)!.push(squad);\n inDegree.set(squad, (inDegree.get(squad) || 0) + 1);\n if (!inDegree.has(dep)) inDegree.set(dep, 0);\n }\n }\n\n // Also ensure squads with no deps and not in adjList are included\n for (const [squad] of deps) {\n if (!inDegree.has(squad)) inDegree.set(squad, 0);\n }\n\n const phases = new Map<number, string[]>();\n let phase = 0;\n const processed = new Set<string>();\n\n // Process phases until all squads are assigned\n const remaining = new Set([...deps.keys()]);\n\n while (remaining.size > 0) {\n // Find all squads with in-degree 0 (no unresolved deps)\n const ready: string[] = [];\n for (const squad of remaining) {\n if ((inDegree.get(squad) || 0) <= 0) {\n ready.push(squad);\n }\n }\n\n if (ready.length === 0) {\n // Cycle detected — group remaining into current phase\n const cycled = [...remaining];\n if (!phases.has(phase)) phases.set(phase, []);\n phases.get(phase)!.push(...cycled);\n for (const s of cycled) processed.add(s);\n break;\n }\n\n phases.set(phase, ready);\n for (const squad of ready) {\n processed.add(squad);\n remaining.delete(squad);\n // Decrement in-degree for dependents\n for (const dependent of (adjList.get(squad) || [])) {\n inDegree.set(dependent, (inDegree.get(dependent) || 0) - 1);\n }\n }\n phase++;\n }\n\n // Star squads go in the last phase\n if (starSquads.length > 0) {\n phases.set(phase, starSquads);\n }\n\n return phases;\n}\n\n/**\n * Score only squads in a specific phase.\n * Wrapper around scoreSquads that filters to phase members.\n */\nexport function scoreSquadsForPhase(\n phaseSquads: string[],\n state: LoopState,\n squadRepos: Record<string, string>,\n ghEnv: Record<string, string>,\n): SquadSignal[] {\n const allSignals = scoreSquads(state, squadRepos, ghEnv);\n return allSignals.filter(s => phaseSquads.includes(s.squad));\n}\n","/**\n * Local-first cognition engine.\n *\n * Processes signals → beliefs → reflections locally using JSON files.\n * Pushes to API when available (pro/enterprise feature).\n *\n * The intelligence loop:\n * 1. Ingest: memory files → signals\n * 2. Synthesize: classify signals against beliefs (Haiku)\n * 3. Evaluate: score past decisions\n * 4. Reflect: meta-cognition assessment (Sonnet, every 4h)\n * 5. Push: sync to API if reachable\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport { createHash } from 'crypto';\nimport { spawnSync } from 'child_process';\nimport { findMemoryDir } from './memory.js';\nimport { pushCognitionSignal, ingestMemorySignal } from './api-client.js';\nimport { slackNotify } from './squad-loop.js';\nimport { colors, RESET, writeLine } from './terminal.js';\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport interface CognitionSignal {\n id: number;\n source: string; // execution, memory, financial, market, etc.\n signal_type: string;\n value: number | null;\n unit: string | null;\n data: Record<string, unknown>;\n entity_type: string | null;\n entity_id: string | null;\n confidence: number;\n created_at: string;\n}\n\nexport interface CognitionBelief {\n belief_key: string;\n domain: string; // revenue, product, operations, market, team\n statement: string;\n confidence: number; // 0.0 - 1.0\n supporting_signals: number[]; // signal IDs\n contradicting_signals: number[];\n temperature: 'hot' | 'warm' | 'cold';\n revision: number;\n updated_at: string;\n}\n\nexport interface CognitionDecision {\n id: number;\n title: string;\n context: Record<string, unknown>;\n reasoning: string;\n action_taken: string;\n expected_outcome: Record<string, unknown>;\n decided_by: string;\n decided_at: string;\n outcome_score: number | null; // -1.0 to 1.0\n actual_outcome: Record<string, unknown> | null;\n}\n\nexport interface CognitionReflection {\n id: number;\n scope: string;\n assessment: string;\n insights: Array<{ type: string; message: string }>;\n belief_updates: Array<{ belief_key: string; suggested_confidence: number; reason: string }>;\n priority_adjustments: Array<{ description: string; urgency: string }>;\n founder_escalations: Array<{ issue: string; why_human_needed: string; suggested_action: string; urgency: string }>;\n created_at: string;\n}\n\nexport interface CognitionState {\n signals: CognitionSignal[];\n beliefs: CognitionBelief[];\n decisions: CognitionDecision[];\n reflections: CognitionReflection[];\n last_synthesize: string | null;\n last_reflect: string | null;\n next_signal_id: number;\n next_decision_id: number;\n next_reflection_id: number;\n memory_hashes: Record<string, string>;\n}\n\n// ── Constants ────────────────────────────────────────────────────────\n\nconst COGNITION_DIR_NAME = 'cognition';\nconst STATE_FILE = 'state.json';\nconst SYNTHESIZE_INTERVAL_MS = 30 * 60 * 1000; // 30 min\nconst REFLECT_INTERVAL_MS = 4 * 60 * 60 * 1000; // 4 hours\nconst MAX_SIGNALS_KEPT = 500;\nconst MAX_REFLECTIONS_KEPT = 50;\nconst CONFIDENCE_PRIOR_WEIGHT = 0.7;\nconst CONFIDENCE_EVIDENCE_WEIGHT = 0.3;\nconst CONFIDENCE_MIN = 0.05;\nconst CONFIDENCE_MAX = 0.95;\nconst BELIEF_SHIFT_THRESHOLD = 0.15; // Slack notify on 15%+ shift\nconst MAX_SUPPORTING_IDS = 20;\n\nconst INGESTIBLE_FILES = ['state', 'learnings', 'executions'] as const;\n\nconst FILE_TYPE_MAPPING: Record<string, { source: string; signal_type: string }> = {\n state: { source: 'memory', signal_type: 'state_update' },\n learnings: { source: 'memory', signal_type: 'learning' },\n executions: { source: 'execution', signal_type: 'execution_log' },\n events: { source: 'market', signal_type: 'external_event' },\n directives: { source: 'execution', signal_type: 'directive' },\n};\n\n// ── Storage ──────────────────────────────────────────────────────────\n\n/**\n * Call Claude CLI with a prompt via stdin.\n * Strips CLAUDECODE env var to avoid nested session errors.\n */\nfunction callClaude(prompt: string, model: string, timeoutMs: number): string | null {\n const { CLAUDECODE: _, ANTHROPIC_API_KEY: _k, ...cleanEnv } = process.env;\n const result = spawnSync('claude', ['--print', '--model', model], {\n input: prompt,\n encoding: 'utf-8',\n timeout: timeoutMs,\n env: cleanEnv,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n if (result.status !== 0 || !result.stdout) return null;\n return result.stdout;\n}\n\nfunction getCognitionDir(): string {\n const memDir = findMemoryDir();\n const dir = memDir\n ? join(memDir, COGNITION_DIR_NAME)\n : join(process.cwd(), '.agents', 'memory', COGNITION_DIR_NAME);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n return dir;\n}\n\nfunction defaultState(): CognitionState {\n return {\n signals: [],\n beliefs: [],\n decisions: [],\n reflections: [],\n last_synthesize: null,\n last_reflect: null,\n next_signal_id: 1,\n next_decision_id: 1,\n next_reflection_id: 1,\n memory_hashes: {},\n };\n}\n\nexport function loadCognitionState(): CognitionState {\n const dir = getCognitionDir();\n const path = join(dir, STATE_FILE);\n if (!existsSync(path)) return defaultState();\n try {\n return JSON.parse(readFileSync(path, 'utf-8')) as CognitionState;\n } catch {\n return defaultState();\n }\n}\n\nexport function saveCognitionState(state: CognitionState): void {\n const dir = getCognitionDir();\n writeFileSync(join(dir, STATE_FILE), JSON.stringify(state, null, 2));\n}\n\n// ── Signal Ingestion ─────────────────────────────────────────────────\n\n/**\n * Add a signal to the local cognition state.\n * Also pushes to API if available.\n */\nexport function addSignal(\n state: CognitionState,\n signal: Omit<CognitionSignal, 'id' | 'created_at'>,\n): CognitionSignal {\n const newSignal: CognitionSignal = {\n ...signal,\n id: state.next_signal_id++,\n created_at: new Date().toISOString(),\n };\n state.signals.push(newSignal);\n\n // Trim old signals\n if (state.signals.length > MAX_SIGNALS_KEPT) {\n state.signals = state.signals.slice(-MAX_SIGNALS_KEPT);\n }\n\n // Push to API (fire-and-forget)\n pushCognitionSignal({\n source: signal.source,\n signal_type: signal.signal_type,\n value: signal.value ?? undefined,\n unit: signal.unit ?? undefined,\n data: signal.data,\n entity_type: signal.entity_type ?? undefined,\n entity_id: signal.entity_id ?? undefined,\n confidence: signal.confidence,\n });\n\n return newSignal;\n}\n\n/**\n * Ingest memory files from agent runs into signals.\n * Reads .agents/memory/{squad}/{agent}/{state,learnings,executions}.md\n * Deduplicates by content hash.\n */\nexport function ingestMemoryFiles(\n state: CognitionState,\n squads: string[],\n verbose: boolean = false,\n): number {\n const memDir = findMemoryDir();\n if (!memDir) return 0;\n\n let signalsCreated = 0;\n\n for (const squad of squads) {\n const squadPath = join(memDir, squad);\n if (!existsSync(squadPath)) continue;\n\n let agents: string[];\n try {\n agents = readdirSync(squadPath, { withFileTypes: true })\n .filter(e => e.isDirectory() && e.name !== COGNITION_DIR_NAME)\n .map(e => e.name);\n } catch { continue; }\n\n for (const agent of agents) {\n for (const fileType of INGESTIBLE_FILES) {\n const filePath = join(squadPath, agent, `${fileType}.md`);\n if (!existsSync(filePath)) continue;\n\n let content: string;\n try { content = readFileSync(filePath, 'utf-8'); } catch { continue; }\n if (!content.trim()) continue;\n\n const hash = createHash('sha256').update(content).digest('hex').slice(0, 16);\n const key = `${squad}/${agent}/${fileType}`;\n\n if (state.memory_hashes[key] === hash) continue;\n state.memory_hashes[key] = hash;\n\n // Extract bullet points as individual signals\n const mapping = FILE_TYPE_MAPPING[fileType] || FILE_TYPE_MAPPING.state;\n const bullets = content\n .split('\\n')\n .filter(line => line.trim().startsWith('- ') || line.trim().startsWith('* '))\n .map(line => line.trim().replace(/^[-*]\\s+/, ''))\n .filter(line => line.length > 10);\n\n if (bullets.length === 0) {\n // Whole file as single signal\n addSignal(state, {\n source: mapping.source,\n signal_type: mapping.signal_type,\n value: null,\n unit: null,\n data: { content: content.slice(0, 500), content_hash: hash },\n entity_type: 'memory_file',\n entity_id: key,\n confidence: 0.8,\n });\n signalsCreated++;\n } else {\n // Each bullet as a signal\n for (const bullet of bullets.slice(0, 10)) {\n addSignal(state, {\n source: mapping.source,\n signal_type: mapping.signal_type,\n value: null,\n unit: null,\n data: { content: bullet, file: key, content_hash: hash },\n entity_type: 'memory_file',\n entity_id: key,\n confidence: 0.8,\n });\n signalsCreated++;\n }\n }\n\n // Also push to API\n ingestMemorySignal({ squad, agent, file_type: fileType, content, content_hash: hash });\n\n if (verbose) {\n writeLine(` ${colors.dim}Cognition: ${key} → ${bullets.length || 1} signals${RESET}`);\n }\n }\n }\n }\n\n return signalsCreated;\n}\n\n// ── Belief Synthesis ─────────────────────────────────────────────────\n\n/**\n * Classify recent signals against beliefs using Claude Haiku.\n * Updates belief confidence using Bayesian-ish formula.\n */\nexport async function synthesizeSignals(\n state: CognitionState,\n verbose: boolean = false,\n): Promise<number> {\n if (state.beliefs.length === 0) return 0;\n\n // Only process signals since last synthesis\n const cutoff = state.last_synthesize\n ? new Date(state.last_synthesize).getTime()\n : 0;\n const recentSignals = state.signals.filter(\n s => new Date(s.created_at).getTime() > cutoff,\n );\n\n if (recentSignals.length === 0) return 0;\n\n let beliefsUpdated = 0;\n\n for (const belief of state.beliefs) {\n // Build classification prompt\n const signalList = recentSignals\n .map((s, i) => `${i + 1}. [${s.source}] ${s.signal_type}${s.value !== null ? ' = ' + s.value : ''}${s.unit ? ' ' + s.unit : ''}: ${(s.data.content as string || '').slice(0, 100)}`)\n .join('\\n');\n\n const prompt = `Given this belief: \"${belief.statement}\"\n\nClassify each signal as SUPPORTING or CONTRADICTING or NEUTRAL.\n\nSignals:\n${signalList}\n\nRespond with JSON only: {\"supporting\": [indexes], \"contradicting\": [indexes], \"neutral\": [indexes]}`;\n\n try {\n // Call Haiku via claude CLI (uses subscription, no API key needed)\n const result = callClaude(prompt, 'haiku', 30000);\n if (!result) continue;\n\n // Parse JSON from response\n const jsonMatch = result.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) continue;\n\n const classification = JSON.parse(jsonMatch[0]) as {\n supporting?: number[];\n contradicting?: number[];\n };\n\n const supportingCount = classification.supporting?.length || 0;\n const contradictingCount = classification.contradicting?.length || 0;\n\n if (supportingCount + contradictingCount === 0) continue;\n\n // Map indexes to signal IDs\n const supportingIds = (classification.supporting || [])\n .map(i => recentSignals[i - 1]?.id)\n .filter((id): id is number => id !== undefined);\n const contradictingIds = (classification.contradicting || [])\n .map(i => recentSignals[i - 1]?.id)\n .filter((id): id is number => id !== undefined);\n\n // Bayesian confidence update\n const oldConfidence = belief.confidence;\n const evidenceRatio = supportingCount / (supportingCount + contradictingCount);\n let newConfidence = oldConfidence * CONFIDENCE_PRIOR_WEIGHT + evidenceRatio * CONFIDENCE_EVIDENCE_WEIGHT;\n newConfidence = Math.max(CONFIDENCE_MIN, Math.min(CONFIDENCE_MAX, newConfidence));\n\n // Update belief\n belief.confidence = newConfidence;\n belief.supporting_signals = [...belief.supporting_signals, ...supportingIds].slice(-MAX_SUPPORTING_IDS);\n belief.contradicting_signals = [...belief.contradicting_signals, ...contradictingIds].slice(-MAX_SUPPORTING_IDS);\n belief.revision++;\n belief.updated_at = new Date().toISOString();\n belief.temperature = 'hot';\n beliefsUpdated++;\n\n // Notify on significant shifts\n const shift = Math.abs(newConfidence - oldConfidence);\n if (shift >= BELIEF_SHIFT_THRESHOLD) {\n const direction = newConfidence > oldConfidence ? '↑' : '↓';\n slackNotify(\n `*Belief shift* ${direction} ${belief.belief_key}: ${(oldConfidence * 100).toFixed(0)}% → ${(newConfidence * 100).toFixed(0)}%\\n${belief.statement}`,\n );\n }\n\n if (verbose) {\n writeLine(` ${colors.dim}Belief: ${belief.belief_key} ${(oldConfidence * 100).toFixed(0)}% → ${(newConfidence * 100).toFixed(0)}% (+${supportingCount}/-${contradictingCount})${RESET}`);\n }\n } catch {\n // Haiku call failed — skip this belief, try next\n continue;\n }\n }\n\n state.last_synthesize = new Date().toISOString();\n return beliefsUpdated;\n}\n\n// ── Decision Evaluation ──────────────────────────────────────────────\n\n/**\n * Auto-evaluate decisions older than 2h by counting execution signals.\n */\nexport function evaluateDecisions(state: CognitionState): number {\n const twoHoursAgo = Date.now() - 2 * 60 * 60 * 1000;\n let evaluated = 0;\n\n for (const decision of state.decisions) {\n if (decision.outcome_score !== null) continue;\n if (new Date(decision.decided_at).getTime() > twoHoursAgo) continue;\n\n // Count positive/negative signals after decision\n const decisionTime = new Date(decision.decided_at).getTime();\n const relevantSignals = state.signals.filter(\n s => new Date(s.created_at).getTime() > decisionTime,\n );\n\n const completed = relevantSignals.filter(s =>\n s.signal_type === 'agent_completed' || s.signal_type === 'conversation_converged',\n ).length;\n const failed = relevantSignals.filter(s =>\n s.signal_type === 'agent_failed' || s.signal_type === 'conversation_stopped',\n ).length;\n\n if (completed + failed < 3) continue;\n\n decision.outcome_score = (completed / (completed + failed)) * 2 - 1;\n decision.actual_outcome = { completed, failed, total: completed + failed };\n evaluated++;\n }\n\n return evaluated;\n}\n\n// ── Reflection ───────────────────────────────────────────────────────\n\n/**\n * Periodic meta-cognition using Sonnet.\n * Produces insights, belief updates, founder escalations.\n */\nexport async function reflect(\n state: CognitionState,\n verbose: boolean = false,\n): Promise<CognitionReflection | null> {\n // Check if enough time has passed\n if (state.last_reflect) {\n const elapsed = Date.now() - new Date(state.last_reflect).getTime();\n if (elapsed < REFLECT_INTERVAL_MS) return null;\n }\n\n // Skip if no new signals since last reflection\n const lastReflectTime = state.last_reflect ? new Date(state.last_reflect).getTime() : 0;\n const newSignals = state.signals.filter(s => new Date(s.created_at).getTime() > lastReflectTime);\n if (newSignals.length === 0) return null;\n\n // Build context\n const beliefsText = state.beliefs\n .map(b => `- [${b.domain}] ${b.belief_key} (${(b.confidence * 100).toFixed(0)}%, ${b.temperature}, r${b.revision}): ${b.statement}`)\n .join('\\n');\n\n const signalsText = newSignals.slice(-30)\n .map(s => `- [${s.source}] ${s.signal_type}: ${(s.data.content as string || '').slice(0, 80)} (${new Date(s.created_at).toLocaleTimeString()})`)\n .join('\\n');\n\n const decisionsText = state.decisions\n .map(d => `- ${d.title} (score: ${d.outcome_score !== null ? d.outcome_score.toFixed(2) : 'pending'})`)\n .join('\\n');\n\n const lastReflection = state.reflections.length > 0\n ? state.reflections[state.reflections.length - 1]\n : null;\n\n const prompt = `You are the cognition engine for an AI-native company called Agents Squads.\nYour job is to reflect on the current state of the business and produce actionable insights.\n\n## Current Beliefs (world model)\n${beliefsText || '(none)'}\n\n## Recent Signals (since last reflection)\n${signalsText || '(none)'}\n\n## Decision Journal\n${decisionsText || '(none)'}\n\n${lastReflection ? `Previous reflection (${lastReflection.created_at}):\\n${lastReflection.assessment}\\n` : ''}\n\n## Your Task\nProduce a business reflection. Respond as JSON only:\n{\n \"assessment\": \"2-3 sentence summary of business state\",\n \"insights\": [{\"type\": \"highlight|warning|recommendation\", \"message\": \"...\"}],\n \"belief_updates\": [{\"belief_key\": \"...\", \"suggested_confidence\": 0.X, \"reason\": \"...\"}],\n \"priority_adjustments\": [{\"description\": \"...\", \"urgency\": \"high|medium|low\"}],\n \"founder_escalations\": [{\"issue\": \"...\", \"why_human_needed\": \"...\", \"suggested_action\": \"...\", \"urgency\": \"immediate|today|this_week\"}]\n}`;\n\n try {\n const result = callClaude(prompt, 'sonnet', 60000);\n if (!result) return null;\n\n const jsonMatch = result.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) return null;\n\n const parsed = JSON.parse(jsonMatch[0]);\n\n const reflection: CognitionReflection = {\n id: state.next_reflection_id++,\n scope: 'business',\n assessment: parsed.assessment || '',\n insights: parsed.insights || [],\n belief_updates: parsed.belief_updates || [],\n priority_adjustments: parsed.priority_adjustments || [],\n founder_escalations: parsed.founder_escalations || [],\n created_at: new Date().toISOString(),\n };\n\n state.reflections.push(reflection);\n if (state.reflections.length > MAX_REFLECTIONS_KEPT) {\n state.reflections = state.reflections.slice(-MAX_REFLECTIONS_KEPT);\n }\n\n // Apply belief updates\n for (const update of reflection.belief_updates) {\n const belief = state.beliefs.find(b => b.belief_key === update.belief_key);\n if (belief && update.suggested_confidence >= 0 && update.suggested_confidence <= 1) {\n belief.confidence = update.suggested_confidence;\n belief.revision++;\n belief.updated_at = new Date().toISOString();\n belief.temperature = 'hot';\n }\n }\n\n // Notify founder on escalations\n if (reflection.founder_escalations.length > 0) {\n const escalationText = reflection.founder_escalations\n .map(e => `• *${e.issue}*: ${e.suggested_action} (${e.urgency})`)\n .join('\\n');\n slackNotify(`🧠 *Cognition reflection*\\n${reflection.assessment}\\n\\n*Escalations:*\\n${escalationText}`);\n } else if (verbose) {\n slackNotify(`🧠 *Cognition reflection*\\n${reflection.assessment}`);\n }\n\n state.last_reflect = new Date().toISOString();\n\n if (verbose) {\n writeLine(` ${colors.dim}Reflection: ${reflection.insights.length} insights, ${reflection.belief_updates.length} belief updates, ${reflection.founder_escalations.length} escalations${RESET}`);\n }\n\n return reflection;\n } catch {\n return null;\n }\n}\n\n// ── Temperature Update ───────────────────────────────────────────────\n\nexport function updateBeliefTemperatures(state: CognitionState): void {\n const now = Date.now();\n for (const belief of state.beliefs) {\n const age = now - new Date(belief.updated_at).getTime();\n if (age < 4 * 60 * 60 * 1000) {\n belief.temperature = 'hot';\n } else if (age < 24 * 60 * 60 * 1000) {\n belief.temperature = 'warm';\n } else {\n belief.temperature = 'cold';\n }\n }\n}\n\n// ── Main Entry Point ─────────────────────────────────────────────────\n\n/**\n * Run the full cognition cycle. Called after agent execution in squads run.\n *\n * 1. Ingest memory files → local signals (+ push to API)\n * 2. Synthesize signals against beliefs (Haiku)\n * 3. Evaluate past decisions\n * 4. Reflect if enough time has passed (Sonnet)\n * 5. Update temperatures\n * 6. Save state\n */\nexport async function runCognitionCycle(\n squads: string[],\n verbose: boolean = false,\n): Promise<{\n signalsIngested: number;\n beliefsUpdated: number;\n decisionsEvaluated: number;\n reflected: boolean;\n}> {\n const state = loadCognitionState();\n\n // 1. Ingest memory files\n const signalsIngested = ingestMemoryFiles(state, squads, verbose);\n\n // 2. Synthesize (if enough time passed)\n let beliefsUpdated = 0;\n const timeSinceSynthesize = state.last_synthesize\n ? Date.now() - new Date(state.last_synthesize).getTime()\n : Infinity;\n if (timeSinceSynthesize >= SYNTHESIZE_INTERVAL_MS && state.signals.length > 0) {\n beliefsUpdated = await synthesizeSignals(state, verbose);\n }\n\n // 3. Evaluate decisions\n const decisionsEvaluated = evaluateDecisions(state);\n\n // 4. Reflect (if enough time passed)\n const reflection = await reflect(state, verbose);\n\n // 5. Update temperatures\n updateBeliefTemperatures(state);\n\n // 6. Save\n saveCognitionState(state);\n\n if (verbose || signalsIngested > 0 || beliefsUpdated > 0 || reflection) {\n writeLine(` ${colors.dim}Cognition: ${signalsIngested} signals, ${beliefsUpdated} beliefs updated${reflection ? ', reflected' : ''}${RESET}`);\n }\n\n return {\n signalsIngested,\n beliefsUpdated,\n decisionsEvaluated,\n reflected: !!reflection,\n };\n}\n\n/**\n * Seed initial beliefs if none exist.\n * Called once on first run to bootstrap the world model.\n */\nexport function seedBeliefsIfEmpty(state: CognitionState): void {\n if (state.beliefs.length > 0) return;\n\n const seeds: Array<Omit<CognitionBelief, 'supporting_signals' | 'contradicting_signals' | 'temperature' | 'revision' | 'updated_at'>> = [\n { belief_key: 'retention_critical', domain: 'product', statement: 'D1 retention (10%) is the primary blocker to product-market fit. Must reach 30% before monetizing.', confidence: 0.9 },\n { belief_key: 'cli_is_os', domain: 'product', statement: 'The CLI is our operating system. Every improvement multiplies autonomous capability.', confidence: 0.85 },\n { belief_key: 'zero_revenue', domain: 'revenue', statement: 'Revenue is $0. Consulting is the near-term path. Pro tier gated on retention.', confidence: 0.95 },\n { belief_key: 'agent_autonomy_low', domain: 'operations', statement: 'Agents run but do not think autonomously. Scanners and leads never fire. Intelligence loop is broken.', confidence: 0.8 },\n { belief_key: 'first_run_broken', domain: 'product', statement: 'First-run experience is broken. v0.7.0 crashes on squads run. Users cannot complete the core flow.', confidence: 0.9 },\n { belief_key: 'global_developer_focus', domain: 'market', statement: 'Target market is global developers, not Chilean enterprises. Product-first, not consulting-first.', confidence: 0.75 },\n { belief_key: 'test_user_simulation', domain: 'operations', statement: 'Simulating test users (fresh install → init → run → evaluate friction) is the most effective way to find and fix retention blockers.', confidence: 0.7 },\n { belief_key: 'cognition_engine_needed', domain: 'operations', statement: 'Without a working cognition engine, the organization cannot learn or improve autonomously. This is the difference between a cron job and intelligence.', confidence: 0.85 },\n ];\n\n const now = new Date().toISOString();\n for (const seed of seeds) {\n state.beliefs.push({\n ...seed,\n supporting_signals: [],\n contradicting_signals: [],\n temperature: 'warm',\n revision: 1,\n updated_at: now,\n });\n }\n}\n\n/**\n * Get beliefs formatted as markdown for agent context injection.\n */\nexport function getBeliefsContext(state: CognitionState): string {\n const hotBeliefs = state.beliefs.filter(b => b.temperature === 'hot' || b.temperature === 'warm');\n if (hotBeliefs.length === 0) return '';\n\n const lines = hotBeliefs.map(b =>\n `- **${b.belief_key}** (${(b.confidence * 100).toFixed(0)}%): ${b.statement}`,\n );\n\n return `## Organizational Beliefs (from cognition engine)\\n${lines.join('\\n')}\\n`;\n}\n"],"mappings":"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","names":["execSync","join","dirname","existsSync","readFileSync","writeFileSync","mkdirSync","join","existsSync","join","existsSync","execSync","existsSync","readFileSync","writeFileSync","mkdirSync","readdirSync","join","join","existsSync","mkdirSync","readFileSync","writeFileSync","execSync","join","existsSync","readFileSync","execSync","join","existsSync","readFileSync","readdirSync","existsSync","readFileSync","writeFileSync","mkdirSync","readdirSync","join","createHash","STATE_FILE","INGESTIBLE_FILES","join","existsSync","mkdirSync","defaultState","readFileSync","writeFileSync","readdirSync","createHash","join","existsSync","readFileSync","writeFileSync","dirname","mkdirSync","execSync","spawnSync","exec","loadSession","getApiUrl","agentEnv"]}