squads-cli 0.2.0 → 0.2.2

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 (249) 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-GARI6J2J.js +105 -0
  5. package/dist/autonomy-GARI6J2J.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-NP5BDPE6.js +240 -0
  27. package/dist/chunk-NP5BDPE6.js.map +1 -0
  28. package/dist/chunk-O632SBON.js +62 -0
  29. package/dist/chunk-O632SBON.js.map +1 -0
  30. package/dist/chunk-QJ7C7CMB.js +223 -0
  31. package/dist/chunk-QJ7C7CMB.js.map +1 -0
  32. package/dist/chunk-QRNR4GIT.js +88 -0
  33. package/dist/chunk-QRNR4GIT.js.map +1 -0
  34. package/dist/chunk-RM6BWILN.js +74 -0
  35. package/dist/chunk-RM6BWILN.js.map +1 -0
  36. package/dist/chunk-TYFTF53O.js +613 -0
  37. package/dist/chunk-TYFTF53O.js.map +1 -0
  38. package/dist/chunk-TZXD6WFN.js +420 -0
  39. package/dist/chunk-TZXD6WFN.js.map +1 -0
  40. package/dist/chunk-WVOIY5GW.js +621 -0
  41. package/dist/chunk-WVOIY5GW.js.map +1 -0
  42. package/dist/chunk-XTHZT53Y.js +364 -0
  43. package/dist/chunk-XTHZT53Y.js.map +1 -0
  44. package/dist/chunk-Z2UKDBNL.js +162 -0
  45. package/dist/chunk-Z2UKDBNL.js.map +1 -0
  46. package/dist/chunk-ZTQ7ISUR.js +338 -0
  47. package/dist/chunk-ZTQ7ISUR.js.map +1 -0
  48. package/dist/cli.js +3371 -5852
  49. package/dist/cli.js.map +1 -1
  50. package/dist/context-PYTO2UQG.js +291 -0
  51. package/dist/context-PYTO2UQG.js.map +1 -0
  52. package/dist/context-feed-TLVZZ24S.js +394 -0
  53. package/dist/context-feed-TLVZZ24S.js.map +1 -0
  54. package/dist/cost-OALPURUQ.js +275 -0
  55. package/dist/cost-OALPURUQ.js.map +1 -0
  56. package/dist/create-BLFGG6PF.js +286 -0
  57. package/dist/create-BLFGG6PF.js.map +1 -0
  58. package/dist/dashboard-HQIEHTZC.js +951 -0
  59. package/dist/dashboard-HQIEHTZC.js.map +1 -0
  60. package/dist/dashboard-RMK2BOD2.js +794 -0
  61. package/dist/dashboard-RMK2BOD2.js.map +1 -0
  62. package/dist/doctor-TWHMR23W.js +374 -0
  63. package/dist/doctor-TWHMR23W.js.map +1 -0
  64. package/dist/env-config-SQEI3Y7Y.js +21 -0
  65. package/dist/env-config-SQEI3Y7Y.js.map +1 -0
  66. package/dist/exec-DYLI4TXY.js +223 -0
  67. package/dist/exec-DYLI4TXY.js.map +1 -0
  68. package/dist/feedback-5AEACUX6.js +229 -0
  69. package/dist/feedback-5AEACUX6.js.map +1 -0
  70. package/dist/github-UQTM5KMS.js +23 -0
  71. package/dist/github-UQTM5KMS.js.map +1 -0
  72. package/dist/goal-XUNV3CKV.js +168 -0
  73. package/dist/goal-XUNV3CKV.js.map +1 -0
  74. package/dist/health-ZF3HSA4W.js +218 -0
  75. package/dist/health-ZF3HSA4W.js.map +1 -0
  76. package/dist/history-WP6R5BNG.js +232 -0
  77. package/dist/history-WP6R5BNG.js.map +1 -0
  78. package/dist/index.d.ts +736 -8
  79. package/dist/index.js +1312 -6
  80. package/dist/index.js.map +1 -1
  81. package/dist/init-BQSCG57S.js +921 -0
  82. package/dist/init-BQSCG57S.js.map +1 -0
  83. package/dist/kpi-VBGDO4GI.js +413 -0
  84. package/dist/kpi-VBGDO4GI.js.map +1 -0
  85. package/dist/learn-C4B2PQ5J.js +269 -0
  86. package/dist/learn-C4B2PQ5J.js.map +1 -0
  87. package/dist/login-F6ITE7PR.js +155 -0
  88. package/dist/login-F6ITE7PR.js.map +1 -0
  89. package/dist/memory-33HYD6AN.js +560 -0
  90. package/dist/memory-33HYD6AN.js.map +1 -0
  91. package/dist/memory-VNF2VFRB.js +23 -0
  92. package/dist/memory-VNF2VFRB.js.map +1 -0
  93. package/dist/observability-CL23L7LD.js +20 -0
  94. package/dist/observability-CL23L7LD.js.map +1 -0
  95. package/dist/org-cycle-Q74OT4I4.js +130 -0
  96. package/dist/org-cycle-Q74OT4I4.js.map +1 -0
  97. package/dist/progress-P2EIZBKP.js +202 -0
  98. package/dist/progress-P2EIZBKP.js.map +1 -0
  99. package/dist/providers-LE744DM6.js +65 -0
  100. package/dist/providers-LE744DM6.js.map +1 -0
  101. package/dist/repo-enforcement-JJQMKDAU.js +75 -0
  102. package/dist/repo-enforcement-JJQMKDAU.js.map +1 -0
  103. package/dist/results-6TH33HPN.js +224 -0
  104. package/dist/results-6TH33HPN.js.map +1 -0
  105. package/dist/run-DOY5SGF3.js +4074 -0
  106. package/dist/run-DOY5SGF3.js.map +1 -0
  107. package/dist/run-context-GB6GUCKZ.js +26 -0
  108. package/dist/run-context-GB6GUCKZ.js.map +1 -0
  109. package/dist/session-HBU6KZOD.js +64 -0
  110. package/dist/session-HBU6KZOD.js.map +1 -0
  111. package/dist/sessions-CK25VGPL.js +333 -0
  112. package/dist/sessions-CK25VGPL.js.map +1 -0
  113. package/dist/squad-parser-DCG65BJS.js +35 -0
  114. package/dist/squad-parser-DCG65BJS.js.map +1 -0
  115. package/dist/stats-G6NAU5BD.js +334 -0
  116. package/dist/stats-G6NAU5BD.js.map +1 -0
  117. package/dist/status-PFFB2NV6.js +352 -0
  118. package/dist/status-PFFB2NV6.js.map +1 -0
  119. package/dist/sync-FR6LQJ4C.js +836 -0
  120. package/dist/sync-FR6LQJ4C.js.map +1 -0
  121. package/dist/templates/core/AGENTS.md.template +51 -0
  122. package/dist/templates/core/BUSINESS_BRIEF.md.template +29 -0
  123. package/dist/templates/core/CLAUDE.md.template +48 -0
  124. package/dist/templates/core/provider.yaml.template +5 -0
  125. package/dist/templates/first-squad/SQUAD.md.template +23 -0
  126. package/dist/templates/first-squad/lead.md.template +44 -0
  127. package/dist/templates/memory/getting-started/state.md.template +19 -0
  128. package/dist/templates/seed/BUSINESS_BRIEF.md.template +27 -0
  129. package/dist/templates/seed/CLAUDE.md.template +119 -0
  130. package/dist/templates/seed/README.md.template +42 -0
  131. package/dist/templates/seed/config/SYSTEM.md +58 -0
  132. package/dist/templates/seed/config/provider.yaml +4 -0
  133. package/dist/templates/seed/hooks/settings.json.template +31 -0
  134. package/dist/templates/seed/idp/catalog/service.yaml.template +25 -0
  135. package/dist/templates/seed/memory/_squad/goals.md +23 -0
  136. package/dist/templates/seed/memory/_squad/priorities.md +25 -0
  137. package/dist/templates/seed/memory/company/company.md +31 -0
  138. package/dist/templates/seed/memory/company/directives.md +37 -0
  139. package/dist/templates/seed/memory/company/manager/state.md +16 -0
  140. package/dist/templates/seed/memory/engineering/issue-solver/state.md +12 -0
  141. package/dist/templates/seed/memory/intelligence/intel-lead/state.md +9 -0
  142. package/dist/templates/seed/memory/marketing/content-drafter/state.md +12 -0
  143. package/dist/templates/seed/memory/operations/ops-lead/state.md +12 -0
  144. package/dist/templates/seed/memory/product/lead/state.md +14 -0
  145. package/dist/templates/seed/memory/research/lead/state.md +14 -0
  146. package/dist/templates/seed/skills/gh/SKILL.md +57 -0
  147. package/dist/templates/seed/skills/squads-cli/SKILL.md +329 -0
  148. package/dist/templates/seed/skills/squads-cli/references/commands.md +181 -0
  149. package/dist/templates/seed/squads/company/SQUAD.md +51 -0
  150. package/dist/templates/seed/squads/company/company-critic.md +57 -0
  151. package/dist/templates/seed/squads/company/company-eval.md +57 -0
  152. package/dist/templates/seed/squads/company/event-dispatcher.md +53 -0
  153. package/dist/templates/seed/squads/company/goal-tracker.md +51 -0
  154. package/dist/templates/seed/squads/company/manager.md +60 -0
  155. package/dist/templates/seed/squads/engineering/SQUAD.md +48 -0
  156. package/dist/templates/seed/squads/engineering/code-reviewer.md +69 -0
  157. package/dist/templates/seed/squads/engineering/issue-solver.md +66 -0
  158. package/dist/templates/seed/squads/engineering/test-writer.md +60 -0
  159. package/dist/templates/seed/squads/intelligence/SQUAD.md +38 -0
  160. package/dist/templates/seed/squads/intelligence/intel-critic.md +53 -0
  161. package/dist/templates/seed/squads/intelligence/intel-eval.md +48 -0
  162. package/dist/templates/seed/squads/intelligence/intel-lead.md +79 -0
  163. package/dist/templates/seed/squads/marketing/SQUAD.md +47 -0
  164. package/dist/templates/seed/squads/marketing/content-drafter.md +81 -0
  165. package/dist/templates/seed/squads/marketing/growth-analyst.md +61 -0
  166. package/dist/templates/seed/squads/marketing/social-poster.md +56 -0
  167. package/dist/templates/seed/squads/operations/SQUAD.md +45 -0
  168. package/dist/templates/seed/squads/operations/finance-tracker.md +55 -0
  169. package/dist/templates/seed/squads/operations/goal-tracker.md +60 -0
  170. package/dist/templates/seed/squads/operations/ops-lead.md +68 -0
  171. package/dist/templates/seed/squads/product/SQUAD.md +41 -0
  172. package/dist/templates/seed/squads/product/lead.md +64 -0
  173. package/dist/templates/seed/squads/product/scanner.md +58 -0
  174. package/dist/templates/seed/squads/product/worker.md +63 -0
  175. package/dist/templates/seed/squads/research/SQUAD.md +38 -0
  176. package/dist/templates/seed/squads/research/analyst.md +58 -0
  177. package/dist/templates/seed/squads/research/lead.md +58 -0
  178. package/dist/templates/seed/squads/research/synthesizer.md +67 -0
  179. package/dist/templates/skills/squads-learn/SKILL.md +86 -0
  180. package/dist/templates/skills/squads-workflow/instruction.md +70 -0
  181. package/dist/terminal-FBQFQTKZ.js +55 -0
  182. package/dist/terminal-FBQFQTKZ.js.map +1 -0
  183. package/dist/tier-detect-YX2HPNNR.js +15 -0
  184. package/dist/tier-detect-YX2HPNNR.js.map +1 -0
  185. package/dist/update-D7CGIZ3M.js +18 -0
  186. package/dist/update-D7CGIZ3M.js.map +1 -0
  187. package/dist/update-STU276HR.js +83 -0
  188. package/dist/update-STU276HR.js.map +1 -0
  189. package/package.json +31 -13
  190. package/templates/core/AGENTS.md.template +51 -0
  191. package/templates/core/BUSINESS_BRIEF.md.template +29 -0
  192. package/templates/core/CLAUDE.md.template +48 -0
  193. package/templates/core/provider.yaml.template +5 -0
  194. package/templates/first-squad/SQUAD.md.template +23 -0
  195. package/templates/first-squad/lead.md.template +44 -0
  196. package/templates/memory/getting-started/state.md.template +19 -0
  197. package/templates/seed/BUSINESS_BRIEF.md.template +27 -0
  198. package/templates/seed/CLAUDE.md.template +119 -0
  199. package/templates/seed/README.md.template +42 -0
  200. package/templates/seed/config/SYSTEM.md +58 -0
  201. package/templates/seed/config/provider.yaml +4 -0
  202. package/templates/seed/hooks/settings.json.template +31 -0
  203. package/templates/seed/idp/catalog/service.yaml.template +25 -0
  204. package/templates/seed/memory/_squad/goals.md +23 -0
  205. package/templates/seed/memory/_squad/priorities.md +25 -0
  206. package/templates/seed/memory/company/company.md +31 -0
  207. package/templates/seed/memory/company/directives.md +37 -0
  208. package/templates/seed/memory/company/manager/state.md +16 -0
  209. package/templates/seed/memory/engineering/issue-solver/state.md +12 -0
  210. package/templates/seed/memory/intelligence/intel-lead/state.md +9 -0
  211. package/templates/seed/memory/marketing/content-drafter/state.md +12 -0
  212. package/templates/seed/memory/operations/ops-lead/state.md +12 -0
  213. package/templates/seed/memory/product/lead/state.md +14 -0
  214. package/templates/seed/memory/research/lead/state.md +14 -0
  215. package/templates/seed/skills/gh/SKILL.md +57 -0
  216. package/templates/seed/skills/squads-cli/SKILL.md +329 -0
  217. package/templates/seed/skills/squads-cli/references/commands.md +181 -0
  218. package/templates/seed/squads/company/SQUAD.md +51 -0
  219. package/templates/seed/squads/company/company-critic.md +57 -0
  220. package/templates/seed/squads/company/company-eval.md +57 -0
  221. package/templates/seed/squads/company/event-dispatcher.md +53 -0
  222. package/templates/seed/squads/company/goal-tracker.md +51 -0
  223. package/templates/seed/squads/company/manager.md +60 -0
  224. package/templates/seed/squads/engineering/SQUAD.md +48 -0
  225. package/templates/seed/squads/engineering/code-reviewer.md +69 -0
  226. package/templates/seed/squads/engineering/issue-solver.md +66 -0
  227. package/templates/seed/squads/engineering/test-writer.md +60 -0
  228. package/templates/seed/squads/intelligence/SQUAD.md +38 -0
  229. package/templates/seed/squads/intelligence/intel-critic.md +53 -0
  230. package/templates/seed/squads/intelligence/intel-eval.md +48 -0
  231. package/templates/seed/squads/intelligence/intel-lead.md +79 -0
  232. package/templates/seed/squads/marketing/SQUAD.md +47 -0
  233. package/templates/seed/squads/marketing/content-drafter.md +81 -0
  234. package/templates/seed/squads/marketing/growth-analyst.md +61 -0
  235. package/templates/seed/squads/marketing/social-poster.md +56 -0
  236. package/templates/seed/squads/operations/SQUAD.md +45 -0
  237. package/templates/seed/squads/operations/finance-tracker.md +55 -0
  238. package/templates/seed/squads/operations/goal-tracker.md +60 -0
  239. package/templates/seed/squads/operations/ops-lead.md +68 -0
  240. package/templates/seed/squads/product/SQUAD.md +41 -0
  241. package/templates/seed/squads/product/lead.md +64 -0
  242. package/templates/seed/squads/product/scanner.md +58 -0
  243. package/templates/seed/squads/product/worker.md +63 -0
  244. package/templates/seed/squads/research/SQUAD.md +38 -0
  245. package/templates/seed/squads/research/analyst.md +58 -0
  246. package/templates/seed/squads/research/lead.md +58 -0
  247. package/templates/seed/squads/research/synthesizer.md +67 -0
  248. package/templates/skills/squads-learn/SKILL.md +86 -0
  249. package/templates/skills/squads-workflow/instruction.md +70 -0
@@ -0,0 +1,224 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ RESET,
4
+ bold,
5
+ box,
6
+ colors,
7
+ gradient,
8
+ icons,
9
+ padEnd,
10
+ truncate,
11
+ writeLine
12
+ } from "./chunk-M5FXNY6Y.js";
13
+ import {
14
+ findSquadsDir,
15
+ listSquads,
16
+ loadSquad
17
+ } from "./chunk-TYFTF53O.js";
18
+ import "./chunk-7OCVIDC7.js";
19
+
20
+ // src/commands/results.ts
21
+ import { execSync } from "child_process";
22
+ function getGitStats(days = 7) {
23
+ const stats = /* @__PURE__ */ new Map();
24
+ const squadKeywords = {
25
+ website: ["agents-squads-web", "website", "homepage"],
26
+ product: ["squads-cli", "cli"],
27
+ research: ["research"],
28
+ engineering: ["engineering", ".agents"],
29
+ intelligence: ["intelligence"],
30
+ customer: ["customer"],
31
+ finance: ["finance"],
32
+ company: ["company"],
33
+ marketing: ["marketing"]
34
+ };
35
+ try {
36
+ const logOutput = execSync(
37
+ `git log --since="${days} days ago" --format="%s" --name-only 2>/dev/null`,
38
+ { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }
39
+ ).trim();
40
+ if (!logOutput) return stats;
41
+ const entries = logOutput.split("\n\n");
42
+ for (const entry of entries) {
43
+ const lines = entry.split("\n").filter((l) => l.trim());
44
+ if (lines.length === 0) continue;
45
+ const message = lines[0];
46
+ const files = lines.slice(1);
47
+ const msgLower = message.toLowerCase();
48
+ let detectedSquad = "other";
49
+ for (const [squad, keywords] of Object.entries(squadKeywords)) {
50
+ const inMessage = keywords.some((k) => msgLower.includes(k));
51
+ const inFiles = files.some(
52
+ (f) => keywords.some((k) => f.toLowerCase().includes(k))
53
+ );
54
+ if (inMessage || inFiles) {
55
+ detectedSquad = squad;
56
+ break;
57
+ }
58
+ }
59
+ if (!stats.has(detectedSquad)) {
60
+ stats.set(detectedSquad, { commits: 0, files: [] });
61
+ }
62
+ const squadStats = stats.get(detectedSquad);
63
+ squadStats.commits++;
64
+ squadStats.files.push(...files);
65
+ }
66
+ } catch {
67
+ }
68
+ return stats;
69
+ }
70
+ function getGitHubStats(days = 7) {
71
+ const prsOpened = /* @__PURE__ */ new Map();
72
+ const prsMerged = /* @__PURE__ */ new Map();
73
+ const issuesClosed = /* @__PURE__ */ new Map();
74
+ try {
75
+ const prsOutput = execSync(
76
+ `gh pr list --state all --json title,createdAt,mergedAt --limit 50 2>/dev/null`,
77
+ { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }
78
+ );
79
+ const prs = JSON.parse(prsOutput || "[]");
80
+ const since = new Date(Date.now() - days * 24 * 60 * 60 * 1e3);
81
+ for (const pr of prs) {
82
+ const created = new Date(pr.createdAt);
83
+ if (created < since) continue;
84
+ const squad = detectSquadFromTitle(pr.title);
85
+ prsOpened.set(squad, (prsOpened.get(squad) || 0) + 1);
86
+ if (pr.mergedAt) {
87
+ prsMerged.set(squad, (prsMerged.get(squad) || 0) + 1);
88
+ }
89
+ }
90
+ const issuesOutput = execSync(
91
+ `gh issue list --state closed --json title,closedAt --limit 50 2>/dev/null`,
92
+ { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }
93
+ );
94
+ const issues = JSON.parse(issuesOutput || "[]");
95
+ for (const issue of issues) {
96
+ const closed = new Date(issue.closedAt);
97
+ if (closed < since) continue;
98
+ const squad = detectSquadFromTitle(issue.title);
99
+ issuesClosed.set(squad, (issuesClosed.get(squad) || 0) + 1);
100
+ }
101
+ } catch {
102
+ }
103
+ return { prsOpened, prsMerged, issuesClosed };
104
+ }
105
+ function detectSquadFromTitle(title) {
106
+ const lower = title.toLowerCase();
107
+ const mapping = {
108
+ website: ["website", "web", "homepage", "page"],
109
+ product: ["cli", "squads", "command"],
110
+ research: ["research", "report"],
111
+ engineering: ["infra", "build", "ci"],
112
+ intelligence: ["intel", "monitor"],
113
+ customer: ["lead", "customer"],
114
+ finance: ["cost", "finance"],
115
+ marketing: ["marketing", "content"]
116
+ };
117
+ for (const [squad, keywords] of Object.entries(mapping)) {
118
+ if (keywords.some((k) => lower.includes(k))) {
119
+ return squad;
120
+ }
121
+ }
122
+ return "other";
123
+ }
124
+ function parseMetrics(goal) {
125
+ const metrics = [];
126
+ if (goal.metrics && goal.metrics.length > 0) {
127
+ return goal.metrics;
128
+ }
129
+ const desc = goal.description.toLowerCase();
130
+ if (desc.includes("revenue")) metrics.push("revenue_usd");
131
+ if (desc.includes("lead")) metrics.push("leads_count");
132
+ if (desc.includes("traffic") || desc.includes("visit")) metrics.push("page_views");
133
+ if (desc.includes("signup") || desc.includes("email")) metrics.push("signups");
134
+ if (desc.includes("cost")) metrics.push("cost_usd");
135
+ if (desc.includes("publish") || desc.includes("launch")) metrics.push("shipped");
136
+ if (desc.includes("demo")) metrics.push("demos_booked");
137
+ return metrics.length > 0 ? metrics : ["progress"];
138
+ }
139
+ async function resultsCommand(options = {}) {
140
+ const squadsDir = findSquadsDir();
141
+ if (!squadsDir) {
142
+ writeLine(`${colors.red}No .agents/squads directory found${RESET}`);
143
+ writeLine(`${colors.dim}Run \`squads init\` to create one.${RESET}`);
144
+ return;
145
+ }
146
+ const days = parseInt(options.days || "7", 10);
147
+ writeLine();
148
+ writeLine(` ${gradient("squads")} ${colors.dim}results${RESET} ${colors.dim}(${days}d)${RESET}`);
149
+ writeLine();
150
+ const squadNames = options.squad ? [options.squad] : listSquads(squadsDir);
151
+ const gitStats = getGitStats(days);
152
+ const ghStats = getGitHubStats(days);
153
+ const results = [];
154
+ for (const name of squadNames) {
155
+ const squad = loadSquad(name);
156
+ if (!squad) continue;
157
+ const git = gitStats.get(name) || { commits: 0, files: [] };
158
+ const activeGoals = squad.goals.filter((g) => !g.completed);
159
+ results.push({
160
+ name,
161
+ commits: git.commits,
162
+ prsOpened: ghStats.prsOpened.get(name) || 0,
163
+ prsMerged: ghStats.prsMerged.get(name) || 0,
164
+ issuesClosed: ghStats.issuesClosed.get(name) || 0,
165
+ goals: activeGoals.map((g) => ({
166
+ description: g.description,
167
+ metrics: parseMetrics(g),
168
+ progress: g.progress,
169
+ completed: g.completed
170
+ }))
171
+ });
172
+ }
173
+ const totalCommits = results.reduce((sum, r) => sum + r.commits, 0);
174
+ const totalPRs = results.reduce((sum, r) => sum + r.prsMerged, 0);
175
+ const totalGoals = results.reduce((sum, r) => sum + r.goals.length, 0);
176
+ const stats = [
177
+ `${colors.cyan}${totalCommits}${RESET} commits`,
178
+ `${colors.green}${totalPRs}${RESET} PRs merged`,
179
+ `${colors.purple}${totalGoals}${RESET} active goals`
180
+ ].join(` ${colors.dim}\u2502${RESET} `);
181
+ writeLine(` ${stats}`);
182
+ writeLine();
183
+ const w = { squad: 14, commits: 8, prs: 6, goals: 5, kpi: 20 };
184
+ const tableWidth = w.squad + w.commits + w.prs + w.goals + w.kpi + 8;
185
+ writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);
186
+ writeLine(` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd("SQUAD", w.squad)}${RESET}${bold}${padEnd("COMMITS", w.commits)}${RESET}${bold}${padEnd("PRs", w.prs)}${RESET}${bold}${padEnd("GOALS", w.goals)}${RESET}${bold}KEY METRIC${RESET} ${colors.purple}${box.vertical}${RESET}`);
187
+ writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);
188
+ for (const result of results) {
189
+ const keyMetric = result.goals.length > 0 ? result.goals[0].metrics[0] || "\u2014" : "\u2014";
190
+ const commitColor = result.commits > 0 ? colors.green : colors.dim;
191
+ const prColor = result.prsMerged > 0 ? colors.green : colors.dim;
192
+ const row = ` ${colors.purple}${box.vertical}${RESET} ${colors.cyan}${padEnd(result.name, w.squad)}${RESET}${commitColor}${padEnd(String(result.commits), w.commits)}${RESET}${prColor}${padEnd(String(result.prsMerged), w.prs)}${RESET}${padEnd(String(result.goals.length), w.goals)}${colors.dim}${truncate(keyMetric, w.kpi)}${RESET} ${colors.purple}${box.vertical}${RESET}`;
193
+ writeLine(row);
194
+ }
195
+ writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);
196
+ writeLine();
197
+ if (options.verbose || options.squad) {
198
+ writeLine(` ${bold}Goals & KPIs${RESET}`);
199
+ writeLine();
200
+ for (const result of results) {
201
+ if (result.goals.length === 0) continue;
202
+ writeLine(` ${colors.cyan}${result.name}${RESET}`);
203
+ for (const goal of result.goals) {
204
+ const statusIcon = goal.progress ? icons.progress : icons.empty;
205
+ writeLine(` ${statusIcon} ${truncate(goal.description, 55)}`);
206
+ if (goal.metrics.length > 0) {
207
+ const metricsStr = goal.metrics.map((m) => `${colors.purple}${m}${RESET}`).join(", ");
208
+ writeLine(` ${colors.dim}metrics:${RESET} ${metricsStr}`);
209
+ }
210
+ if (goal.progress) {
211
+ writeLine(` ${colors.dim}progress:${RESET} ${colors.green}${goal.progress}${RESET}`);
212
+ }
213
+ }
214
+ writeLine();
215
+ }
216
+ }
217
+ writeLine(` ${colors.dim}$${RESET} squads results ${colors.cyan}<squad>${RESET} -v ${colors.dim}Detailed squad KPIs${RESET}`);
218
+ writeLine(` ${colors.dim}$${RESET} squads goal progress ${colors.dim}Update goal progress${RESET}`);
219
+ writeLine();
220
+ }
221
+ export {
222
+ resultsCommand
223
+ };
224
+ //# sourceMappingURL=results-6TH33HPN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/results.ts"],"sourcesContent":["import { execSync } from 'child_process';\nimport { findSquadsDir, listSquads, loadSquad, Goal } from '../lib/squad-parser.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\ninterface SquadResults {\n name: string;\n commits: number;\n prsOpened: number;\n prsMerged: number;\n issuesClosed: number;\n goals: GoalWithMetrics[];\n}\n\ninterface GoalWithMetrics {\n description: string;\n metrics: string[];\n progress?: string;\n completed: boolean;\n actual?: Record<string, number | string>;\n}\n\n// Get git stats for the past week per squad\nfunction getGitStats(days: number = 7): Map<string, { commits: number; files: string[] }> {\n const stats = new Map<string, { commits: number; files: string[] }>();\n\n const squadKeywords: Record<string, string[]> = {\n website: ['agents-squads-web', 'website', 'homepage'],\n product: ['squads-cli', 'cli'],\n research: ['research'],\n engineering: ['engineering', '.agents'],\n intelligence: ['intelligence'],\n customer: ['customer'],\n finance: ['finance'],\n company: ['company'],\n marketing: ['marketing'],\n };\n\n try {\n const logOutput = execSync(\n `git log --since=\"${days} days ago\" --format=\"%s\" --name-only 2>/dev/null`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n\n if (!logOutput) return stats;\n\n const entries = logOutput.split('\\n\\n');\n for (const entry of entries) {\n const lines = entry.split('\\n').filter(l => l.trim());\n if (lines.length === 0) continue;\n\n const message = lines[0];\n const files = lines.slice(1);\n const msgLower = message.toLowerCase();\n\n // Detect squad\n let detectedSquad = 'other';\n for (const [squad, keywords] of Object.entries(squadKeywords)) {\n const inMessage = keywords.some(k => msgLower.includes(k));\n const inFiles = files.some(f =>\n keywords.some(k => f.toLowerCase().includes(k))\n );\n if (inMessage || inFiles) {\n detectedSquad = squad;\n break;\n }\n }\n\n if (!stats.has(detectedSquad)) {\n stats.set(detectedSquad, { commits: 0, files: [] });\n }\n const squadStats = stats.get(detectedSquad)!;\n squadStats.commits++;\n squadStats.files.push(...files);\n }\n } catch {\n // Not in git repo\n }\n\n return stats;\n}\n\n// Get GitHub stats via gh CLI\nfunction getGitHubStats(days: number = 7): {\n prsOpened: Map<string, number>;\n prsMerged: Map<string, number>;\n issuesClosed: Map<string, number>;\n} {\n const prsOpened = new Map<string, number>();\n const prsMerged = new Map<string, number>();\n const issuesClosed = new Map<string, number>();\n\n try {\n // Get PRs opened\n const prsOutput = execSync(\n `gh pr list --state all --json title,createdAt,mergedAt --limit 50 2>/dev/null`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n const prs = JSON.parse(prsOutput || '[]');\n const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000);\n\n for (const pr of prs) {\n const created = new Date(pr.createdAt);\n if (created < since) continue;\n\n const squad = detectSquadFromTitle(pr.title);\n prsOpened.set(squad, (prsOpened.get(squad) || 0) + 1);\n\n if (pr.mergedAt) {\n prsMerged.set(squad, (prsMerged.get(squad) || 0) + 1);\n }\n }\n\n // Get issues closed\n const issuesOutput = execSync(\n `gh issue list --state closed --json title,closedAt --limit 50 2>/dev/null`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n const issues = JSON.parse(issuesOutput || '[]');\n\n for (const issue of issues) {\n const closed = new Date(issue.closedAt);\n if (closed < since) continue;\n\n const squad = detectSquadFromTitle(issue.title);\n issuesClosed.set(squad, (issuesClosed.get(squad) || 0) + 1);\n }\n } catch {\n // gh not available or not in repo\n }\n\n return { prsOpened, prsMerged, issuesClosed };\n}\n\nfunction detectSquadFromTitle(title: string): string {\n const lower = title.toLowerCase();\n const mapping: Record<string, string[]> = {\n website: ['website', 'web', 'homepage', 'page'],\n product: ['cli', 'squads', 'command'],\n research: ['research', 'report'],\n engineering: ['infra', 'build', 'ci'],\n intelligence: ['intel', 'monitor'],\n customer: ['lead', 'customer'],\n finance: ['cost', 'finance'],\n marketing: ['marketing', 'content'],\n };\n\n for (const [squad, keywords] of Object.entries(mapping)) {\n if (keywords.some(k => lower.includes(k))) {\n return squad;\n }\n }\n return 'other';\n}\n\n// Parse metrics from goal description\nfunction parseMetrics(goal: Goal): string[] {\n const metrics: string[] = [];\n\n // Check for explicit metrics in goal\n if (goal.metrics && goal.metrics.length > 0) {\n return goal.metrics;\n }\n\n // Infer from description\n const desc = goal.description.toLowerCase();\n\n if (desc.includes('revenue')) metrics.push('revenue_usd');\n if (desc.includes('lead')) metrics.push('leads_count');\n if (desc.includes('traffic') || desc.includes('visit')) metrics.push('page_views');\n if (desc.includes('signup') || desc.includes('email')) metrics.push('signups');\n if (desc.includes('cost')) metrics.push('cost_usd');\n if (desc.includes('publish') || desc.includes('launch')) metrics.push('shipped');\n if (desc.includes('demo')) metrics.push('demos_booked');\n\n return metrics.length > 0 ? metrics : ['progress'];\n}\n\nexport async function resultsCommand(options: {\n squad?: string;\n days?: string;\n verbose?: boolean;\n} = {}): Promise<void> {\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 const days = parseInt(options.days || '7', 10);\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}results${RESET} ${colors.dim}(${days}d)${RESET}`);\n writeLine();\n\n const squadNames = options.squad ? [options.squad] : listSquads(squadsDir);\n const gitStats = getGitStats(days);\n const ghStats = getGitHubStats(days);\n\n const results: SquadResults[] = [];\n\n for (const name of squadNames) {\n const squad = loadSquad(name);\n if (!squad) continue;\n\n const git = gitStats.get(name) || { commits: 0, files: [] };\n const activeGoals = squad.goals.filter(g => !g.completed);\n\n results.push({\n name,\n commits: git.commits,\n prsOpened: ghStats.prsOpened.get(name) || 0,\n prsMerged: ghStats.prsMerged.get(name) || 0,\n issuesClosed: ghStats.issuesClosed.get(name) || 0,\n goals: activeGoals.map(g => ({\n description: g.description,\n metrics: parseMetrics(g),\n progress: g.progress,\n completed: g.completed,\n })),\n });\n }\n\n // Summary stats\n const totalCommits = results.reduce((sum, r) => sum + r.commits, 0);\n const totalPRs = results.reduce((sum, r) => sum + r.prsMerged, 0);\n const totalGoals = results.reduce((sum, r) => sum + r.goals.length, 0);\n\n const stats = [\n `${colors.cyan}${totalCommits}${RESET} commits`,\n `${colors.green}${totalPRs}${RESET} PRs merged`,\n `${colors.purple}${totalGoals}${RESET} active goals`,\n ].join(` ${colors.dim}│${RESET} `);\n writeLine(` ${stats}`);\n writeLine();\n\n // Results table\n const w = { squad: 14, commits: 8, prs: 6, goals: 5, kpi: 20 };\n const tableWidth = w.squad + w.commits + w.prs + w.goals + w.kpi + 8;\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.squad)}${RESET}` +\n `${bold}${padEnd('COMMITS', w.commits)}${RESET}` +\n `${bold}${padEnd('PRs', w.prs)}${RESET}` +\n `${bold}${padEnd('GOALS', w.goals)}${RESET}` +\n `${bold}KEY METRIC${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 for (const result of results) {\n const keyMetric = result.goals.length > 0\n ? result.goals[0].metrics[0] || '—'\n : '—';\n\n const commitColor = result.commits > 0 ? colors.green : colors.dim;\n const prColor = result.prsMerged > 0 ? colors.green : colors.dim;\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(result.name, w.squad)}${RESET}` +\n `${commitColor}${padEnd(String(result.commits), w.commits)}${RESET}` +\n `${prColor}${padEnd(String(result.prsMerged), w.prs)}${RESET}` +\n `${padEnd(String(result.goals.length), w.goals)}` +\n `${colors.dim}${truncate(keyMetric, w.kpi)}${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Goal details with KPIs\n if (options.verbose || options.squad) {\n writeLine(` ${bold}Goals & KPIs${RESET}`);\n writeLine();\n\n for (const result of results) {\n if (result.goals.length === 0) continue;\n\n writeLine(` ${colors.cyan}${result.name}${RESET}`);\n\n for (const goal of result.goals) {\n const statusIcon = goal.progress ? icons.progress : icons.empty;\n writeLine(` ${statusIcon} ${truncate(goal.description, 55)}`);\n\n // Show metrics\n if (goal.metrics.length > 0) {\n const metricsStr = goal.metrics.map(m => `${colors.purple}${m}${RESET}`).join(', ');\n writeLine(` ${colors.dim}metrics:${RESET} ${metricsStr}`);\n }\n\n // Show progress if any\n if (goal.progress) {\n writeLine(` ${colors.dim}progress:${RESET} ${colors.green}${goal.progress}${RESET}`);\n }\n }\n writeLine();\n }\n }\n\n // Help\n writeLine(` ${colors.dim}$${RESET} squads results ${colors.cyan}<squad>${RESET} -v ${colors.dim}Detailed squad KPIs${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads goal progress ${colors.dim}Update goal progress${RESET}`);\n writeLine();\n}\n"],"mappings":"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","names":[]}