aiwg 2026.6.4 → 2026.6.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.
- package/CLAUDE.md +1 -1
- package/package.json +1 -1
- package/tools/release/cut-tag.sh +44 -25
package/CLAUDE.md
CHANGED
|
@@ -674,7 +674,7 @@ Before pushing a version tag:
|
|
|
674
674
|
5. **Commit the release prep** — `git commit` the package.json/CHANGELOG/announcement bump. Do NOT use plain `git tag -a` or `git tag -s` (they sign with `user.signingkey`, which is typically the maintainer's *personal commit-signing key* — wrong key for tags; the supply-chain gate `tools/ci/verify-signed-tag.sh` will reject in CI).
|
|
675
675
|
6. **Cut the tag via the wrapper — REQUIRED, never `git tag` by hand** — `tools/release/cut-tag.sh <X.Y.Z>`. Runs 10 pre-tag checks (CalVer shape, `package.json` + `marketplace.json` lockstep, **CHANGELOG entry present**, **announcement file present**, release-signing key both present locally AND published in `.gitea/keys/maintainers.asc`) and signs with `-u <RELEASE_KEY_FINGERPRINT>` (default: `FE9272F0BC5781E1DE77FAAA719AB63879E84CE8`, the `AIWG Release Signing <release@aiwg.io>` key per the two-key model from commit `a13dabc5`). **Bypassing this wrapper is how v2026.5.10 shipped without a CHANGELOG entry — don't repeat the failure.** See the v2026.5.5 incident note in `docs/contributing/versioning.md` for the signing-key variant of the same lesson.
|
|
676
676
|
7. **Push tag to Gitea** — `git push origin main --tags`. Triggers `gitea-release.yml` + `npm-publish.yml` (both gated on signed-tag verify).
|
|
677
|
-
8. **
|
|
677
|
+
8. **GitHub mirror is automatic** — the Gitea tag push in step 7 triggers `github-mirror.yml`, which pushes `main` + the tag to the GitHub mirror (`jmagly/aiwg`) **and** creates the GitHub Release using `docs/releases/v<version>-announcement.md` as the body (it reads the `GH_ACCESS_TOKEN` Gitea Actions secret). **Do NOT run `git push github` or `gh release create` manually for stable releases** — a manual tag push races the workflow's own tag push and makes the mirror job fail on "tag already exists." Pre-release tags (`-rc.*`, `-alpha.*`, `-beta.*`, `-nightly.*`) skip GitHub-Release creation by design.
|
|
678
678
|
|
|
679
679
|
### Version Format
|
|
680
680
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aiwg",
|
|
3
|
-
"version": "2026.6.
|
|
3
|
+
"version": "2026.6.6",
|
|
4
4
|
"description": "Deployment tool and support utility for AI context. Copies agents, skills, commands, rules, and behaviors into the paths each AI platform reads (Claude Code, Codex, Copilot, Cursor, Warp, OpenClaw, and 6 more) so one source of truth works across 10 platforms. Optional utilities for persistent artifact memory, background orchestration, autonomous loops, and artifact indexing.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
package/tools/release/cut-tag.sh
CHANGED
|
@@ -28,13 +28,15 @@
|
|
|
28
28
|
# 1. Verifies <version> matches the CalVer YYYY.M.PATCH shape (no leading zeros)
|
|
29
29
|
# 2. Verifies package.json version matches <version>
|
|
30
30
|
# 3. Verifies .claude-plugin/marketplace.json metadata.version matches (PUW-038 lockstep)
|
|
31
|
-
# 4. Verifies
|
|
32
|
-
# 5. Verifies
|
|
33
|
-
# 6. Verifies
|
|
34
|
-
# 7. Verifies
|
|
35
|
-
# 8.
|
|
36
|
-
# 9. Verifies the
|
|
37
|
-
# 10.
|
|
31
|
+
# 4. Verifies apps/cockpit/package.json version matches (@aiwg/cockpit lockstep)
|
|
32
|
+
# 5. Verifies package-lock.json version matches (CI check:versions / npm ci gate)
|
|
33
|
+
# 6. Verifies CHANGELOG.md has an entry for [<version>]
|
|
34
|
+
# 7. Verifies docs/releases/v<version>-announcement.md exists
|
|
35
|
+
# 8. Verifies the AIWG release-signing key is available locally
|
|
36
|
+
# 9. Verifies the release-signing key is published in .gitea/keys/maintainers.asc
|
|
37
|
+
# 10. Creates the signed tag with `git tag -s -u <release-key-fingerprint>`
|
|
38
|
+
# 11. Verifies the tag's signature locally before any push (`git tag -v`)
|
|
39
|
+
# 12. Reports next-step push commands; does NOT push automatically
|
|
38
40
|
#
|
|
39
41
|
# The push step is intentionally left to the operator so this script can
|
|
40
42
|
# also be run as a sanity check before a release ceremony.
|
|
@@ -102,7 +104,7 @@ FAIL: '$VERSION' does not match CalVer 'YYYY.M.PATCH'.
|
|
|
102
104
|
EOF
|
|
103
105
|
exit 1
|
|
104
106
|
fi
|
|
105
|
-
echo " [1/
|
|
107
|
+
echo " [1/12] CalVer shape OK: $VERSION"
|
|
106
108
|
|
|
107
109
|
# ---------------------------------------------------------------------------
|
|
108
110
|
# 2. package.json lockstep
|
|
@@ -116,7 +118,7 @@ FAIL: package.json version is '$PKG_VERSION', expected '$VERSION'.
|
|
|
116
118
|
EOF
|
|
117
119
|
exit 1
|
|
118
120
|
fi
|
|
119
|
-
echo " [2/
|
|
121
|
+
echo " [2/12] package.json lockstep OK"
|
|
120
122
|
|
|
121
123
|
# ---------------------------------------------------------------------------
|
|
122
124
|
# 3. .claude-plugin/marketplace.json metadata.version lockstep (PUW-038 #1139)
|
|
@@ -130,7 +132,7 @@ FAIL: .claude-plugin/marketplace.json metadata.version is '$MP_VERSION',
|
|
|
130
132
|
EOF
|
|
131
133
|
exit 1
|
|
132
134
|
fi
|
|
133
|
-
echo " [3/
|
|
135
|
+
echo " [3/12] marketplace.json lockstep OK"
|
|
134
136
|
|
|
135
137
|
# ---------------------------------------------------------------------------
|
|
136
138
|
# 4. @aiwg/cockpit package lockstep
|
|
@@ -144,10 +146,27 @@ FAIL: apps/cockpit/package.json version is '$COCKPIT_VERSION',
|
|
|
144
146
|
EOF
|
|
145
147
|
exit 1
|
|
146
148
|
fi
|
|
147
|
-
echo " [4/
|
|
149
|
+
echo " [4/12] @aiwg/cockpit package lockstep OK"
|
|
148
150
|
|
|
149
151
|
# ---------------------------------------------------------------------------
|
|
150
|
-
# 5.
|
|
152
|
+
# 5. package-lock.json lockstep
|
|
153
|
+
# CI's `check:versions` / `npm ci` reject a lockfile whose version drifts
|
|
154
|
+
# from package.json, which fails the build gate and blocks npm publish.
|
|
155
|
+
# Catch it here instead of after the tag is already pushed.
|
|
156
|
+
# ---------------------------------------------------------------------------
|
|
157
|
+
LOCK_VERSION=$(node -e "console.log(JSON.parse(require('fs').readFileSync('package-lock.json','utf8')).version)")
|
|
158
|
+
if [ "$LOCK_VERSION" != "$VERSION" ]; then
|
|
159
|
+
cat <<EOF >&2
|
|
160
|
+
FAIL: package-lock.json version is '$LOCK_VERSION', expected '$VERSION'.
|
|
161
|
+
Run: npm install --package-lock-only
|
|
162
|
+
(then commit package-lock.json) so CI's check:versions / npm ci pass.
|
|
163
|
+
EOF
|
|
164
|
+
exit 1
|
|
165
|
+
fi
|
|
166
|
+
echo " [5/12] package-lock.json lockstep OK"
|
|
167
|
+
|
|
168
|
+
# ---------------------------------------------------------------------------
|
|
169
|
+
# 6. CHANGELOG.md entry exists
|
|
151
170
|
# ---------------------------------------------------------------------------
|
|
152
171
|
if ! grep -q "^## \[${VERSION}\]" CHANGELOG.md; then
|
|
153
172
|
cat <<EOF >&2
|
|
@@ -156,10 +175,10 @@ FAIL: CHANGELOG.md does not contain '## [${VERSION}]'.
|
|
|
156
175
|
EOF
|
|
157
176
|
exit 1
|
|
158
177
|
fi
|
|
159
|
-
echo " [
|
|
178
|
+
echo " [6/12] CHANGELOG.md entry OK"
|
|
160
179
|
|
|
161
180
|
# ---------------------------------------------------------------------------
|
|
162
|
-
#
|
|
181
|
+
# 7. Release announcement file exists
|
|
163
182
|
# ---------------------------------------------------------------------------
|
|
164
183
|
ANNOUNCEMENT="docs/releases/v${VERSION}-announcement.md"
|
|
165
184
|
if [ ! -f "$ANNOUNCEMENT" ]; then
|
|
@@ -170,10 +189,10 @@ FAIL: $ANNOUNCEMENT does not exist.
|
|
|
170
189
|
EOF
|
|
171
190
|
exit 1
|
|
172
191
|
fi
|
|
173
|
-
echo " [
|
|
192
|
+
echo " [7/12] Announcement file OK"
|
|
174
193
|
|
|
175
194
|
# ---------------------------------------------------------------------------
|
|
176
|
-
#
|
|
195
|
+
# 8. Release-signing key available locally
|
|
177
196
|
# ---------------------------------------------------------------------------
|
|
178
197
|
if ! gpg --list-secret-keys "$RELEASE_KEY_FINGERPRINT" >/dev/null 2>&1; then
|
|
179
198
|
cat <<EOF >&2
|
|
@@ -189,10 +208,10 @@ FAIL: Release-signing key $RELEASE_KEY_FINGERPRINT not found in local
|
|
|
189
208
|
EOF
|
|
190
209
|
exit 1
|
|
191
210
|
fi
|
|
192
|
-
echo " [
|
|
211
|
+
echo " [8/12] Release-signing key present locally"
|
|
193
212
|
|
|
194
213
|
# ---------------------------------------------------------------------------
|
|
195
|
-
#
|
|
214
|
+
# 9. Release-signing key published in maintainers.asc
|
|
196
215
|
# ---------------------------------------------------------------------------
|
|
197
216
|
# Extract fingerprints from the committed keyring and check ours is among
|
|
198
217
|
# them. We use `gpg --show-keys --with-colons` so the output is parseable
|
|
@@ -209,10 +228,10 @@ FAIL: Release-signing key $RELEASE_KEY_FINGERPRINT is NOT published in
|
|
|
209
228
|
EOF
|
|
210
229
|
exit 1
|
|
211
230
|
fi
|
|
212
|
-
echo " [
|
|
231
|
+
echo " [9/12] Release-signing key published in maintainers.asc"
|
|
213
232
|
|
|
214
233
|
# ---------------------------------------------------------------------------
|
|
215
|
-
#
|
|
234
|
+
# 10. Create signed tag with explicit release key (-u override)
|
|
216
235
|
# ---------------------------------------------------------------------------
|
|
217
236
|
if [ -z "$TAG_MESSAGE" ]; then
|
|
218
237
|
TODAY=$(date -u '+%Y-%m-%d')
|
|
@@ -233,10 +252,10 @@ EOF
|
|
|
233
252
|
fi
|
|
234
253
|
|
|
235
254
|
git tag -s -u "$RELEASE_KEY_FINGERPRINT" "$TAG" -m "$TAG_MESSAGE"
|
|
236
|
-
echo " [
|
|
255
|
+
echo " [10/12] Signed tag '$TAG' created with release key"
|
|
237
256
|
|
|
238
257
|
# ---------------------------------------------------------------------------
|
|
239
|
-
#
|
|
258
|
+
# 11. Local verify (mirror of the CI gate logic)
|
|
240
259
|
# ---------------------------------------------------------------------------
|
|
241
260
|
if ! git tag -v "$TAG" >/dev/null 2>&1; then
|
|
242
261
|
cat <<EOF >&2
|
|
@@ -248,14 +267,14 @@ EOF
|
|
|
248
267
|
git tag -d "$TAG" >/dev/null 2>&1 || true
|
|
249
268
|
exit 1
|
|
250
269
|
fi
|
|
251
|
-
echo " [
|
|
270
|
+
echo " [11/12] Local 'git tag -v' verification passed"
|
|
252
271
|
|
|
253
272
|
# ---------------------------------------------------------------------------
|
|
254
|
-
#
|
|
273
|
+
# 12. Report next steps; do NOT auto-push
|
|
255
274
|
# ---------------------------------------------------------------------------
|
|
256
275
|
cat <<EOF
|
|
257
276
|
|
|
258
|
-
[
|
|
277
|
+
[12/12] Ready to push. The push step is left manual on purpose —
|
|
259
278
|
inspect the tag once more with 'git tag -v $TAG' if you want, then:
|
|
260
279
|
|
|
261
280
|
git push origin main --tags
|