patchcord 0.6.32 → 0.6.34
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/bin/patchcord.mjs +11 -24
- package/package.json +1 -1
- package/scripts/subscribe.mjs +12 -1
- package/skills/inbox/SKILL.md +8 -0
package/bin/patchcord.mjs
CHANGED
|
@@ -2865,7 +2865,12 @@ if (!cmd || cmd === "install" || cmd === "agent" || cmd?.startsWith("--")) {
|
|
|
2865
2865
|
|
|
2866
2866
|
const CLIENT_TYPE_MAP = {
|
|
2867
2867
|
"claude_code": "1", "codex": "2", "cursor": "3", "grok": "14", "grok_cli": "14", "grok_build": "14", "windsurf": "4",
|
|
2868
|
-
"gemini"
|
|
2868
|
+
// "gemini" is deliberately ABSENT: Gemini CLI is retired as an install
|
|
2869
|
+
// target (Antigravity covers Google's agent). Slot "5" is left unassigned
|
|
2870
|
+
// rather than reused, so an old connect page sending client_type=gemini
|
|
2871
|
+
// falls through to no choice instead of silently configuring a DIFFERENT
|
|
2872
|
+
// harness and writing someone's token to the wrong file.
|
|
2873
|
+
"vscode": "6", "zed": "7", "opencode": "8", "openclaw": "9", "antigravity": "10",
|
|
2869
2874
|
"cline": "11", "kimi": "12", "hermes": "13",
|
|
2870
2875
|
};
|
|
2871
2876
|
|
|
@@ -3242,7 +3247,11 @@ if (!cmd || cmd === "install" || cmd === "agent" || cmd?.startsWith("--")) {
|
|
|
3242
3247
|
const isCursor = choice === "3";
|
|
3243
3248
|
const isGrok = choice === "14";
|
|
3244
3249
|
const isWindsurf = choice === "4";
|
|
3245
|
-
|
|
3250
|
+
// Gemini CLI retired as an install target. Kept as a permanent false so the
|
|
3251
|
+
// guards below still read as "this harness gets no project-local config"
|
|
3252
|
+
// for anything that reaches them, and so removing the slot cannot flip a
|
|
3253
|
+
// condition that used to exclude it into one that now includes it.
|
|
3254
|
+
const isGemini = false;
|
|
3246
3255
|
const isVSCode = choice === "6";
|
|
3247
3256
|
const isZed = choice === "7";
|
|
3248
3257
|
const isOpenCode = choice === "8";
|
|
@@ -3371,28 +3380,6 @@ if (!cmd || cmd === "install" || cmd === "agent" || cmd?.startsWith("--")) {
|
|
|
3371
3380
|
console.log(`\n ${green}✓${r} Windsurf configured: ${dim}${wsPath}${r}`);
|
|
3372
3381
|
console.log(` ${yellow}Global config — all Windsurf projects share this agent.${r}`);
|
|
3373
3382
|
}
|
|
3374
|
-
} else if (isGemini) {
|
|
3375
|
-
// Gemini CLI: global only (~/.gemini/settings.json)
|
|
3376
|
-
const geminiPath = join(HOME, ".gemini", "settings.json");
|
|
3377
|
-
const geminiOk = updateJsonConfig(geminiPath, (obj) => {
|
|
3378
|
-
obj.mcpServers = obj.mcpServers || {};
|
|
3379
|
-
obj.mcpServers.patchcord = {
|
|
3380
|
-
httpUrl: `${serverUrl}/mcp`,
|
|
3381
|
-
headers: {
|
|
3382
|
-
Authorization: `Bearer ${token}`,
|
|
3383
|
-
"X-Patchcord-Machine": hostname,
|
|
3384
|
-
},
|
|
3385
|
-
};
|
|
3386
|
-
// Clean up deprecated tools.allowed if present (removed in Gemini CLI 1.0)
|
|
3387
|
-
if (obj.tools?.allowed) {
|
|
3388
|
-
obj.tools.allowed = obj.tools.allowed.filter(t => !t.startsWith("mcp_patchcord_"));
|
|
3389
|
-
if (obj.tools.allowed.length === 0) delete obj.tools;
|
|
3390
|
-
}
|
|
3391
|
-
});
|
|
3392
|
-
if (geminiOk) {
|
|
3393
|
-
console.log(`\n ${green}✓${r} Gemini CLI configured: ${dim}${geminiPath}${r}`);
|
|
3394
|
-
console.log(` ${yellow}Global config — all Gemini CLI projects share this agent.${r}`);
|
|
3395
|
-
}
|
|
3396
3383
|
} else if (isZed) {
|
|
3397
3384
|
// Zed: global settings.json → context_servers
|
|
3398
3385
|
const zedPath = process.platform === "darwin"
|
package/package.json
CHANGED
package/scripts/subscribe.mjs
CHANGED
|
@@ -617,7 +617,18 @@ function runOnce(ticket, baseUrl, getToken, refreshTicket) {
|
|
|
617
617
|
// Skip terminal resolved replies — they carry thread_resolved_at and need
|
|
618
618
|
// no action from the recipient. Notifying on them is the root cause of ack loops.
|
|
619
619
|
if (rec.thread_resolved_at) return;
|
|
620
|
-
|
|
620
|
+
// Qualify the sender when the message crosses a namespace boundary.
|
|
621
|
+
// A bare seat name is ambiguous the moment this agent is linked to two
|
|
622
|
+
// namespaces that share it, and `lead` is the seat name every team has.
|
|
623
|
+
// rec.namespace_id is OUR namespace here (the row is addressed to us);
|
|
624
|
+
// rec.from_namespace is the sender's. If either is missing we render
|
|
625
|
+
// bare rather than inventing an origin.
|
|
626
|
+
const fromAgent = rec.from_agent || "unknown";
|
|
627
|
+
const fromNs = rec.from_namespace;
|
|
628
|
+
const from =
|
|
629
|
+
fromNs && rec.namespace_id && fromNs !== rec.namespace_id
|
|
630
|
+
? `${fromAgent}@${fromNs}`
|
|
631
|
+
: fromAgent;
|
|
621
632
|
notify(`PATCHCORD: 1 new from ${from}`, { from, count: 1, kind: "message" });
|
|
622
633
|
});
|
|
623
634
|
|
package/skills/inbox/SKILL.md
CHANGED
|
@@ -51,6 +51,14 @@ If `subscribe_appears_down: true` is in the response, your subscribe.mjs was run
|
|
|
51
51
|
|
|
52
52
|
If there are pending messages, reply to all of them immediately. Do not ask the human first. Do not explain what you plan to reply. Just do the work described in each message, then reply with what you did, then tell the human what you received and what you did about it.
|
|
53
53
|
|
|
54
|
+
## Name the other agent when you talk to the human
|
|
55
|
+
|
|
56
|
+
When you tell a human that you sent, received, or replied to a message, always write the full address as `name@namespace` — never a bare role word like "the worker", "their lead", or "the team".
|
|
57
|
+
|
|
58
|
+
The human cannot see your inbox. An unnamed recipient is a claim they cannot check. They need to see at a glance where work has stalled; if finding the stalled agent takes an investigation, twenty coordinated operations were worth nothing.
|
|
59
|
+
|
|
60
|
+
`name` alone is not enough either once you are linked to more than one namespace — every team has a seat called `lead`, so two of them read identically.
|
|
61
|
+
|
|
54
62
|
## Sending
|
|
55
63
|
|
|
56
64
|
1. inbox() - clear any pending messages that block outbound sends. From the response, note `self_subscribed` (your own push-receiving state).
|