@bradygaster/squad-cli 0.9.1 → 0.9.2-insider.6

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 (320) hide show
  1. package/README.md +329 -329
  2. package/dist/cli/commands/build.d.ts.map +1 -1
  3. package/dist/cli/commands/build.js +10 -10
  4. package/dist/cli/commands/build.js.map +1 -1
  5. package/dist/cli/commands/config.d.ts +12 -0
  6. package/dist/cli/commands/config.d.ts.map +1 -0
  7. package/dist/cli/commands/config.js +157 -0
  8. package/dist/cli/commands/config.js.map +1 -0
  9. package/dist/cli/commands/consult.d.ts.map +1 -1
  10. package/dist/cli/commands/consult.js +9 -4
  11. package/dist/cli/commands/consult.js.map +1 -1
  12. package/dist/cli/commands/copilot.d.ts.map +1 -1
  13. package/dist/cli/commands/copilot.js +8 -7
  14. package/dist/cli/commands/copilot.js.map +1 -1
  15. package/dist/cli/commands/doctor.d.ts.map +1 -1
  16. package/dist/cli/commands/doctor.js +50 -17
  17. package/dist/cli/commands/doctor.js.map +1 -1
  18. package/dist/cli/commands/economy.d.ts.map +1 -1
  19. package/dist/cli/commands/economy.js +3 -2
  20. package/dist/cli/commands/economy.js.map +1 -1
  21. package/dist/cli/commands/export.d.ts.map +1 -1
  22. package/dist/cli/commands/export.js +22 -16
  23. package/dist/cli/commands/export.js.map +1 -1
  24. package/dist/cli/commands/extract.d.ts.map +1 -1
  25. package/dist/cli/commands/extract.js +14 -10
  26. package/dist/cli/commands/extract.js.map +1 -1
  27. package/dist/cli/commands/import.d.ts.map +1 -1
  28. package/dist/cli/commands/import.js +21 -18
  29. package/dist/cli/commands/import.js.map +1 -1
  30. package/dist/cli/commands/init-remote.d.ts.map +1 -1
  31. package/dist/cli/commands/init-remote.js +7 -6
  32. package/dist/cli/commands/init-remote.js.map +1 -1
  33. package/dist/cli/commands/link.d.ts.map +1 -1
  34. package/dist/cli/commands/link.js +11 -10
  35. package/dist/cli/commands/link.js.map +1 -1
  36. package/dist/cli/commands/migrate.d.ts.map +1 -1
  37. package/dist/cli/commands/migrate.js +19 -18
  38. package/dist/cli/commands/migrate.js.map +1 -1
  39. package/dist/cli/commands/personal.d.ts.map +1 -1
  40. package/dist/cli/commands/personal.js +57 -65
  41. package/dist/cli/commands/personal.js.map +1 -1
  42. package/dist/cli/commands/plugin.d.ts.map +1 -1
  43. package/dist/cli/commands/plugin.js +8 -7
  44. package/dist/cli/commands/plugin.js.map +1 -1
  45. package/dist/cli/commands/rc.d.ts.map +1 -1
  46. package/dist/cli/commands/rc.js +19 -12
  47. package/dist/cli/commands/rc.js.map +1 -1
  48. package/dist/cli/commands/schedule.d.ts.map +1 -1
  49. package/dist/cli/commands/schedule.js +6 -5
  50. package/dist/cli/commands/schedule.js.map +1 -1
  51. package/dist/cli/commands/start.d.ts.map +1 -1
  52. package/dist/cli/commands/start.js +18 -11
  53. package/dist/cli/commands/start.js.map +1 -1
  54. package/dist/cli/commands/streams.d.ts.map +1 -1
  55. package/dist/cli/commands/streams.js +3 -2
  56. package/dist/cli/commands/streams.js.map +1 -1
  57. package/dist/cli/commands/upstream.d.ts.map +1 -1
  58. package/dist/cli/commands/upstream.js +23 -19
  59. package/dist/cli/commands/upstream.js.map +1 -1
  60. package/dist/cli/commands/watch/capabilities/board.d.ts +22 -0
  61. package/dist/cli/commands/watch/capabilities/board.d.ts.map +1 -0
  62. package/dist/cli/commands/watch/capabilities/board.js +121 -0
  63. package/dist/cli/commands/watch/capabilities/board.js.map +1 -0
  64. package/dist/cli/commands/watch/capabilities/budget-check.d.ts +29 -0
  65. package/dist/cli/commands/watch/capabilities/budget-check.d.ts.map +1 -0
  66. package/dist/cli/commands/watch/capabilities/budget-check.js +38 -0
  67. package/dist/cli/commands/watch/capabilities/budget-check.js.map +1 -0
  68. package/dist/cli/commands/watch/capabilities/circuit-breaker.d.ts +52 -0
  69. package/dist/cli/commands/watch/capabilities/circuit-breaker.d.ts.map +1 -0
  70. package/dist/cli/commands/watch/capabilities/circuit-breaker.js +152 -0
  71. package/dist/cli/commands/watch/capabilities/circuit-breaker.js.map +1 -0
  72. package/dist/cli/commands/watch/capabilities/decision-hygiene.d.ts +14 -0
  73. package/dist/cli/commands/watch/capabilities/decision-hygiene.d.ts.map +1 -0
  74. package/dist/cli/commands/watch/capabilities/decision-hygiene.js +72 -0
  75. package/dist/cli/commands/watch/capabilities/decision-hygiene.js.map +1 -0
  76. package/dist/cli/commands/watch/capabilities/execute.d.ts +33 -0
  77. package/dist/cli/commands/watch/capabilities/execute.d.ts.map +1 -0
  78. package/dist/cli/commands/watch/capabilities/execute.js +156 -0
  79. package/dist/cli/commands/watch/capabilities/execute.js.map +1 -0
  80. package/dist/cli/commands/watch/capabilities/health-check.d.ts +29 -0
  81. package/dist/cli/commands/watch/capabilities/health-check.d.ts.map +1 -0
  82. package/dist/cli/commands/watch/capabilities/health-check.js +139 -0
  83. package/dist/cli/commands/watch/capabilities/health-check.js.map +1 -0
  84. package/dist/cli/commands/watch/capabilities/heartbeat.d.ts +48 -0
  85. package/dist/cli/commands/watch/capabilities/heartbeat.d.ts.map +1 -0
  86. package/dist/cli/commands/watch/capabilities/heartbeat.js +115 -0
  87. package/dist/cli/commands/watch/capabilities/heartbeat.js.map +1 -0
  88. package/dist/cli/commands/watch/capabilities/index.d.ts +9 -0
  89. package/dist/cli/commands/watch/capabilities/index.d.ts.map +1 -0
  90. package/dist/cli/commands/watch/capabilities/index.js +40 -0
  91. package/dist/cli/commands/watch/capabilities/index.js.map +1 -0
  92. package/dist/cli/commands/watch/capabilities/lockfile.d.ts +30 -0
  93. package/dist/cli/commands/watch/capabilities/lockfile.d.ts.map +1 -0
  94. package/dist/cli/commands/watch/capabilities/lockfile.js +100 -0
  95. package/dist/cli/commands/watch/capabilities/lockfile.js.map +1 -0
  96. package/dist/cli/commands/watch/capabilities/machine-capabilities.d.ts +30 -0
  97. package/dist/cli/commands/watch/capabilities/machine-capabilities.d.ts.map +1 -0
  98. package/dist/cli/commands/watch/capabilities/machine-capabilities.js +103 -0
  99. package/dist/cli/commands/watch/capabilities/machine-capabilities.js.map +1 -0
  100. package/dist/cli/commands/watch/capabilities/monitor-email.d.ts +14 -0
  101. package/dist/cli/commands/watch/capabilities/monitor-email.d.ts.map +1 -0
  102. package/dist/cli/commands/watch/capabilities/monitor-email.js +54 -0
  103. package/dist/cli/commands/watch/capabilities/monitor-email.js.map +1 -0
  104. package/dist/cli/commands/watch/capabilities/monitor-teams.d.ts +14 -0
  105. package/dist/cli/commands/watch/capabilities/monitor-teams.d.ts.map +1 -0
  106. package/dist/cli/commands/watch/capabilities/monitor-teams.js +55 -0
  107. package/dist/cli/commands/watch/capabilities/monitor-teams.js.map +1 -0
  108. package/dist/cli/commands/watch/capabilities/post-failure.d.ts +19 -0
  109. package/dist/cli/commands/watch/capabilities/post-failure.d.ts.map +1 -0
  110. package/dist/cli/commands/watch/capabilities/post-failure.js +58 -0
  111. package/dist/cli/commands/watch/capabilities/post-failure.js.map +1 -0
  112. package/dist/cli/commands/watch/capabilities/priority.d.ts +59 -0
  113. package/dist/cli/commands/watch/capabilities/priority.d.ts.map +1 -0
  114. package/dist/cli/commands/watch/capabilities/priority.js +101 -0
  115. package/dist/cli/commands/watch/capabilities/priority.js.map +1 -0
  116. package/dist/cli/commands/watch/capabilities/rate-pool.d.ts +67 -0
  117. package/dist/cli/commands/watch/capabilities/rate-pool.d.ts.map +1 -0
  118. package/dist/cli/commands/watch/capabilities/rate-pool.js +187 -0
  119. package/dist/cli/commands/watch/capabilities/rate-pool.js.map +1 -0
  120. package/dist/cli/commands/watch/capabilities/retro.d.ts +14 -0
  121. package/dist/cli/commands/watch/capabilities/retro.d.ts.map +1 -0
  122. package/dist/cli/commands/watch/capabilities/retro.js +81 -0
  123. package/dist/cli/commands/watch/capabilities/retro.js.map +1 -0
  124. package/dist/cli/commands/watch/capabilities/self-pull.d.ts +14 -0
  125. package/dist/cli/commands/watch/capabilities/self-pull.d.ts.map +1 -0
  126. package/dist/cli/commands/watch/capabilities/self-pull.js +33 -0
  127. package/dist/cli/commands/watch/capabilities/self-pull.js.map +1 -0
  128. package/dist/cli/commands/watch/capabilities/stale-reclaim.d.ts +23 -0
  129. package/dist/cli/commands/watch/capabilities/stale-reclaim.d.ts.map +1 -0
  130. package/dist/cli/commands/watch/capabilities/stale-reclaim.js +87 -0
  131. package/dist/cli/commands/watch/capabilities/stale-reclaim.js.map +1 -0
  132. package/dist/cli/commands/watch/capabilities/two-pass.d.ts +14 -0
  133. package/dist/cli/commands/watch/capabilities/two-pass.d.ts.map +1 -0
  134. package/dist/cli/commands/watch/capabilities/two-pass.js +66 -0
  135. package/dist/cli/commands/watch/capabilities/two-pass.js.map +1 -0
  136. package/dist/cli/commands/watch/capabilities/wave-dispatch.d.ts +14 -0
  137. package/dist/cli/commands/watch/capabilities/wave-dispatch.d.ts.map +1 -0
  138. package/dist/cli/commands/watch/capabilities/wave-dispatch.js +117 -0
  139. package/dist/cli/commands/watch/capabilities/wave-dispatch.js.map +1 -0
  140. package/dist/cli/commands/watch/capabilities/webhook-alerts.d.ts +29 -0
  141. package/dist/cli/commands/watch/capabilities/webhook-alerts.d.ts.map +1 -0
  142. package/dist/cli/commands/watch/capabilities/webhook-alerts.js +114 -0
  143. package/dist/cli/commands/watch/capabilities/webhook-alerts.js.map +1 -0
  144. package/dist/cli/commands/watch/config.d.ts +40 -0
  145. package/dist/cli/commands/watch/config.d.ts.map +1 -0
  146. package/dist/cli/commands/watch/config.js +129 -0
  147. package/dist/cli/commands/watch/config.js.map +1 -0
  148. package/dist/cli/commands/watch/index.d.ts +109 -0
  149. package/dist/cli/commands/watch/index.d.ts.map +1 -0
  150. package/dist/cli/commands/watch/index.js +757 -0
  151. package/dist/cli/commands/watch/index.js.map +1 -0
  152. package/dist/cli/commands/watch/registry.d.ts +19 -0
  153. package/dist/cli/commands/watch/registry.d.ts.map +1 -0
  154. package/dist/cli/commands/watch/registry.js +28 -0
  155. package/dist/cli/commands/watch/registry.js.map +1 -0
  156. package/dist/cli/commands/watch/types.d.ts +57 -0
  157. package/dist/cli/commands/watch/types.d.ts.map +1 -0
  158. package/dist/cli/commands/watch/types.js +8 -0
  159. package/dist/cli/commands/watch/types.js.map +1 -0
  160. package/dist/cli/core/cast.d.ts.map +1 -1
  161. package/dist/cli/core/cast.js +15 -19
  162. package/dist/cli/core/cast.js.map +1 -1
  163. package/dist/cli/core/detect-squad-dir.d.ts.map +1 -1
  164. package/dist/cli/core/detect-squad-dir.js +12 -10
  165. package/dist/cli/core/detect-squad-dir.js.map +1 -1
  166. package/dist/cli/core/email-scrub.d.ts.map +1 -1
  167. package/dist/cli/core/email-scrub.js +12 -11
  168. package/dist/cli/core/email-scrub.js.map +1 -1
  169. package/dist/cli/core/gh-cli.d.ts +13 -0
  170. package/dist/cli/core/gh-cli.d.ts.map +1 -1
  171. package/dist/cli/core/gh-cli.js +24 -0
  172. package/dist/cli/core/gh-cli.js.map +1 -1
  173. package/dist/cli/core/init.d.ts +2 -0
  174. package/dist/cli/core/init.d.ts.map +1 -1
  175. package/dist/cli/core/init.js +22 -5
  176. package/dist/cli/core/init.js.map +1 -1
  177. package/dist/cli/core/migrate-directory.d.ts.map +1 -1
  178. package/dist/cli/core/migrate-directory.js +14 -13
  179. package/dist/cli/core/migrate-directory.js.map +1 -1
  180. package/dist/cli/core/migrations.d.ts.map +1 -1
  181. package/dist/cli/core/migrations.js +22 -8
  182. package/dist/cli/core/migrations.js.map +1 -1
  183. package/dist/cli/core/nap.d.ts.map +1 -1
  184. package/dist/cli/core/nap.js +116 -49
  185. package/dist/cli/core/nap.js.map +1 -1
  186. package/dist/cli/core/project-type.d.ts.map +1 -1
  187. package/dist/cli/core/project-type.js +11 -10
  188. package/dist/cli/core/project-type.js.map +1 -1
  189. package/dist/cli/core/team-md.d.ts.map +1 -1
  190. package/dist/cli/core/team-md.js +43 -38
  191. package/dist/cli/core/team-md.js.map +1 -1
  192. package/dist/cli/core/templates.d.ts.map +1 -1
  193. package/dist/cli/core/templates.js +4 -3
  194. package/dist/cli/core/templates.js.map +1 -1
  195. package/dist/cli/core/upgrade.d.ts.map +1 -1
  196. package/dist/cli/core/upgrade.js +68 -55
  197. package/dist/cli/core/upgrade.js.map +1 -1
  198. package/dist/cli/core/version.d.ts.map +1 -1
  199. package/dist/cli/core/version.js +8 -7
  200. package/dist/cli/core/version.js.map +1 -1
  201. package/dist/cli/index.d.ts +1 -1
  202. package/dist/cli/index.d.ts.map +1 -1
  203. package/dist/cli/index.js +1 -1
  204. package/dist/cli/index.js.map +1 -1
  205. package/dist/cli/self-update.d.ts.map +1 -1
  206. package/dist/cli/self-update.js +7 -4
  207. package/dist/cli/self-update.js.map +1 -1
  208. package/dist/cli/shell/agent-name-parser.d.ts +16 -0
  209. package/dist/cli/shell/agent-name-parser.d.ts.map +1 -0
  210. package/dist/cli/shell/agent-name-parser.js +54 -0
  211. package/dist/cli/shell/agent-name-parser.js.map +1 -0
  212. package/dist/cli/shell/commands.d.ts.map +1 -1
  213. package/dist/cli/shell/commands.js +4 -3
  214. package/dist/cli/shell/commands.js.map +1 -1
  215. package/dist/cli/shell/coordinator.d.ts +4 -1
  216. package/dist/cli/shell/coordinator.d.ts.map +1 -1
  217. package/dist/cli/shell/coordinator.js +29 -26
  218. package/dist/cli/shell/coordinator.js.map +1 -1
  219. package/dist/cli/shell/index.d.ts.map +1 -1
  220. package/dist/cli/shell/index.js +33 -35
  221. package/dist/cli/shell/index.js.map +1 -1
  222. package/dist/cli/shell/lifecycle.d.ts +13 -2
  223. package/dist/cli/shell/lifecycle.d.ts.map +1 -1
  224. package/dist/cli/shell/lifecycle.js +26 -13
  225. package/dist/cli/shell/lifecycle.js.map +1 -1
  226. package/dist/cli/shell/session-store.d.ts.map +1 -1
  227. package/dist/cli/shell/session-store.js +16 -12
  228. package/dist/cli/shell/session-store.js.map +1 -1
  229. package/dist/cli/shell/spawn.d.ts +4 -1
  230. package/dist/cli/shell/spawn.d.ts.map +1 -1
  231. package/dist/cli/shell/spawn.js +28 -10
  232. package/dist/cli/shell/spawn.js.map +1 -1
  233. package/dist/cli-entry.js +136 -12
  234. package/dist/cli-entry.js.map +1 -1
  235. package/package.json +8 -4
  236. package/scripts/patch-esm-imports.mjs +105 -105
  237. package/scripts/patch-ink-rendering.mjs +115 -115
  238. package/templates/casting/Futurama.json +9 -9
  239. package/templates/casting-history.json +4 -4
  240. package/templates/casting-policy.json +37 -37
  241. package/templates/casting-reference.md +104 -104
  242. package/templates/casting-registry.json +3 -3
  243. package/templates/ceremonies.md +41 -41
  244. package/templates/charter.md +53 -53
  245. package/templates/constraint-tracking.md +38 -38
  246. package/templates/cooperative-rate-limiting.md +229 -229
  247. package/templates/copilot-instructions.md +46 -46
  248. package/templates/history.md +10 -10
  249. package/templates/identity/now.md +9 -9
  250. package/templates/identity/wisdom.md +15 -15
  251. package/templates/issue-lifecycle.md +412 -412
  252. package/templates/keda-scaler.md +164 -164
  253. package/templates/machine-capabilities.md +74 -74
  254. package/templates/mcp-config.md +90 -90
  255. package/templates/multi-agent-format.md +28 -28
  256. package/templates/orchestration-log.md +27 -27
  257. package/templates/plugin-marketplace.md +49 -49
  258. package/templates/ralph-circuit-breaker.md +313 -313
  259. package/templates/raw-agent-output.md +37 -37
  260. package/templates/roster.md +60 -60
  261. package/templates/routing.md +39 -39
  262. package/templates/run-output.md +50 -50
  263. package/templates/scribe-charter.md +123 -119
  264. package/templates/skill.md +24 -24
  265. package/templates/skills/agent-collaboration/SKILL.md +42 -42
  266. package/templates/skills/agent-conduct/SKILL.md +24 -24
  267. package/templates/skills/architectural-proposals/SKILL.md +151 -151
  268. package/templates/skills/ci-validation-gates/SKILL.md +84 -84
  269. package/templates/skills/cli-wiring/SKILL.md +47 -47
  270. package/templates/skills/client-compatibility/SKILL.md +89 -89
  271. package/templates/skills/cross-machine-coordination/SKILL.md +434 -0
  272. package/templates/skills/cross-squad/SKILL.md +114 -114
  273. package/templates/skills/distributed-mesh/SKILL.md +287 -287
  274. package/templates/skills/distributed-mesh/mesh.json.example +30 -30
  275. package/templates/skills/distributed-mesh/sync-mesh.ps1 +111 -111
  276. package/templates/skills/distributed-mesh/sync-mesh.sh +104 -104
  277. package/templates/skills/docs-standards/SKILL.md +71 -71
  278. package/templates/skills/economy-mode/SKILL.md +114 -114
  279. package/templates/skills/error-recovery/SKILL.md +99 -0
  280. package/templates/skills/external-comms/SKILL.md +329 -329
  281. package/templates/skills/gh-auth-isolation/SKILL.md +183 -183
  282. package/templates/skills/git-workflow/SKILL.md +204 -204
  283. package/templates/skills/github-multi-account/SKILL.md +95 -95
  284. package/templates/skills/history-hygiene/SKILL.md +36 -36
  285. package/templates/skills/humanizer/SKILL.md +105 -105
  286. package/templates/skills/init-mode/SKILL.md +102 -102
  287. package/templates/skills/iterative-retrieval/SKILL.md +165 -0
  288. package/templates/skills/model-selection/SKILL.md +117 -117
  289. package/templates/skills/nap/SKILL.md +24 -24
  290. package/templates/skills/notification-routing/SKILL.md +105 -0
  291. package/templates/skills/personal-squad/SKILL.md +57 -57
  292. package/templates/skills/pr-screenshots/SKILL.md +149 -0
  293. package/templates/skills/ralph-two-pass-scan/SKILL.md +35 -0
  294. package/templates/skills/reflect/SKILL.md +229 -0
  295. package/templates/skills/release-process/SKILL.md +131 -423
  296. package/templates/skills/reskill/SKILL.md +92 -92
  297. package/templates/skills/retro-enforcement/SKILL.md +148 -0
  298. package/templates/skills/reviewer-protocol/SKILL.md +79 -79
  299. package/templates/skills/secret-handling/SKILL.md +200 -200
  300. package/templates/skills/session-recovery/SKILL.md +155 -155
  301. package/templates/skills/squad-conventions/SKILL.md +69 -69
  302. package/templates/skills/test-discipline/SKILL.md +37 -37
  303. package/templates/skills/tiered-memory/SKILL.md +234 -0
  304. package/templates/skills/windows-compatibility/SKILL.md +98 -74
  305. package/templates/{squad.agent.md → squad.agent.md.template} +1316 -1287
  306. package/templates/workflows/squad-ci.yml +24 -24
  307. package/templates/workflows/squad-docs.yml +54 -54
  308. package/templates/workflows/squad-heartbeat.yml +0 -4
  309. package/templates/workflows/squad-insider-release.yml +61 -61
  310. package/templates/workflows/squad-issue-assign.yml +161 -161
  311. package/templates/workflows/squad-label-enforce.yml +181 -181
  312. package/templates/workflows/squad-preview.yml +55 -55
  313. package/templates/workflows/squad-promote.yml +120 -120
  314. package/templates/workflows/squad-release.yml +77 -77
  315. package/templates/workflows/squad-triage.yml +260 -260
  316. package/templates/workflows/sync-squad-labels.yml +169 -169
  317. package/dist/cli/commands/watch.d.ts +0 -18
  318. package/dist/cli/commands/watch.d.ts.map +0 -1
  319. package/dist/cli/commands/watch.js +0 -306
  320. package/dist/cli/commands/watch.js.map +0 -1
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Stale work reclaim capability — find assigned issues with no activity
3
+ * and unassign them so they can be re-queued.
4
+ *
5
+ * Ported from ralph-watch.ps1 `Get-StaleIssues`.
6
+ *
7
+ * Runs in the `pre-scan` phase.
8
+ *
9
+ * Config (via squad.config.ts → watch.capabilities["stale-reclaim"]):
10
+ * staleHours – hours since last update to consider stale (default: 24)
11
+ * dryRun – log but don't actually unassign (default: false)
12
+ */
13
+ import { execFile } from 'node:child_process';
14
+ import { promisify } from 'node:util';
15
+ const execFileAsync = promisify(execFile);
16
+ export class StaleReclaimCapability {
17
+ name = 'stale-reclaim';
18
+ description = 'Reclaim issues assigned >24h with no activity';
19
+ configShape = 'object';
20
+ requires = ['gh'];
21
+ phase = 'pre-scan';
22
+ async preflight(_context) {
23
+ return { ok: true };
24
+ }
25
+ async execute(context) {
26
+ const config = context.config;
27
+ const staleHours = config['staleHours'] ?? 24;
28
+ const dryRun = config['dryRun'] ?? false;
29
+ const cutoff = new Date(Date.now() - staleHours * 60 * 60 * 1000);
30
+ let reclaimed = 0;
31
+ try {
32
+ // List open squad-labeled issues that have assignees
33
+ const { stdout } = await execFileAsync('gh', [
34
+ 'issue', 'list',
35
+ '--label', 'squad',
36
+ '--state', 'open',
37
+ '--json', 'number,title,assignees,updatedAt',
38
+ '--limit', '50',
39
+ ], { cwd: context.teamRoot, timeout: 30_000 });
40
+ const issues = JSON.parse(stdout);
41
+ for (const issue of issues) {
42
+ if (!issue.assignees || issue.assignees.length === 0)
43
+ continue;
44
+ const lastUpdate = new Date(issue.updatedAt);
45
+ if (lastUpdate >= cutoff)
46
+ continue;
47
+ const staleHrs = Math.round((Date.now() - lastUpdate.getTime()) / (1000 * 60 * 60));
48
+ if (dryRun) {
49
+ console.log(` [stale-reclaim] Would unassign #${issue.number} "${issue.title}" (stale ${staleHrs}h)`);
50
+ }
51
+ else {
52
+ try {
53
+ // Unassign all current assignees
54
+ for (const assignee of issue.assignees) {
55
+ await execFileAsync('gh', [
56
+ 'issue', 'edit', String(issue.number),
57
+ '--remove-assignee', assignee.login,
58
+ ], { cwd: context.teamRoot, timeout: 10_000 });
59
+ }
60
+ // Add a comment so there's an audit trail
61
+ await execFileAsync('gh', [
62
+ 'issue', 'comment', String(issue.number),
63
+ '--body', `🔄 Auto-reclaimed by watch (stale ${staleHrs}h, threshold ${staleHours}h). Re-queued for assignment.`,
64
+ ], { cwd: context.teamRoot, timeout: 10_000 });
65
+ reclaimed++;
66
+ }
67
+ catch {
68
+ // best-effort per issue
69
+ }
70
+ }
71
+ }
72
+ const mode = dryRun ? ' (dry-run)' : '';
73
+ return {
74
+ success: true,
75
+ summary: `${reclaimed} issue(s) reclaimed${mode}`,
76
+ data: { reclaimed },
77
+ };
78
+ }
79
+ catch (e) {
80
+ return {
81
+ success: false,
82
+ summary: `stale-reclaim failed: ${e.message}`,
83
+ };
84
+ }
85
+ }
86
+ }
87
+ //# sourceMappingURL=stale-reclaim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stale-reclaim.js","sourceRoot":"","sources":["../../../../../src/cli/commands/watch/capabilities/stale-reclaim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * TwoPass capability — lightweight list then hydrate actionable issues only.
3
+ */
4
+ import type { WatchCapability, WatchContext, PreflightResult, CapabilityResult } from '../types.js';
5
+ export declare class TwoPassCapability implements WatchCapability {
6
+ readonly name = "two-pass";
7
+ readonly description = "Lightweight scan then hydrate only actionable issues";
8
+ readonly configShape: "boolean";
9
+ readonly requires: string[];
10
+ readonly phase: "post-triage";
11
+ preflight(_context: WatchContext): Promise<PreflightResult>;
12
+ execute(context: WatchContext): Promise<CapabilityResult>;
13
+ }
14
+ //# sourceMappingURL=two-pass.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"two-pass.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/watch/capabilities/two-pass.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAWpG,qBAAa,iBAAkB,YAAW,eAAe;IACvD,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,WAAW,0DAA0D;IAC9E,QAAQ,CAAC,WAAW,EAAG,SAAS,CAAU;IAC1C,QAAQ,CAAC,QAAQ,WAAU;IAC3B,QAAQ,CAAC,KAAK,EAAG,aAAa,CAAU;IAElC,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;IAI3D,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA0ChE"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * TwoPass capability — lightweight list then hydrate actionable issues only.
3
+ */
4
+ import { execFile } from 'node:child_process';
5
+ import { promisify } from 'node:util';
6
+ const execFileAsync = promisify(execFile);
7
+ /** Labels that block autonomous execution. */
8
+ const BLOCKED_LABELS = new Set([
9
+ 'status:blocked', 'status:waiting-external', 'status:postponed',
10
+ 'status:scheduled', 'status:needs-action', 'status:needs-decision',
11
+ 'status:needs-review', 'pending-user', 'do-not-merge',
12
+ ]);
13
+ export class TwoPassCapability {
14
+ name = 'two-pass';
15
+ description = 'Lightweight scan then hydrate only actionable issues';
16
+ configShape = 'boolean';
17
+ requires = ['gh'];
18
+ phase = 'post-triage';
19
+ async preflight(_context) {
20
+ return { ok: true };
21
+ }
22
+ async execute(context) {
23
+ try {
24
+ const memberLabels = new Set(context.roster.map(m => m.label));
25
+ // Pass 1: lightweight list
26
+ const allItems = await context.adapter.listWorkItems({
27
+ tags: ['squad'], state: 'open', limit: 200,
28
+ });
29
+ const total = allItems.length;
30
+ // Filter to actionable
31
+ const actionable = allItems.filter(item => {
32
+ const labels = item.tags;
33
+ if (!labels.some(l => memberLabels.has(l)))
34
+ return false;
35
+ if (item.assignedTo)
36
+ return false;
37
+ if (labels.some(l => BLOCKED_LABELS.has(l)))
38
+ return false;
39
+ return true;
40
+ });
41
+ // Pass 2: hydrate actionable issues (fetch body + comments)
42
+ const hydrated = [];
43
+ for (const item of actionable) {
44
+ try {
45
+ const { stdout: detailJson } = await execFileAsync('gh', [
46
+ 'issue', 'view', String(item.id),
47
+ '--json', 'number,title,body,labels,assignees',
48
+ ], { maxBuffer: 5 * 1024 * 1024 });
49
+ hydrated.push(JSON.parse(detailJson));
50
+ }
51
+ catch {
52
+ hydrated.push({ number: item.id, title: item.title });
53
+ }
54
+ }
55
+ return {
56
+ success: true,
57
+ summary: `${total} total → ${hydrated.length} actionable (hydrated)`,
58
+ data: { total, actionable: hydrated.length, issues: hydrated },
59
+ };
60
+ }
61
+ catch (e) {
62
+ return { success: false, summary: `two-pass error: ${e.message}` };
63
+ }
64
+ }
65
+ }
66
+ //# sourceMappingURL=two-pass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"two-pass.js","sourceRoot":"","sources":["../../../../../src/cli/commands/watch/capabilities/two-pass.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * WaveDispatch capability — parallel sub-task execution within issues.
3
+ */
4
+ import type { WatchCapability, WatchContext, PreflightResult, CapabilityResult } from '../types.js';
5
+ export declare class WaveDispatchCapability implements WatchCapability {
6
+ readonly name = "wave-dispatch";
7
+ readonly description = "Wave-based parallel sub-task dispatch within issues";
8
+ readonly configShape: "boolean";
9
+ readonly requires: string[];
10
+ readonly phase: "post-execute";
11
+ preflight(_context: WatchContext): Promise<PreflightResult>;
12
+ execute(context: WatchContext): Promise<CapabilityResult>;
13
+ }
14
+ //# sourceMappingURL=wave-dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wave-dispatch.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/watch/capabilities/wave-dispatch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA+DpG,qBAAa,sBAAuB,YAAW,eAAe;IAC5D,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,WAAW,yDAAyD;IAC7E,QAAQ,CAAC,WAAW,EAAG,SAAS,CAAU;IAC1C,QAAQ,CAAC,QAAQ,WAAU;IAC3B,QAAQ,CAAC,KAAK,EAAG,cAAc,CAAU;IAEnC,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;IAI3D,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA6DhE"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * WaveDispatch capability — parallel sub-task execution within issues.
3
+ */
4
+ import { execFile } from 'node:child_process';
5
+ /** Parse sub-tasks from issue body markdown. */
6
+ function parseSubTasks(body) {
7
+ if (!body)
8
+ return [];
9
+ const lines = body.split('\n');
10
+ const tasks = [];
11
+ for (const line of lines) {
12
+ const match = line.match(/^[-*]\s+\[[ x]?\]\s+(.+)/i);
13
+ if (!match)
14
+ continue;
15
+ let description = match[1].trim();
16
+ let dependsOn = [];
17
+ const depMatch = description.match(/\(depends_on:\s*([^)]+)\)/i);
18
+ if (depMatch) {
19
+ dependsOn = depMatch[1].split(',').map(d => d.trim()).filter(Boolean);
20
+ description = description.replace(depMatch[0], '').trim();
21
+ }
22
+ tasks.push({ description, dependsOn });
23
+ }
24
+ return tasks;
25
+ }
26
+ function buildAgentCommand(prompt, context) {
27
+ if (context.agentCmd) {
28
+ const parts = context.agentCmd.trim().split(/\s+/);
29
+ return { cmd: parts[0], args: [...parts.slice(1), '--message', prompt] };
30
+ }
31
+ const args = ['copilot', '--message', prompt];
32
+ if (context.copilotFlags)
33
+ args.push(...context.copilotFlags.trim().split(/\s+/));
34
+ return { cmd: 'gh', args };
35
+ }
36
+ function executeSubTask(prompt, context, timeoutMs) {
37
+ const { cmd, args } = buildAgentCommand(prompt, context);
38
+ return new Promise((resolve) => {
39
+ const _cp = execFile(cmd, args, { cwd: context.teamRoot, timeout: timeoutMs, maxBuffer: 50 * 1024 * 1024 }, (err) => {
40
+ if (err) {
41
+ const execErr = err;
42
+ resolve({ success: false, error: execErr.killed ? 'Timed out' : execErr.message });
43
+ }
44
+ else {
45
+ resolve({ success: true });
46
+ }
47
+ });
48
+ });
49
+ }
50
+ export class WaveDispatchCapability {
51
+ name = 'wave-dispatch';
52
+ description = 'Wave-based parallel sub-task dispatch within issues';
53
+ configShape = 'boolean';
54
+ requires = ['gh'];
55
+ phase = 'post-execute';
56
+ async preflight(_context) {
57
+ return { ok: true };
58
+ }
59
+ async execute(context) {
60
+ try {
61
+ const maxConcurrent = context.config['maxConcurrent'] ?? 1;
62
+ const timeoutMs = (context.config['timeout'] ?? 30) * 60_000;
63
+ // Get issues from two-pass data if available, otherwise fetch
64
+ const sdkItems = await context.adapter.listWorkItems({ tags: ['squad'], state: 'open', limit: 50 });
65
+ let executed = 0;
66
+ let failed = 0;
67
+ for (const item of sdkItems) {
68
+ const subTasks = parseSubTasks(undefined); // Body not available from list; skip sub-tasks for items without body
69
+ if (subTasks.length === 0)
70
+ continue;
71
+ const completed = new Set();
72
+ const remaining = new Map(subTasks.map((t, i) => [`task-${i}`, t]));
73
+ let waveNum = 0;
74
+ while (remaining.size > 0) {
75
+ waveNum++;
76
+ const wave = [];
77
+ for (const [id, task] of remaining) {
78
+ if (task.dependsOn.every(dep => completed.has(dep)))
79
+ wave.push([id, task]);
80
+ }
81
+ if (wave.length === 0) {
82
+ // Circular dep — execute remaining sequentially
83
+ for (const [id] of remaining)
84
+ completed.add(id);
85
+ break;
86
+ }
87
+ for (let i = 0; i < wave.length; i += maxConcurrent) {
88
+ const batch = wave.slice(i, i + maxConcurrent);
89
+ const results = await Promise.all(batch.map(([, task]) => {
90
+ const prompt = `Work on sub-task of #${item.id}: ${task.description}`;
91
+ return executeSubTask(prompt, context, timeoutMs);
92
+ }));
93
+ for (const r of results) {
94
+ if (r.success)
95
+ executed++;
96
+ else
97
+ failed++;
98
+ }
99
+ }
100
+ for (const [id] of wave) {
101
+ completed.add(id);
102
+ remaining.delete(id);
103
+ }
104
+ }
105
+ }
106
+ return {
107
+ success: true,
108
+ summary: `wave dispatch: ${executed} succeeded, ${failed} failed`,
109
+ data: { executed, failed },
110
+ };
111
+ }
112
+ catch (e) {
113
+ return { success: false, summary: `wave dispatch error: ${e.message}` };
114
+ }
115
+ }
116
+ }
117
+ //# sourceMappingURL=wave-dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wave-dispatch.js","sourceRoot":"","sources":["../../../../../src/cli/commands/watch/capabilities/wave-dispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Webhook alerts capability — POST to a webhook URL on consecutive failures.
3
+ *
4
+ * Ported from ralph-watch.ps1 Teams alert logic in `Invoke-PostFailureRemediation`.
5
+ * Org-agnostic: works with any webhook that accepts JSON POST (Slack, Discord,
6
+ * Teams Incoming Webhook, generic HTTP endpoint).
7
+ *
8
+ * Runs in the `housekeeping` phase.
9
+ *
10
+ * Config (via squad.config.ts → watch.capabilities["webhook-alerts"]):
11
+ * webhookUrl – URL to POST to (also settable via --webhook-url flag)
12
+ * alertThreshold – consecutive failures before alerting (default: 3, also --alert-threshold)
13
+ * includeHostname – include machine hostname in payload (default: true)
14
+ *
15
+ * CLI flags:
16
+ * --webhook-url <url> Override webhook URL
17
+ * --alert-threshold <n> Override failure threshold
18
+ */
19
+ import type { WatchCapability, WatchContext, PreflightResult, CapabilityResult } from '../types.js';
20
+ export declare class WebhookAlertCapability implements WatchCapability {
21
+ readonly name = "webhook-alerts";
22
+ readonly description = "POST to webhook on consecutive failures above threshold";
23
+ readonly configShape: "object";
24
+ readonly requires: never[];
25
+ readonly phase: "housekeeping";
26
+ preflight(context: WatchContext): Promise<PreflightResult>;
27
+ execute(context: WatchContext): Promise<CapabilityResult>;
28
+ }
29
+ //# sourceMappingURL=webhook-alerts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-alerts.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/watch/capabilities/webhook-alerts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpG,qBAAa,sBAAuB,YAAW,eAAe;IAC5D,QAAQ,CAAC,IAAI,oBAAoB;IACjC,QAAQ,CAAC,WAAW,6DAA6D;IACjF,QAAQ,CAAC,WAAW,EAAG,QAAQ,CAAU;IACzC,QAAQ,CAAC,QAAQ,UAAM;IACvB,QAAQ,CAAC,KAAK,EAAG,cAAc,CAAU;IAEnC,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;IAS1D,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAkFhE"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Webhook alerts capability — POST to a webhook URL on consecutive failures.
3
+ *
4
+ * Ported from ralph-watch.ps1 Teams alert logic in `Invoke-PostFailureRemediation`.
5
+ * Org-agnostic: works with any webhook that accepts JSON POST (Slack, Discord,
6
+ * Teams Incoming Webhook, generic HTTP endpoint).
7
+ *
8
+ * Runs in the `housekeeping` phase.
9
+ *
10
+ * Config (via squad.config.ts → watch.capabilities["webhook-alerts"]):
11
+ * webhookUrl – URL to POST to (also settable via --webhook-url flag)
12
+ * alertThreshold – consecutive failures before alerting (default: 3, also --alert-threshold)
13
+ * includeHostname – include machine hostname in payload (default: true)
14
+ *
15
+ * CLI flags:
16
+ * --webhook-url <url> Override webhook URL
17
+ * --alert-threshold <n> Override failure threshold
18
+ */
19
+ import * as os from 'node:os';
20
+ import { getConsecutiveFailures } from './heartbeat.js';
21
+ export class WebhookAlertCapability {
22
+ name = 'webhook-alerts';
23
+ description = 'POST to webhook on consecutive failures above threshold';
24
+ configShape = 'object';
25
+ requires = [];
26
+ phase = 'housekeeping';
27
+ async preflight(context) {
28
+ const config = context.config;
29
+ const url = config['webhookUrl'];
30
+ if (!url) {
31
+ return { ok: false, reason: 'No webhookUrl configured (use --webhook-url or config)' };
32
+ }
33
+ return { ok: true };
34
+ }
35
+ async execute(context) {
36
+ const config = context.config;
37
+ const webhookUrl = config['webhookUrl'];
38
+ const threshold = config['alertThreshold'] ?? 3;
39
+ const includeHostname = config['includeHostname'] ?? true;
40
+ const failures = getConsecutiveFailures();
41
+ if (failures < threshold) {
42
+ return {
43
+ success: true,
44
+ summary: `${failures} failure(s) — below threshold (${threshold})`,
45
+ };
46
+ }
47
+ // Build generic JSON payload (works with Slack, Discord, Teams, etc.)
48
+ const hostname = includeHostname ? os.hostname() : 'unknown';
49
+ const payload = {
50
+ text: `🚨 Squad Watch Alert: ${failures} consecutive failures on ${hostname} (round ${context.round})`,
51
+ // Slack-compatible fields
52
+ blocks: [
53
+ {
54
+ type: 'section',
55
+ text: {
56
+ type: 'mrkdwn',
57
+ text: `*🚨 Squad Watch Alert*\n${failures} consecutive failures`,
58
+ },
59
+ },
60
+ {
61
+ type: 'section',
62
+ fields: [
63
+ { type: 'mrkdwn', text: `*Machine:* ${hostname}` },
64
+ { type: 'mrkdwn', text: `*Round:* ${context.round}` },
65
+ { type: 'mrkdwn', text: `*Failures:* ${failures}` },
66
+ { type: 'mrkdwn', text: `*Timestamp:* ${new Date().toISOString()}` },
67
+ ],
68
+ },
69
+ ],
70
+ // Teams-compatible fields (MessageCard format)
71
+ '@type': 'MessageCard',
72
+ '@context': 'https://schema.org/extensions',
73
+ summary: `Squad Watch: ${failures} consecutive failures on ${hostname}`,
74
+ themeColor: 'FF0000',
75
+ title: `🚨 Squad Watch Alert — ${hostname}`,
76
+ sections: [
77
+ {
78
+ activityTitle: `${failures} consecutive failures detected`,
79
+ facts: [
80
+ { name: 'Machine', value: hostname },
81
+ { name: 'Round', value: String(context.round) },
82
+ { name: 'Consecutive Failures', value: String(failures) },
83
+ { name: 'Timestamp', value: new Date().toISOString() },
84
+ ],
85
+ },
86
+ ],
87
+ };
88
+ try {
89
+ const response = await fetch(webhookUrl, {
90
+ method: 'POST',
91
+ headers: { 'Content-Type': 'application/json' },
92
+ body: JSON.stringify(payload),
93
+ signal: AbortSignal.timeout(10_000),
94
+ });
95
+ if (!response.ok) {
96
+ return {
97
+ success: false,
98
+ summary: `Webhook POST failed: ${response.status} ${response.statusText}`,
99
+ };
100
+ }
101
+ return {
102
+ success: true,
103
+ summary: `Alert sent (${failures} failures, threshold ${threshold})`,
104
+ };
105
+ }
106
+ catch (e) {
107
+ return {
108
+ success: false,
109
+ summary: `Webhook error: ${e.message}`,
110
+ };
111
+ }
112
+ }
113
+ }
114
+ //# sourceMappingURL=webhook-alerts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-alerts.js","sourceRoot":"","sources":["../../../../../src/cli/commands/watch/capabilities/webhook-alerts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,OAAO,sBAAsB;IACxB,IAAI,GAAG,gBAAgB,CAAC;IACxB,WAAW,GAAG,yDAAyD,CAAC;IACxE,WAAW,GAAG,QAAiB,CAAC;IAChC,QAAQ,GAAG,EAAE,CAAC;IACd,KAAK,GAAG,cAAuB,CAAC;IAEzC,KAAK,CAAC,SAAS,CAAC,OAAqB;QACnC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAiC,CAAC;QACzD,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAuB,CAAC;QACvD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,wDAAwD,EAAE,CAAC;QACzF,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAqB;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAiC,CAAC;QACzD,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAW,CAAC;QAClD,MAAM,SAAS,GAAI,MAAM,CAAC,gBAAgB,CAAY,IAAI,CAAC,CAAC;QAC5D,MAAM,eAAe,GAAI,MAAM,CAAC,iBAAiB,CAAa,IAAI,IAAI,CAAC;QACvE,MAAM,QAAQ,GAAG,sBAAsB,EAAE,CAAC;QAE1C,IAAI,QAAQ,GAAG,SAAS,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,GAAG,QAAQ,kCAAkC,SAAS,GAAG;aACnE,CAAC;QACJ,CAAC;QAED,sEAAsE;QACtE,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7D,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,yBAAyB,QAAQ,4BAA4B,QAAQ,WAAW,OAAO,CAAC,KAAK,GAAG;YACtG,0BAA0B;YAC1B,MAAM,EAAE;gBACN;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,2BAA2B,QAAQ,uBAAuB;qBACjE;iBACF;gBACD;oBACE,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE;wBACN,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,QAAQ,EAAE,EAAE;wBAClD,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,OAAO,CAAC,KAAK,EAAE,EAAE;wBACrD,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,QAAQ,EAAE,EAAE;wBACnD,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE;qBACrE;iBACF;aACF;YACD,+CAA+C;YAC/C,OAAO,EAAE,aAAa;YACtB,UAAU,EAAE,+BAA+B;YAC3C,OAAO,EAAE,gBAAgB,QAAQ,4BAA4B,QAAQ,EAAE;YACvE,UAAU,EAAE,QAAQ;YACpB,KAAK,EAAE,0BAA0B,QAAQ,EAAE;YAC3C,QAAQ,EAAE;gBACR;oBACE,aAAa,EAAE,GAAG,QAAQ,gCAAgC;oBAC1D,KAAK,EAAE;wBACL,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;wBACpC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;wBAC/C,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE;wBACzD,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;qBACvD;iBACF;aACF;SACF,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE;gBACvC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;aACpC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,wBAAwB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE;iBAC1E,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,eAAe,QAAQ,wBAAwB,SAAS,GAAG;aACrE,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,kBAAmB,CAAW,CAAC,OAAO,EAAE;aAClD,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Watch config loader.
3
+ *
4
+ * Priority: CLI flag > .squad/config.json "watch" section > defaults.
5
+ */
6
+ /** Fully-resolved watch configuration. */
7
+ export interface WatchConfig {
8
+ interval: number;
9
+ execute: boolean;
10
+ maxConcurrent: number;
11
+ timeout: number;
12
+ copilotFlags?: string;
13
+ /** Hidden — fully override the agent command. */
14
+ agentCmd?: string;
15
+ /** Per-capability config: `true` / `false` / object with sub-options. */
16
+ capabilities: Record<string, boolean | Record<string, unknown>>;
17
+ /** Webhook URL for failure alerts. */
18
+ webhookUrl?: string;
19
+ /** Consecutive failures before webhook alert (default: 3). */
20
+ alertThreshold?: number;
21
+ /** Max issues to execute per round (default: 5). */
22
+ maxBudget?: number;
23
+ /** Explicit machine capabilities list (e.g., ["gpu", "docker"]). */
24
+ machineCapabilities?: string[];
25
+ /** Cooperative rate pool settings for multi-instance coordination. */
26
+ ratePool?: {
27
+ /** Max API calls per interval window (default: 50). */
28
+ maxCallsPerInterval: number;
29
+ /** Interval window in seconds (default: 600). */
30
+ intervalSeconds: number;
31
+ };
32
+ }
33
+ /**
34
+ * Load watch config from `.squad/config.json` then merge CLI overrides.
35
+ *
36
+ * @param teamRoot - Root directory containing `.squad/`.
37
+ * @param cliOverrides - Values from CLI flag parsing (only set keys win).
38
+ */
39
+ export declare function loadWatchConfig(teamRoot: string, cliOverrides: Partial<WatchConfig>): WatchConfig;
40
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/watch/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,0CAA0C;AAC1C,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEhE,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,sEAAsE;IACtE,QAAQ,CAAC,EAAE;QACT,uDAAuD;QACvD,mBAAmB,EAAE,MAAM,CAAC;QAC5B,iDAAiD;QACjD,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAgBD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,OAAO,CAAC,WAAW,CAAC,GACjC,WAAW,CAuDb"}