@bradygaster/squad-cli 0.9.0 → 0.9.2-insider.5

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 (213) hide show
  1. package/README.md +1 -1
  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 +12 -20
  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/decision-hygiene.d.ts +14 -0
  65. package/dist/cli/commands/watch/capabilities/decision-hygiene.d.ts.map +1 -0
  66. package/dist/cli/commands/watch/capabilities/decision-hygiene.js +72 -0
  67. package/dist/cli/commands/watch/capabilities/decision-hygiene.js.map +1 -0
  68. package/dist/cli/commands/watch/capabilities/execute.d.ts +33 -0
  69. package/dist/cli/commands/watch/capabilities/execute.d.ts.map +1 -0
  70. package/dist/cli/commands/watch/capabilities/execute.js +119 -0
  71. package/dist/cli/commands/watch/capabilities/execute.js.map +1 -0
  72. package/dist/cli/commands/watch/capabilities/index.d.ts +7 -0
  73. package/dist/cli/commands/watch/capabilities/index.d.ts.map +1 -0
  74. package/dist/cli/commands/watch/capabilities/index.js +28 -0
  75. package/dist/cli/commands/watch/capabilities/index.js.map +1 -0
  76. package/dist/cli/commands/watch/capabilities/monitor-email.d.ts +14 -0
  77. package/dist/cli/commands/watch/capabilities/monitor-email.d.ts.map +1 -0
  78. package/dist/cli/commands/watch/capabilities/monitor-email.js +54 -0
  79. package/dist/cli/commands/watch/capabilities/monitor-email.js.map +1 -0
  80. package/dist/cli/commands/watch/capabilities/monitor-teams.d.ts +14 -0
  81. package/dist/cli/commands/watch/capabilities/monitor-teams.d.ts.map +1 -0
  82. package/dist/cli/commands/watch/capabilities/monitor-teams.js +55 -0
  83. package/dist/cli/commands/watch/capabilities/monitor-teams.js.map +1 -0
  84. package/dist/cli/commands/watch/capabilities/retro.d.ts +14 -0
  85. package/dist/cli/commands/watch/capabilities/retro.d.ts.map +1 -0
  86. package/dist/cli/commands/watch/capabilities/retro.js +81 -0
  87. package/dist/cli/commands/watch/capabilities/retro.js.map +1 -0
  88. package/dist/cli/commands/watch/capabilities/self-pull.d.ts +14 -0
  89. package/dist/cli/commands/watch/capabilities/self-pull.d.ts.map +1 -0
  90. package/dist/cli/commands/watch/capabilities/self-pull.js +33 -0
  91. package/dist/cli/commands/watch/capabilities/self-pull.js.map +1 -0
  92. package/dist/cli/commands/watch/capabilities/two-pass.d.ts +14 -0
  93. package/dist/cli/commands/watch/capabilities/two-pass.d.ts.map +1 -0
  94. package/dist/cli/commands/watch/capabilities/two-pass.js +66 -0
  95. package/dist/cli/commands/watch/capabilities/two-pass.js.map +1 -0
  96. package/dist/cli/commands/watch/capabilities/wave-dispatch.d.ts +14 -0
  97. package/dist/cli/commands/watch/capabilities/wave-dispatch.d.ts.map +1 -0
  98. package/dist/cli/commands/watch/capabilities/wave-dispatch.js +117 -0
  99. package/dist/cli/commands/watch/capabilities/wave-dispatch.js.map +1 -0
  100. package/dist/cli/commands/watch/config.d.ts +25 -0
  101. package/dist/cli/commands/watch/config.d.ts.map +1 -0
  102. package/dist/cli/commands/watch/config.js +82 -0
  103. package/dist/cli/commands/watch/config.js.map +1 -0
  104. package/dist/cli/commands/watch/index.d.ts +95 -0
  105. package/dist/cli/commands/watch/index.d.ts.map +1 -0
  106. package/dist/cli/commands/watch/index.js +704 -0
  107. package/dist/cli/commands/watch/index.js.map +1 -0
  108. package/dist/cli/commands/watch/registry.d.ts +19 -0
  109. package/dist/cli/commands/watch/registry.d.ts.map +1 -0
  110. package/dist/cli/commands/watch/registry.js +28 -0
  111. package/dist/cli/commands/watch/registry.js.map +1 -0
  112. package/dist/cli/commands/watch/types.d.ts +57 -0
  113. package/dist/cli/commands/watch/types.d.ts.map +1 -0
  114. package/dist/cli/commands/watch/types.js +8 -0
  115. package/dist/cli/commands/watch/types.js.map +1 -0
  116. package/dist/cli/core/cast.d.ts.map +1 -1
  117. package/dist/cli/core/cast.js +15 -19
  118. package/dist/cli/core/cast.js.map +1 -1
  119. package/dist/cli/core/detect-squad-dir.d.ts.map +1 -1
  120. package/dist/cli/core/detect-squad-dir.js +12 -10
  121. package/dist/cli/core/detect-squad-dir.js.map +1 -1
  122. package/dist/cli/core/email-scrub.d.ts.map +1 -1
  123. package/dist/cli/core/email-scrub.js +12 -11
  124. package/dist/cli/core/email-scrub.js.map +1 -1
  125. package/dist/cli/core/gh-cli.d.ts +13 -0
  126. package/dist/cli/core/gh-cli.d.ts.map +1 -1
  127. package/dist/cli/core/gh-cli.js +24 -0
  128. package/dist/cli/core/gh-cli.js.map +1 -1
  129. package/dist/cli/core/init.d.ts +2 -0
  130. package/dist/cli/core/init.d.ts.map +1 -1
  131. package/dist/cli/core/init.js +22 -5
  132. package/dist/cli/core/init.js.map +1 -1
  133. package/dist/cli/core/migrate-directory.d.ts.map +1 -1
  134. package/dist/cli/core/migrate-directory.js +14 -13
  135. package/dist/cli/core/migrate-directory.js.map +1 -1
  136. package/dist/cli/core/migrations.d.ts.map +1 -1
  137. package/dist/cli/core/migrations.js +22 -8
  138. package/dist/cli/core/migrations.js.map +1 -1
  139. package/dist/cli/core/nap.d.ts.map +1 -1
  140. package/dist/cli/core/nap.js +111 -49
  141. package/dist/cli/core/nap.js.map +1 -1
  142. package/dist/cli/core/project-type.d.ts.map +1 -1
  143. package/dist/cli/core/project-type.js +11 -10
  144. package/dist/cli/core/project-type.js.map +1 -1
  145. package/dist/cli/core/team-md.d.ts.map +1 -1
  146. package/dist/cli/core/team-md.js +9 -4
  147. package/dist/cli/core/team-md.js.map +1 -1
  148. package/dist/cli/core/templates.d.ts.map +1 -1
  149. package/dist/cli/core/templates.js +4 -3
  150. package/dist/cli/core/templates.js.map +1 -1
  151. package/dist/cli/core/upgrade.d.ts.map +1 -1
  152. package/dist/cli/core/upgrade.js +68 -55
  153. package/dist/cli/core/upgrade.js.map +1 -1
  154. package/dist/cli/core/version.d.ts.map +1 -1
  155. package/dist/cli/core/version.js +8 -7
  156. package/dist/cli/core/version.js.map +1 -1
  157. package/dist/cli/index.d.ts +1 -1
  158. package/dist/cli/index.d.ts.map +1 -1
  159. package/dist/cli/index.js +1 -1
  160. package/dist/cli/index.js.map +1 -1
  161. package/dist/cli/self-update.d.ts.map +1 -1
  162. package/dist/cli/self-update.js +7 -4
  163. package/dist/cli/self-update.js.map +1 -1
  164. package/dist/cli/shell/agent-name-parser.d.ts +16 -0
  165. package/dist/cli/shell/agent-name-parser.d.ts.map +1 -0
  166. package/dist/cli/shell/agent-name-parser.js +54 -0
  167. package/dist/cli/shell/agent-name-parser.js.map +1 -0
  168. package/dist/cli/shell/commands.d.ts.map +1 -1
  169. package/dist/cli/shell/commands.js +4 -3
  170. package/dist/cli/shell/commands.js.map +1 -1
  171. package/dist/cli/shell/coordinator.d.ts +4 -1
  172. package/dist/cli/shell/coordinator.d.ts.map +1 -1
  173. package/dist/cli/shell/coordinator.js +29 -26
  174. package/dist/cli/shell/coordinator.js.map +1 -1
  175. package/dist/cli/shell/index.d.ts.map +1 -1
  176. package/dist/cli/shell/index.js +33 -35
  177. package/dist/cli/shell/index.js.map +1 -1
  178. package/dist/cli/shell/lifecycle.d.ts +13 -2
  179. package/dist/cli/shell/lifecycle.d.ts.map +1 -1
  180. package/dist/cli/shell/lifecycle.js +26 -13
  181. package/dist/cli/shell/lifecycle.js.map +1 -1
  182. package/dist/cli/shell/session-store.d.ts.map +1 -1
  183. package/dist/cli/shell/session-store.js +16 -12
  184. package/dist/cli/shell/session-store.js.map +1 -1
  185. package/dist/cli/shell/spawn.d.ts +4 -1
  186. package/dist/cli/shell/spawn.d.ts.map +1 -1
  187. package/dist/cli/shell/spawn.js +28 -10
  188. package/dist/cli/shell/spawn.js.map +1 -1
  189. package/dist/cli-entry.js +83 -12
  190. package/dist/cli-entry.js.map +1 -1
  191. package/package.json +8 -4
  192. package/templates/scribe-charter.md +4 -0
  193. package/templates/skills/cross-machine-coordination/SKILL.md +434 -0
  194. package/templates/skills/error-recovery/SKILL.md +99 -0
  195. package/templates/skills/iterative-retrieval/SKILL.md +165 -0
  196. package/templates/skills/notification-routing/SKILL.md +105 -0
  197. package/templates/skills/pr-screenshots/SKILL.md +149 -0
  198. package/templates/skills/ralph-two-pass-scan/SKILL.md +35 -0
  199. package/templates/skills/reflect/SKILL.md +229 -0
  200. package/templates/skills/release-process/SKILL.md +84 -376
  201. package/templates/skills/retro-enforcement/SKILL.md +148 -0
  202. package/templates/skills/tiered-memory/SKILL.md +234 -0
  203. package/templates/skills/windows-compatibility/SKILL.md +24 -0
  204. package/templates/{squad.agent.md → squad.agent.md.template} +1316 -1287
  205. package/templates/workflows/squad-ci.yml +1 -1
  206. package/templates/workflows/squad-heartbeat.yml +0 -4
  207. package/templates/workflows/squad-insider-release.yml +1 -1
  208. package/templates/workflows/squad-preview.yml +1 -1
  209. package/templates/workflows/squad-release.yml +1 -1
  210. package/dist/cli/commands/watch.d.ts +0 -18
  211. package/dist/cli/commands/watch.d.ts.map +0 -1
  212. package/dist/cli/commands/watch.js +0 -306
  213. package/dist/cli/commands/watch.js.map +0 -1
@@ -1,423 +1,131 @@
1
- ---
2
- name: "release-process"
3
- description: "Step-by-step release checklist for Squad — prevents v0.8.22-style disasters"
4
- domain: "release-management"
5
- confidence: "high"
6
- source: "team-decision"
7
- ---
1
+ # Release Process
8
2
 
9
- ## Context
10
-
11
- This is the **definitive release runbook** for Squad. Born from the v0.8.22 release disaster (4-part semver mangled by npm, draft release never triggered publish, wrong NPM_TOKEN type, 6+ hours of broken `latest` dist-tag).
12
-
13
- **Rule:** No agent releases Squad without following this checklist. No exceptions. No improvisation.
14
-
15
- ---
16
-
17
- ## Pre-Release Validation
18
-
19
- Before starting ANY release work, validate the following:
20
-
21
- ### 1. Version Number Validation
22
-
23
- **Rule:** Only 3-part semver (major.minor.patch) or prerelease (major.minor.patch-tag.N) are valid. 4-part versions (0.8.21.4) are NOT valid semver and npm will mangle them.
24
-
25
- ```bash
26
- # Check version is valid semver
27
- node -p "require('semver').valid('0.8.22')"
28
- # Output: '0.8.22' = valid
29
- # Output: null = INVALID, STOP
30
-
31
- # For prerelease versions
32
- node -p "require('semver').valid('0.8.23-preview.1')"
33
- # Output: '0.8.23-preview.1' = valid
34
- ```
35
-
36
- **If `semver.valid()` returns `null`:** STOP. Fix the version. Do NOT proceed.
37
-
38
- ### 2. NPM_TOKEN Verification
39
-
40
- **Rule:** NPM_TOKEN must be an **Automation token** (no 2FA required). User tokens with 2FA will fail in CI with EOTP errors.
41
-
42
- ```bash
43
- # Check token type (requires npm CLI authenticated)
44
- npm token list
45
- ```
46
-
47
- Look for:
48
- - ✅ `read-write` tokens with NO 2FA requirement = Automation token (correct)
49
- - ❌ Tokens requiring OTP = User token (WRONG, will fail in CI)
50
-
51
- **How to create an Automation token:**
52
- 1. Go to npmjs.com → Settings → Access Tokens
53
- 2. Click "Generate New Token"
54
- 3. Select **"Automation"** (NOT "Publish")
55
- 4. Copy token and save as GitHub secret: `NPM_TOKEN`
56
-
57
- **If using a User token:** STOP. Create an Automation token first.
58
-
59
- ### 3. Branch and Tag State
60
-
61
- **Rule:** Release from `main` branch. Ensure clean state, no uncommitted changes, latest from origin.
62
-
63
- ```bash
64
- # Ensure on main and clean
65
- git checkout main
66
- git pull origin main
67
- git status # Should show: "nothing to commit, working tree clean"
68
-
69
- # Check tag doesn't already exist
70
- git tag -l "v0.8.22"
71
- # Output should be EMPTY. If tag exists, release already done or collision.
72
- ```
73
-
74
- **If tag exists:** STOP. Either release was already done, or there's a collision. Investigate before proceeding.
75
-
76
- ### 4. Disable bump-build.mjs
77
-
78
- **Rule:** `bump-build.mjs` is for dev builds ONLY. It must NOT run during release builds (it increments build numbers, creating 4-part versions).
79
-
80
- ```bash
81
- # Set env var to skip bump-build.mjs
82
- export SKIP_BUILD_BUMP=1
83
-
84
- # Verify it's set
85
- echo $SKIP_BUILD_BUMP
86
- # Output: 1
87
- ```
88
-
89
- **For Windows PowerShell:**
90
- ```powershell
91
- $env:SKIP_BUILD_BUMP = "1"
92
- ```
93
-
94
- **If not set:** `bump-build.mjs` will run and mutate versions. This causes disasters (see v0.8.22).
95
-
96
- ---
97
-
98
- ## Release Workflow
99
-
100
- ### Step 1: Version Bump
101
-
102
- Update version in all 3 package.json files (root + both workspaces) in lockstep.
103
-
104
- ```bash
105
- # Set target version (no 'v' prefix)
106
- VERSION="0.8.22"
107
-
108
- # Validate it's valid semver BEFORE proceeding
109
- node -p "require('semver').valid('$VERSION')"
110
- # Must output the version string, NOT null
111
-
112
- # Update all 3 package.json files
113
- npm version $VERSION --workspaces --include-workspace-root --no-git-tag-version
114
-
115
- # Verify all 3 match
116
- grep '"version"' package.json packages/squad-sdk/package.json packages/squad-cli/package.json
117
- # All 3 should show: "version": "0.8.22"
118
- ```
119
-
120
- **Checkpoint:** All 3 package.json files have identical versions. Run `semver.valid()` one more time to be sure.
121
-
122
- ### Step 2: Commit and Tag
123
-
124
- ```bash
125
- # Commit version bump
126
- git add package.json packages/squad-sdk/package.json packages/squad-cli/package.json
127
- git commit -m "chore: bump version to $VERSION
128
-
129
- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>"
130
-
131
- # Create tag (with 'v' prefix)
132
- git tag -a "v$VERSION" -m "Release v$VERSION"
133
-
134
- # Push commit and tag
135
- git push origin main
136
- git push origin "v$VERSION"
137
- ```
138
-
139
- **Checkpoint:** Tag created and pushed. Verify with `git tag -l "v$VERSION"`.
140
-
141
- ### Step 3: Create GitHub Release
142
-
143
- **CRITICAL:** Release must be **published**, NOT draft. Draft releases don't trigger `publish.yml` workflow.
144
-
145
- ```bash
146
- # Create GitHub Release (NOT draft)
147
- gh release create "v$VERSION" \
148
- --title "v$VERSION" \
149
- --notes "Release notes go here" \
150
- --latest
151
-
152
- # Verify release is PUBLISHED (not draft)
153
- gh release view "v$VERSION"
154
- # Output should NOT contain "(draft)"
155
- ```
3
+ > Earned knowledge from the v0.9.0→v0.9.1 incident. Every agent involved in releases MUST read this before starting release work.
156
4
 
157
- **If output contains `(draft)`:** STOP. Delete the release and recreate without `--draft` flag.
5
+ ## SCOPE
158
6
 
159
- ```bash
160
- # If you accidentally created a draft, fix it:
161
- gh release edit "v$VERSION" --draft=false
162
- ```
7
+ ✅ THIS SKILL PRODUCES:
8
+ - Pre-release validation checks that prevent broken publishes
9
+ - Correct npm publish commands (never workspace-scoped)
10
+ - Fallback procedures when CI workflows fail
11
+ - Post-publish verification steps
163
12
 
164
- **Checkpoint:** Release is published (NOT draft). The `release: published` event fired and triggered `publish.yml`.
13
+ THIS SKILL DOES NOT PRODUCE:
14
+ - Feature implementation or test code
15
+ - Architecture decisions
16
+ - Documentation content
165
17
 
166
- ### Step 4: Monitor Workflow
18
+ ## Confidence: high
167
19
 
168
- The `publish.yml` workflow should start automatically within 10 seconds of release creation.
20
+ Established through the v0.9.1 incident (8-hour recovery). Every rule below is battle-tested.
169
21
 
170
- ```bash
171
- # Watch workflow runs
172
- gh run list --workflow=publish.yml --limit 1
22
+ ## Context
173
23
 
174
- # Get detailed status
175
- gh run view --log
176
- ```
24
+ Squad publishes two npm packages: `@bradygaster/squad-sdk` and `@bradygaster/squad-cli`. The release pipeline flows: dev → preview → main → GitHub Release → npm publish. Brady (project owner) triggers releases — the coordinator does NOT.
177
25
 
178
- **Expected flow:**
179
- 1. `publish-sdk` job runs → publishes `@bradygaster/squad-sdk`
180
- 2. Verify step runs with retry loop (up to 5 attempts, 15s interval) to confirm SDK on npm registry
181
- 3. `publish-cli` job runs → publishes `@bradygaster/squad-cli`
182
- 4. Verify step runs with retry loop to confirm CLI on npm registry
26
+ ## Rules (Non-Negotiable)
183
27
 
184
- **If workflow fails:** Check the logs. Common issues:
185
- - EOTP error = wrong NPM_TOKEN type (use Automation token)
186
- - Verify step timeout = npm propagation delay (retry loop should handle this, but propagation can take up to 2 minutes in rare cases)
187
- - Version mismatch = package.json version doesn't match tag
28
+ ### 1. Coordinator Does NOT Publish
188
29
 
189
- **Checkpoint:** Both jobs succeeded. Workflow shows green checkmarks.
30
+ The coordinator routes work and manages agents. It does NOT run `npm publish`, trigger release workflows, or make release decisions. Brady owns the release trigger. If an agent or the coordinator is asked to publish, escalate to Brady.
190
31
 
191
- ### Step 5: Verify npm Publication
32
+ ### 2. Pre-Publish Dependency Validation
192
33
 
193
- Manually verify both packages are on npm with correct `latest` dist-tag.
34
+ Before ANY release is tagged, scan every `packages/*/package.json` for:
35
+ - `file:` references (workspace leak — the v0.9.0 root cause)
36
+ - `link:` references
37
+ - Absolute paths in dependency values
38
+ - Non-semver version strings
194
39
 
40
+ **Command:**
195
41
  ```bash
196
- # Check SDK
197
- npm view @bradygaster/squad-sdk version
198
- # Output: 0.8.22
199
-
200
- npm dist-tag ls @bradygaster/squad-sdk
201
- # Output should show: latest: 0.8.22
202
-
203
- # Check CLI
204
- npm view @bradygaster/squad-cli version
205
- # Output: 0.8.22
206
-
207
- npm dist-tag ls @bradygaster/squad-cli
208
- # Output should show: latest: 0.8.22
42
+ grep -r '"file:\|"link:\|"/' packages/*/package.json
209
43
  ```
44
+ If anything matches, STOP. Do not proceed. Fix the reference first.
210
45
 
211
- **If versions don't match:** Something went wrong. Check workflow logs. DO NOT proceed with GitHub Release announcement until npm is correct.
46
+ ### 3. Never Use `npm -w` for Publishing
212
47
 
213
- **Checkpoint:** Both packages show correct version. `latest` dist-tags point to the new version.
214
-
215
- ### Step 6: Test Installation
216
-
217
- Verify packages can be installed from npm (real-world smoke test).
48
+ `npm -w packages/squad-sdk publish` hangs silently when 2FA is enabled. Always `cd` into the package directory:
218
49
 
219
50
  ```bash
220
- # Create temp directory
221
- mkdir /tmp/squad-release-test && cd /tmp/squad-release-test
222
-
223
- # Test SDK installation
224
- npm init -y
225
- npm install @bradygaster/squad-sdk
226
- node -p "require('@bradygaster/squad-sdk/package.json').version"
227
- # Output: 0.8.22
228
-
229
- # Test CLI installation
230
- npm install -g @bradygaster/squad-cli
231
- squad --version
232
- # Output: 0.8.22
233
-
234
- # Cleanup
235
- cd -
236
- rm -rf /tmp/squad-release-test
51
+ cd packages/squad-sdk && npm publish --access public
52
+ cd packages/squad-cli && npm publish --access public
237
53
  ```
238
54
 
239
- **If installation fails:** npm registry issue or package metadata corruption. DO NOT announce release until this works.
55
+ ### 4. Fallback Protocol
240
56
 
241
- **Checkpoint:** Both packages install cleanly. Versions match.
57
+ If `workflow_dispatch` or the publish workflow fails:
58
+ 1. Try once more (ONE retry, not four)
59
+ 2. If it fails again → local publish immediately
60
+ 3. Do NOT attempt GitHub UI file operations to fix workflow indexing
61
+ 4. GitHub has a ~15min workflow cache TTL after file renames/deletes — waiting helps, retrying doesn't
242
62
 
243
- ### Step 7: Sync dev to Next Preview
244
-
245
- After main release, sync dev to the next preview version.
63
+ ### 5. Post-Publish Smoke Test
246
64
 
65
+ After every publish, verify in a clean shell:
247
66
  ```bash
248
- # Checkout dev
249
- git checkout dev
250
- git pull origin dev
251
-
252
- # Bump to next preview version (e.g., 0.8.23-preview.1)
253
- NEXT_VERSION="0.8.23-preview.1"
254
-
255
- # Validate semver
256
- node -p "require('semver').valid('$NEXT_VERSION')"
257
- # Must output the version string, NOT null
258
-
259
- # Update all 3 package.json files
260
- npm version $NEXT_VERSION --workspaces --include-workspace-root --no-git-tag-version
261
-
262
- # Commit
263
- git add package.json packages/squad-sdk/package.json packages/squad-cli/package.json
264
- git commit -m "chore: bump dev to $NEXT_VERSION
265
-
266
- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>"
267
-
268
- # Push
269
- git push origin dev
67
+ npm install -g @bradygaster/squad-cli@latest
68
+ squad --version # should match published version
69
+ squad doctor # should pass in a test repo
270
70
  ```
271
71
 
272
- **Checkpoint:** dev branch now shows next preview version. Future dev builds will publish to `@preview` dist-tag.
273
-
274
- ---
275
-
276
- ## Manual Publish (Fallback)
72
+ If the smoke test fails, rollback immediately.
277
73
 
278
- If `publish.yml` workflow fails or needs to be bypassed, use `workflow_dispatch` to manually trigger publish.
74
+ ### 6. npm Token Must Be Automation Type
279
75
 
280
- ```bash
281
- # Trigger manual publish
282
- gh workflow run publish.yml -f version="0.8.22"
76
+ NPM_TOKEN in CI must be an Automation token (not a user token with 2FA prompts). User tokens with `auth-and-writes` 2FA cause silent hangs in non-interactive environments.
283
77
 
284
- # Monitor the run
285
- gh run watch
286
- ```
78
+ ### 7. No Draft GitHub Releases
287
79
 
288
- **Rule:** Only use this if automated publish failed. Always investigate why automation failed and fix it for next release.
80
+ Never create draft GitHub Releases. The `release: published` event only fires when a release is published drafts don't trigger the npm publish workflow.
289
81
 
290
- ---
82
+ ### 8. Version Format
291
83
 
292
- ## Rollback Procedure
84
+ Semantic versioning only: `MAJOR.MINOR.PATCH` (e.g., `0.9.1`). Four-part versions like `0.8.21.4` are NOT valid semver and will break npm publish.
293
85
 
294
- If a release is broken and needs to be rolled back:
86
+ ### 9. SKIP_BUILD_BUMP=1 in CI
295
87
 
296
- ### 1. Unpublish from npm (Nuclear Option)
88
+ Set this environment variable in all CI build steps to prevent the build script from mutating versions during CI runs.
297
89
 
298
- **WARNING:** npm unpublish is time-limited (24 hours) and leaves the version slot burned. Only use if version is critically broken.
90
+ ## Release Checklist (Quick Reference)
299
91
 
300
- ```bash
301
- # Unpublish (requires npm owner privileges)
302
- npm unpublish @bradygaster/squad-sdk@0.8.22
303
- npm unpublish @bradygaster/squad-cli@0.8.22
304
92
  ```
305
-
306
- ### 2. Deprecate on npm (Preferred)
307
-
308
- **Preferred approach:** Mark version as deprecated, publish a hotfix.
309
-
310
- ```bash
311
- # Deprecate broken version
312
- npm deprecate @bradygaster/squad-sdk@0.8.22 "Broken release, use 0.8.22.1 instead"
313
- npm deprecate @bradygaster/squad-cli@0.8.22 "Broken release, use 0.8.22.1 instead"
314
-
315
- # Publish hotfix version
316
- # (Follow this runbook with version 0.8.22.1)
93
+ □ All tests passing on dev
94
+ No file:/link: references in packages/*/package.json
95
+ □ CHANGELOG.md updated
96
+ Version bumps committed (node -e script)
97
+ □ npm auth verified (Automation token)
98
+ □ No draft GitHub Releases pending
99
+ Local build + test: npm run build && npx vitest run
100
+ Push dev CI green
101
+ Promote dev preview (squad-promote workflow)
102
+ □ Preview CI green (squad-preview validates)
103
+ Promote preview → main
104
+ squad-release auto-creates GitHub Release
105
+ □ squad-npm-publish auto-triggers
106
+ □ Monitor publish workflow
107
+ □ Post-publish smoke test
317
108
  ```
318
109
 
319
- ### 3. Delete GitHub Release and Tag
320
-
321
- ```bash
322
- # Delete GitHub Release
323
- gh release delete "v0.8.22" --yes
324
-
325
- # Delete tag locally and remotely
326
- git tag -d "v0.8.22"
327
- git push origin --delete "v0.8.22"
328
- ```
329
-
330
- ### 4. Revert Commit on main
331
-
332
- ```bash
333
- # Revert version bump commit
334
- git checkout main
335
- git revert HEAD
336
- git push origin main
337
- ```
338
-
339
- **Checkpoint:** Tag and release deleted. main branch reverted. npm packages deprecated or unpublished.
340
-
341
- ---
342
-
343
- ## Common Failure Modes
344
-
345
- ### EOTP Error (npm OTP Required)
346
-
347
- **Symptom:** Workflow fails with `EOTP` error.
348
- **Root cause:** NPM_TOKEN is a User token with 2FA enabled. CI can't provide OTP.
349
- **Fix:** Replace NPM_TOKEN with an Automation token (no 2FA). See "NPM_TOKEN Verification" above.
350
-
351
- ### Verify Step 404 (npm Propagation Delay)
352
-
353
- **Symptom:** Verify step fails with 404 even though publish succeeded.
354
- **Root cause:** npm registry propagation delay (5-30 seconds).
355
- **Fix:** Verify step now has retry loop (5 attempts, 15s interval). Should auto-resolve. If not, wait 2 minutes and re-run workflow.
356
-
357
- ### Version Mismatch (package.json ≠ tag)
358
-
359
- **Symptom:** Verify step fails with "Package version (X) does not match target version (Y)".
360
- **Root cause:** package.json version doesn't match the tag version.
361
- **Fix:** Ensure all 3 package.json files were updated in Step 1. Re-run `npm version` if needed.
362
-
363
- ### 4-Part Version Mangled by npm
364
-
365
- **Symptom:** Published version on npm doesn't match package.json (e.g., 0.8.21.4 became 0.8.2-1.4).
366
- **Root cause:** 4-part versions are NOT valid semver. npm's parser misinterprets them.
367
- **Fix:** NEVER use 4-part versions. Only 3-part (0.8.22) or prerelease (0.8.23-preview.1). Run `semver.valid()` before ANY commit.
368
-
369
- ### Draft Release Didn't Trigger Workflow
370
-
371
- **Symptom:** Release created but `publish.yml` never ran.
372
- **Root cause:** Release was created as a draft. Draft releases don't emit `release: published` event.
373
- **Fix:** Edit release and change to published: `gh release edit "v$VERSION" --draft=false`. Workflow should trigger immediately.
374
-
375
- ---
376
-
377
- ## Validation Checklist
378
-
379
- Before starting ANY release, confirm:
380
-
381
- - [ ] Version is valid semver: `node -p "require('semver').valid('VERSION')"` returns the version string (NOT null)
382
- - [ ] NPM_TOKEN is an Automation token (no 2FA): `npm token list` shows `read-write` without OTP requirement
383
- - [ ] Branch is clean: `git status` shows "nothing to commit, working tree clean"
384
- - [ ] Tag doesn't exist: `git tag -l "vVERSION"` returns empty
385
- - [ ] `SKIP_BUILD_BUMP=1` is set: `echo $SKIP_BUILD_BUMP` returns `1`
386
-
387
- Before creating GitHub Release:
388
-
389
- - [ ] All 3 package.json files have matching versions: `grep '"version"' package.json packages/*/package.json`
390
- - [ ] Commit is pushed: `git log origin/main..main` returns empty
391
- - [ ] Tag is pushed: `git ls-remote --tags origin vVERSION` returns the tag SHA
392
-
393
- After GitHub Release:
394
-
395
- - [ ] Release is published (NOT draft): `gh release view "vVERSION"` output doesn't contain "(draft)"
396
- - [ ] Workflow is running: `gh run list --workflow=publish.yml --limit 1` shows "in_progress"
397
-
398
- After workflow completes:
399
-
400
- - [ ] Both jobs succeeded: Workflow shows green checkmarks
401
- - [ ] SDK on npm: `npm view @bradygaster/squad-sdk version` returns correct version
402
- - [ ] CLI on npm: `npm view @bradygaster/squad-cli version` returns correct version
403
- - [ ] `latest` tags correct: `npm dist-tag ls @bradygaster/squad-sdk` shows `latest: VERSION`
404
- - [ ] Packages install: `npm install @bradygaster/squad-cli` succeeds
405
-
406
- After dev sync:
110
+ ## Known Gotchas
407
111
 
408
- - [ ] dev branch has next preview version: `git show dev:package.json | grep version` shows next preview
112
+ | Gotcha | Impact | Mitigation |
113
+ |--------|--------|------------|
114
+ | npm workspaces rewrite `"*"` → `"file:../path"` | Broken global installs | Preflight scan in CI (squad-npm-publish.yml) |
115
+ | GitHub Actions workflow cache (~15min TTL) | 422 on workflow_dispatch after file renames | Wait 15min or use local publish fallback |
116
+ | `npm -w publish` hangs with 2FA | Silent hang, no error | Never use `-w` for publish |
117
+ | Draft GitHub Releases | npm publish workflow doesn't trigger | Never create drafts |
118
+ | User npm tokens with 2FA | EOTP errors in CI | Use Automation token type |
409
119
 
410
- ---
120
+ ## CI Gate: Workspace Publish Policy
411
121
 
412
- ## Post-Mortem Reference
122
+ The `publish-policy` job in `squad-ci.yml` scans all workflow files for bare `npm publish` commands that are missing `-w`/`--workspace` flags. Any workflow that attempts a non-workspace-scoped publish will fail CI. This prevents accidental root-level publishes that would push the wrong `package.json` to npm.
413
123
 
414
- This skill was created after the v0.8.22 release disaster. Full retrospective: `.squad/decisions/inbox/keaton-v0822-retrospective.md`
124
+ See `.github/workflows/squad-ci.yml` `publish-policy` job for implementation details.
415
125
 
416
- **Key learnings:**
417
- 1. No release without a runbook = improvisation = disaster
418
- 2. Semver validation is mandatory — 4-part versions break npm
419
- 3. NPM_TOKEN type matters — User tokens with 2FA fail in CI
420
- 4. Draft releases are a footgun — they don't trigger automation
421
- 5. Retry logic is essential — npm propagation takes time
126
+ ## Related
422
127
 
423
- **Never again.**
128
+ - Issues: #556–#564 (release:next)
129
+ - Retro: `.squad/decisions/inbox/surgeon-v091-retrospective.md`
130
+ - CI audit: `.squad/decisions/inbox/booster-ci-audit.md`
131
+ - Playbook: `PUBLISH-README.md` (repo root)
@@ -0,0 +1,148 @@
1
+ # Skill: Retro Enforcement
2
+
3
+ ## Purpose
4
+
5
+ Ensure retrospectives happen on schedule and that their action items are tracked in GitHub Issues — not markdown checklists.
6
+
7
+ This skill addresses a specific, measured failure mode: **0% completion rate on markdown retro action items across 6 consecutive retrospectives**. GitHub Issues have an 85%+ completion rate in the same squad. The format was the problem, not the people.
8
+
9
+ ## Core Function: Test-RetroOverdue
10
+
11
+ ```powershell
12
+ function Test-RetroOverdue {
13
+ param(
14
+ [string]$LogDir = ".squad/log",
15
+ [int]$WindowDays = 7,
16
+ [string]$Pattern = "*retrospective*"
17
+ )
18
+
19
+ $cutoff = (Get-Date).AddDays(-$WindowDays)
20
+
21
+ $retroLogs = Get-ChildItem -Path $LogDir -Filter $Pattern -ErrorAction SilentlyContinue |
22
+ Where-Object { $_.LastWriteTime -ge $cutoff }
23
+
24
+ return ($retroLogs.Count -eq 0)
25
+ }
26
+ ```
27
+
28
+ ### Returns
29
+ - `$true` — No retro log found within the window. **Retro is overdue. Block other work.**
30
+ - `$false` — At least one retro log found within the window. Proceed normally.
31
+
32
+ ### Detection Logic
33
+
34
+ The function checks `.squad/log/` for any file matching `*retrospective*` dated within the last `$WindowDays` days (default: 7). If none is found, the retro is overdue.
35
+
36
+ **File naming convention:** `.squad/log/{ISO8601-timestamp}-retrospective.md`
37
+
38
+ Example: `.squad/log/2026-03-24T14-45-00Z-retrospective.md`
39
+
40
+ ## Coordinator Integration
41
+
42
+ Call `Test-RetroOverdue` **at the start of every round**, before building the work queue.
43
+
44
+ ```powershell
45
+ # At round start — before any work queue construction
46
+ if (Test-RetroOverdue -LogDir ".squad/log" -WindowDays 7) {
47
+ Write-Host "[RETRO] Retrospective overdue. Running before other work."
48
+
49
+ # Spawn retro facilitator
50
+ Invoke-RetroSession -Mode "catch-up"
51
+
52
+ # Wait for retro log to be written
53
+ # Then resume normal round
54
+ }
55
+
56
+ # Proceed with normal work queue
57
+ $workQueue = Get-PendingIssues | Sort-Object -Property Priority
58
+ ```
59
+
60
+ ### Blocking Semantics
61
+
62
+ When `Test-RetroOverdue` returns `$true`:
63
+
64
+ 1. **Do not start any other work** until the retro completes
65
+ 2. **Spawn the facilitator agent** (Scribe or designated) with retro mode
66
+ 3. **Wait for the log file** to be written to `.squad/log/`
67
+ 4. **Verify action items** were created as GitHub Issues (not markdown)
68
+ 5. **Resume normal round** after retro log confirmed
69
+
70
+ ## Action Item Enforcement
71
+
72
+ Every retro action item MUST become a GitHub Issue. The facilitator agent is responsible for this. The coordinator verifies.
73
+
74
+ ### Verification Check
75
+
76
+ ```powershell
77
+ function Test-RetroActionItemsCreated {
78
+ param([string]$RetroLogPath)
79
+
80
+ $content = Get-Content $RetroLogPath -Raw
81
+
82
+ # Check for Issue references (e.g., #1478, https://github.com/.../issues/1478)
83
+ $issueRefs = [regex]::Matches($content, '(?:#\d{3,}|issues/\d{3,})')
84
+
85
+ # Check for unclosed markdown checkboxes (bad pattern)
86
+ $openCheckboxes = [regex]::Matches($content, '- \[ \]')
87
+
88
+ if ($openCheckboxes.Count -gt 0) {
89
+ Write-Warning "[RETRO] Found $($openCheckboxes.Count) markdown checkboxes — convert to Issues"
90
+ return $false
91
+ }
92
+
93
+ return ($issueRefs.Count -gt 0)
94
+ }
95
+ ```
96
+
97
+ ### Why Not Markdown Checklists
98
+
99
+ From production data in tamirdresher/tamresearch1:
100
+
101
+ | Retro | Action Items Format | Completion |
102
+ |-------|---------------------|------------|
103
+ | 2025-12-05 | Markdown `- [ ]` | 0/4 = **0%** |
104
+ | 2025-12-19 | Markdown `- [ ]` | 0/3 = **0%** |
105
+ | 2026-01-09 | Markdown `- [ ]` | 0/5 = **0%** |
106
+ | 2026-01-23 | Markdown `- [ ]` | 0/4 = **0%** |
107
+ | 2026-02-07 | Markdown `- [ ]` | 0/3 = **0%** |
108
+ | 2026-02-21 | Markdown `- [ ]` | 0/4 = **0%** |
109
+ | 2026-03-24 | GitHub Issues | 4/4 = **100%** (after enforcement) |
110
+
111
+ **Root cause:** Markdown checklists have no assignee, no notifications, no close event, and no query surface. They are invisible to every workflow that drives completion.
112
+
113
+ ## Cadence Enforcement
114
+
115
+ ### Recommended schedule
116
+ - Weekly squads: window = 7 days
117
+ - Bi-weekly squads: window = 14 days
118
+
119
+ ### Ralph integration example
120
+
121
+ ```powershell
122
+ # ralph-watch.ps1 — round start hook
123
+ function Invoke-RoundStart {
124
+ # 1. Always check retro first
125
+ if (Test-RetroOverdue -LogDir "$RepoRoot/.squad/log" -WindowDays 7) {
126
+ Write-Host "[RALPH] Retro overdue — enforcing before work queue"
127
+ Invoke-RetroSession
128
+ return # Re-enter round after retro completes
129
+ }
130
+
131
+ # 2. Normal work queue
132
+ $issues = Get-ReadyIssues
133
+ foreach ($issue in $issues) {
134
+ Invoke-WorkItem -Issue $issue
135
+ }
136
+ }
137
+ ```
138
+
139
+ ## Skill Metadata
140
+
141
+ | Field | Value |
142
+ |-------|-------|
143
+ | **Skill ID** | `retro-enforcement` |
144
+ | **Category** | Ceremonies / Process |
145
+ | **Trigger** | Coordinator round start |
146
+ | **Dependencies** | `.squad/log/` directory, GitHub Issues API |
147
+ | **Tested in** | tamirdresher/tamresearch1 (production, March 2026) |
148
+ | **Outcome** | Retro cadence restored; action item completion 0% → 100% |