switchroom 0.21.11 → 0.21.12

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.
@@ -2120,7 +2120,7 @@ var init_esm = __esm(() => {
2120
2120
  });
2121
2121
 
2122
2122
  // src/build-info.ts
2123
- var VERSION = "0.21.11", COMMIT_SHA = "7a80af9d", COMMIT_DATE = "2026-08-14T09:19:49Z";
2123
+ var VERSION = "0.21.12", COMMIT_SHA = "66041822", COMMIT_DATE = "2026-08-14T20:57:00Z";
2124
2124
 
2125
2125
  // src/cli/resolve-version.ts
2126
2126
  import { existsSync, readFileSync } from "node:fs";
@@ -21565,7 +21565,7 @@ function allocateAgentUid(name) {
21565
21565
  }
21566
21566
 
21567
21567
  // src/build-info.ts
21568
- var VERSION = "0.21.11";
21568
+ var VERSION = "0.21.12";
21569
21569
 
21570
21570
  // src/setup/hindsight-recall-passthrough.ts
21571
21571
  var HINDSIGHT_RECALL_TAG_WEIGHT_SEED = Object.freeze({ sidechain: 0.8 });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "switchroom",
3
3
  "//version": "NOT the release version — source of truth is the git tag, resolved by scripts/build.mjs:resolveVersion() (see CLAUDE.md > Standard release process). This field is stale by design and only the Layer-4 dev/non-tag fallback for build.mjs + src/cli/resolve-version.ts; do NOT bump it expecting a release to pick it up. npm-pack tarball naming needs a real version — do that as an UNCOMMITTED pack-time bump (see release step 6), never a committed one.",
4
- "version": "0.21.11",
4
+ "version": "0.21.12",
5
5
  "description": "Run Claude Code 24/7 on your Claude Pro/Max subscription over Telegram. Open-source alternative to OpenClaw and NanoClaw — no API keys.",
6
6
  "type": "module",
7
7
  "bin": {
@@ -57,6 +57,7 @@
57
57
  "lint:claude-cli-lockstep": "node scripts/check-claude-cli-lockstep.mjs",
58
58
  "lint:changelog-entry": "node scripts/check-changelog-entry.mjs",
59
59
  "changelog:generate": "node scripts/gen-changelog-entry.mjs",
60
+ "changelog:cut": "node scripts/cut-changelog-release.mjs",
60
61
  "lint:agent-attribution-trailers": "node scripts/check-agent-attribution-trailers.mjs",
61
62
  "lint:hostd-template-guard": "bun scripts/check-hostd-template-guard.ts",
62
63
  "lint:bench-baseline-anonymised": "node scripts/check-bench-baseline-anonymised.mjs",
@@ -83,6 +84,7 @@
83
84
  "@types/bun": "^1.3.11",
84
85
  "@types/node": "^22.0.0",
85
86
  "@vitest/coverage-v8": "3.2.4",
87
+ "commonmark": "0.31.2",
86
88
  "typescript": "^5.7.0",
87
89
  "vitest": "^3.2.4"
88
90
  },
@@ -139,17 +139,21 @@ is not a rebuttal.
139
139
  `AWAITING_CHECKS` means a required workflow is not listening for
140
140
  `merge_group`; `.github/MERGE-QUEUE.md` owns that failure mode and the
141
141
  invariants that prevent it.
142
- - **Stage the CHANGELOG entry author-side, before `gh pr create`.** A PR that
143
- changes shippable code must add a `## Unreleased` entry (#4469's
142
+ - **Stage the changelog note author-side, before `gh pr create`.** A PR that
143
+ changes shippable code must add a NEW `changelog.d/` fragment file (#4469's
144
144
  `check-changelog-entry.mjs`, part of `npm run lint`, enforces it). Don't
145
- hand-write it: run `bun run changelog:generate` in the repo — it derives the
146
- entry from your conventional-commit title, appends it under `## Unreleased`
147
- (idempotently — a second run is a no-op), and respects the escape hatches. Then
148
- commit CHANGELOG.md so it lands in your own push. It runs AUTHOR-side, not in
149
- CI, because a CI commit-back with the default `GITHUB_TOKEN` cannot re-trigger
150
- the required checks and would wedge the PR (`.github/MERGE-QUEUE.md` §
151
- "Author-side changelog generation"). Opt a docs/chore/test PR out with the
152
- `no-changelog` label or a `[skip changelog]` token on its own line.
145
+ hand-edit `CHANGELOG.md`: run `bun run changelog:generate` in the repo — it
146
+ derives a per-PR fragment (`changelog.d/<pr>-<slug>.<type>.md`) from your
147
+ conventional-commit title (idempotently — a second run is a no-op) and
148
+ respects the escape hatches. Then commit the fragment so it lands in your
149
+ own push. Fragment files are per-PR, so they never conflict with another
150
+ in-flight PR editing the shared `## Unreleased` section does, which is
151
+ exactly the conflict class fragments replace (see `changelog.d/README.md`).
152
+ It runs AUTHOR-side, not in CI, because a CI commit-back with the default
153
+ `GITHUB_TOKEN` cannot re-trigger the required checks and would wedge the PR
154
+ (`.github/MERGE-QUEUE.md` § "Author-side changelog generation"). Opt a
155
+ docs/chore/test PR out with the `no-changelog` label or a `[skip changelog]`
156
+ token on its own line.
153
157
  - **A test that wouldn't fail on the bug it guards is not a test.** Assert the
154
158
  observable outcome, not that the code path executed.
155
159
  - **Prefer a deterministic mechanism over prompt discipline.** If a check, a
@@ -22,14 +22,20 @@ Cut a release of `switchroom/switchroom` and get it live on the fleet. This is a
22
22
  1. `git fetch origin`, confirm `main` is at the commit you want released.
23
23
  2. `gh pr list --state open` — confirm no PR meant for this release is still open. Ask the operator if unsure.
24
24
  3. Confirm CI on `main` is green (`gh run list --branch main --limit 3`).
25
- 4. Read `CHANGELOG.md`the `## Unreleased` section is the **continuously-maintained** staging area for this release's notes. Every PR since the last release stages its own entry there as it merges, enforced by `scripts/check-changelog-entry.mjs` (part of `npm run lint`), so by release time this section should already read as a near-complete draft — you tidy and summarise, you do NOT author it from scratch. **An empty (or missing) `## Unreleased` at release time is now an ANOMALY, not the normal state:** it means either there genuinely is nothing to release, OR the enforcement was bypassed (`no-changelog` labels / `[skip changelog]` tokens on their own line on PRs that should have staged entries). Before assuming the former, cross-check against `git log <last-tag>..origin/main` — if real shippable work landed but Unreleased is bare, investigate and reconstruct rather than shipping a hollow release (this is exactly the v0.20.12 failure mode the enforcement exists to prevent).
25
+ 4. Read the staged notes they live in TWO places, both **continuously maintained** as PRs merge and both enforced by `scripts/check-changelog-entry.mjs` (part of `npm run lint`): the `changelog.d/` **fragment files** (the primary path — every shippable PR adds its own `<pr>-<slug>.<type>.md`; see `changelog.d/README.md`) and any legacy/hand-staged entries under `## Unreleased` in `CHANGELOG.md`. Together they should already read as a near-complete draft — you assemble and tidy, you do NOT author from scratch. **Nothing staged at release time (no fragments AND an empty `## Unreleased`) is an ANOMALY, not the normal state** — `bun run changelog:cut` refuses to cut it: it means either there genuinely is nothing to release, OR the enforcement was bypassed (`no-changelog` labels / `[skip changelog]` tokens on their own line on PRs that should have staged notes). Before assuming the former, cross-check against `git log <last-tag>..origin/main` — if real shippable work landed but nothing is staged, investigate and reconstruct rather than shipping a hollow release (this is exactly the v0.20.12 failure mode the enforcement exists to prevent).
26
26
  5. Pick the next version: read the latest tag (`git tag --list 'v*' --sort=-v:refname | head -1`) and bump the patch (or minor if the operator asks). Confirm with the operator which.
27
27
 
28
- ## Step 1 — Consolidate the changelog (the release commit is CHANGELOG-only)
28
+ ## Step 1 — Assemble the changelog (the release commit is CHANGELOG + fragment deletions only)
29
29
 
30
- - The section is maintained continuously (see pre-flight 4), so this step is now a **rename + tidy**, not authorship: change the `## Unreleased` header to `## vX.Y.Z — <one-line summary>`, then read through the staged entries and lightly edit for grouping/summary. If Unreleased was empty or thin, STOP and resolve the anomaly (pre-flight 4) before proceeding — do not invent a release note.
31
- - **Re-seed a fresh empty `## Unreleased` block at the top** (header + the convention HTML comment) immediately below `# Changelog`, so the staging area exists for the next cycle and `scripts/check-changelog-entry.mjs` keeps enforcing it. (Copy the comment block from the section you just renamed.)
32
- - The release commit touches **CHANGELOG.md only**. Do NOT bump `package.json` (placeholder discipline).
30
+ - The notes are staged continuously (see pre-flight 4), so this step is **one command + a review**, not authorship:
31
+
32
+ ```bash
33
+ bun run changelog:cut -- --version vX.Y.Z --summary "<one-line summary>"
34
+ ```
35
+
36
+ `scripts/cut-changelog-release.mjs` folds every `changelog.d/` fragment (plus anything hand-staged under `## Unreleased`) into a new `## vX.Y.Z — <summary>` section grouped by category, **re-seeds a fresh empty `## Unreleased` block** (header + convention comment) below `# Changelog`, and **deletes the consumed fragment files**. Use `--dry-run` first to preview the assembled section. It FAILS LOUDLY on a double cut or an empty cut — if it refuses for "nothing to release", STOP and resolve the anomaly (pre-flight 4); do not invent a release note.
37
+ - Read through the assembled section and lightly edit for grouping/summary before committing.
38
+ - The release commit touches **CHANGELOG.md and the deleted `changelog.d/` fragments only**. Do NOT bump `package.json` (placeholder discipline). (A CHANGELOG + fragment-deletion PR changes no shippable code, so `check-changelog-entry.mjs` passes it without a staged note of its own — deleting fragments never counts as staging one.)
33
39
  - Branch protection blocks direct push to `main`, so: create a `release/vX.Y.Z` branch, push it, open a `chore: release vX.Y.Z` PR (base `main`), arm auto-merge (squash, delete-branch) on green CI.
34
40
 
35
41
  ## Step 2 — Create the DRAFT release on a PINNED SHA, then push the tag
@@ -105739,10 +105739,10 @@ function startOutboxSweep(deps) {
105739
105739
  }
105740
105740
 
105741
105741
  // ../src/build-info.ts
105742
- var VERSION2 = "0.21.11";
105743
- var COMMIT_SHA = "7a80af9d";
105744
- var COMMIT_DATE = "2026-08-14T09:19:49Z";
105745
- var LATEST_PR = 4713;
105742
+ var VERSION2 = "0.21.12";
105743
+ var COMMIT_SHA = "66041822";
105744
+ var COMMIT_DATE = "2026-08-14T20:57:00Z";
105745
+ var LATEST_PR = 4717;
105746
105746
  var COMMITS_AHEAD_OF_TAG = 0;
105747
105747
 
105748
105748
  // gateway/boot-version.ts