@twinsearth/w2m-dsh-plugin 1.1.0 → 1.1.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.
- package/.claude-plugin/marketplace.json +29 -0
- package/.claude-plugin/plugin.json +29 -0
- package/CHANGELOG.md +92 -0
- package/codex/mcp-servers.toml +17 -0
- package/docs/PLATFORMS.md +83 -0
- package/package.json +9 -5
- package/plugin.json +1 -1
- package/src/plugin/fleet-target.mjs.bak-arch2 +812 -0
- package/src/plugin/fleet-target.mjs.bak-archive +812 -0
- package/src/plugin/tools.mjs +13 -1
- package/src/relay/state.mjs +38 -3
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "twinsearth-w2m",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "TwinsEarth"
|
|
5
|
+
},
|
|
6
|
+
"metadata": {
|
|
7
|
+
"description": "The w2m fleet plugins: one account, many machines, any of Windows, macOS or Linux.",
|
|
8
|
+
"version": "1.1.2"
|
|
9
|
+
},
|
|
10
|
+
"plugins": [
|
|
11
|
+
{
|
|
12
|
+
"name": "w2m-fleet",
|
|
13
|
+
"source": "./",
|
|
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": "1.1.2",
|
|
16
|
+
"author": {
|
|
17
|
+
"name": "TwinsEarth"
|
|
18
|
+
},
|
|
19
|
+
"homepage": "https://github.com/TwinsEarth/dsh-windows2macos",
|
|
20
|
+
"repository": "https://github.com/TwinsEarth/dsh-windows2macos",
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"keywords": [
|
|
23
|
+
"fleet",
|
|
24
|
+
"remote-execution",
|
|
25
|
+
"mcp"
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "w2m-fleet",
|
|
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": "1.1.2",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "TwinsEarth"
|
|
7
|
+
},
|
|
8
|
+
"homepage": "https://github.com/TwinsEarth/dsh-windows2macos",
|
|
9
|
+
"repository": "https://github.com/TwinsEarth/dsh-windows2macos",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"keywords": [
|
|
12
|
+
"fleet",
|
|
13
|
+
"remote-execution",
|
|
14
|
+
"windows",
|
|
15
|
+
"macos",
|
|
16
|
+
"linux",
|
|
17
|
+
"mcp",
|
|
18
|
+
"claude-code",
|
|
19
|
+
"codex"
|
|
20
|
+
],
|
|
21
|
+
"mcpServers": {
|
|
22
|
+
"w2m-fleet": {
|
|
23
|
+
"command": "node",
|
|
24
|
+
"args": [
|
|
25
|
+
"${CLAUDE_PLUGIN_ROOT}/bin/w2m-mcp.mjs"
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,98 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project are documented here.
|
|
4
4
|
|
|
5
|
+
## [1.1.2] — 2026-10-17
|
|
6
|
+
|
|
7
|
+
**A dispatch that names no machines now goes to the machines that are online. The rule that decides "online" had been
|
|
8
|
+
written three times and the three copies are now one.**
|
|
9
|
+
|
|
10
|
+
### The defect
|
|
11
|
+
|
|
12
|
+
The relay built a lease for **every paired device**, including a machine whose agent had stopped heartbeating days
|
|
13
|
+
earlier. That lease expired, `partial` became the only verdict the task could reach, and a fleet whose live machines
|
|
14
|
+
agreed reported *"incomplete"* forever. Observed on 2026-10-17:
|
|
15
|
+
|
|
16
|
+
aggregate: partial counts: { ok: 3, expired: 4 }
|
|
17
|
+
|
|
18
|
+
So "all machines agree" was **unreachable** while a stale entry existed, and no amount of re-running could fix it.
|
|
19
|
+
|
|
20
|
+
### The fix: one definition, three call sites
|
|
21
|
+
|
|
22
|
+
`device.online === true` alone is **not** the answer -- the flag stays true until the sweep runs. The real rule was
|
|
23
|
+
already computed, in two places, as `device.online === true && !silent`, and the target list was about to become a
|
|
24
|
+
third copy. It is now a method:
|
|
25
|
+
|
|
26
|
+
isOnlineDevice(device, nowMs = this.nowMs())
|
|
27
|
+
|
|
28
|
+
used by `deviceStatus`, `publicDevice` and the default target list. `simtMs === null` (no contact ever observed) is
|
|
29
|
+
**not** silent, so an unknown age cannot be read as "gone".
|
|
30
|
+
|
|
31
|
+
### `include_offline` is the escape hatch, and it is reachable
|
|
32
|
+
|
|
33
|
+
`w2m_run` gains `include_offline` (boolean, **default false**) and puts it on the wire only when asked, so a default
|
|
34
|
+
dispatch sends the same bytes as before. The relay records it on the task, and a probe against a live `RabbitState`
|
|
35
|
+
confirmed the field is accepted and stored (`recorded: true`) rather than rejected as unknown.
|
|
36
|
+
|
|
37
|
+
### Deliberately NOT in this release
|
|
38
|
+
|
|
39
|
+
**The 72-hour archive rule is deferred to 1.1.3.** The read-path filter is written and correct, but eight
|
|
40
|
+
`fleet-target` fixtures carry fixed old timestamps and would need their intent reviewed one by one; shipping it with
|
|
41
|
+
those fixtures patched blindly is how a green suite stops meaning anything. A machine that has been offline for days is
|
|
42
|
+
therefore **hidden from dispatch** by this release (it is not online) but still **listed** by `w2m_devices`.
|
|
43
|
+
|
|
44
|
+
### Verified
|
|
45
|
+
|
|
46
|
+
`test/relay.test.mjs` 160 pass, `test/tools.test.mjs` 115 pass, `test/fleet-target.test.mjs` 41 pass -- 316 tests, 0
|
|
47
|
+
fail, after the change. The 72h filter was measured, found to break 8 fixtures, and rolled back rather than shipped.
|
|
48
|
+
|
|
49
|
+
## [1.1.1] — 2026-10-17
|
|
50
|
+
|
|
51
|
+
**The fleet is now installable from Claude Code, Codex and OpenAI's plugin surface -- and the parts that still need a
|
|
52
|
+
person are marked as needing one.**
|
|
53
|
+
|
|
54
|
+
### One server, three manifests
|
|
55
|
+
|
|
56
|
+
`bin/w2m-mcp.mjs` already answers both MCP eras (modern per-request `_meta`, and the legacy `initialize` handshake
|
|
57
|
+
most deployed clients still speak) and exposes **five read-only tools**. Adapting to a platform is therefore a
|
|
58
|
+
**manifest**, not a second implementation:
|
|
59
|
+
|
|
60
|
+
* `.claude-plugin/plugin.json` — the Claude Code plugin manifest, with its own `mcpServers` entry.
|
|
61
|
+
* `.claude-plugin/marketplace.json` — so this repository can be added **as** a marketplace.
|
|
62
|
+
* `codex/mcp-servers.toml` — the block to append to `~/.codex/config.toml`, kept as a reviewable file rather than
|
|
63
|
+
prose in a document.
|
|
64
|
+
* `docs/PLATFORMS.md` — the per-platform routes, and the exact state of each submission.
|
|
65
|
+
* `w2m-mcp` is now a published **bin**, so a client can start the server without guessing a path.
|
|
66
|
+
|
|
67
|
+
### The trap: two schemas, two different root variables
|
|
68
|
+
|
|
69
|
+
The top-level `mcp.json` uses the agent-plugins schema's `${PLUGIN_ROOT}`. **Claude Code does not substitute that
|
|
70
|
+
variable** -- it substitutes `${CLAUDE_PLUGIN_ROOT}`. Reusing the top-level file verbatim would ship a literal
|
|
71
|
+
`${PLUGIN_ROOT}` string as the server's first argument, and the failure would present as *a missing server* rather
|
|
72
|
+
than *a wrong variable name*.
|
|
73
|
+
|
|
74
|
+
So the Claude Code manifest declares its own server entry, and `test/portable-plugins.test.mjs` refuses a manifest
|
|
75
|
+
that uses the wrong variable, points at a file that is not in the package, or drifts from `package.json`'s version.
|
|
76
|
+
|
|
77
|
+
### What is published, and what is not
|
|
78
|
+
|
|
79
|
+
| Destination | State |
|
|
80
|
+
|---|---|
|
|
81
|
+
| npm package, GitHub release, `SHA256SUMS` | **published** |
|
|
82
|
+
| Claude Code plugin + marketplace manifests | **shipped and tested** |
|
|
83
|
+
| Codex configuration snippet | **shipped and tested** |
|
|
84
|
+
| Pull request to `anthropics/claude-plugins-official` / `-community` / `claude-code` | **not done** |
|
|
85
|
+
| Submission to OpenAI's plugin portal | **not done** |
|
|
86
|
+
|
|
87
|
+
The last two require write access to repositories this project does not own; the release token is scoped to
|
|
88
|
+
`TwinsEarth/dsh-windows2macos` and acting on a third-party repository is refused by design. A manifest that exists is
|
|
89
|
+
not a listing, so it is not reported as one.
|
|
90
|
+
|
|
91
|
+
### Verified
|
|
92
|
+
|
|
93
|
+
New suite `test/portable-plugins.test.mjs`: the manifests parse, the version agrees across all four manifests and the
|
|
94
|
+
package, the MCP bin exists, the Codex snippet pins the version being released, both manifests are in
|
|
95
|
+
`package.json#files`, and `docs/PLATFORMS.md` names every platform it claims to.
|
|
96
|
+
|
|
5
97
|
## [1.1.0] — 2026-10-17
|
|
6
98
|
|
|
7
99
|
**The direct path now works on runtimes whose OpenSSL has no BLAKE2s, and the compatibility gate that measures the real
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Codex MCP configuration for the w2m fleet.
|
|
2
|
+
#
|
|
3
|
+
# This file is a **snippet, not a config**: it is the block to append to `~/.codex/config.toml`, kept here so the
|
|
4
|
+
# arguments are reviewable and testable instead of living only in prose (docs/PLATFORMS.md).
|
|
5
|
+
#
|
|
6
|
+
# Why `npx -p ... w2m-mcp` and not a path: Codex runs on whichever machine the operator is sitting at, and the package
|
|
7
|
+
# is published, so the same block works on Windows, macOS and Linux without an install step. The version is pinned
|
|
8
|
+
# exactly -- a floating server is a moving target for a protocol the client negotiates at startup.
|
|
9
|
+
#
|
|
10
|
+
# The server is stdio and read-only by design: `w2m_run` is not among the tools it exposes, because handing fleet
|
|
11
|
+
# execution rights to any process able to start an MCP server is a guard that only looks like one.
|
|
12
|
+
|
|
13
|
+
[mcp_servers.w2m-fleet]
|
|
14
|
+
command = "npx"
|
|
15
|
+
args = ["-y", "-p", "@twinsearth/w2m-dsh-plugin@1.1.2", "w2m-mcp"]
|
|
16
|
+
startup_timeout_sec = 20
|
|
17
|
+
tool_timeout_sec = 60
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Platforms: the same fleet from Claude Code, Codex, OpenAI's plugin directory and anything else that speaks MCP
|
|
2
|
+
|
|
3
|
+
One MCP server, `bin/w2m-mcp.mjs`, published in the npm package and exposed three ways. **Nothing in this document
|
|
4
|
+
invents a second implementation per platform** -- a platform is adapted to by shipping a manifest, not by forking the
|
|
5
|
+
server.
|
|
6
|
+
|
|
7
|
+
## What is exposed, and why it is read-only
|
|
8
|
+
|
|
9
|
+
The server answers both MCP protocol eras in the wild: the modern revision (per-request `_meta`, no handshake) and the
|
|
10
|
+
legacy one (`initialize` -> `notifications/initialized` -> requests) that most deployed clients still speak.
|
|
11
|
+
|
|
12
|
+
**`w2m_run` is deliberately absent.** A process that can start an MCP server would otherwise be handed fleet execution
|
|
13
|
+
rights. The exposed tools read state and cannot change it; each one is a thin wrapper over an endpoint the plugin
|
|
14
|
+
already calls.
|
|
15
|
+
|
|
16
|
+
## Claude Code
|
|
17
|
+
|
|
18
|
+
Two routes, both from this repository:
|
|
19
|
+
|
|
20
|
+
**As a plugin marketplace** -- which is what `.claude-plugin/marketplace.json` is for:
|
|
21
|
+
|
|
22
|
+
/plugin marketplace add TwinsEarth/dsh-windows2macos
|
|
23
|
+
/plugin install w2m-fleet@twinsearth-w2m
|
|
24
|
+
|
|
25
|
+
The plugin manifest is `.claude-plugin/plugin.json`; its `mcpServers` entry resolves through `${CLAUDE_PLUGIN_ROOT}`,
|
|
26
|
+
which Claude Code substitutes with the installed plugin directory. **That variable is why the manifest carries its own
|
|
27
|
+
server entry instead of pointing at the top-level `mcp.json`** -- the top-level file uses the agent-plugins schema's
|
|
28
|
+
`${PLUGIN_ROOT}`, and a client that does not know that schema would receive the literal string.
|
|
29
|
+
|
|
30
|
+
**As a project-scoped server** -- add to the project's `.mcp.json`:
|
|
31
|
+
|
|
32
|
+
{ "mcpServers": { "w2m-fleet": { "command": "node",
|
|
33
|
+
"args": ["<path-to-package>/bin/w2m-mcp.mjs"] } } }
|
|
34
|
+
|
|
35
|
+
## Codex (OpenAI)
|
|
36
|
+
|
|
37
|
+
Codex reads MCP servers from `~/.codex/config.toml`. The block to append is kept as a reviewable, testable file rather
|
|
38
|
+
than prose: [`codex/mcp-servers.toml`](../codex/mcp-servers.toml).
|
|
39
|
+
|
|
40
|
+
It invokes the published package through `npx`, so the same block works on Windows, macOS and Linux with no install
|
|
41
|
+
step, and the version is pinned exactly.
|
|
42
|
+
|
|
43
|
+
## OpenAI's plugin directory (`openai/plugins`, `openai/mcp-extensions`)
|
|
44
|
+
|
|
45
|
+
This one is **not** a filesystem layout to conform to. `openai/plugins` is a Codex-oriented example library
|
|
46
|
+
distributed through an official submission portal, and `openai/mcp-extensions` is a directory of extension
|
|
47
|
+
descriptors. Our side of that transaction is the npm package plus the manifests in this repository; the submission
|
|
48
|
+
itself is a form or a pull request against a repository **we do not own**.
|
|
49
|
+
|
|
50
|
+
**Status: prepared, not submitted.** See "What still needs a person" below.
|
|
51
|
+
|
|
52
|
+
## Anthropic's Claude Code marketplaces
|
|
53
|
+
|
|
54
|
+
`anthropics/claude-plugins-official`, `anthropics/claude-plugins-community` and `anthropics/claude-code` are the
|
|
55
|
+
upstream repositories. A listing there is a pull request against a third-party repository.
|
|
56
|
+
|
|
57
|
+
**Status: prepared, not submitted.** The manifests they would review are already in this repository and validated by
|
|
58
|
+
`test/portable-plugins.test.mjs`.
|
|
59
|
+
|
|
60
|
+
## Anything else (Cursor, Windsurf, a script of your own)
|
|
61
|
+
|
|
62
|
+
Any client that accepts a generic MCP server list can use the `mcp.json` this package already ships, or the same
|
|
63
|
+
`command`/`args` pair from the Claude Code section.
|
|
64
|
+
|
|
65
|
+
## What still needs a person
|
|
66
|
+
|
|
67
|
+
Publishing to the three third-party destinations above requires write access to repositories this project does not
|
|
68
|
+
own. The token used for release automation is scoped to `TwinsEarth/dsh-windows2macos`; acting on a third-party
|
|
69
|
+
repository with it is refused by design, and that refusal is correct.
|
|
70
|
+
|
|
71
|
+
So the split is:
|
|
72
|
+
|
|
73
|
+
| Step | Who | State |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| npm publish, GitHub release, SHA256SUMS | automation | **done** (see the release page) |
|
|
76
|
+
| Claude Code marketplace manifests | this repository | **shipped and tested** |
|
|
77
|
+
| Codex configuration snippet | this repository | **shipped and tested** |
|
|
78
|
+
| Adding the repo as a Claude Code marketplace | any operator | one command, above |
|
|
79
|
+
| PR to `anthropics/claude-plugins-official` / `-community` / `claude-code` | a person with access | **not done** |
|
|
80
|
+
| Submission to OpenAI's portal | a person with the account | **not done** |
|
|
81
|
+
|
|
82
|
+
Marking the last two rows "prepared" rather than "done" is deliberate: a manifest that exists is not a listing, and
|
|
83
|
+
this project has already shipped a "mechanism with no caller" seven times.
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@twinsearth/w2m-dsh-plugin",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
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",
|
|
7
7
|
"bin": {
|
|
8
|
-
"w2m-rabbit": "bin/w2m-rabbit.mjs",
|
|
9
8
|
"w2m-localside": "bin/w2m-localside.mjs",
|
|
9
|
+
"w2m-mcp": "bin/w2m-mcp.mjs",
|
|
10
|
+
"w2m-rabbit": "bin/w2m-rabbit.mjs",
|
|
10
11
|
"w2m-stun": "bin/w2m-stun.mjs"
|
|
11
12
|
},
|
|
12
13
|
"exports": {
|
|
@@ -42,7 +43,9 @@
|
|
|
42
43
|
"PROTOCOL-v0.4.0.md",
|
|
43
44
|
"TROUBLESHOOTING.md",
|
|
44
45
|
"SECURITY.md",
|
|
45
|
-
"CONTRIBUTING.md"
|
|
46
|
+
"CONTRIBUTING.md",
|
|
47
|
+
".claude-plugin",
|
|
48
|
+
"codex"
|
|
46
49
|
],
|
|
47
50
|
"dsh": {
|
|
48
51
|
"plugin": true,
|
|
@@ -126,10 +129,10 @@
|
|
|
126
129
|
"pack": "node scripts/pack.mjs",
|
|
127
130
|
"reachability": "node scripts/reachability-check.mjs",
|
|
128
131
|
"reachability:classify": "node scripts/reachability-classify.mjs",
|
|
129
|
-
"test": "node --test --test-force-exit test/relay.test.mjs test/broadcast.test.mjs test/blake2s.test.mjs test/agent.test.mjs test/plan-sec-cmd.test.mjs test/authority.test.mjs test/blocks.test.mjs test/approval-index.test.mjs test/fleet-sync.test.mjs test/fleet-merge.test.mjs test/fleet-memory-e2e.test.mjs test/fleet-concurrency.test.mjs test/fleet-merge-race.test.mjs test/health.test.mjs test/storage.test.mjs test/exit-channel.test.mjs test/council.test.mjs test/council-session.test.mjs test/log-bounds.test.mjs test/test-report.test.mjs test/fleet-scale.test.mjs test/fleet-state.test.mjs test/crypto-blake2s.test.mjs test/installed-version.test.mjs test/permission.test.mjs test/machine-test-packet.test.mjs test/field-authority.test.mjs test/approval-gate.test.mjs test/authority-choice.test.mjs test/reachability-check.test.mjs test/reachability-classify.test.mjs test/accepted-orphans.test.mjs test/acceptance-doc.test.mjs test/layer-model.test.mjs test/cwd-containment.test.mjs test/cwd-outside-project.test.mjs test/memory.test.mjs test/tools.test.mjs test/claims.test.mjs test/fleet-target.test.mjs test/client-bundle.test.mjs test/schedule.test.mjs test/auto-update.test.mjs test/update-source.test.mjs test/update-install.test.mjs test/update-wiring.test.mjs test/signing.test.mjs test/stress.test.mjs test/shared-config.test.mjs test/metrics.test.mjs test/metrics-route.test.mjs test/tool-cards.test.mjs test/p2p-stun.test.mjs test/p2p-transport.test.mjs test/p2p-signaling.test.mjs test/p2p-node.test.mjs test/p2p-transport-fields.test.mjs test/p2p-plugin.test.mjs test/p2p-crypto.test.mjs test/stun-server.test.mjs test/loader-entry.test.mjs test/mdns-wire.test.mjs test/mdns-discover.test.mjs test/chatops-approval.test.mjs test/chatops-policy.test.mjs test/chatops-file-safety.test.mjs test/chatops-outbound-queue.test.mjs test/chatops-commands.test.mjs test/chatops-bridge.test.mjs test/chatops-config-route.test.mjs test/chatops-apply.test.mjs test/chatops-ilink-contract.test.mjs test/chatops-fleet.test.mjs test/chatops-account.test.mjs test/chatops-auth.test.mjs test/chatops-fleet-scope.test.mjs test/chatops-handoff.test.mjs test/chatops-fleet-wiring.test.mjs test/chatops-fleet-live.test.mjs test/chatops-takeover.test.mjs test/chatops-device-signing.test.mjs test/chatops-relay-verify.test.mjs test/chatops-durability.test.mjs test/chatops-run-command.test.mjs test/secrets-guard.test.mjs test/chatops-ilink-fleet-bridge.test.mjs test/agent-plugins.test.mjs test/memory-layer.test.mjs test/mcp-server.test.mjs test/mcp-http.test.mjs test/mcp-http-live.test.mjs test/vision.test.mjs test/ilink-shape.test.mjs test/chatops-fleet-join.test.mjs",
|
|
132
|
+
"test": "node --test --test-force-exit test/relay.test.mjs test/broadcast.test.mjs test/blake2s.test.mjs test/agent.test.mjs test/plan-sec-cmd.test.mjs test/authority.test.mjs test/blocks.test.mjs test/approval-index.test.mjs test/fleet-sync.test.mjs test/fleet-merge.test.mjs test/fleet-memory-e2e.test.mjs test/fleet-concurrency.test.mjs test/fleet-merge-race.test.mjs test/health.test.mjs test/storage.test.mjs test/exit-channel.test.mjs test/council.test.mjs test/council-session.test.mjs test/log-bounds.test.mjs test/test-report.test.mjs test/fleet-scale.test.mjs test/fleet-state.test.mjs test/crypto-blake2s.test.mjs test/installed-version.test.mjs test/permission.test.mjs test/machine-test-packet.test.mjs test/field-authority.test.mjs test/approval-gate.test.mjs test/authority-choice.test.mjs test/reachability-check.test.mjs test/reachability-classify.test.mjs test/accepted-orphans.test.mjs test/acceptance-doc.test.mjs test/layer-model.test.mjs test/cwd-containment.test.mjs test/cwd-outside-project.test.mjs test/memory.test.mjs test/tools.test.mjs test/claims.test.mjs test/fleet-target.test.mjs test/client-bundle.test.mjs test/schedule.test.mjs test/auto-update.test.mjs test/update-source.test.mjs test/update-install.test.mjs test/update-wiring.test.mjs test/signing.test.mjs test/stress.test.mjs test/shared-config.test.mjs test/metrics.test.mjs test/metrics-route.test.mjs test/tool-cards.test.mjs test/p2p-stun.test.mjs test/p2p-transport.test.mjs test/p2p-signaling.test.mjs test/p2p-node.test.mjs test/p2p-transport-fields.test.mjs test/p2p-plugin.test.mjs test/p2p-crypto.test.mjs test/stun-server.test.mjs test/loader-entry.test.mjs test/mdns-wire.test.mjs test/mdns-discover.test.mjs test/chatops-approval.test.mjs test/chatops-policy.test.mjs test/chatops-file-safety.test.mjs test/chatops-outbound-queue.test.mjs test/chatops-commands.test.mjs test/chatops-bridge.test.mjs test/chatops-config-route.test.mjs test/chatops-apply.test.mjs test/chatops-ilink-contract.test.mjs test/chatops-fleet.test.mjs test/chatops-account.test.mjs test/chatops-auth.test.mjs test/chatops-fleet-scope.test.mjs test/chatops-handoff.test.mjs test/chatops-fleet-wiring.test.mjs test/chatops-fleet-live.test.mjs test/chatops-takeover.test.mjs test/chatops-device-signing.test.mjs test/chatops-relay-verify.test.mjs test/chatops-durability.test.mjs test/chatops-run-command.test.mjs test/secrets-guard.test.mjs test/chatops-ilink-fleet-bridge.test.mjs test/agent-plugins.test.mjs test/memory-layer.test.mjs test/mcp-server.test.mjs test/portable-plugins.test.mjs test/mcp-http.test.mjs test/mcp-http-live.test.mjs test/vision.test.mjs test/ilink-shape.test.mjs test/chatops-fleet-join.test.mjs",
|
|
130
133
|
"test:acceptance-doc": "node --test --test-force-exit test/acceptance-doc.test.mjs",
|
|
131
134
|
"test:agent": "node --test --test-force-exit test/agent.test.mjs test/memory.test.mjs",
|
|
132
|
-
"test:all": "node --test --test-force-exit test/relay.test.mjs test/broadcast.test.mjs test/blake2s.test.mjs test/agent.test.mjs test/plan-sec-cmd.test.mjs test/authority.test.mjs test/blocks.test.mjs test/approval-index.test.mjs test/fleet-sync.test.mjs test/fleet-merge.test.mjs test/fleet-memory-e2e.test.mjs test/fleet-concurrency.test.mjs test/fleet-merge-race.test.mjs test/health.test.mjs test/storage.test.mjs test/exit-channel.test.mjs test/council.test.mjs test/council-session.test.mjs test/log-bounds.test.mjs test/test-report.test.mjs test/fleet-scale.test.mjs test/fleet-state.test.mjs test/crypto-blake2s.test.mjs test/installed-version.test.mjs test/permission.test.mjs test/machine-test-packet.test.mjs test/field-authority.test.mjs test/approval-gate.test.mjs test/authority-choice.test.mjs test/reachability-check.test.mjs test/reachability-classify.test.mjs test/accepted-orphans.test.mjs test/acceptance-doc.test.mjs test/layer-model.test.mjs test/cwd-containment.test.mjs test/cwd-outside-project.test.mjs test/memory.test.mjs test/tools.test.mjs test/claims.test.mjs test/fleet-target.test.mjs test/client-bundle.test.mjs test/schedule.test.mjs test/auto-update.test.mjs test/update-source.test.mjs test/update-install.test.mjs test/update-wiring.test.mjs test/signing.test.mjs test/stress.test.mjs test/e2e.test.mjs test/crossnetwork.test.mjs test/signing-e2e.test.mjs test/outbound-only.test.mjs test/recovery.test.mjs test/pipeline-e2e.test.mjs test/shared-config.test.mjs test/metrics.test.mjs test/metrics-route.test.mjs test/tool-cards.test.mjs test/p2p-stun.test.mjs test/p2p-transport.test.mjs test/p2p-signaling.test.mjs test/p2p-node.test.mjs test/p2p-transport-fields.test.mjs test/p2p-plugin.test.mjs test/p2p-agent.test.mjs test/stun-server.test.mjs test/loader-entry.test.mjs test/mdns-wire.test.mjs test/mdns-discover.test.mjs test/p2p-crypto.test.mjs test/chatops-approval.test.mjs test/chatops-policy.test.mjs test/chatops-file-safety.test.mjs test/chatops-outbound-queue.test.mjs test/chatops-commands.test.mjs test/chatops-bridge.test.mjs test/chatops-config-route.test.mjs test/chatops-apply.test.mjs test/chatops-ilink-contract.test.mjs test/chatops-fleet.test.mjs test/chatops-account.test.mjs test/chatops-auth.test.mjs test/chatops-fleet-scope.test.mjs test/chatops-handoff.test.mjs test/chatops-fleet-wiring.test.mjs test/chatops-fleet-live.test.mjs test/chatops-takeover.test.mjs test/chatops-device-signing.test.mjs test/chatops-relay-verify.test.mjs test/chatops-durability.test.mjs test/chatops-run-command.test.mjs test/secrets-guard.test.mjs test/chatops-ilink-fleet-bridge.test.mjs test/agent-plugins.test.mjs test/memory-layer.test.mjs test/mcp-server.test.mjs test/mcp-http.test.mjs test/mcp-http-live.test.mjs test/vision.test.mjs test/ilink-shape.test.mjs test/chatops-fleet-join.test.mjs",
|
|
135
|
+
"test:all": "node --test --test-force-exit test/relay.test.mjs test/broadcast.test.mjs test/blake2s.test.mjs test/agent.test.mjs test/plan-sec-cmd.test.mjs test/authority.test.mjs test/blocks.test.mjs test/approval-index.test.mjs test/fleet-sync.test.mjs test/fleet-merge.test.mjs test/fleet-memory-e2e.test.mjs test/fleet-concurrency.test.mjs test/fleet-merge-race.test.mjs test/health.test.mjs test/storage.test.mjs test/exit-channel.test.mjs test/council.test.mjs test/council-session.test.mjs test/log-bounds.test.mjs test/test-report.test.mjs test/fleet-scale.test.mjs test/fleet-state.test.mjs test/crypto-blake2s.test.mjs test/installed-version.test.mjs test/permission.test.mjs test/machine-test-packet.test.mjs test/field-authority.test.mjs test/approval-gate.test.mjs test/authority-choice.test.mjs test/reachability-check.test.mjs test/reachability-classify.test.mjs test/accepted-orphans.test.mjs test/acceptance-doc.test.mjs test/layer-model.test.mjs test/cwd-containment.test.mjs test/cwd-outside-project.test.mjs test/memory.test.mjs test/tools.test.mjs test/claims.test.mjs test/fleet-target.test.mjs test/client-bundle.test.mjs test/schedule.test.mjs test/auto-update.test.mjs test/update-source.test.mjs test/update-install.test.mjs test/update-wiring.test.mjs test/signing.test.mjs test/stress.test.mjs test/e2e.test.mjs test/crossnetwork.test.mjs test/signing-e2e.test.mjs test/outbound-only.test.mjs test/recovery.test.mjs test/pipeline-e2e.test.mjs test/shared-config.test.mjs test/metrics.test.mjs test/metrics-route.test.mjs test/tool-cards.test.mjs test/p2p-stun.test.mjs test/p2p-transport.test.mjs test/p2p-signaling.test.mjs test/p2p-node.test.mjs test/p2p-transport-fields.test.mjs test/p2p-plugin.test.mjs test/p2p-agent.test.mjs test/stun-server.test.mjs test/loader-entry.test.mjs test/mdns-wire.test.mjs test/mdns-discover.test.mjs test/p2p-crypto.test.mjs test/chatops-approval.test.mjs test/chatops-policy.test.mjs test/chatops-file-safety.test.mjs test/chatops-outbound-queue.test.mjs test/chatops-commands.test.mjs test/chatops-bridge.test.mjs test/chatops-config-route.test.mjs test/chatops-apply.test.mjs test/chatops-ilink-contract.test.mjs test/chatops-fleet.test.mjs test/chatops-account.test.mjs test/chatops-auth.test.mjs test/chatops-fleet-scope.test.mjs test/chatops-handoff.test.mjs test/chatops-fleet-wiring.test.mjs test/chatops-fleet-live.test.mjs test/chatops-takeover.test.mjs test/chatops-device-signing.test.mjs test/chatops-relay-verify.test.mjs test/chatops-durability.test.mjs test/chatops-run-command.test.mjs test/secrets-guard.test.mjs test/chatops-ilink-fleet-bridge.test.mjs test/agent-plugins.test.mjs test/memory-layer.test.mjs test/mcp-server.test.mjs test/portable-plugins.test.mjs test/mcp-http.test.mjs test/mcp-http-live.test.mjs test/vision.test.mjs test/ilink-shape.test.mjs test/chatops-fleet-join.test.mjs",
|
|
133
136
|
"test:approval-gate": "node --test --test-force-exit test/approval-gate.test.mjs",
|
|
134
137
|
"test:approval-index": "node --test --test-force-exit test/approval-index.test.mjs",
|
|
135
138
|
"test:authority": "node --test --test-force-exit test/authority.test.mjs",
|
|
@@ -158,6 +161,7 @@
|
|
|
158
161
|
"test:p2p": "node --test --test-force-exit test/p2p-stun.test.mjs test/p2p-transport.test.mjs test/p2p-signaling.test.mjs test/p2p-node.test.mjs test/stun-server.test.mjs test/p2p-transport-fields.test.mjs test/p2p-plugin.test.mjs test/p2p-agent.test.mjs",
|
|
159
162
|
"test:packet": "node --test --test-force-exit test/machine-test-packet.test.mjs",
|
|
160
163
|
"test:permission": "node --test --test-force-exit test/permission.test.mjs",
|
|
164
|
+
"test:portable": "node --test --test-force-exit test/portable-plugins.test.mjs",
|
|
161
165
|
"test:reachability": "node --test --test-force-exit test/reachability-check.test.mjs",
|
|
162
166
|
"test:relay": "node --test --test-force-exit test/relay.test.mjs",
|
|
163
167
|
"test:storage": "node --test --test-force-exit test/storage.test.mjs",
|
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.1.
|
|
4
|
+
"version": "1.1.2",
|
|
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": [
|