@twinsearth/w2m-dsh-plugin 2.2.0 → 2.2.2

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.
@@ -5,14 +5,14 @@
5
5
  },
6
6
  "metadata": {
7
7
  "description": "The w2m fleet plugins: one account, many machines, any of Windows, macOS or Linux.",
8
- "version": "2.2.0"
8
+ "version": "2.2.2"
9
9
  },
10
10
  "plugins": [
11
11
  {
12
12
  "name": "w2m-fleet",
13
13
  "source": "./",
14
14
  "description": "Read fleet state and dispatch commands across the machines registered to one account. Read-only MCP surface: the five exposed tools cannot change anything.",
15
- "version": "2.2.0",
15
+ "version": "2.2.2",
16
16
  "author": {
17
17
  "name": "TwinsEarth"
18
18
  },
@@ -26,5 +26,5 @@
26
26
  ]
27
27
  }
28
28
  ],
29
- "version": "2.2.0"
29
+ "version": "2.2.2"
30
30
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "w2m-fleet",
3
3
  "description": "Drive the same project on online Windows, macOS and Linux machines from one account: read fleet state, dispatch commands and read results. The MCP surface is deliberately read-only.",
4
- "version": "2.2.0",
4
+ "version": "2.2.2",
5
5
  "author": {
6
6
  "name": "TwinsEarth"
7
7
  },
package/CHANGELOG.md CHANGED
@@ -5,8 +5,29 @@ All notable changes to this project are documented here.
5
5
  ## [Unreleased]
6
6
 
7
7
  - `w2m_intent`: structured intents mapped onto allow-listed commands; unknown actions, parameters and types
8
- are refused by name (the fleet does not invent commands).
9
-
8
+ are refused by name (the fleet does not invent commands).
9
+
10
+ ## [2.2.2] - 2026-11-05
11
+
12
+ - DSH 0.2.2-rc.1 compatibility: composer popups (the dispatch-target menu and the Node-execution menu)
13
+ now render through a `react-dom` portal under `document.body`. The release candidate puts
14
+ `container-type: inline-size` on the composer row, which makes that row the containing block for
15
+ `position: fixed` descendants; the Node-execution menu was positioned relative to the row and its
16
+ options could not be selected. A portal keeps the viewport coordinates the menus compute.
17
+ - Loader tests: the bundle-fetch helper sends a Fetch `Request` as 0.2.2-rc.1 requires, the real-page
18
+ probe seeds a Workspace, opens the Node-execution menu and selects temporary execution, and the
19
+ host route probe confirms `GET/POST /api/w2m/capability` is mounted.
20
+ ## [2.2.1] - 2026-11-01
21
+
22
+ - Fleet identity is now per-account **home**-first. Each machine records the fleet key it actually joined under `fleet-home.json` beside `device.json`; switching back to an account returns to that account’s previous fleet instead of deriving a new one. This is the “whoever leaves returns by themselves” rule: a first appearance of account B may join B’s account fleet, but an existing home for A is never rewritten by B, and no other machine is moved.
23
+ - `fleetKeyPolicy` is now `home` by default. `account` keeps the v2.2.0 always-follow-the-account behaviour as an opt-in; `config` remains the explicit operator pin. An invalid policy is a startup error naming the setting, not a silent default.
24
+ - A corrupt or unreadable `fleet-home.json` is reported and blocks `home` policy instead of silently creating a new fleet; `account` policy may continue without the history. The file is written atomically with mode 0600 (ACL protection on Windows).
25
+ - Upgrading a paired 2.2.0 machine with no home to 2.2.1 keeps it in its current fleet instead of deriving the account key; an actual account switch is still allowed to make its first join, and that first join is remembered.
26
+ - leet-home.json` now also records the last account code, so a restart can tell `same account, no home yet` (stay put) from a real account switch (first join allowed).
27
+ - Composer target control: selecting a machine now writes a visible `@machine` token into the draft after the host accepts the selection. Switching targets replaces the previous token, and selecting All machines removes it; names containing whitespace use `@"machine name"`. A refused host write reopens the menu with the host’s reason; an editor rejection is shown instead of leaving a stale token.
28
+
29
+ - Settings page: new `编队绑定` section for machines that must return to an old fleet. It previews the `fleet_id` derived from a pasted key, requires explicit confirmation, then writes an independent `fleet-config.json` (0600) with a timestamped backup and rollback; `cordis.patch.yml` is never modified. The file takes precedence over the profile's `fleetKey`/`fleetKeyPolicy` at startup, and the raw key is never returned by the route.
30
+ - Tests: fleet-config storage/backup/corruption and the preview/save route, including an explicit assertion that the profile patch is untouched.
10
31
  ## [2.2.0] - 2026-11-01
11
32
 
12
33
  - Fleet binding policy: `fleetKeyPolicy: account` is the new default. A configured `fleetKey` is a fallback while the signed-in account is authoritative, so switching DeepSeek accounts moves the machine without editing every profile. Set `fleetKeyPolicy: config` to keep the old explicit-pin behaviour.
package/README.md CHANGED
@@ -92,7 +92,7 @@ w2m-mcp --help
92
92
  # 复制进你自己的 codex/mcp-servers.toml
93
93
  [mcp_servers.w2m]
94
94
  command = "npx"
95
- args = ["-y", "@twinsearth/w2m-dsh-plugin@2.2.0", "w2m-mcp"]
95
+ args = ["-y", "@twinsearth/w2m-dsh-plugin@2.2.2", "w2m-mcp"]
96
96
  ```
97
97
 
98
98
  ### 5. 验证过的 release tarball(离线)
@@ -12,6 +12,6 @@
12
12
 
13
13
  [mcp_servers.w2m-fleet]
14
14
  command = "npx"
15
- args = ["-y", "-p", "@twinsearth/w2m-dsh-plugin@2.2.0", "w2m-mcp"]
15
+ args = ["-y", "-p", "@twinsearth/w2m-dsh-plugin@2.2.2", "w2m-mcp"]
16
16
  startup_timeout_sec = 20
17
17
  tool_timeout_sec = 60
@@ -0,0 +1,31 @@
1
+ {
2
+ "version": "2.2.1",
3
+ "case": "RELEASE-2210",
4
+ "kind": "positive",
5
+ "machines": [
6
+ "b53a37f4-1464-4512-9259-33a7df091e3e"
7
+ ],
8
+ "executed_at": "2026-11-01T03:05:23.452Z",
9
+ "executor": "lead",
10
+ "task_id": "pre-release-2210-1793511923452",
11
+ "requirement": "v2.2.1: fleet membership returns to the per-account home after an account switch, a first appearance of a new account may join its fleet without moving other machines, and the settings page can pin an old fleet key without editing cordis.patch.yml",
12
+ "commands": [
13
+ ["node", "--test", "--test-force-exit", "test/fleet-home.test.mjs", "test/fleet-binding.test.mjs"],
14
+ ["node", "--test", "--test-force-exit", "test/fleet-config.test.mjs", "test/fleet-config-route.test.mjs"],
15
+ ["node", "--test", "--test-force-exit", "test/tools.test.mjs"],
16
+ ["node", "--test", "--test-force-exit", "test/client-bundle.test.mjs"],
17
+ ["node", "--test", "--test-force-exit", "test/loader-entry.test.mjs"]
18
+ ],
19
+ "result": {
20
+ "outcome": "ok",
21
+ "assertions": {
22
+ "fleet_home": "test/fleet-home.test.mjs 6/6: A first join, B first join, B->A returns A's home, account policy does not overwrite home, config pin wins, corrupt home blocks a new fleet, upgrade with an existing token stays put",
23
+ "fleet_config": "test/fleet-config.test.mjs 4/4 and test/fleet-config-route.test.mjs 3/3: preview does not write, mismatch is shown before saving, save writes fleet-config.json with a backup, a wrong expected fleet_id is refused, and cordis.patch.yml is untouched",
24
+ "tools": "test/tools.test.mjs 141/141, including w2m_status reading the settings-page pin without printing the key",
25
+ "bundle": "test/client-bundle.test.mjs 34/34; the 编队绑定 settings section is registered and target @mention tests remain green",
26
+ "loader": "test/loader-entry.test.mjs 10/10 against the packed 2.2.1 tarball in the real DSH Loader",
27
+ "lint": "eslint 0 errors; layer-check clean",
28
+ "scope": "local code, tests and packed artifact only; the release tag is pushed separately; no machine profile was edited by the tests"
29
+ }
30
+ }
31
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "version": "2.2.2",
3
+ "case": "RELEASE-2220",
4
+ "kind": "positive",
5
+ "machines": [
6
+ "b53a37f4-1464-4512-9259-33a7df091e3e"
7
+ ],
8
+ "executed_at": "2026-11-04T20:16:04.717Z",
9
+ "executor": "lead",
10
+ "task_id": "pre-release-2220-1793823364724",
11
+ "requirement": "v2.2.2: DSH 0.2.2-rc.1 users can open the Node-execution menu and select temporary execution from the composer",
12
+ "commands": [
13
+ ["node", "--test", "--test-force-exit", "test/client-bundle.test.mjs"],
14
+ ["node", "--test", "--test-force-exit", "test/loader-entry.test.mjs"]
15
+ ],
16
+ "result": {
17
+ "outcome": "ok",
18
+ "assertions": {
19
+ "client": "test/client-bundle.test.mjs 36/36: popup menus portal to document.body when react-dom is available and fall back inline without it",
20
+ "loader": "test/loader-entry.test.mjs 10/10 against the packed 2.2.2 tarball in the real DSH 0.2.2-rc.1 Loader and its own Edge page; the route probe finds /api/w2m/capability and W2M_CAPABILITY_PROBE=1 opens the Node-execution menu and selects temporary execution",
21
+ "dsh": "the installed runtime is @deepseek-ai/dsh-desktop-runtime 0.2.2-rc.1 (resources/app.asar), not the 0.2.1-rc.5 profile pins",
22
+ "scope": "local code and packed artifact only; no installed profile was edited by the tests; the release is published separately"
23
+ }
24
+ }
25
+ }