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/dashboard.ts","../src/lib/db.ts"],"sourcesContent":["import { readdirSync, existsSync, statSync } from 'fs';\nimport { join } from 'path';\nimport { findSquadsDir, listSquads, loadSquad, Goal, hasLocalInfraConfig } from '../lib/squad-parser.js';\nimport { findMemoryDir } from '../lib/memory.js';\nimport { fetchCostSummary, fetchInsights, Insights, fetchBridgeStats, BridgeStats, CostSummary, isMaxPlan, getPlanType, fetchNpmStats, NpmStats, fetchQuotaInfo, QuotaInfo, fetchClaudeCodeCapacity, ClaudeCodeCapacity, calculateROIMetrics, calculateSquadCostProjections, ROIMetrics, SquadCostProjection } from '../lib/costs.js';\nimport { getMultiRepoGitStats, getActivitySparkline, getGitHubStatsOptimized, SquadGitHubStats, GitPerformanceStats, GitHubStats } from '../lib/git.js';\nimport { saveDashboardSnapshot, isDatabaseAvailable, getDashboardHistory, DashboardSnapshot, SquadSnapshotData, closeDatabase, getLatestBaseline, BaselineSnapshot } from '../lib/db.js';\nimport { getLiveSessionSummaryAsync, cleanupStaleSessions, SessionSummary } from '../lib/sessions.js';\nimport { checkForUpdate } from '../lib/update.js';\nimport { track, Events } from '../lib/telemetry.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n progressBar,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n sparkline,\n barChart,\n} from '../lib/terminal.js';\n\ninterface SquadMetrics {\n name: string;\n mission: string;\n goals: Goal[];\n lastActivity: string;\n status: 'active' | 'stale' | 'needs-goal';\n github: SquadGitHubStats | null;\n goalProgress: number; // 0-100\n}\n\nfunction getLastActivityDate(squadName: string): string {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return 'unknown';\n\n const squadMemory = join(memoryDir, squadName);\n if (!existsSync(squadMemory)) return '—';\n\n let latestTime = 0;\n\n try {\n const agents = readdirSync(squadMemory, { withFileTypes: true })\n .filter(e => e.isDirectory());\n\n for (const agent of agents) {\n const agentPath = join(squadMemory, agent.name);\n const files = readdirSync(agentPath).filter(f => f.endsWith('.md'));\n\n for (const file of files) {\n const filePath = join(agentPath, file);\n const stats = statSync(filePath);\n if (stats.mtimeMs > latestTime) {\n latestTime = stats.mtimeMs;\n }\n }\n }\n } catch {\n return '—';\n }\n\n if (latestTime === 0) return '—';\n\n const ageMs = Date.now() - latestTime;\n const ageDays = Math.floor(ageMs / (1000 * 60 * 60 * 24));\n\n if (ageDays === 0) return 'today';\n if (ageDays === 1) return '1d';\n if (ageDays < 7) return `${ageDays}d`;\n return `${Math.floor(ageDays / 7)}w`;\n}\n\n// Cache for expensive computations within a single run\ninterface DashboardCache {\n gitStats: GitPerformanceStats | null;\n ghStats: GitHubStats | null;\n costs: CostSummary | null;\n bridgeStats: BridgeStats | null;\n activity: number[];\n dbAvailable: boolean;\n history: DashboardSnapshot[];\n insights: Insights | null;\n sessionSummary: SessionSummary;\n npmStats: NpmStats | null;\n quotaInfo: QuotaInfo | null;\n capacity: ClaudeCodeCapacity | null;\n baseline: BaselineSnapshot | null;\n roiMetrics: ROIMetrics | null;\n squadProjections: SquadCostProjection[];\n}\n\n// Dashboard stats aggregated from squad data\ninterface DashboardStats {\n activeSquads: number;\n totalSquads: number;\n totalPRs: number;\n totalIssuesClosed: number;\n totalIssuesOpen: number;\n overallProgress: number;\n}\n\n/**\n * Build squad metrics from squad data and git/github stats\n */\nfunction collectSquadMetrics(\n squadNames: string[],\n gitStats: GitPerformanceStats | null,\n ghStats: GitHubStats | null\n): SquadMetrics[] {\n const squadData: SquadMetrics[] = [];\n\n // Map repos to squads for commit attribution\n const repoSquadMap: Record<string, string[]> = {\n website: ['agents-squads-web'],\n product: ['squads-cli'],\n engineering: ['hq', 'squads-cli'],\n research: ['research'],\n intelligence: ['intelligence'],\n customer: ['customer'],\n finance: ['finance'],\n company: ['company', 'hq'],\n marketing: ['marketing', 'agents-squads-web'],\n cli: ['squads-cli'],\n };\n\n for (const name of squadNames) {\n const squad = loadSquad(name);\n if (!squad) continue;\n\n const lastActivity = getLastActivityDate(name);\n const github = ghStats?.bySquad.get(name) || null;\n\n let status: SquadMetrics['status'] = 'active';\n const activeGoals = squad.goals.filter(g => !g.completed);\n if (activeGoals.length === 0) {\n status = 'needs-goal';\n } else if (lastActivity.includes('w') || lastActivity === '—') {\n status = 'stale';\n }\n\n const totalGoals = squad.goals.length;\n const completedGoals = squad.goals.filter(g => g.completed).length;\n const hasProgress = squad.goals.filter(g => g.progress).length;\n const goalProgress = totalGoals > 0\n ? Math.round(((completedGoals + hasProgress * 0.3) / totalGoals) * 100)\n : 0;\n\n // Calculate commit counts from git stats\n let squadCommits = 0;\n if (gitStats) {\n for (const [repo, commits] of gitStats.commitsByRepo) {\n if (repoSquadMap[name]?.includes(repo)) {\n squadCommits += commits;\n }\n }\n }\n\n // Create github stats object (from ghStats or minimal with just commits)\n const githubStats: SquadGitHubStats = github || {\n prsOpened: 0,\n prsMerged: 0,\n issuesClosed: 0,\n issuesOpen: 0,\n commits: 0,\n recentIssues: [],\n recentPRs: [],\n };\n githubStats.commits = squadCommits;\n\n squadData.push({\n name,\n mission: squad.mission,\n goals: squad.goals,\n lastActivity,\n status,\n github: githubStats,\n goalProgress,\n });\n }\n\n return squadData;\n}\n\n/**\n * Calculate aggregated dashboard stats from squad metrics\n */\nfunction calculateDashboardStats(squadData: SquadMetrics[], ghStats: GitHubStats | null): DashboardStats {\n const activeSquads = squadData.filter(s => s.status === 'active').length;\n const totalPRs = ghStats ? ghStats.prsMerged : 0;\n const totalIssuesClosed = ghStats ? ghStats.issuesClosed : 0;\n const totalIssuesOpen = ghStats ? ghStats.issuesOpen : 0;\n const overallProgress = squadData.length > 0\n ? Math.round(squadData.reduce((sum, s) => sum + s.goalProgress, 0) / squadData.length)\n : 0;\n\n return {\n activeSquads,\n totalSquads: squadData.length,\n totalPRs,\n totalIssuesClosed,\n totalIssuesOpen,\n overallProgress,\n };\n}\n\n/**\n * Render the dashboard header with session and stats info\n */\nfunction renderDashboardHeader(\n stats: DashboardStats,\n sessionSummary: SessionSummary,\n gitStats: GitPerformanceStats | null,\n ghStats: GitHubStats | null\n): void {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}dashboard${RESET}`);\n\n // Check for updates (cached, non-blocking)\n const updateInfo = checkForUpdate();\n if (updateInfo.updateAvailable) {\n writeLine(` ${colors.cyan}⬆${RESET} Update available: ${colors.dim}${updateInfo.currentVersion}${RESET} → ${colors.green}${updateInfo.latestVersion}${RESET} ${colors.dim}(run \\`squads update\\`)${RESET}`);\n }\n\n // Session indicator line (only if there are active sessions)\n if (sessionSummary.totalSessions > 0) {\n const sessionText = sessionSummary.totalSessions === 1 ? 'session' : 'sessions';\n const squadText = sessionSummary.squadCount === 1 ? 'squad' : 'squads';\n\n // Build tool breakdown string (e.g., \"claude 4, cursor 2\")\n let toolInfo = '';\n if (sessionSummary.byTool && Object.keys(sessionSummary.byTool).length > 0) {\n const toolParts = Object.entries(sessionSummary.byTool)\n .sort((a, b) => b[1] - a[1]) // Sort by count descending\n .map(([tool, count]) => `${colors.dim}${tool}${RESET} ${colors.cyan}${count}${RESET}`);\n toolInfo = ` ${colors.dim}(${RESET}${toolParts.join(` ${colors.dim}·${RESET} `)}${colors.dim})${RESET}`;\n }\n\n writeLine(` ${colors.green}${icons.active}${RESET} ${colors.white}${sessionSummary.totalSessions}${RESET} active ${sessionText} ${colors.dim}across${RESET} ${colors.cyan}${sessionSummary.squadCount}${RESET} ${squadText}${toolInfo}`);\n }\n writeLine();\n\n // Stats row - show different info based on whether GitHub data is available\n const statsParts = [`${colors.cyan}${stats.activeSquads}${RESET}/${stats.totalSquads} squads`];\n if (ghStats) {\n statsParts.push(`${colors.green}${stats.totalPRs}${RESET} PRs merged`);\n statsParts.push(`${colors.purple}${stats.totalIssuesClosed}${RESET} closed`);\n statsParts.push(`${colors.yellow}${stats.totalIssuesOpen}${RESET} open`);\n } else {\n statsParts.push(`${colors.cyan}${gitStats?.totalCommits || 0}${RESET} commits`);\n statsParts.push(`${colors.dim}use -f for PRs/issues${RESET}`);\n }\n writeLine(` ${statsParts.join(` ${colors.dim}│${RESET} `)}`);\n writeLine();\n\n writeLine(` ${progressBar(stats.overallProgress, 32)} ${colors.dim}${stats.overallProgress}% goal progress${RESET}`);\n writeLine();\n}\n\n/**\n * Render the squads table showing activity per squad\n */\nfunction renderSquadsTable(squadData: SquadMetrics[]): void {\n // Squad table - add 2 chars padding to each column for spacing\n const w = { name: 13, commits: 9, prs: 5, issues: 8, goals: 7, bar: 10 };\n const tableWidth = w.name + w.commits + w.prs + w.issues + w.goals + w.bar + 6;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.name)}${RESET}` +\n `${bold}${padEnd('COMMITS', w.commits)}${RESET}` +\n `${bold}${padEnd('PRs', w.prs)}${RESET}` +\n `${bold}${padEnd('ISSUES', w.issues)}${RESET}` +\n `${bold}${padEnd('GOALS', w.goals)}${RESET}` +\n `${bold}PROGRESS${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n const sortedSquads = [...squadData].sort((a, b) => {\n const aActivity = (a.github?.commits || 0) + (a.github?.prsMerged || 0) * 5;\n const bActivity = (b.github?.commits || 0) + (b.github?.prsMerged || 0) * 5;\n return bActivity - aActivity;\n });\n\n for (const squad of sortedSquads) {\n const gh = squad.github;\n const commits = gh?.commits || 0;\n const prs = gh?.prsMerged || 0;\n const issuesClosed = gh?.issuesClosed || 0;\n const issuesOpen = gh?.issuesOpen || 0;\n const completedCount = squad.goals.filter(g => g.completed).length;\n const totalCount = squad.goals.length;\n\n const commitColor = commits > 10 ? colors.green : commits > 0 ? colors.cyan : colors.dim;\n const prColor = prs > 0 ? colors.green : colors.dim;\n const issueColor = issuesClosed > 0 ? colors.green : colors.dim;\n\n writeLine(` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(squad.name, w.name)}${RESET}` +\n `${commitColor}${padEnd(String(commits), w.commits)}${RESET}` +\n `${prColor}${padEnd(String(prs), w.prs)}${RESET}` +\n `${issueColor}${padEnd(`${issuesClosed}/${issuesOpen}`, w.issues)}${RESET}` +\n `${padEnd(`${completedCount}/${totalCount}`, w.goals)}` +\n `${progressBar(squad.goalProgress, 8)}` +\n ` ${colors.purple}${box.vertical}${RESET}`);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n}\n\n/**\n * Render the working on section showing recent commits\n */\nfunction renderWorkingOn(gitStats: GitPerformanceStats | null): void {\n if (gitStats && gitStats.recentCommits && gitStats.recentCommits.length > 0) {\n writeLine(` ${bold}Working On${RESET}`);\n writeLine();\n\n for (const commit of gitStats.recentCommits.slice(0, 3)) {\n const shortHash = commit.hash.slice(0, 7);\n const shortMsg = truncate(commit.message, 45);\n writeLine(` ${colors.dim}${shortHash}${RESET} ${shortMsg} ${colors.dim}(${commit.repo})${RESET}`);\n }\n writeLine();\n }\n}\n\n/**\n * Render the goals section sorted from tactical to strategic\n */\nfunction renderGoalsSection(squadData: SquadMetrics[]): void {\n const allActiveGoals = squadData.flatMap(s =>\n s.goals.filter(g => !g.completed).map(g => ({\n squad: s.name,\n goal: g,\n scope: inferScope(g.description)\n }))\n );\n\n if (allActiveGoals.length > 0) {\n // Sort goals: tactical first (actionable NOW) → operational → strategic (vision)\n const scopeOrder = { tactical: 0, operational: 1, strategic: 2 };\n const sortedGoals = [...allActiveGoals].sort((a, b) => {\n // Primary: scope (tactical first)\n const scopeDiff = scopeOrder[a.scope] - scopeOrder[b.scope];\n if (scopeDiff !== 0) return scopeDiff;\n // Secondary: goals with progress first (being worked on)\n const aHasProgress = a.goal.progress ? 1 : 0;\n const bHasProgress = b.goal.progress ? 1 : 0;\n return bHasProgress - aHasProgress;\n });\n\n // Group labels for display\n const scopeLabels = { tactical: 'Next', operational: 'In Progress', strategic: 'Vision' };\n const scopeIcons = { tactical: icons.active, operational: icons.progress, strategic: icons.empty };\n\n writeLine(` ${bold}Goals${RESET} ${colors.dim}(tactical → strategic)${RESET}`);\n writeLine();\n\n const maxGoals = 5; // Show more goals since they're now meaningfully ordered\n let lastScope = '';\n for (const { squad, goal, scope } of sortedGoals.slice(0, maxGoals)) {\n // Show scope header when it changes\n if (scope !== lastScope) {\n const label = scopeLabels[scope];\n const labelColor = scope === 'tactical' ? colors.green : scope === 'strategic' ? colors.purple : colors.cyan;\n writeLine(` ${labelColor}${label}${RESET}`);\n lastScope = scope;\n }\n const hasProgress = goal.progress && goal.progress.length > 0;\n const icon = scopeIcons[scope];\n writeLine(` ${icon} ${colors.dim}${squad}${RESET} ${truncate(goal.description, 48)}`);\n if (hasProgress) {\n writeLine(` ${colors.dim}└${RESET} ${colors.green}${truncate(goal.progress!, 52)}${RESET}`);\n }\n }\n\n if (allActiveGoals.length > maxGoals) {\n writeLine(` ${colors.dim} +${allActiveGoals.length - maxGoals} more${RESET}`);\n }\n writeLine();\n }\n}\n\n/**\n * Render the footer with command hints\n */\nfunction renderDashboardFooter(): void {\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}<squad>${RESET} ${colors.dim}Execute a squad${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads goal set ${colors.dim}Add a goal${RESET}`);\n writeLine();\n}\n\nexport async function dashboardCommand(options: { verbose?: boolean; ceo?: boolean; fast?: boolean; json?: boolean } = {}): Promise<void> {\n await track(Events.CLI_DASHBOARD, { verbose: options.verbose, ceo: options.ceo, fast: options.fast });\n const squadsDir = findSquadsDir();\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 return;\n }\n\n // CEO mode: executive summary\n if (options.ceo) {\n await renderCeoReport(squadsDir);\n return;\n }\n\n const baseDir = findAgentsSquadsDir();\n const squadNames = listSquads(squadsDir);\n const skipGitHub = options.fast !== false; // Default to fast mode (skip GitHub API)\n\n // === PHASE 1: Parallel data fetching ===\n const cache = await fetchDashboardData(baseDir, skipGitHub);\n\n // === PHASE 2: Build squad metrics ===\n const squadData = collectSquadMetrics(squadNames, cache.gitStats, cache.ghStats);\n\n // === PHASE 3: Calculate stats and render ===\n const stats = calculateDashboardStats(squadData, cache.ghStats);\n\n // JSON output\n if (options.json) {\n const goalCount = {\n active: squadData.reduce((sum, s) => sum + s.goals.filter(g => !g.completed).length, 0),\n completed: squadData.reduce((sum, s) => sum + s.goals.filter(g => g.completed).length, 0),\n };\n console.log(JSON.stringify({\n ok: true,\n command: 'dash',\n data: {\n squads: squadData.map(s => ({\n name: s.name, mission: s.mission, status: s.status,\n goalProgress: s.goalProgress, lastActivity: s.lastActivity,\n goals: s.goals,\n })),\n stats,\n goals: goalCount,\n sessions: cache.sessionSummary,\n costs: cache.costs,\n gitStats: cache.gitStats ? {\n totalCommits: cache.gitStats.totalCommits,\n repos: cache.gitStats.repos?.map(r => ({ name: r.name, commits: r.commits })),\n } : null,\n },\n }, null, 2));\n await closeDatabase();\n return;\n }\n\n // Render dashboard sections\n renderDashboardHeader(stats, cache.sessionSummary, cache.gitStats, cache.ghStats);\n renderSquadsTable(squadData);\n\n // Compute goal counts for efficiency metrics\n const goalCount = {\n active: squadData.reduce((sum, s) => sum + s.goals.filter(g => !g.completed).length, 0),\n completed: squadData.reduce((sum, s) => sum + s.goals.filter(g => g.completed).length, 0),\n };\n\n // Render sections using cached data (no more network calls)\n renderGitPerformanceCached(cache);\n renderTokenEconomicsCached(cache, goalCount);\n renderROICached(cache, goalCount);\n renderQuotaCached(cache);\n renderCapacityCached(cache);\n renderInfrastructureCached(cache);\n renderAcquisitionCached(cache);\n renderHistoricalTrendsCached(cache);\n renderInsightsCached(cache);\n renderWorkingOn(cache.gitStats);\n renderGoalsSection(squadData);\n renderDashboardFooter();\n\n // Save snapshot in background (don't block)\n saveSnapshotCached(squadData, cache, baseDir).catch(() => {});\n\n // Close database pool to allow process to exit immediately\n await closeDatabase();\n}\n\n/**\n * Fetch all dashboard data in parallel with timeouts\n */\nasync function fetchDashboardData(baseDir: string | null, skipGitHub: boolean): Promise<DashboardCache> {\n // Wrap slow calls with race timeout to ensure CLI responsiveness\n const timeout = <T>(promise: Promise<T>, ms: number, fallback: T): Promise<T> =>\n Promise.race([promise, new Promise<T>(resolve => setTimeout(() => resolve(fallback), ms))]);\n\n // Clean up stale file-based sessions (sync, fast)\n cleanupStaleSessions();\n\n const [gitStats, ghStats, costs, bridgeStats, activity, dbAvailable, history, insights, sessionSummary, npmStats, quotaInfo, capacity, baseline] = await Promise.all([\n // Git stats (local, parallel across repos, 1.5s timeout)\n baseDir ? timeout(getMultiRepoGitStats(baseDir, 30), 1500, null) : Promise.resolve(null),\n // GitHub stats (network, ~20-30s) - skip by default for fast mode\n skipGitHub ? Promise.resolve(null) : Promise.resolve(baseDir ? getGitHubStatsOptimized(baseDir, 30) : null),\n // Langfuse costs (network, 2s timeout)\n timeout(fetchCostSummary(100), 2000, null),\n // Bridge stats (local network, 2s timeout)\n timeout(fetchBridgeStats(), 2000, null),\n // Activity sparkline (local, parallel across repos, 1.5s timeout)\n baseDir ? timeout(getActivitySparkline(baseDir, 14), 1500, [] as number[]) : Promise.resolve([] as number[]),\n // Database availability check (1.5s timeout)\n timeout(isDatabaseAvailable(), 1500, false),\n // Dashboard history (1.5s timeout)\n timeout(getDashboardHistory(14).catch(() => [] as DashboardSnapshot[]), 1500, [] as DashboardSnapshot[]),\n // Insights (2s timeout)\n timeout(fetchInsights('week').catch(() => null), 2000, null),\n // Session summary: lsof per AI process, cap at 1s to stay under 2s total\n timeout(getLiveSessionSummaryAsync(), 1000, { totalSessions: 0, bySquad: {}, squadCount: 0, byTool: {} } as SessionSummary),\n // NPM download stats (network, 2s timeout)\n timeout(fetchNpmStats('squads-cli'), 2000, null),\n // Quota/autonomy info (local network, 2s timeout)\n timeout(fetchQuotaInfo(), 2000, null),\n // Claude Code capacity (local file read, fast)\n fetchClaudeCodeCapacity(),\n // Latest baseline for ROI comparison (1.5s timeout)\n timeout(getLatestBaseline().catch(() => null), 1500, null),\n ]);\n\n // Calculate ROI metrics\n const roiMetrics = calculateROIMetrics(costs, 0, gitStats?.totalCommits || 0, ghStats?.prsMerged || 0);\n const squadProjections = calculateSquadCostProjections(bridgeStats, null);\n\n return { gitStats, ghStats, costs, bridgeStats, activity, dbAvailable, history, insights, sessionSummary, npmStats, quotaInfo, capacity, baseline, roiMetrics, squadProjections };\n}\n\n\n// Find agents-squads base directory (project-scoped, not global)\nfunction findAgentsSquadsDir(): string | null {\n // First try: parent of current project (for multi-repo setups)\n const parentDir = join(process.cwd(), '..');\n if (existsSync(join(parentDir, 'hq'))) {\n return parentDir;\n }\n\n // Second try: current directory IS the project root\n if (existsSync(join(process.cwd(), '.git'))) {\n return process.cwd();\n }\n\n // Don't fall back to ~/agents-squads - that would show our data to fresh users\n return null;\n}\n\n\n// Format number as K/M\nfunction formatK(n: number): string {\n if (n >= 1000000) return (n / 1000000).toFixed(1) + 'M';\n if (n >= 1000) return (n / 1000).toFixed(0) + 'k';\n return String(n);\n}\n\n\n// === CACHED RENDER FUNCTIONS (use pre-fetched data) ===\n\nfunction renderGitPerformanceCached(cache: DashboardCache): void {\n const { gitStats: stats, activity } = cache;\n\n if (!stats || stats.totalCommits === 0) {\n writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(no commits in 30d)${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(30d)${RESET}`);\n writeLine();\n\n // Sparkline for last 14 days\n if (activity.length > 0) {\n const spark = sparkline(activity);\n writeLine(` ${colors.dim}Last 14d:${RESET} ${spark}`);\n writeLine();\n }\n\n // Key metrics row\n const metrics = [\n `${colors.cyan}${stats.totalCommits}${RESET} commits`,\n `${colors.green}${stats.avgCommitsPerDay}${RESET}/day`,\n `${colors.purple}${stats.activeDays}${RESET} active days`,\n ];\n if (stats.peakDay) {\n metrics.push(`${colors.yellow}${stats.peakDay.count}${RESET} peak ${colors.dim}(${stats.peakDay.date})${RESET}`);\n }\n writeLine(` ${metrics.join(` ${colors.dim}│${RESET} `)}`);\n writeLine();\n\n // Repos by commits (top 5)\n const sortedRepos = Array.from(stats.commitsByRepo.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5);\n\n if (sortedRepos.length > 0) {\n const maxRepoCommits = sortedRepos[0][1];\n for (const [repo, commits] of sortedRepos) {\n const bar = barChart(commits, maxRepoCommits, 12);\n writeLine(` ${colors.cyan}${padEnd(repo, 20)}${RESET}${bar} ${colors.dim}${commits}${RESET}`);\n }\n writeLine();\n }\n\n // Authors (top 3)\n const sortedAuthors = Array.from(stats.commitsByAuthor.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3);\n\n if (sortedAuthors.length > 0) {\n const authorLine = sortedAuthors\n .map(([author, count]) => `${colors.dim}${truncate(author, 15)}${RESET} ${colors.cyan}${count}${RESET}`)\n .join(` ${colors.dim}│${RESET} `);\n writeLine(` ${colors.dim}By author:${RESET} ${authorLine}`);\n writeLine();\n }\n}\n\nfunction renderTokenEconomicsCached(cache: DashboardCache, goalCount?: { active: number; completed: number }): void {\n const costs = cache.costs;\n const stats = cache.bridgeStats;\n const hasInfra = hasLocalInfraConfig();\n const hasData = costs || stats;\n\n writeLine(` ${bold}Token Economics${RESET}`);\n writeLine();\n\n // === SUBSCRIPTION (always show - works without infra) ===\n const planType = getPlanType();\n const tier = parseInt(process.env.ANTHROPIC_TIER || '0', 10);\n\n if (planType === 'unknown') {\n // If no API key is set, user is likely on OAuth (Claude Code subscription)\n const hasApiKey = !!process.env.ANTHROPIC_API_KEY;\n if (!hasApiKey) {\n writeLine(` ${colors.purple}◆${RESET} ${bold}Claude Code${RESET} ${colors.dim}(subscription)${RESET}`);\n writeLine();\n } else {\n writeLine(` ${colors.dim}○${RESET} ${bold}Plan${RESET} ${colors.dim}not configured${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Set your Claude plan:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} export SQUADS_PLAN_TYPE=max ${colors.dim}# $200/mo flat${RESET}`);\n writeLine(` ${colors.dim}$${RESET} export SQUADS_PLAN_TYPE=usage ${colors.dim}# pay-per-token${RESET}`);\n writeLine();\n }\n } else {\n const maxPlan = planType === 'max';\n const planIcon = maxPlan ? `${colors.purple}◆${RESET}` : `${colors.dim}○${RESET}`;\n const planLabel = maxPlan ? 'Claude Max' : 'Claude Pro';\n const planCost = maxPlan ? '$200/mo flat' : 'pay-per-token';\n const tierDisplay = tier > 0 ? ` ${colors.dim}Tier ${tier}${RESET}` : '';\n writeLine(` ${planIcon} ${bold}${planLabel}${RESET} ${colors.dim}${planCost}${RESET}${tierDisplay}`);\n writeLine();\n }\n\n // === METRICS (require infra) ===\n if (!hasInfra || !hasData) {\n writeLine(` ${colors.dim}○${RESET} Track costs, tokens, and API usage`);\n writeLine(` ${colors.dim}○${RESET} Monitor rate limits and budgets`);\n writeLine();\n writeLine(` ${colors.dim}Setup:${RESET} github.com/agents-squads/squads-cli#analytics`);\n writeLine();\n return;\n }\n\n // === TOKEN USAGE ===\n const todayTokens = stats ? stats.today.inputTokens + stats.today.outputTokens : 0;\n const todayCalls = stats?.today.generations || costs?.totalCalls || 0;\n const todayCost = stats?.today.costUsd || costs?.totalCost || 0;\n\n writeLine(` ${colors.dim}Today${RESET}`);\n writeLine(` ${colors.cyan}${formatK(todayTokens)}${RESET} tokens ${colors.dim}│${RESET} ${colors.cyan}${todayCalls}${RESET} calls ${colors.dim}│${RESET} ${colors.green}$${todayCost.toFixed(2)}${RESET}`);\n\n // Week stats if available\n if (stats?.week && stats.week.generations > 0) {\n const weekTokens = (stats.week.inputTokens || 0) + (stats.week.outputTokens || 0);\n writeLine(` ${colors.dim}Week${RESET} ${colors.purple}${formatK(weekTokens)}${RESET} tokens ${colors.dim}│${RESET} ${colors.purple}${stats.week.generations}${RESET} calls ${colors.dim}│${RESET} ${colors.purple}$${stats.week.costUsd.toFixed(2)}${RESET}`);\n }\n writeLine();\n\n // === GOAL EFFICIENCY ===\n if (goalCount && goalCount.completed > 0 && todayTokens > 0) {\n const tokensPerGoal = Math.round(todayTokens / goalCount.completed);\n writeLine(` ${colors.dim}Efficiency${RESET}`);\n writeLine(` ${colors.cyan}${formatK(tokensPerGoal)}${RESET} tokens/goal ${colors.dim}│${RESET} ${colors.green}${goalCount.completed}${RESET} goals done`);\n writeLine();\n }\n\n // === RATE LIMITS (informational - real limits from Anthropic subscription) ===\n // Limits vary by tier - check /usage for actual subscription limits\n writeLine(` ${colors.dim}Rate Limits${RESET} ${colors.dim}(check /usage for real limits)${RESET}`);\n\n // Dynamic tier limits based on configured tier (or estimate from usage patterns)\n const tierLimits: Record<number, { rpm: number; inputTpm: number; outputTpm: number }> = {\n 1: { rpm: 50, inputTpm: 30000, outputTpm: 8000 },\n 2: { rpm: 1000, inputTpm: 450000, outputTpm: 90000 },\n 3: { rpm: 2000, inputTpm: 800000, outputTpm: 160000 },\n 4: { rpm: 4000, inputTpm: 2000000, outputTpm: 400000 },\n };\n const limits = tierLimits[tier] || tierLimits[4];\n\n // Estimate current usage rate (calls per minute based on today's activity)\n const now = new Date();\n const minutesElapsed = Math.max((now.getHours() * 60) + now.getMinutes(), 1);\n const callsPerMinute = todayCalls / minutesElapsed;\n const tokensPerMinute = todayTokens / minutesElapsed;\n const rpmPct = (callsPerMinute / limits.rpm) * 100;\n const tpmPct = (tokensPerMinute / (limits.inputTpm + limits.outputTpm)) * 100;\n\n // Show rate usage bars\n const rpmBar = progressBar(Math.min(rpmPct, 100), 10);\n const tpmBar = progressBar(Math.min(tpmPct, 100), 10);\n const rpmColor = rpmPct > 75 ? colors.red : rpmPct > 50 ? colors.yellow : colors.green;\n const tpmColor = tpmPct > 75 ? colors.red : tpmPct > 50 ? colors.yellow : colors.green;\n\n writeLine(` RPM ${rpmBar} ${rpmColor}${callsPerMinute.toFixed(1)}${RESET}${colors.dim}/${limits.rpm}${RESET}`);\n writeLine(` TPM ${tpmBar} ${tpmColor}${formatK(Math.round(tokensPerMinute))}${RESET}${colors.dim}/${formatK(limits.inputTpm + limits.outputTpm)}${RESET}`);\n\n // Capacity remaining for autonomous work\n const rpmAvailable = Math.max(0, limits.rpm - callsPerMinute);\n const tpmAvailable = Math.max(0, (limits.inputTpm + limits.outputTpm) - tokensPerMinute);\n\n if (rpmAvailable > 100 && tpmAvailable > 10000) {\n writeLine(` ${colors.green}●${RESET} ${colors.dim}Capacity for autonomous triggers${RESET}`);\n } else if (rpmPct > 75 || tpmPct > 75) {\n writeLine(` ${colors.yellow}⚠${RESET} ${colors.yellow}Rate limits constrained${RESET}`);\n }\n\n writeLine();\n}\n\nfunction renderQuotaCached(cache: DashboardCache): void {\n const quota = cache.quotaInfo;\n\n if (!quota || !quota.monthlyQuota || quota.monthlyQuota === 0) {\n // No quota data or invalid quota - skip section\n return;\n }\n\n // Calculate ROI multiplier (how much value extracted from subscription)\n const monthlyUsed = quota.monthlyUsed || 0;\n const monthlyQuota = quota.monthlyQuota;\n const roiMultiplier = monthlyUsed / monthlyQuota;\n const roiDisplay = roiMultiplier >= 1 ? `${roiMultiplier.toFixed(1)}x` : `${(roiMultiplier * 100).toFixed(0)}%`;\n\n // High utilization = good (green), low = room to grow (yellow)\n const utilizationColor = roiMultiplier >= 2 ? colors.green : roiMultiplier >= 1 ? colors.cyan : roiMultiplier >= 0.5 ? colors.yellow : colors.dim;\n const roiIcon = roiMultiplier >= 3 ? '🚀' : roiMultiplier >= 2 ? '🎉' : roiMultiplier >= 1 ? '✓' : '';\n\n writeLine(` ${bold}Subscription ROI${RESET} ${colors.dim}(autonomy: ${quota.autonomyScore}% ${quota.confidenceLevel})${RESET}`);\n writeLine();\n\n // ROI bar - fills up and overflows to show value extraction\n const barWidth = 24;\n const fillPct = Math.min(roiMultiplier, 1); // Cap at 100% for the bar\n const filled = Math.round(fillPct * barWidth);\n const overflowIndicator = roiMultiplier > 1 ? `${utilizationColor}+${RESET}` : '';\n const bar = `${utilizationColor}${'█'.repeat(filled)}${colors.dim}${'░'.repeat(barWidth - filled)}${RESET}${overflowIndicator}`;\n\n writeLine(` ${bar} ${utilizationColor}${roiDisplay}${RESET} ${roiIcon}`);\n writeLine(` ${colors.green}$${monthlyUsed.toFixed(2)}${RESET} ${colors.dim}consumed${RESET} ${colors.dim}/${RESET} $${monthlyQuota}${colors.dim}/mo subscription${RESET}`);\n\n // ROI interpretation\n if (roiMultiplier >= 2) {\n writeLine(` ${colors.green}Excellent value${RESET} ${colors.dim}- ${roiDisplay} return on $${monthlyQuota} subscription${RESET}`);\n } else if (roiMultiplier >= 1) {\n writeLine(` ${colors.cyan}Good utilization${RESET} ${colors.dim}- maximizing subscription value${RESET}`);\n } else {\n const potentialValue = monthlyQuota - monthlyUsed;\n writeLine(` ${colors.yellow}Room to grow${RESET} ${colors.dim}- $${potentialValue.toFixed(0)} of unused capacity${RESET}`);\n writeLine(` ${colors.dim}Tip: Run more routines with${RESET} ${colors.cyan}squads run <squad>${RESET}`);\n }\n\n // Learnings count\n if (quota.learningCount > 0) {\n writeLine(` ${colors.dim}Learnings:${RESET} ${colors.purple}${quota.learningCount}${RESET} ${colors.dim}captured${RESET}`);\n }\n\n writeLine();\n}\n\nfunction renderCapacityCached(cache: DashboardCache): void {\n const cap = cache.capacity;\n\n if (!cap) {\n // No capacity data - skip section\n return;\n }\n\n // Helper to format tokens\n const formatTokens = (n: number) => {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(0)}k`;\n return n.toString();\n };\n\n writeLine(` ${bold}Subscription Capacity${RESET} ${colors.dim}(from Claude Code)${RESET}`);\n writeLine();\n\n // Weekly capacity bar\n const weeklyPct = cap.weeklyCapacityPct;\n const weeklyColor = weeklyPct > 80 ? colors.red : weeklyPct > 60 ? colors.yellow : colors.green;\n const weeklyBarWidth = 20;\n const weeklyFilled = Math.min(Math.round((weeklyPct / 100) * weeklyBarWidth), weeklyBarWidth);\n const weeklyBar = `${weeklyColor}${'█'.repeat(weeklyFilled)}${colors.dim}${'░'.repeat(weeklyBarWidth - weeklyFilled)}${RESET}`;\n\n writeLine(` ${colors.dim}Weekly:${RESET} ${weeklyBar} ${weeklyColor}${weeklyPct}%${RESET} ${colors.dim}(resets ${cap.weeklyResetDate})${RESET}`);\n writeLine(` ${colors.dim}${formatTokens(cap.weeklyTokensUsed)} / ${formatTokens(cap.weeklyTokensLimit)} tokens${RESET}`);\n\n // Model breakdown\n const opusPct = cap.weeklyTokensUsed > 0 ? Math.round((cap.opusTokensUsed / cap.weeklyTokensUsed) * 100) : 0;\n const sonnetPct = cap.weeklyTokensUsed > 0 ? Math.round((cap.sonnetTokensUsed / cap.weeklyTokensUsed) * 100) : 0;\n\n writeLine(` ${colors.dim}opus${RESET} ${colors.purple}${opusPct}%${RESET} ${colors.dim}sonnet${RESET} ${colors.cyan}${sonnetPct}%${RESET}`);\n\n // Session capacity (if significant)\n if (cap.sessionCapacityPct > 10) {\n const sessionPct = cap.sessionCapacityPct;\n const sessionColor = sessionPct > 80 ? colors.red : sessionPct > 60 ? colors.yellow : colors.green;\n writeLine(` ${colors.dim}Session:${RESET} ${sessionColor}${sessionPct}%${RESET} ${colors.dim}(resets ${cap.sessionResetTime})${RESET}`);\n }\n\n // Capacity interpretation\n const headroom = 100 - weeklyPct;\n if (headroom > 50) {\n writeLine(` ${colors.green}●${RESET} ${colors.dim}${headroom}% headroom for autonomous agents${RESET}`);\n } else if (headroom > 20) {\n writeLine(` ${colors.yellow}●${RESET} ${colors.dim}${headroom}% remaining - monitor usage${RESET}`);\n } else {\n writeLine(` ${colors.red}●${RESET} ${colors.dim}Low capacity - consider Sonnet for routine tasks${RESET}`);\n }\n\n writeLine();\n}\n\nfunction renderInfrastructureCached(cache: DashboardCache): void {\n const stats = cache.bridgeStats;\n const hasInfra = hasLocalInfraConfig();\n\n if (!hasInfra || !stats) {\n writeLine(` ${bold}Infrastructure${RESET} ${colors.dim}(local only)${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Running locally — no cloud connection needed to get started.${RESET}`);\n writeLine(` ${colors.dim}Optional: connect for remote execution and team sharing.${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${bold}Infrastructure${RESET} ${colors.dim}(${stats.source})${RESET}`);\n writeLine();\n\n // Health status row\n const pgStatus = stats.health.postgres === 'connected' ? `${colors.green}●${RESET}` : `${colors.red}●${RESET}`;\n const redisStatus = stats.health.redis === 'connected' ? `${colors.green}●${RESET}` : stats.health.redis === 'disabled' ? `${colors.dim}○${RESET}` : `${colors.red}●${RESET}`;\n // OTel pipeline is working if we have data flowing (postgres connected + generations > 0)\n const otelWorking = stats.health.postgres === 'connected' && stats.today.generations > 0;\n const otelStatus = otelWorking ? `${colors.green}●${RESET}` : `${colors.dim}○${RESET}`;\n\n writeLine(` ${pgStatus} postgres ${redisStatus} redis ${otelStatus} otel`);\n writeLine();\n\n // Today's real-time metrics\n if (stats.today.generations > 0 || stats.today.costUsd > 0) {\n // On Max plan, cost is informational only (green). On usage plan, color by budget usage.\n const maxPlan = isMaxPlan();\n const costColor = maxPlan ? colors.green : (stats.budget.usedPct > 80 ? colors.red : stats.budget.usedPct > 50 ? colors.yellow : colors.green);\n const costDisplay = maxPlan\n ? `${costColor}$${stats.today.costUsd.toFixed(2)}${RESET}`\n : `${costColor}$${stats.today.costUsd.toFixed(2)}${RESET}${colors.dim}/$${stats.budget.daily}${RESET}`;\n writeLine(` ${colors.dim}Today:${RESET} ${colors.cyan}${stats.today.generations}${RESET}${colors.dim} calls${RESET} ${costDisplay} ${colors.dim}${formatK(stats.today.inputTokens)}+${formatK(stats.today.outputTokens)} tokens${RESET}`);\n\n // Model breakdown\n if (stats.byModel && stats.byModel.length > 0) {\n const modelLine = stats.byModel.map(m => {\n const shortName = m.model.includes('opus') ? 'opus' :\n m.model.includes('sonnet') ? 'sonnet' :\n m.model.includes('haiku') ? 'haiku' : m.model.slice(0, 10);\n return `${colors.dim}${shortName}${RESET} ${colors.cyan}${m.generations}${RESET}`;\n }).join(' ');\n writeLine(` ${colors.dim}Models:${RESET} ${modelLine}`);\n }\n }\n\n // Week totals\n if (stats.week && stats.week.generations > 0) {\n const weekModelLine = stats.week.byModel?.map(m => {\n const shortName = m.model.includes('opus') ? 'opus' :\n m.model.includes('sonnet') ? 'sonnet' :\n m.model.includes('haiku') ? 'haiku' : m.model.slice(0, 10);\n return `${colors.dim}${shortName}${RESET} ${colors.purple}$${m.costUsd.toFixed(0)}${RESET}`;\n }).join(' ') || '';\n writeLine(` ${colors.dim}Week:${RESET} ${colors.cyan}${stats.week.generations}${RESET}${colors.dim} calls${RESET} ${colors.purple}$${stats.week.costUsd.toFixed(2)}${RESET} ${weekModelLine}`);\n }\n\n writeLine();\n}\n\nfunction renderAcquisitionCached(cache: DashboardCache): void {\n // Only show Acquisition for squads-cli project (internal metrics)\n // Check if SQUADS_NPM_PACKAGE is set or if we're in the squads-cli repo\n const npmPackage = process.env.SQUADS_NPM_PACKAGE;\n if (!npmPackage) {\n // Not configured - don't show internal acquisition metrics to fresh users\n return;\n }\n\n const npm = cache.npmStats;\n if (!npm) {\n // Don't show section if npm API failed\n return;\n }\n\n writeLine(` ${bold}Acquisition${RESET} ${colors.dim}(npm)${RESET}`);\n writeLine();\n\n // Download stats\n const trendIcon = npm.weekOverWeek >= 0 ? `${colors.green}↑${RESET}` : `${colors.red}↓${RESET}`;\n const trendColor = npm.weekOverWeek >= 0 ? colors.green : colors.red;\n\n writeLine(` ${colors.cyan}${npm.downloads.lastWeek}${RESET} installs/week ${trendIcon} ${trendColor}${Math.abs(npm.weekOverWeek)}%${RESET} ${colors.dim}wow${RESET}`);\n writeLine(` ${colors.dim}Today${RESET} ${npm.downloads.lastDay} ${colors.dim}│${RESET} ${colors.dim}Month${RESET} ${npm.downloads.lastMonth}`);\n\n writeLine();\n}\n\nasync function saveSnapshotCached(\n squadData: SquadMetrics[],\n cache: DashboardCache,\n _baseDir: string | null\n): Promise<void> {\n // Use cached dbAvailable check - don't make another slow connection attempt\n if (!cache.dbAvailable) return;\n\n const { gitStats, ghStats, costs } = cache;\n\n // Build squad snapshot data\n const squadsData: SquadSnapshotData[] = squadData.map(s => ({\n name: s.name,\n commits: s.github?.commits || 0,\n prsOpened: s.github?.prsOpened || 0,\n prsMerged: s.github?.prsMerged || 0,\n issuesClosed: s.github?.issuesClosed || 0,\n issuesOpen: s.github?.issuesOpen || 0,\n goalsActive: s.goals.filter(g => !g.completed).length,\n goalsTotal: s.goals.length,\n progress: s.goalProgress,\n }));\n\n // Build authors data\n const authorsData = gitStats\n ? Array.from(gitStats.commitsByAuthor.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([name, commits]) => ({ name, commits }))\n : [];\n\n // Build repos data\n const reposData = gitStats\n ? Array.from(gitStats.commitsByRepo.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([name, commits]) => ({ name, commits }))\n : [];\n\n // Calculate totals\n const totalInputTokens = costs?.bySquad.reduce((sum: number, s: { inputTokens: number }) => sum + s.inputTokens, 0) || 0;\n const totalOutputTokens = costs?.bySquad.reduce((sum: number, s: { outputTokens: number }) => sum + s.outputTokens, 0) || 0;\n const overallProgress = squadData.length > 0\n ? Math.round(squadData.reduce((sum, s) => sum + s.goalProgress, 0) / squadData.length)\n : 0;\n\n const snapshot: DashboardSnapshot = {\n totalSquads: squadData.length,\n totalCommits: gitStats?.totalCommits || 0,\n totalPrsMerged: ghStats?.prsMerged || 0,\n totalIssuesClosed: ghStats?.issuesClosed || 0,\n totalIssuesOpen: ghStats?.issuesOpen || 0,\n goalProgressPct: overallProgress,\n costUsd: costs?.totalCost || 0,\n dailyBudgetUsd: costs?.dailyBudget || 0, // 0 = not configured (no hardcoded defaults)\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n commits30d: gitStats?.totalCommits || 0,\n avgCommitsPerDay: gitStats?.avgCommitsPerDay || 0,\n activeDays: gitStats?.activeDays || 0,\n peakCommits: gitStats?.peakDay?.count || 0,\n peakDate: gitStats?.peakDay?.date || null,\n squadsData,\n authorsData,\n reposData,\n };\n\n // Save with timeout - don't block the CLI exit\n const saveTimeout = new Promise<void>(resolve => setTimeout(resolve, 2000));\n await Promise.race([saveDashboardSnapshot(snapshot), saveTimeout]);\n}\n\n// Goal classification by scope (tactical = immediate action, strategic = long-term vision)\n// Tactical: specific, actionable, concrete tasks (what to do NOW)\nconst TACTICAL_KEYWORDS = ['fix', 'add', 'update', 'implement', 'run', 'test', 'deploy', 'merge', 'review', 'debug'];\n// Strategic: high-level objectives, foundational work (WHERE we're going)\nconst STRATEGIC_KEYWORDS = ['revenue', 'establish', 'build', 'create', 'define', 'design', 'launch', 'ship', 'foundation', 'strategy'];\n\n// Classify goal scope: tactical (0) = do now, strategic (2) = long-term vision\nfunction inferScope(goal: string): 'tactical' | 'operational' | 'strategic' {\n const lower = goal.toLowerCase();\n if (TACTICAL_KEYWORDS.some(k => lower.includes(k))) return 'tactical';\n if (STRATEGIC_KEYWORDS.some(k => lower.includes(k))) return 'strategic';\n return 'operational'; // middle ground\n}\n\n// Legacy priority inference for CEO report (strategic-first view)\nfunction inferPriority(goal: string): 'P0' | 'P1' | 'P2' {\n const lower = goal.toLowerCase();\n // P0 = strategic/revenue critical\n if (STRATEGIC_KEYWORDS.slice(0, 3).some(k => lower.includes(k))) return 'P0'; // revenue, establish, build\n // P1 = operational/important\n if (TACTICAL_KEYWORDS.slice(0, 4).some(k => lower.includes(k))) return 'P1'; // fix, add, update, implement\n return 'P2';\n}\n\nasync function renderCeoReport(squadsDir: string): Promise<void> {\n const squadNames = listSquads(squadsDir);\n const allGoals: { squad: string; goal: Goal; priority: 'P0' | 'P1' | 'P2' }[] = [];\n const blockers: string[] = [];\n let activeSquads = 0;\n let staleSquads = 0;\n\n for (const name of squadNames) {\n const squad = loadSquad(name);\n if (!squad) continue;\n\n const lastActivity = getLastActivityDate(name);\n const activeGoals = squad.goals.filter(g => !g.completed);\n\n // Check for blockers\n if (activeGoals.length === 0) {\n blockers.push(`${name}: No active goals`);\n } else if (lastActivity.includes('w') || lastActivity === '—') {\n blockers.push(`${name}: Stale (${lastActivity})`);\n staleSquads++;\n } else {\n activeSquads++;\n }\n\n // Collect goals with inferred priority\n for (const goal of activeGoals) {\n allGoals.push({\n squad: name,\n goal,\n priority: inferPriority(goal.description),\n });\n }\n }\n\n // Sort by priority\n allGoals.sort((a, b) => {\n const order = { P0: 0, P1: 1, P2: 2 };\n return order[a.priority] - order[b.priority];\n });\n\n const p0Goals = allGoals.filter(g => g.priority === 'P0');\n const p1Goals = allGoals.filter(g => g.priority === 'P1');\n\n // Render\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}CEO Report${RESET}`);\n writeLine(` ${colors.dim}${new Date().toISOString().split('T')[0]}${RESET}`);\n writeLine();\n\n // Key metrics\n const w = { label: 20, value: 12 };\n const tableWidth = w.label + w.value + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd('METRIC', w.label)}${RESET}${bold}VALUE${RESET} ${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('Active Squads', w.label)}${colors.green}${padEnd(`${activeSquads}/${squadNames.length}`, w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('P0 Goals', w.label)}${colors.red}${padEnd(String(p0Goals.length), w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('P1 Goals', w.label)}${colors.yellow}${padEnd(String(p1Goals.length), w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('Blockers', w.label)}${blockers.length > 0 ? colors.red : colors.green}${padEnd(String(blockers.length), w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n\n // Token Economics (add to metrics table)\n const costs = await fetchCostSummary(100);\n if (costs) {\n const spendStr = `$${costs.totalCost.toFixed(2)} / $${costs.dailyBudget}`;\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${padEnd('Daily Spend', w.label)}${colors.green}${padEnd(spendStr, w.value)}${RESET}${colors.purple}${box.vertical}${RESET}`);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Top Priorities (P0)\n if (p0Goals.length > 0) {\n writeLine(` ${bold}${colors.red}P0${RESET} ${bold}Priorities${RESET} ${colors.dim}(revenue/launch critical)${RESET}`);\n writeLine();\n for (const { squad, goal } of p0Goals.slice(0, 5)) {\n writeLine(` ${icons.error} ${colors.cyan}${squad}${RESET} ${goal.description}`);\n if (goal.progress) {\n writeLine(` ${colors.dim}└ ${goal.progress}${RESET}`);\n }\n }\n writeLine();\n }\n\n // P1 Goals\n if (p1Goals.length > 0) {\n writeLine(` ${bold}${colors.yellow}P1${RESET} ${bold}Important${RESET} ${colors.dim}(tracking/foundations)${RESET}`);\n writeLine();\n for (const { squad, goal } of p1Goals.slice(0, 3)) {\n writeLine(` ${icons.warning} ${colors.cyan}${squad}${RESET} ${truncate(goal.description, 50)}`);\n }\n if (p1Goals.length > 3) {\n writeLine(` ${colors.dim} +${p1Goals.length - 3} more${RESET}`);\n }\n writeLine();\n }\n\n // Blockers\n if (blockers.length > 0) {\n writeLine(` ${bold}Blockers${RESET}`);\n writeLine();\n for (const blocker of blockers.slice(0, 3)) {\n writeLine(` ${icons.error} ${colors.red}${blocker}${RESET}`);\n }\n writeLine();\n }\n\n // Next Steps\n writeLine(` ${bold}Next Steps${RESET}`);\n writeLine();\n if (p0Goals.length > 0) {\n writeLine(` ${icons.active} Focus on P0: ${colors.cyan}${p0Goals[0].squad}${RESET} - ${truncate(p0Goals[0].goal.description, 40)}`);\n }\n if (blockers.length > 0) {\n writeLine(` ${icons.warning} Unblock: ${colors.yellow}${blockers[0]}${RESET}`);\n }\n if (staleSquads > 0) {\n writeLine(` ${icons.progress} Revive ${staleSquads} stale squad(s)`);\n }\n writeLine();\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads dash ${colors.dim}Full operational view${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads goal list ${colors.dim}All active goals${RESET}`);\n writeLine();\n}\n\nfunction renderHistoricalTrendsCached(cache: DashboardCache): void {\n if (!cache.dbAvailable) return;\n\n const history = cache.history;\n if (history.length < 2) return; // Need at least 2 data points\n\n writeLine(` ${bold}Usage Trends${RESET} ${colors.dim}(${history.length}d history)${RESET}`);\n writeLine();\n\n // Daily cost sparkline (most recent first, so reverse for left-to-right)\n const dailyCosts = history.map(h => h.costUsd).reverse();\n const costSparkStr = sparkline(dailyCosts);\n const totalSpend = dailyCosts.reduce((sum, c) => sum + c, 0);\n const avgDaily = totalSpend / dailyCosts.length;\n\n writeLine(` ${colors.dim}Cost:${RESET} ${costSparkStr} ${colors.green}$${totalSpend.toFixed(2)}${RESET} total ${colors.dim}($${avgDaily.toFixed(2)}/day avg)${RESET}`);\n\n // Token usage trend\n const inputTokens = history.map(h => h.inputTokens).reverse();\n const totalInput = inputTokens.reduce((sum, t) => sum + t, 0);\n const tokenSparkStr = sparkline(inputTokens);\n\n writeLine(` ${colors.dim}Tokens:${RESET} ${tokenSparkStr} ${colors.cyan}${formatK(totalInput)}${RESET} input ${colors.dim}(${formatK(Math.round(totalInput / inputTokens.length))}/day)${RESET}`);\n\n // Goal progress trend\n const goalProgress = history.map(h => h.goalProgressPct).reverse();\n const latestProgress = goalProgress[goalProgress.length - 1] || 0;\n const earliestProgress = goalProgress[0] || 0;\n const progressDelta = latestProgress - earliestProgress;\n const progressColor = progressDelta > 0 ? colors.green : progressDelta < 0 ? colors.red : colors.dim;\n const progressSign = progressDelta > 0 ? '+' : '';\n\n writeLine(` ${colors.dim}Goals:${RESET} ${sparkline(goalProgress)} ${colors.purple}${latestProgress}%${RESET} ${progressColor}${progressSign}${progressDelta.toFixed(0)}%${RESET}${colors.dim} vs start${RESET}`);\n writeLine();\n}\n\nfunction renderInsightsCached(cache: DashboardCache): void {\n const insights = cache.insights;\n\n if (!insights || insights.source === 'none' || insights.taskMetrics.length === 0) {\n return;\n }\n\n writeLine(` ${bold}Agent Insights${RESET} ${colors.dim}(${insights.days}d)${RESET}`);\n writeLine();\n\n // Task completion metrics (aggregated)\n const totals = insights.taskMetrics.reduce(\n (acc, t) => ({\n tasks: acc.tasks + t.tasksTotal,\n completed: acc.completed + t.tasksCompleted,\n failed: acc.failed + t.tasksFailed,\n retries: acc.retries + t.totalRetries,\n withRetries: acc.withRetries + t.tasksWithRetries,\n }),\n { tasks: 0, completed: 0, failed: 0, retries: 0, withRetries: 0 }\n );\n\n if (totals.tasks > 0) {\n const successRate = totals.tasks > 0 ? ((totals.completed / totals.tasks) * 100).toFixed(0) : '0';\n const successColor = parseInt(successRate) >= 80 ? colors.green : parseInt(successRate) >= 60 ? colors.yellow : colors.red;\n\n writeLine(` ${colors.dim}Tasks:${RESET} ${colors.green}${totals.completed}${RESET}${colors.dim}/${totals.tasks} completed${RESET} ${successColor}${successRate}%${RESET}${colors.dim} success${RESET} ${colors.red}${totals.failed}${RESET}${colors.dim} failed${RESET}`);\n\n if (totals.retries > 0) {\n const retryRate = totals.tasks > 0 ? ((totals.withRetries / totals.tasks) * 100).toFixed(0) : '0';\n const retryColor = parseInt(retryRate) > 30 ? colors.red : parseInt(retryRate) > 15 ? colors.yellow : colors.green;\n writeLine(` ${colors.dim}Retries:${RESET} ${retryColor}${totals.retries}${RESET}${colors.dim} total${RESET} ${retryColor}${retryRate}%${RESET}${colors.dim} of tasks needed retry${RESET}`);\n }\n }\n\n // Skip quality metrics for brevity in cached version\n writeLine();\n}\n\n/**\n * Render ROI metrics section showing cost projections and before/after comparison\n */\nfunction renderROICached(cache: DashboardCache, goalCount: { active: number; completed: number }): void {\n const { costs, bridgeStats, baseline, squadProjections } = cache;\n\n if (!costs && !bridgeStats) {\n return;\n }\n\n const roiMetrics = calculateROIMetrics(\n costs,\n goalCount.completed,\n cache.gitStats?.totalCommits || 0,\n cache.ghStats?.prsMerged || 0\n );\n\n writeLine(` ${bold}ROI & Projections${RESET}`);\n writeLine();\n\n // Cost per output metrics\n if (roiMetrics.totalCostUsd > 0) {\n const metricsLine = [];\n if (roiMetrics.costPerGoal > 0) {\n metricsLine.push(`${colors.cyan}$${roiMetrics.costPerGoal.toFixed(2)}${RESET}${colors.dim}/goal${RESET}`);\n }\n if (roiMetrics.costPerPR > 0) {\n metricsLine.push(`${colors.cyan}$${roiMetrics.costPerPR.toFixed(2)}${RESET}${colors.dim}/PR${RESET}`);\n }\n if (roiMetrics.costPerCommit > 0) {\n metricsLine.push(`${colors.cyan}$${roiMetrics.costPerCommit.toFixed(2)}${RESET}${colors.dim}/commit${RESET}`);\n }\n if (metricsLine.length > 0) {\n writeLine(` ${colors.dim}Cost/Output:${RESET} ${metricsLine.join(` ${colors.dim}|${RESET} `)}`);\n }\n }\n\n // ROI multiplier\n if (roiMetrics.roiMultiplier > 0) {\n const roiColor = roiMetrics.roiMultiplier >= 3 ? colors.green :\n roiMetrics.roiMultiplier >= 1 ? colors.cyan : colors.yellow;\n writeLine(` ${colors.dim}Est. ROI:${RESET} ${roiColor}${roiMetrics.roiMultiplier.toFixed(1)}x${RESET} ${colors.dim}($${roiMetrics.estimatedValueUsd.toFixed(0)} value / $${roiMetrics.totalCostUsd.toFixed(2)} cost)${RESET}`);\n }\n\n // Cost projections\n writeLine();\n writeLine(` ${colors.dim}Projections${RESET}`);\n const dailyBudget = costs?.dailyBudget || 200;\n const projColor = roiMetrics.dailyProjectedCost > dailyBudget ? colors.red :\n roiMetrics.dailyProjectedCost > dailyBudget * 0.8 ? colors.yellow : colors.green;\n writeLine(` ${colors.dim}Daily:${RESET} ${projColor}~$${roiMetrics.dailyProjectedCost.toFixed(2)}${RESET} ${colors.dim}Weekly:${RESET} ${colors.cyan}~$${roiMetrics.weeklyProjectedCost.toFixed(0)}${RESET} ${colors.dim}Monthly:${RESET} ${colors.purple}~$${roiMetrics.monthlyProjectedCost.toFixed(0)}${RESET}`);\n\n // Squad-level projections\n if (squadProjections.length > 0) {\n writeLine();\n writeLine(` ${colors.dim}By Squad (projected monthly)${RESET}`);\n const topSquads = squadProjections\n .sort((a, b) => b.projectedMonthlyCost - a.projectedMonthlyCost)\n .slice(0, 4);\n for (const sq of topSquads) {\n const trendIcon = sq.costTrend === 'increasing' ? `${colors.red}↑${RESET}` :\n sq.costTrend === 'decreasing' ? `${colors.green}↓${RESET}` : `${colors.dim}-${RESET}`;\n writeLine(` ${colors.cyan}${padEnd(sq.squad, 14)}${RESET}${colors.dim}~$${sq.projectedMonthlyCost.toFixed(0)}/mo${RESET} ${trendIcon}`);\n }\n }\n\n // Before/after comparison with baseline\n if (baseline) {\n writeLine();\n writeLine(` ${colors.dim}vs Baseline${RESET} ${colors.dim}(${baseline.name})${RESET}`);\n const costDelta = roiMetrics.totalCostUsd - baseline.costUsd;\n const goalsDelta = goalCount.completed - baseline.goalsCompleted;\n const costPerGoalBefore = baseline.goalsCompleted > 0 ? baseline.costUsd / baseline.goalsCompleted : 0;\n const costPerGoalAfter = goalCount.completed > 0 ? roiMetrics.totalCostUsd / goalCount.completed : 0;\n const efficiencyChange = costPerGoalBefore > 0 ? ((costPerGoalBefore - costPerGoalAfter) / costPerGoalBefore) * 100 : 0;\n\n const costColor = costDelta > 0 ? colors.red : colors.green;\n const goalsColor = goalsDelta >= 0 ? colors.green : colors.red;\n const effColor = efficiencyChange > 0 ? colors.green : efficiencyChange < 0 ? colors.red : colors.dim;\n writeLine(` ${colors.dim}Cost:${RESET} ${costColor}${costDelta >= 0 ? '+' : ''}$${costDelta.toFixed(2)}${RESET} ${colors.dim}Goals:${RESET} ${goalsColor}${goalsDelta >= 0 ? '+' : ''}${goalsDelta}${RESET} ${colors.dim}Efficiency:${RESET} ${effColor}${efficiencyChange >= 0 ? '+' : ''}${efficiencyChange.toFixed(0)}%${RESET}`);\n } else {\n writeLine();\n writeLine(` ${colors.dim}No baseline set. Capture one with:${RESET} squads baseline`);\n }\n\n writeLine();\n}\n","/**\n * Database utilities — stub implementation\n *\n * Database persistence is a platform feature (Layer 3).\n * The CLI (Layer 1) operates entirely on the local file system.\n * These stubs maintain API compatibility for commands that reference db functions.\n */\n\n/**\n * Check if database is available (always false in CLI-only mode)\n */\nexport async function isDatabaseAvailable(): Promise<boolean> {\n return false;\n}\n\n/**\n * Dashboard snapshot data structure\n */\nexport interface DashboardSnapshot {\n totalSquads: number;\n totalCommits: number;\n totalPrsMerged: number;\n totalIssuesClosed: number;\n totalIssuesOpen: number;\n goalProgressPct: number;\n costUsd: number;\n dailyBudgetUsd: number;\n inputTokens: number;\n outputTokens: number;\n commits30d: number;\n avgCommitsPerDay: number;\n activeDays: number;\n peakCommits: number;\n peakDate: string | null;\n squadsData: SquadSnapshotData[];\n authorsData: { name: string; commits: number }[];\n reposData: { name: string; commits: number }[];\n}\n\nexport interface SquadSnapshotData {\n name: string;\n commits: number;\n prsOpened: number;\n prsMerged: number;\n issuesClosed: number;\n issuesOpen: number;\n goalsActive: number;\n goalsTotal: number;\n progress: number;\n}\n\n/**\n * Save a dashboard snapshot (no-op without database)\n */\nexport async function saveDashboardSnapshot(_snapshot: DashboardSnapshot): Promise<number | null> {\n return null;\n}\n\n/**\n * Get recent dashboard snapshots (empty without database)\n */\nexport async function getDashboardHistory(_limit: number = 30): Promise<DashboardSnapshot[]> {\n return [];\n}\n\n/**\n * Close the database connection pool (no-op)\n */\nexport async function closeDatabase(): Promise<void> {\n // No-op: no database connection in CLI-only mode\n}\n\n// === Baseline Storage for ROI Tracking ===\n\nexport interface BaselineSnapshot {\n id?: number;\n name: string;\n capturedAt: string;\n costUsd: number;\n goalsCompleted: number;\n goalsActive: number;\n commits: number;\n prsMerged: number;\n issuesClosed: number;\n inputTokens: number;\n outputTokens: number;\n squadMetrics: Array<{\n squad: string;\n costUsd: number;\n goals: number;\n commits: number;\n prs: number;\n }>;\n}\n\n/**\n * Save a baseline snapshot (no-op without database)\n */\nexport async function saveBaseline(_baseline: BaselineSnapshot): Promise<number | null> {\n return null;\n}\n\n/**\n * Get the most recent baseline (null without database)\n */\nexport async function getLatestBaseline(): Promise<BaselineSnapshot | null> {\n return null;\n}\n\n/**\n * Get a baseline by name (null without database)\n */\nexport async function getBaselineByName(_name: string): Promise<BaselineSnapshot | null> {\n return null;\n}\n\n/**\n * List all baselines (empty without database)\n */\nexport async function listBaselines(_limit: number = 10): Promise<BaselineSnapshot[]> {\n return [];\n}\n"],"mappings":"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","names":["goalCount"]}