@bradygaster/squad-sdk 0.9.1 → 0.9.2-insider.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 (285) hide show
  1. package/README.md +340 -296
  2. package/dist/agents/history-shadow.d.ts +7 -5
  3. package/dist/agents/history-shadow.d.ts.map +1 -1
  4. package/dist/agents/history-shadow.js +69 -78
  5. package/dist/agents/history-shadow.js.map +1 -1
  6. package/dist/agents/index.d.ts +12 -1
  7. package/dist/agents/index.d.ts.map +1 -1
  8. package/dist/agents/index.js +62 -9
  9. package/dist/agents/index.js.map +1 -1
  10. package/dist/agents/lifecycle.d.ts +4 -0
  11. package/dist/agents/lifecycle.d.ts.map +1 -1
  12. package/dist/agents/lifecycle.js +6 -7
  13. package/dist/agents/lifecycle.js.map +1 -1
  14. package/dist/agents/onboarding.d.ts +4 -2
  15. package/dist/agents/onboarding.d.ts.map +1 -1
  16. package/dist/agents/onboarding.js +26 -16
  17. package/dist/agents/onboarding.js.map +1 -1
  18. package/dist/agents/personal.d.ts +2 -1
  19. package/dist/agents/personal.d.ts.map +1 -1
  20. package/dist/agents/personal.js +11 -12
  21. package/dist/agents/personal.js.map +1 -1
  22. package/dist/build/bundle.d.ts.map +1 -1
  23. package/dist/build/bundle.js +6 -6
  24. package/dist/build/bundle.js.map +1 -1
  25. package/dist/build/github-dist.js +42 -42
  26. package/dist/build/release.d.ts.map +1 -1
  27. package/dist/build/release.js +7 -5
  28. package/dist/build/release.js.map +1 -1
  29. package/dist/casting/index.d.ts.map +1 -1
  30. package/dist/casting/index.js +4 -3
  31. package/dist/casting/index.js.map +1 -1
  32. package/dist/config/agent-source.d.ts +5 -1
  33. package/dist/config/agent-source.d.ts.map +1 -1
  34. package/dist/config/agent-source.js +85 -41
  35. package/dist/config/agent-source.js.map +1 -1
  36. package/dist/config/init.d.ts +4 -3
  37. package/dist/config/init.d.ts.map +1 -1
  38. package/dist/config/init.js +257 -236
  39. package/dist/config/init.js.map +1 -1
  40. package/dist/config/legacy-fallback.d.ts +3 -2
  41. package/dist/config/legacy-fallback.d.ts.map +1 -1
  42. package/dist/config/legacy-fallback.js +16 -14
  43. package/dist/config/legacy-fallback.js.map +1 -1
  44. package/dist/config/models.d.ts +9 -6
  45. package/dist/config/models.d.ts.map +1 -1
  46. package/dist/config/models.js +35 -25
  47. package/dist/config/models.js.map +1 -1
  48. package/dist/index.d.ts +5 -1
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +14 -1
  51. package/dist/index.js.map +1 -1
  52. package/dist/marketplace/packaging.d.ts.map +1 -1
  53. package/dist/marketplace/packaging.js +18 -16
  54. package/dist/marketplace/packaging.js.map +1 -1
  55. package/dist/multi-squad.d.ts.map +1 -1
  56. package/dist/multi-squad.js +10 -9
  57. package/dist/multi-squad.js.map +1 -1
  58. package/dist/platform/comms-file-log.d.ts.map +1 -1
  59. package/dist/platform/comms-file-log.js +7 -6
  60. package/dist/platform/comms-file-log.js.map +1 -1
  61. package/dist/platform/comms.d.ts.map +1 -1
  62. package/dist/platform/comms.js +6 -5
  63. package/dist/platform/comms.js.map +1 -1
  64. package/dist/platform/index.d.ts.map +1 -1
  65. package/dist/platform/index.js +4 -3
  66. package/dist/platform/index.js.map +1 -1
  67. package/dist/ralph/capabilities.d.ts +30 -1
  68. package/dist/ralph/capabilities.d.ts.map +1 -1
  69. package/dist/ralph/capabilities.js +51 -6
  70. package/dist/ralph/capabilities.js.map +1 -1
  71. package/dist/ralph/index.d.ts +1 -1
  72. package/dist/ralph/index.d.ts.map +1 -1
  73. package/dist/ralph/index.js +4 -3
  74. package/dist/ralph/index.js.map +1 -1
  75. package/dist/ralph/rate-limiting.d.ts.map +1 -1
  76. package/dist/ralph/rate-limiting.js +4 -4
  77. package/dist/ralph/rate-limiting.js.map +1 -1
  78. package/dist/remote/bridge.d.ts.map +1 -1
  79. package/dist/remote/bridge.js +2 -2
  80. package/dist/remote/bridge.js.map +1 -1
  81. package/dist/resolution.d.ts +9 -0
  82. package/dist/resolution.d.ts.map +1 -1
  83. package/dist/resolution.js +39 -16
  84. package/dist/resolution.js.map +1 -1
  85. package/dist/roles/catalog.d.ts +1 -1
  86. package/dist/runtime/config.d.ts.map +1 -1
  87. package/dist/runtime/config.js +8 -7
  88. package/dist/runtime/config.js.map +1 -1
  89. package/dist/runtime/cross-squad.d.ts.map +1 -1
  90. package/dist/runtime/cross-squad.js +8 -7
  91. package/dist/runtime/cross-squad.js.map +1 -1
  92. package/dist/runtime/scheduler.d.ts.map +1 -1
  93. package/dist/runtime/scheduler.js +8 -8
  94. package/dist/runtime/scheduler.js.map +1 -1
  95. package/dist/runtime/squad-observer.d.ts.map +1 -1
  96. package/dist/runtime/squad-observer.js +7 -4
  97. package/dist/runtime/squad-observer.js.map +1 -1
  98. package/dist/sharing/consult.d.ts +1 -1
  99. package/dist/sharing/consult.d.ts.map +1 -1
  100. package/dist/sharing/consult.js +144 -142
  101. package/dist/sharing/consult.js.map +1 -1
  102. package/dist/sharing/export.d.ts.map +1 -1
  103. package/dist/sharing/export.js +16 -16
  104. package/dist/sharing/export.js.map +1 -1
  105. package/dist/sharing/import.d.ts.map +1 -1
  106. package/dist/sharing/import.js +13 -12
  107. package/dist/sharing/import.js.map +1 -1
  108. package/dist/skills/skill-loader.d.ts.map +1 -1
  109. package/dist/skills/skill-loader.js +10 -9
  110. package/dist/skills/skill-loader.js.map +1 -1
  111. package/dist/skills/skill-script-loader.d.ts.map +1 -1
  112. package/dist/skills/skill-script-loader.js +6 -4
  113. package/dist/skills/skill-script-loader.js.map +1 -1
  114. package/dist/skills/skill-source.d.ts +3 -1
  115. package/dist/skills/skill-source.d.ts.map +1 -1
  116. package/dist/skills/skill-source.js +18 -16
  117. package/dist/skills/skill-source.js.map +1 -1
  118. package/dist/state/collection-map.d.ts +43 -0
  119. package/dist/state/collection-map.d.ts.map +1 -0
  120. package/dist/state/collection-map.js +9 -0
  121. package/dist/state/collection-map.js.map +1 -0
  122. package/dist/state/collections.d.ts +102 -0
  123. package/dist/state/collections.d.ts.map +1 -0
  124. package/dist/state/collections.js +317 -0
  125. package/dist/state/collections.js.map +1 -0
  126. package/dist/state/domain-types.d.ts +122 -0
  127. package/dist/state/domain-types.d.ts.map +1 -0
  128. package/dist/state/domain-types.js +54 -0
  129. package/dist/state/domain-types.js.map +1 -0
  130. package/dist/state/handles.d.ts +16 -0
  131. package/dist/state/handles.d.ts.map +1 -0
  132. package/dist/state/handles.js +161 -0
  133. package/dist/state/handles.js.map +1 -0
  134. package/dist/state/index.d.ts +17 -0
  135. package/dist/state/index.d.ts.map +1 -0
  136. package/dist/state/index.js +15 -0
  137. package/dist/state/index.js.map +1 -0
  138. package/dist/state/io/charter-io.d.ts +28 -0
  139. package/dist/state/io/charter-io.d.ts.map +1 -0
  140. package/dist/state/io/charter-io.js +94 -0
  141. package/dist/state/io/charter-io.js.map +1 -0
  142. package/dist/state/io/decisions-io.d.ts +42 -0
  143. package/dist/state/io/decisions-io.d.ts.map +1 -0
  144. package/dist/state/io/decisions-io.js +66 -0
  145. package/dist/state/io/decisions-io.js.map +1 -0
  146. package/dist/state/io/history-io.d.ts +37 -0
  147. package/dist/state/io/history-io.d.ts.map +1 -0
  148. package/dist/state/io/history-io.js +102 -0
  149. package/dist/state/io/history-io.js.map +1 -0
  150. package/dist/state/io/index.d.ts +19 -0
  151. package/dist/state/io/index.d.ts.map +1 -0
  152. package/dist/state/io/index.js +19 -0
  153. package/dist/state/io/index.js.map +1 -0
  154. package/dist/state/io/routing-io.d.ts +37 -0
  155. package/dist/state/io/routing-io.d.ts.map +1 -0
  156. package/dist/state/io/routing-io.js +99 -0
  157. package/dist/state/io/routing-io.js.map +1 -0
  158. package/dist/state/io/team-io.d.ts +46 -0
  159. package/dist/state/io/team-io.d.ts.map +1 -0
  160. package/dist/state/io/team-io.js +82 -0
  161. package/dist/state/io/team-io.js.map +1 -0
  162. package/dist/state/schema.d.ts +24 -0
  163. package/dist/state/schema.d.ts.map +1 -0
  164. package/dist/state/schema.js +41 -0
  165. package/dist/state/schema.js.map +1 -0
  166. package/dist/state/squad-state.d.ts +42 -0
  167. package/dist/state/squad-state.d.ts.map +1 -0
  168. package/dist/state/squad-state.js +68 -0
  169. package/dist/state/squad-state.js.map +1 -0
  170. package/dist/storage/fs-storage-provider.d.ts +60 -0
  171. package/dist/storage/fs-storage-provider.d.ts.map +1 -0
  172. package/dist/storage/fs-storage-provider.js +377 -0
  173. package/dist/storage/fs-storage-provider.js.map +1 -0
  174. package/dist/storage/in-memory-storage-provider.d.ts +46 -0
  175. package/dist/storage/in-memory-storage-provider.d.ts.map +1 -0
  176. package/dist/storage/in-memory-storage-provider.js +264 -0
  177. package/dist/storage/in-memory-storage-provider.js.map +1 -0
  178. package/dist/storage/index.d.ts +6 -0
  179. package/dist/storage/index.d.ts.map +1 -0
  180. package/dist/storage/index.js +5 -0
  181. package/dist/storage/index.js.map +1 -0
  182. package/dist/storage/sqlite-storage-provider.d.ts +95 -0
  183. package/dist/storage/sqlite-storage-provider.d.ts.map +1 -0
  184. package/dist/storage/sqlite-storage-provider.js +383 -0
  185. package/dist/storage/sqlite-storage-provider.js.map +1 -0
  186. package/dist/storage/storage-error.d.ts +28 -0
  187. package/dist/storage/storage-error.d.ts.map +1 -0
  188. package/dist/storage/storage-error.js +35 -0
  189. package/dist/storage/storage-error.js.map +1 -0
  190. package/dist/storage/storage-provider.d.ts +161 -0
  191. package/dist/storage/storage-provider.d.ts.map +1 -0
  192. package/dist/storage/storage-provider.js +18 -0
  193. package/dist/storage/storage-provider.js.map +1 -0
  194. package/dist/streams/resolver.d.ts.map +1 -1
  195. package/dist/streams/resolver.js +6 -5
  196. package/dist/streams/resolver.js.map +1 -1
  197. package/dist/tools/index.d.ts +5 -1
  198. package/dist/tools/index.d.ts.map +1 -1
  199. package/dist/tools/index.js +54 -15
  200. package/dist/tools/index.js.map +1 -1
  201. package/dist/upstream/resolver.d.ts +3 -2
  202. package/dist/upstream/resolver.d.ts.map +1 -1
  203. package/dist/upstream/resolver.js +33 -32
  204. package/dist/upstream/resolver.js.map +1 -1
  205. package/package.json +33 -1
  206. package/templates/casting/Futurama.json +9 -9
  207. package/templates/casting-history.json +4 -4
  208. package/templates/casting-policy.json +37 -37
  209. package/templates/casting-reference.md +104 -104
  210. package/templates/casting-registry.json +3 -3
  211. package/templates/ceremonies.md +41 -41
  212. package/templates/charter.md +53 -53
  213. package/templates/constraint-tracking.md +38 -38
  214. package/templates/cooperative-rate-limiting.md +229 -229
  215. package/templates/copilot-instructions.md +46 -46
  216. package/templates/history.md +10 -10
  217. package/templates/identity/now.md +9 -9
  218. package/templates/identity/wisdom.md +15 -15
  219. package/templates/issue-lifecycle.md +412 -412
  220. package/templates/keda-scaler.md +164 -164
  221. package/templates/machine-capabilities.md +74 -74
  222. package/templates/mcp-config.md +90 -90
  223. package/templates/multi-agent-format.md +28 -28
  224. package/templates/plugin-marketplace.md +49 -49
  225. package/templates/ralph-circuit-breaker.md +313 -313
  226. package/templates/raw-agent-output.md +37 -37
  227. package/templates/roster.md +60 -60
  228. package/templates/routing.md +39 -39
  229. package/templates/run-output.md +50 -50
  230. package/templates/schedule.json +19 -19
  231. package/templates/scribe-charter.md +123 -119
  232. package/templates/skill.md +24 -24
  233. package/templates/skills/agent-collaboration/SKILL.md +42 -42
  234. package/templates/skills/agent-conduct/SKILL.md +24 -24
  235. package/templates/skills/architectural-proposals/SKILL.md +151 -151
  236. package/templates/skills/ci-validation-gates/SKILL.md +84 -84
  237. package/templates/skills/cli-wiring/SKILL.md +47 -47
  238. package/templates/skills/client-compatibility/SKILL.md +89 -89
  239. package/templates/skills/cross-machine-coordination/SKILL.md +434 -0
  240. package/templates/skills/cross-squad/SKILL.md +114 -114
  241. package/templates/skills/distributed-mesh/SKILL.md +287 -287
  242. package/templates/skills/distributed-mesh/mesh.json.example +30 -30
  243. package/templates/skills/distributed-mesh/sync-mesh.ps1 +111 -111
  244. package/templates/skills/distributed-mesh/sync-mesh.sh +104 -104
  245. package/templates/skills/docs-standards/SKILL.md +71 -71
  246. package/templates/skills/economy-mode/SKILL.md +114 -114
  247. package/templates/skills/error-recovery/SKILL.md +99 -0
  248. package/templates/skills/external-comms/SKILL.md +329 -329
  249. package/templates/skills/gh-auth-isolation/SKILL.md +183 -183
  250. package/templates/skills/git-workflow/SKILL.md +204 -204
  251. package/templates/skills/github-multi-account/SKILL.md +95 -95
  252. package/templates/skills/history-hygiene/SKILL.md +36 -36
  253. package/templates/skills/humanizer/SKILL.md +105 -105
  254. package/templates/skills/init-mode/SKILL.md +102 -102
  255. package/templates/skills/iterative-retrieval/SKILL.md +165 -0
  256. package/templates/skills/model-selection/SKILL.md +117 -117
  257. package/templates/skills/nap/SKILL.md +24 -24
  258. package/templates/skills/notification-routing/SKILL.md +105 -0
  259. package/templates/skills/personal-squad/SKILL.md +57 -57
  260. package/templates/skills/pr-screenshots/SKILL.md +149 -0
  261. package/templates/skills/project-conventions/SKILL.md +56 -56
  262. package/templates/skills/ralph-two-pass-scan/SKILL.md +35 -0
  263. package/templates/skills/reflect/SKILL.md +229 -0
  264. package/templates/skills/release-process/SKILL.md +131 -423
  265. package/templates/skills/reskill/SKILL.md +92 -92
  266. package/templates/skills/retro-enforcement/SKILL.md +148 -0
  267. package/templates/skills/reviewer-protocol/SKILL.md +79 -79
  268. package/templates/skills/secret-handling/SKILL.md +200 -200
  269. package/templates/skills/session-recovery/SKILL.md +155 -155
  270. package/templates/skills/squad-conventions/SKILL.md +69 -69
  271. package/templates/skills/test-discipline/SKILL.md +37 -37
  272. package/templates/skills/tiered-memory/SKILL.md +234 -0
  273. package/templates/skills/windows-compatibility/SKILL.md +98 -74
  274. package/templates/{squad.agent.md → squad.agent.md.template} +57 -28
  275. package/templates/workflows/squad-ci.yml +24 -24
  276. package/templates/workflows/squad-docs.yml +54 -54
  277. package/templates/workflows/squad-heartbeat.yml +167 -171
  278. package/templates/workflows/squad-insider-release.yml +61 -61
  279. package/templates/workflows/squad-issue-assign.yml +161 -161
  280. package/templates/workflows/squad-label-enforce.yml +181 -181
  281. package/templates/workflows/squad-preview.yml +55 -55
  282. package/templates/workflows/squad-promote.yml +120 -120
  283. package/templates/workflows/squad-release.yml +77 -77
  284. package/templates/workflows/squad-triage.yml +260 -260
  285. package/templates/workflows/sync-squad-labels.yml +169 -169
@@ -1,24 +1,24 @@
1
- name: Squad CI
2
-
3
- on:
4
- pull_request:
5
- branches: [dev, preview, main, insider]
6
- types: [opened, synchronize, reopened]
7
- push:
8
- branches: [dev, insider]
9
-
10
- permissions:
11
- contents: read
12
-
13
- jobs:
14
- test:
15
- runs-on: ubuntu-latest
16
- steps:
17
- - uses: actions/checkout@v4
18
-
19
- - uses: actions/setup-node@v4
20
- with:
21
- node-version: 22
22
-
23
- - name: Run tests
24
- run: node --test test/*.test.js
1
+ name: Squad CI
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [dev, preview, main, insider]
6
+ types: [opened, synchronize, reopened]
7
+ push:
8
+ branches: [dev, insider]
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ test:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - uses: actions/setup-node@v4
20
+ with:
21
+ node-version: 22
22
+
23
+ - name: Run tests
24
+ run: node --test test/*.test.cjs
@@ -1,54 +1,54 @@
1
- name: Squad Docs — Build & Deploy
2
-
3
- on:
4
- workflow_dispatch:
5
- push:
6
- branches: [preview]
7
- paths:
8
- - 'docs/**'
9
- - '.github/workflows/squad-docs.yml'
10
-
11
- permissions:
12
- contents: read
13
- pages: write
14
- id-token: write
15
-
16
- concurrency:
17
- group: pages
18
- cancel-in-progress: true
19
-
20
- jobs:
21
- build:
22
- runs-on: ubuntu-latest
23
- steps:
24
- - uses: actions/checkout@v4
25
-
26
- - uses: actions/setup-node@v4
27
- with:
28
- node-version: '22'
29
- cache: npm
30
- cache-dependency-path: docs/package-lock.json
31
-
32
- - name: Install docs dependencies
33
- working-directory: docs
34
- run: npm ci
35
-
36
- - name: Build docs site
37
- working-directory: docs
38
- run: npm run build
39
-
40
- - name: Upload Pages artifact
41
- uses: actions/upload-pages-artifact@v3
42
- with:
43
- path: docs/dist
44
-
45
- deploy:
46
- needs: build
47
- runs-on: ubuntu-latest
48
- environment:
49
- name: github-pages
50
- url: ${{ steps.deployment.outputs.page_url }}
51
- steps:
52
- - name: Deploy to GitHub Pages
53
- id: deployment
54
- uses: actions/deploy-pages@v4
1
+ name: Squad Docs — Build & Deploy
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ push:
6
+ branches: [preview]
7
+ paths:
8
+ - 'docs/**'
9
+ - '.github/workflows/squad-docs.yml'
10
+
11
+ permissions:
12
+ contents: read
13
+ pages: write
14
+ id-token: write
15
+
16
+ concurrency:
17
+ group: pages
18
+ cancel-in-progress: true
19
+
20
+ jobs:
21
+ build:
22
+ runs-on: ubuntu-latest
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+
26
+ - uses: actions/setup-node@v4
27
+ with:
28
+ node-version: '22'
29
+ cache: npm
30
+ cache-dependency-path: docs/package-lock.json
31
+
32
+ - name: Install docs dependencies
33
+ working-directory: docs
34
+ run: npm ci
35
+
36
+ - name: Build docs site
37
+ working-directory: docs
38
+ run: npm run build
39
+
40
+ - name: Upload Pages artifact
41
+ uses: actions/upload-pages-artifact@v3
42
+ with:
43
+ path: docs/dist
44
+
45
+ deploy:
46
+ needs: build
47
+ runs-on: ubuntu-latest
48
+ environment:
49
+ name: github-pages
50
+ url: ${{ steps.deployment.outputs.page_url }}
51
+ steps:
52
+ - name: Deploy to GitHub Pages
53
+ id: deployment
54
+ uses: actions/deploy-pages@v4
@@ -1,171 +1,167 @@
1
- name: Squad Heartbeat (Ralph)
2
- # ⚠️ SYNC: This workflow is maintained in 4 locations. Changes must be applied to all:
3
- # - templates/workflows/squad-heartbeat.yml (source template)
4
- # - packages/squad-cli/templates/workflows/squad-heartbeat.yml (CLI package)
5
- # - .squad/templates/workflows/squad-heartbeat.yml (installed template)
6
- # - .github/workflows/squad-heartbeat.yml (active workflow)
7
- # Run 'squad upgrade' to sync installed copies from source templates.
8
-
9
- on:
10
- schedule:
11
- # Every 30 minutes — adjust via cron expression as needed
12
- - cron: '*/30 * * * *'
13
-
14
- # React to completed work or new squad work
15
- issues:
16
- types: [closed, labeled]
17
- pull_request:
18
- types: [closed]
19
-
20
- # Manual trigger
21
- workflow_dispatch:
22
-
23
- permissions:
24
- issues: write
25
- contents: read
26
- pull-requests: read
27
-
28
- jobs:
29
- heartbeat:
30
- runs-on: ubuntu-latest
31
- steps:
32
- - uses: actions/checkout@v4
33
-
34
- - name: Check triage script
35
- id: check-script
36
- run: |
37
- if [ -f ".squad/templates/ralph-triage.js" ]; then
38
- echo "has_script=true" >> $GITHUB_OUTPUT
39
- else
40
- echo "has_script=false" >> $GITHUB_OUTPUT
41
- echo "⚠️ ralph-triage.js not found — run 'squad upgrade' to install"
42
- fi
43
-
44
- - name: Ralph — Smart triage
45
- if: steps.check-script.outputs.has_script == 'true'
46
- env:
47
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
48
- run: |
49
- node .squad/templates/ralph-triage.js \
50
- --squad-dir .squad \
51
- --output triage-results.json
52
-
53
- - name: Ralph — Apply triage decisions
54
- if: steps.check-script.outputs.has_script == 'true' && hashFiles('triage-results.json') != ''
55
- uses: actions/github-script@v7
56
- with:
57
- script: |
58
- const fs = require('fs');
59
- const path = 'triage-results.json';
60
- if (!fs.existsSync(path)) {
61
- core.info('No triage results board is clear');
62
- return;
63
- }
64
-
65
- const results = JSON.parse(fs.readFileSync(path, 'utf8'));
66
- if (results.length === 0) {
67
- core.info('📋 Board is clear — Ralph found no untriaged issues');
68
- return;
69
- }
70
-
71
- for (const decision of results) {
72
- try {
73
- await github.rest.issues.addLabels({
74
- owner: context.repo.owner,
75
- repo: context.repo.repo,
76
- issue_number: decision.issueNumber,
77
- labels: [decision.label]
78
- });
79
-
80
- await github.rest.issues.createComment({
81
- owner: context.repo.owner,
82
- repo: context.repo.repo,
83
- issue_number: decision.issueNumber,
84
- body: [
85
- '### 🔄 Ralph — Auto-Triage',
86
- '',
87
- `**Assigned to:** ${decision.assignTo}`,
88
- `**Reason:** ${decision.reason}`,
89
- `**Source:** ${decision.source}`,
90
- '',
91
- '> Ralph auto-triaged this issue using routing rules.',
92
- '> To reassign, swap the `squad:*` label.'
93
- ].join('\n')
94
- });
95
-
96
- core.info(`Triaged #${decision.issueNumber} → ${decision.assignTo} (${decision.source})`);
97
- } catch (e) {
98
- core.warning(`Failed to triage #${decision.issueNumber}: ${e.message}`);
99
- }
100
- }
101
-
102
- core.info(`🔄 Ralph triaged ${results.length} issue(s)`);
103
-
104
- # Copilot auto-assign step (uses PAT if available)
105
- - name: Ralph Assign @copilot issues
106
- if: success()
107
- uses: actions/github-script@v7
108
- with:
109
- github-token: ${{ secrets.COPILOT_ASSIGN_TOKEN || secrets.GITHUB_TOKEN }}
110
- script: |
111
- const fs = require('fs');
112
-
113
- let teamFile = '.squad/team.md';
114
- if (!fs.existsSync(teamFile)) {
115
- teamFile = '.ai-team/team.md';
116
- }
117
- if (!fs.existsSync(teamFile)) return;
118
-
119
- const content = fs.readFileSync(teamFile, 'utf8');
120
-
121
- // Check if @copilot is on the team with auto-assign
122
- const hasCopilot = content.includes('🤖 Coding Agent') || content.includes('@copilot');
123
- const autoAssign = content.includes('<!-- copilot-auto-assign: true -->');
124
- if (!hasCopilot || !autoAssign) return;
125
-
126
- // Find issues labeled squad:copilot with no assignee
127
- try {
128
- const { data: copilotIssues } = await github.rest.issues.listForRepo({
129
- owner: context.repo.owner,
130
- repo: context.repo.repo,
131
- labels: 'squad:copilot',
132
- state: 'open',
133
- per_page: 5
134
- });
135
-
136
- const unassigned = copilotIssues.filter(i =>
137
- !i.assignees || i.assignees.length === 0
138
- );
139
-
140
- if (unassigned.length === 0) {
141
- core.info('No unassigned squad:copilot issues');
142
- return;
143
- }
144
-
145
- // Get repo default branch
146
- const { data: repoData } = await github.rest.repos.get({
147
- owner: context.repo.owner,
148
- repo: context.repo.repo
149
- });
150
-
151
- for (const issue of unassigned) {
152
- try {
153
- await github.request('POST /repos/{owner}/{repo}/issues/{issue_number}/assignees', {
154
- owner: context.repo.owner,
155
- repo: context.repo.repo,
156
- issue_number: issue.number,
157
- assignees: ['copilot-swe-agent[bot]'],
158
- agent_assignment: {
159
- target_repo: `${context.repo.owner}/${context.repo.repo}`,
160
- base_branch: repoData.default_branch,
161
- custom_instructions: `Read .squad/team.md (or .ai-team/team.md) for team context and .squad/routing.md (or .ai-team/routing.md) for routing rules.`
162
- }
163
- });
164
- core.info(`Assigned copilot-swe-agent[bot] to #${issue.number}`);
165
- } catch (e) {
166
- core.warning(`Failed to assign @copilot to #${issue.number}: ${e.message}`);
167
- }
168
- }
169
- } catch (e) {
170
- core.info(`No squad:copilot label found or error: ${e.message}`);
171
- }
1
+ name: Squad Heartbeat (Ralph)
2
+ # ⚠️ SYNC: This workflow is maintained in 4 locations. Changes must be applied to all:
3
+ # - templates/workflows/squad-heartbeat.yml (source template)
4
+ # - packages/squad-cli/templates/workflows/squad-heartbeat.yml (CLI package)
5
+ # - .squad/templates/workflows/squad-heartbeat.yml (installed template)
6
+ # - .github/workflows/squad-heartbeat.yml (active workflow)
7
+ # Run 'squad upgrade' to sync installed copies from source templates.
8
+
9
+ on:
10
+ # React to completed work or new squad work
11
+ issues:
12
+ types: [closed, labeled]
13
+ pull_request:
14
+ types: [closed]
15
+
16
+ # Manual trigger
17
+ workflow_dispatch:
18
+
19
+ permissions:
20
+ issues: write
21
+ contents: read
22
+ pull-requests: read
23
+
24
+ jobs:
25
+ heartbeat:
26
+ runs-on: ubuntu-latest
27
+ steps:
28
+ - uses: actions/checkout@v4
29
+
30
+ - name: Check triage script
31
+ id: check-script
32
+ run: |
33
+ if [ -f ".squad/templates/ralph-triage.js" ]; then
34
+ echo "has_script=true" >> $GITHUB_OUTPUT
35
+ else
36
+ echo "has_script=false" >> $GITHUB_OUTPUT
37
+ echo "⚠️ ralph-triage.js not found — run 'squad upgrade' to install"
38
+ fi
39
+
40
+ - name: Ralph — Smart triage
41
+ if: steps.check-script.outputs.has_script == 'true'
42
+ env:
43
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
44
+ run: |
45
+ node .squad/templates/ralph-triage.js \
46
+ --squad-dir .squad \
47
+ --output triage-results.json
48
+
49
+ - name: Ralph — Apply triage decisions
50
+ if: steps.check-script.outputs.has_script == 'true' && hashFiles('triage-results.json') != ''
51
+ uses: actions/github-script@v7
52
+ with:
53
+ script: |
54
+ const fs = require('fs');
55
+ const path = 'triage-results.json';
56
+ if (!fs.existsSync(path)) {
57
+ core.info('No triage results — board is clear');
58
+ return;
59
+ }
60
+
61
+ const results = JSON.parse(fs.readFileSync(path, 'utf8'));
62
+ if (results.length === 0) {
63
+ core.info('📋 Board is clear — Ralph found no untriaged issues');
64
+ return;
65
+ }
66
+
67
+ for (const decision of results) {
68
+ try {
69
+ await github.rest.issues.addLabels({
70
+ owner: context.repo.owner,
71
+ repo: context.repo.repo,
72
+ issue_number: decision.issueNumber,
73
+ labels: [decision.label]
74
+ });
75
+
76
+ await github.rest.issues.createComment({
77
+ owner: context.repo.owner,
78
+ repo: context.repo.repo,
79
+ issue_number: decision.issueNumber,
80
+ body: [
81
+ '### 🔄 Ralph — Auto-Triage',
82
+ '',
83
+ `**Assigned to:** ${decision.assignTo}`,
84
+ `**Reason:** ${decision.reason}`,
85
+ `**Source:** ${decision.source}`,
86
+ '',
87
+ '> Ralph auto-triaged this issue using routing rules.',
88
+ '> To reassign, swap the `squad:*` label.'
89
+ ].join('\n')
90
+ });
91
+
92
+ core.info(`Triaged #${decision.issueNumber} ${decision.assignTo} (${decision.source})`);
93
+ } catch (e) {
94
+ core.warning(`Failed to triage #${decision.issueNumber}: ${e.message}`);
95
+ }
96
+ }
97
+
98
+ core.info(`🔄 Ralph triaged ${results.length} issue(s)`);
99
+
100
+ # Copilot auto-assign step (uses PAT if available)
101
+ - name: Ralph — Assign @copilot issues
102
+ if: success()
103
+ uses: actions/github-script@v7
104
+ with:
105
+ github-token: ${{ secrets.COPILOT_ASSIGN_TOKEN || secrets.GITHUB_TOKEN }}
106
+ script: |
107
+ const fs = require('fs');
108
+
109
+ let teamFile = '.squad/team.md';
110
+ if (!fs.existsSync(teamFile)) {
111
+ teamFile = '.ai-team/team.md';
112
+ }
113
+ if (!fs.existsSync(teamFile)) return;
114
+
115
+ const content = fs.readFileSync(teamFile, 'utf8');
116
+
117
+ // Check if @copilot is on the team with auto-assign
118
+ const hasCopilot = content.includes('🤖 Coding Agent') || content.includes('@copilot');
119
+ const autoAssign = content.includes('<!-- copilot-auto-assign: true -->');
120
+ if (!hasCopilot || !autoAssign) return;
121
+
122
+ // Find issues labeled squad:copilot with no assignee
123
+ try {
124
+ const { data: copilotIssues } = await github.rest.issues.listForRepo({
125
+ owner: context.repo.owner,
126
+ repo: context.repo.repo,
127
+ labels: 'squad:copilot',
128
+ state: 'open',
129
+ per_page: 5
130
+ });
131
+
132
+ const unassigned = copilotIssues.filter(i =>
133
+ !i.assignees || i.assignees.length === 0
134
+ );
135
+
136
+ if (unassigned.length === 0) {
137
+ core.info('No unassigned squad:copilot issues');
138
+ return;
139
+ }
140
+
141
+ // Get repo default branch
142
+ const { data: repoData } = await github.rest.repos.get({
143
+ owner: context.repo.owner,
144
+ repo: context.repo.repo
145
+ });
146
+
147
+ for (const issue of unassigned) {
148
+ try {
149
+ await github.request('POST /repos/{owner}/{repo}/issues/{issue_number}/assignees', {
150
+ owner: context.repo.owner,
151
+ repo: context.repo.repo,
152
+ issue_number: issue.number,
153
+ assignees: ['copilot-swe-agent[bot]'],
154
+ agent_assignment: {
155
+ target_repo: `${context.repo.owner}/${context.repo.repo}`,
156
+ base_branch: repoData.default_branch,
157
+ custom_instructions: `Read .squad/team.md (or .ai-team/team.md) for team context and .squad/routing.md (or .ai-team/routing.md) for routing rules.`
158
+ }
159
+ });
160
+ core.info(`Assigned copilot-swe-agent[bot] to #${issue.number}`);
161
+ } catch (e) {
162
+ core.warning(`Failed to assign @copilot to #${issue.number}: ${e.message}`);
163
+ }
164
+ }
165
+ } catch (e) {
166
+ core.info(`No squad:copilot label found or error: ${e.message}`);
167
+ }
@@ -1,61 +1,61 @@
1
- name: Squad Insider Release
2
-
3
- on:
4
- push:
5
- branches: [insider]
6
-
7
- permissions:
8
- contents: write
9
-
10
- jobs:
11
- release:
12
- runs-on: ubuntu-latest
13
- steps:
14
- - uses: actions/checkout@v4
15
- with:
16
- fetch-depth: 0
17
-
18
- - uses: actions/setup-node@v4
19
- with:
20
- node-version: 22
21
-
22
- - name: Run tests
23
- run: node --test test/*.test.js
24
-
25
- - name: Read version from package.json
26
- id: version
27
- run: |
28
- VERSION=$(node -e "console.log(require('./package.json').version)")
29
- SHORT_SHA=$(git rev-parse --short HEAD)
30
- INSIDER_VERSION="${VERSION}-insider+${SHORT_SHA}"
31
- INSIDER_TAG="v${INSIDER_VERSION}"
32
- echo "version=$VERSION" >> "$GITHUB_OUTPUT"
33
- echo "short_sha=$SHORT_SHA" >> "$GITHUB_OUTPUT"
34
- echo "insider_version=$INSIDER_VERSION" >> "$GITHUB_OUTPUT"
35
- echo "insider_tag=$INSIDER_TAG" >> "$GITHUB_OUTPUT"
36
- echo "📦 Base Version: $VERSION (Short SHA: $SHORT_SHA)"
37
- echo "🏷️ Insider Version: $INSIDER_VERSION"
38
- echo "🔖 Insider Tag: $INSIDER_TAG"
39
-
40
- - name: Create git tag
41
- run: |
42
- git config user.name "github-actions[bot]"
43
- git config user.email "github-actions[bot]@users.noreply.github.com"
44
- git tag -a "${{ steps.version.outputs.insider_tag }}" -m "Insider Release ${{ steps.version.outputs.insider_tag }}"
45
- git push origin "${{ steps.version.outputs.insider_tag }}"
46
-
47
- - name: Create GitHub Release
48
- env:
49
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
50
- run: |
51
- gh release create "${{ steps.version.outputs.insider_tag }}" \
52
- --title "${{ steps.version.outputs.insider_tag }}" \
53
- --notes "This is an insider/development build of Squad. Install with:\`\`\`bash\nnpm install -g @bradygaster/squad-cli@${{ steps.version.outputs.insider_tag }}\n\`\`\`\n\n**Note:** Insider builds may be unstable and are intended for early adopters and testing only." \
54
- --prerelease
55
-
56
- - name: Verify release
57
- env:
58
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
59
- run: |
60
- gh release view "${{ steps.version.outputs.insider_tag }}"
61
- echo "✅ Insider Release ${{ steps.version.outputs.insider_tag }} created and verified."
1
+ name: Squad Insider Release
2
+
3
+ on:
4
+ push:
5
+ branches: [insider]
6
+
7
+ permissions:
8
+ contents: write
9
+
10
+ jobs:
11
+ release:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ with:
16
+ fetch-depth: 0
17
+
18
+ - uses: actions/setup-node@v4
19
+ with:
20
+ node-version: 22
21
+
22
+ - name: Run tests
23
+ run: node --test test/*.test.cjs
24
+
25
+ - name: Read version from package.json
26
+ id: version
27
+ run: |
28
+ VERSION=$(node -e "console.log(require('./package.json').version)")
29
+ SHORT_SHA=$(git rev-parse --short HEAD)
30
+ INSIDER_VERSION="${VERSION}-insider+${SHORT_SHA}"
31
+ INSIDER_TAG="v${INSIDER_VERSION}"
32
+ echo "version=$VERSION" >> "$GITHUB_OUTPUT"
33
+ echo "short_sha=$SHORT_SHA" >> "$GITHUB_OUTPUT"
34
+ echo "insider_version=$INSIDER_VERSION" >> "$GITHUB_OUTPUT"
35
+ echo "insider_tag=$INSIDER_TAG" >> "$GITHUB_OUTPUT"
36
+ echo "📦 Base Version: $VERSION (Short SHA: $SHORT_SHA)"
37
+ echo "🏷️ Insider Version: $INSIDER_VERSION"
38
+ echo "🔖 Insider Tag: $INSIDER_TAG"
39
+
40
+ - name: Create git tag
41
+ run: |
42
+ git config user.name "github-actions[bot]"
43
+ git config user.email "github-actions[bot]@users.noreply.github.com"
44
+ git tag -a "${{ steps.version.outputs.insider_tag }}" -m "Insider Release ${{ steps.version.outputs.insider_tag }}"
45
+ git push origin "${{ steps.version.outputs.insider_tag }}"
46
+
47
+ - name: Create GitHub Release
48
+ env:
49
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
50
+ run: |
51
+ gh release create "${{ steps.version.outputs.insider_tag }}" \
52
+ --title "${{ steps.version.outputs.insider_tag }}" \
53
+ --notes "This is an insider/development build of Squad. Install with:\`\`\`bash\nnpm install -g @bradygaster/squad-cli@${{ steps.version.outputs.insider_tag }}\n\`\`\`\n\n**Note:** Insider builds may be unstable and are intended for early adopters and testing only." \
54
+ --prerelease
55
+
56
+ - name: Verify release
57
+ env:
58
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
59
+ run: |
60
+ gh release view "${{ steps.version.outputs.insider_tag }}"
61
+ echo "✅ Insider Release ${{ steps.version.outputs.insider_tag }} created and verified."