@twinsearth/w2m-dsh-plugin 1.0.14 → 1.0.16

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/CHANGELOG.md CHANGED
@@ -2,6 +2,88 @@
2
2
 
3
3
  All notable changes to this project are documented here.
4
4
 
5
+ ## [1.0.16] — 2026-10-17
6
+
7
+ **The last two failures on Linux CI, and one of them was a defect in the release process: a release was advertised as
8
+ "latest" before its assets had finished uploading.**
9
+
10
+ ### A release must not be "latest" until it can be downloaded
11
+
12
+ The release script created the release with `make_latest: 'true'` and *then* uploaded the tarball. That leaves a
13
+ window in which `releases/latest` points at a release **with no tarball** -- and CI's live-API job read exactly that,
14
+ failing with:
15
+
16
+ > `ASSET_MISSING no release asset matches /\.(?:tgz|tar\.gz)$/i`
17
+
18
+ on a release that was complete seconds later. **The ordering was the defect, not the test.** The release is now created
19
+ without `make_latest`, the assets are attached, **and only then is it promoted** -- so a reader following the
20
+ "latest" link always lands on something downloadable.
21
+
22
+ ### A test that was only true on a developer machine
23
+
24
+ `test/fleet-sync.test.mjs` removes the repository's git identity to prove the tool refuses to rebase without one. It
25
+ checked `git config user.email`, which **falls back to the global and system config** -- absent on a developer machine,
26
+ **present on GitHub's runners**. So the tool correctly found an identity and the test's premise was false, on CI only.
27
+
28
+ The test now points `GIT_CONFIG_GLOBAL` and `GIT_CONFIG_SYSTEM` at paths that do not exist, so git's config is exactly
29
+ as empty as the test claims. It also restores every environment variable it touches.
30
+
31
+ ### Verified
32
+
33
+ Full suite **2380 tests in 93 files, 2366 pass, 0 fail, 14 skip**; pre-flight **GREEN, 15 of 15 checks**.
34
+
35
+ ## [1.0.15] — 2026-10-17
36
+
37
+ **Every 1.0.x GitHub release was missing its `SHA256SUMS` asset, so updating from GitHub could not be verified and
38
+ would be refused. That is fixed, along with the two tests that were failing on Linux CI.**
39
+
40
+ ### The product defect: un-updatable releases
41
+
42
+ `src/plugin/update-source.mjs` refuses to offer an update without a checksum asset:
43
+
44
+ > `no SHA256SUMS asset for ${tag}; cannot verify a download without it`
45
+
46
+ The 0.x releases carry **two** assets (tarball + sums). **When the 1.0 line was cut, the release script uploaded only the
47
+ tarball** -- so every 1.0.x release looked complete and was, in fact, **un-updatable from GitHub**. Nothing local could
48
+ have caught it: the tarball was present and correct, and only a job that calls the real API noticed.
49
+
50
+ Fixed in three places:
51
+
52
+ * `scripts/github-release.mjs` now derives the sums from the same bytes it uploads and attaches `SHA256SUMS` in the
53
+ same run, **and reads back the asset list** so a missing sums file is a release failure rather than a warning;
54
+ * the asset has been backfilled on **all fourteen** 1.0.x releases (v1.0.1 … v1.0.14), each checksum computed from the
55
+ bytes GitHub actually serves;
56
+ * the live-API test in `test/update-source.test.mjs` now passes -- it was the only thing that ever reported this.
57
+
58
+ ### Two tests that failed only on Linux CI
59
+
60
+ Both were invisible on Windows, and both were **the test's** fault, not the code's:
61
+
62
+ **`test/vision.test.mjs`** created its settings fixture with the default umask, which is `0644` on Linux. The loader
63
+ correctly refuses a file that holds a key and is group-readable, so the test got *"mode 644"* instead of the message it
64
+ asserted. **The fixture should be 0600; the guard was right.**
65
+
66
+ **`test/chatops-bridge.test.mjs`** faked its timer with a real `setTimeout`. The broker calls `record.timer.unref()`,
67
+ so during the await the only pending handle is an **unref'd** timeout -- which does not keep the event loop alive. On
68
+ Linux the loop drained before it fired and node reported
69
+ `cancelledByParent: Promise resolution is still pending but the event loop has already resolved`. **It passed on Windows
70
+ by accident of scheduling.** The timer is now deterministic: the callback is captured and fired explicitly.
71
+
72
+ ### Release titles are version numbers
73
+
74
+ The repository home page sidebar renders the latest release's **name**, and the name was the commit subject:
75
+
76
+ > `test(merge): verify merging while a third machine publishes -- never tears, …`
77
+
78
+ -- where a reader looking for "which version is current?" expects `v1.0.14`. The title is now the tag; **the commit
79
+ subject moved to the first line of the body**, so nothing is lost and the one slot that names the release names the
80
+ version. All fourteen 1.0.x releases were renamed to match.
81
+
82
+ ### Verified
83
+
84
+ Full suite **2380 tests in 93 files, 2366 pass, 0 fail, 14 skip**; pre-flight **GREEN, 15 of 15 checks**.
85
+ `test/update-source.test.mjs` (which makes a real GitHub API call) passes: **50 tests, 49 pass, 0 fail**.
86
+
5
87
  ## [1.0.14] — 2026-10-17
6
88
 
7
89
  **Merging while a third machine publishes is verified: it never tears, never writes, and names its failures.**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twinsearth/w2m-dsh-plugin",
3
- "version": "1.0.14",
3
+ "version": "1.0.16",
4
4
  "description": "Run one project across your own Windows and macOS machines from a single DeepSeek account, through 11 w2m_* tools. Four coordination modes (replicate, split, broadcast, pipeline) and six aggregate verdicts (consistent, divergent, divergent-platform, failed, partial, unverifiable). P2P hole punching by default, with a bundled relay, STUN responder and ledger fallback, so the fleet needs no third-party service. Joining needs a pairing code plus autoStartAgent: true; installing alone does not join.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
package/plugin.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "twinsearth-w2m-dsh",
4
- "version": "1.0.14",
4
+ "version": "1.0.16",
5
5
  "description": "Run one project across your own Windows and macOS machines from a single DeepSeek account, through 11 w2m_* tools. Four coordination modes (replicate, split, broadcast, pipeline) and six aggregate verdicts (consistent, divergent, divergent-platform, failed, partial, unverifiable). P2P hole punching by default, with a bundled relay, STUN responder and ledger fallback, so the fleet needs no third-party service. Joining needs a pairing code plus autoStartAgent: true; installing alone does not join.",
6
6
  "license": "MIT",
7
7
  "keywords": [
@@ -211,7 +211,7 @@ const MAX_STAGES = 16;
211
211
  * `package.json` during `scripts/pack.mjs` rather than hand-maintained, and `W2M_PLUGIN_VERSION`
212
212
  * overrides it at runtime for tests and packagers.
213
213
  */
214
- const PLUGIN_VERSION = '1.0.14';
214
+ const PLUGIN_VERSION = '1.0.16';
215
215
 
216
216
  /** How long any single HTTP call may take before it is aborted, in milliseconds. */
217
217
  const DEFAULT_REQUEST_TIMEOUT_MS = 15_000;