patchcord 0.6.44 → 0.6.45
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/plugin.json +1 -1
- package/agent-plugin/plugin.json +1 -1
- package/harnesses.json +40 -9
- package/package.json +1 -1
- package/scripts/lib/hermes-home.mjs +29 -21
package/agent-plugin/plugin.json
CHANGED
package/harnesses.json
CHANGED
|
@@ -25,7 +25,9 @@
|
|
|
25
25
|
"harnesses": [
|
|
26
26
|
{
|
|
27
27
|
"id": "claude_code",
|
|
28
|
-
"aliases": [
|
|
28
|
+
"aliases": [
|
|
29
|
+
"claude"
|
|
30
|
+
],
|
|
29
31
|
"cli": "claude",
|
|
30
32
|
"kind": "terminal",
|
|
31
33
|
"installer_scope": "project",
|
|
@@ -75,7 +77,10 @@
|
|
|
75
77
|
},
|
|
76
78
|
{
|
|
77
79
|
"id": "grok",
|
|
78
|
-
"aliases": [
|
|
80
|
+
"aliases": [
|
|
81
|
+
"grok_cli",
|
|
82
|
+
"grok_build"
|
|
83
|
+
],
|
|
79
84
|
"cli": "grok",
|
|
80
85
|
"kind": "terminal",
|
|
81
86
|
"installer_scope": "project",
|
|
@@ -130,9 +135,9 @@
|
|
|
130
135
|
"cli": "hermes",
|
|
131
136
|
"kind": "terminal",
|
|
132
137
|
"installer_scope": "env-directed",
|
|
133
|
-
"installer_config": "$HERMES_HOME/config.yaml if set, else the output of `hermes config path` if the binary resolves, else ~/.hermes/config.yaml",
|
|
138
|
+
"installer_config": "$HERMES_HOME/config.yaml if set, else the output of `hermes config path` if the binary resolves (which reflects the ambient profile), else ~/.hermes/config.yaml",
|
|
134
139
|
"harness_scope": "per-profile-or-per-home",
|
|
135
|
-
"installer_defect": "WAS: the path was hardcoded to ~/.hermes/config.yaml. The installer never called `hermes config path` and did not know profiles exist, so installing while a non-default profile was active wrote the DEFAULT profile's config — the wrong file, silently. FIXED (scripts/lib/hermes-home.mjs, resolveHermesHome/resolveHermesConfigPath/resolveHermesSkillsDest, all three deriving from the same resolved home): HERMES_HOME from the environment, else a shelled `hermes config path` (which itself honours HERMES_HOME — the child inherits the environment), else the unchanged ~/.hermes fallback. Applies to config.yaml AND to where Hermes skills install (~/.hermes/skills/integrations was hardcoded in three more places, unaware of HERMES_HOME — a seat isolated by home for identity but not for skills is not isolated: skills are a guard, not documentation). mux measured two independent isolation mechanisms this way — HERMES_HOME and -p/--profile, both real, both giving a separate mcp_servers AND a separate .env — which is why harness_scope reads per-profile-or-per-home rather than per-profile alone. installer_scope changed from 'global' to 'env-directed' for the same reason: our installer's write target is no longer a fixed machine-wide path, it is wherever HERMES_HOME points when mux sets it, falling back to global only when nothing directs it. PROFILE
|
|
140
|
+
"installer_defect": "WAS: the path was hardcoded to ~/.hermes/config.yaml. The installer never called `hermes config path` and did not know profiles exist, so installing while a non-default profile was active wrote the DEFAULT profile's config — the wrong file, silently. FIXED (scripts/lib/hermes-home.mjs, resolveHermesHome/resolveHermesConfigPath/resolveHermesSkillsDest, all three deriving from the same resolved home): HERMES_HOME from the environment, else a shelled `hermes config path` (which itself honours HERMES_HOME — the child inherits the environment), else the unchanged ~/.hermes fallback. Applies to config.yaml AND to where Hermes skills install (~/.hermes/skills/integrations was hardcoded in three more places, unaware of HERMES_HOME — a seat isolated by home for identity but not for skills is not isolated: skills are a guard, not documentation). mux measured two independent isolation mechanisms this way — HERMES_HOME and -p/--profile, both real, both giving a separate mcp_servers AND a separate .env — which is why harness_scope reads per-profile-or-per-home rather than per-profile alone. installer_scope changed from 'global' to 'env-directed' for the same reason: our installer's write target is no longer a fixed machine-wide path, it is wherever HERMES_HOME points when mux sets it, falling back to global only when nothing directs it. PROFILE AXIS: COVERED, AND MEASURED RATHER THAN CLAIMED. This entry previously said profile support was deliberately not built, and that a user on a non-default -p/--profile without a matching HERMES_HOME would still get the silent-wrong-file failure. That was WRONG and lead@mux-v2 disproved it on a real Hermes install (boca, 2026-08-20): `hermes profile use sticky1` then `hermes config path` answers $HERMES_HOME/profiles/sticky1/config.yaml. The shelled resolver therefore honours the ambient profile by construction, because Hermes resolves it, not us. The same measurement confirmed the output is a FILE path, so dirname() in resolveHermesHome is correct. Resolution order in full: HERMES_HOME set (a mux seat) uses it directly and the profile is correctly ignored; HERMES_HOME unset with a profile active gets the profile's config; no hermes binary falls back to ~/.hermes, and a host with no hermes has no hermes seat. Under a sticky profile skills land at .../profiles/<name>/skills/integrations - profile-local skills beside profile-local config, which is the intent. Shipped in 0.6.44.",
|
|
136
141
|
"listener": {
|
|
137
142
|
"wake": "realtime",
|
|
138
143
|
"mechanism": "webhook-bridge",
|
|
@@ -146,7 +151,9 @@
|
|
|
146
151
|
},
|
|
147
152
|
{
|
|
148
153
|
"id": "antigravity",
|
|
149
|
-
"aliases": [
|
|
154
|
+
"aliases": [
|
|
155
|
+
"agy"
|
|
156
|
+
],
|
|
150
157
|
"cli": "antigravity",
|
|
151
158
|
"kind": "terminal",
|
|
152
159
|
"installer_scope": "project",
|
|
@@ -186,7 +193,13 @@
|
|
|
186
193
|
"installer_scope": "global",
|
|
187
194
|
"installer_config": "~/.codeium/windsurf/mcp_config.json",
|
|
188
195
|
"harness_scope": "unknown",
|
|
189
|
-
"listener": {
|
|
196
|
+
"listener": {
|
|
197
|
+
"wake": "none",
|
|
198
|
+
"mechanism": null,
|
|
199
|
+
"self_arm": false,
|
|
200
|
+
"survives_wake": null,
|
|
201
|
+
"evidence": "declared"
|
|
202
|
+
}
|
|
190
203
|
},
|
|
191
204
|
{
|
|
192
205
|
"id": "vscode",
|
|
@@ -196,7 +209,13 @@
|
|
|
196
209
|
"installer_scope": "project",
|
|
197
210
|
"installer_config": ".vscode/mcp.json",
|
|
198
211
|
"harness_scope": "unknown",
|
|
199
|
-
"listener": {
|
|
212
|
+
"listener": {
|
|
213
|
+
"wake": "none",
|
|
214
|
+
"mechanism": null,
|
|
215
|
+
"self_arm": false,
|
|
216
|
+
"survives_wake": null,
|
|
217
|
+
"evidence": "declared"
|
|
218
|
+
}
|
|
200
219
|
},
|
|
201
220
|
{
|
|
202
221
|
"id": "zed",
|
|
@@ -206,7 +225,13 @@
|
|
|
206
225
|
"installer_scope": "global",
|
|
207
226
|
"installer_config": "~/.config/zed/settings.json",
|
|
208
227
|
"harness_scope": "unknown",
|
|
209
|
-
"listener": {
|
|
228
|
+
"listener": {
|
|
229
|
+
"wake": "none",
|
|
230
|
+
"mechanism": null,
|
|
231
|
+
"self_arm": false,
|
|
232
|
+
"survives_wake": null,
|
|
233
|
+
"evidence": "declared"
|
|
234
|
+
}
|
|
210
235
|
},
|
|
211
236
|
{
|
|
212
237
|
"id": "cline",
|
|
@@ -216,7 +241,13 @@
|
|
|
216
241
|
"installer_scope": "global",
|
|
217
242
|
"installer_config": "cline_mcp_settings.json (VS Code globalStorage)",
|
|
218
243
|
"harness_scope": "unknown",
|
|
219
|
-
"listener": {
|
|
244
|
+
"listener": {
|
|
245
|
+
"wake": "none",
|
|
246
|
+
"mechanism": null,
|
|
247
|
+
"self_arm": false,
|
|
248
|
+
"survives_wake": null,
|
|
249
|
+
"evidence": "declared"
|
|
250
|
+
}
|
|
220
251
|
},
|
|
221
252
|
{
|
|
222
253
|
"id": "jcode",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "patchcord",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.45",
|
|
4
4
|
"description": "Cross-machine agent messaging for Claude Code and Codex",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"version": "node scripts/sync-plugin-version.mjs && git add .claude-plugin/plugin.json agent-plugin/plugin.json"
|
|
@@ -48,28 +48,36 @@
|
|
|
48
48
|
// SAME resolved home (resolveHermesHome), never computed independently —
|
|
49
49
|
// the two must never be able to disagree about which home they mean.
|
|
50
50
|
//
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
// FILE path directly (its name is "config path", not "profile path" or
|
|
54
|
-
// "home"), so step 2 takes dirname() of it as the home rather than
|
|
55
|
-
// assuming a directory was printed. If that assumption is wrong, the whole
|
|
56
|
-
// chain (config.yaml AND skills) is wrong together under step 2 rather
|
|
57
|
-
// than disagreeing with each other — a shared, nameable failure mode
|
|
58
|
-
// instead of a silent split.
|
|
51
|
+
// VERIFIED, ON A REAL INSTALL. lead@mux-v2 measured both open questions on
|
|
52
|
+
// boca (hermes installed, 2026-08-20) and answered them:
|
|
59
53
|
//
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
//
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
//
|
|
68
|
-
//
|
|
69
|
-
//
|
|
70
|
-
//
|
|
71
|
-
//
|
|
72
|
-
//
|
|
54
|
+
// $ hermes config path
|
|
55
|
+
// /home/p/.hermes/config.yaml <- a FILE path, so dirname() is right
|
|
56
|
+
//
|
|
57
|
+
// $ hermes profile use sticky1 <- sets the ambient sticky profile
|
|
58
|
+
// $ hermes config path
|
|
59
|
+
// $HERMES_HOME/profiles/sticky1/config.yaml <- the PROFILE is honoured
|
|
60
|
+
//
|
|
61
|
+
// PROFILES (-p/--profile) ARE COVERED, BY CONSTRUCTION RATHER THAN BY CODE.
|
|
62
|
+
// This comment previously said the opposite: that profiles were a second
|
|
63
|
+
// isolation axis this module does not resolve, and that a user on a
|
|
64
|
+
// non-default profile without a matching HERMES_HOME would still get the
|
|
65
|
+
// silent-wrong-file failure. That was wrong. Hermes resolves the ambient
|
|
66
|
+
// profile itself, and step 2 shells Hermes, so the answer arrives already
|
|
67
|
+
// correct. The decision NOT to model Hermes's resolution and to ask the
|
|
68
|
+
// binary instead is what covers an axis nobody wrote code for.
|
|
69
|
+
//
|
|
70
|
+
// Resolution order, in full:
|
|
71
|
+
// HERMES_HOME set (a mux seat) -> used directly; the profile is correctly
|
|
72
|
+
// ignored, because the seat's home wins
|
|
73
|
+
// HERMES_HOME unset, profile on -> `hermes config path` answers with the
|
|
74
|
+
// profile's own config
|
|
75
|
+
// no hermes binary -> ~/.hermes, and a host without hermes
|
|
76
|
+
// has no hermes seat to get wrong
|
|
77
|
+
//
|
|
78
|
+
// One consequence to keep rather than fix: under a sticky profile, dirname()
|
|
79
|
+
// puts skills at .../profiles/<name>/skills/integrations. Profile-local
|
|
80
|
+
// skills beside profile-local config is coherent, and it is what we want.
|
|
73
81
|
|
|
74
82
|
import { execSync } from "node:child_process";
|
|
75
83
|
import { join, dirname } from "node:path";
|