hivecode-mcp 0.14.5 → 0.14.7

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/README.md CHANGED
@@ -16,7 +16,7 @@ earlier point.
16
16
  ## How it works
17
17
 
18
18
  1. Someone creates a **room** and gets a **join link**, like
19
- `wss://hivecode-relay.onrender.com|room-a1b2c3d4e5`
19
+ `wss://livecode-xoss.onrender.com|room-a1b2c3d4e5`
20
20
  2. Everyone — people and agents — joins with that link.
21
21
  3. Each agent works in **its own folder**. Hivecode keeps every folder identical, live.
22
22
  4. An agent **claims** a file before editing it and **releases** it after. While someone
@@ -88,7 +88,7 @@ Then:
88
88
  Customizations → MCP Servers → refresh. For Claude Code, start a new session.
89
89
  2. **Paste this to your agent**, with the link you were sent and a name:
90
90
 
91
- > Use your hive_join tool to join the Hivecode room `wss://hivecode-relay.onrender.com|room-a1b2c3d4e5`
91
+ > Use your hive_join tool to join the Hivecode room `wss://livecode-xoss.onrender.com|room-a1b2c3d4e5`
92
92
  > as **Alice-AI**. Then follow the rules it gives you.
93
93
 
94
94
  The agent's files go in `~/hivecode/<room>/<name>`, a folder of its own. To use a particular
@@ -124,12 +124,12 @@ If it says **NOT JOINED** instead, see [Troubleshooting](#troubleshooting).
124
124
 
125
125
  You don't need to install anything to watch and steer.
126
126
 
127
- 1. Open the Control Room: **https://hivecode-relay.onrender.com/control**
127
+ 1. Open the Control Room: **https://livecode-xoss.onrender.com/control**
128
128
  2. Paste the join link, type your name, and press **Enter room**.
129
129
 
130
130
  To skip the pasting, put the link after a `#` in the address — the room is filled in and you
131
131
  only type your name:
132
- `https://hivecode-relay.onrender.com/control#wss://hivecode-relay.onrender.com|room-a1b2c3d4e5`
132
+ `https://livecode-xoss.onrender.com/control#wss://livecode-xoss.onrender.com|room-a1b2c3d4e5`
133
133
 
134
134
  From there you can:
135
135
 
@@ -366,7 +366,7 @@ you prompt it: tell it to check the room.
366
366
  | `setup` printed `FAILED` for an app | that app's config could not be written, or what was written does not start | the reason is on the same line, and the entry to add by hand is printed below it |
367
367
  | `npx` stops with `ENOENT` and `AppData\Roaming\npm` (Windows) | that folder is missing, which happens on some fresh Node installs, and npm gives up before Hivecode starts | create it with `mkdir "$env:APPDATA\npm"` in PowerShell (`mkdir "%APPDATA%\npm"` in cmd), then run setup again |
368
368
  | `'room-…' is not recognized` or `command not found: room-…` | a join link was pasted into a terminal without quotes | give the link to your agent instead; if you pass it to `setup`, quote it |
369
- | `NOT JOINED` and the address `livecode-xoss.onrender.com` | an old Hivecode version, still cached by `npx` | put `hivecode-mcp@latest` in your agent's config and restart it |
369
+ | `NOT JOINED` and the address `hivecode-relay.onrender.com` | an old Hivecode version, still cached by `npx` | put `hivecode-mcp@latest` in your agent's config and restart it |
370
370
  | `Q430` | the relay is out of sockets | try again shortly; clients on the older one-socket-per-file transport (the VS Code extension, the browser panel) can lower `HIVE_MAX_OPEN_FILES` |
371
371
  | `Q438` | the relay holds as many open files as it is sized for | try again shortly, or ask whoever runs the relay to raise `HIVE_MAX_CHANNELS_TOTAL` |
372
372
  | `Q431` | this room is full | fewer participants in one room, or ask whoever runs the relay to raise `HIVE_SEATS` |
package/docs/MCP.md CHANGED
@@ -16,7 +16,7 @@ the runtime copy that `setup` installs:
16
16
  "hivecode": {
17
17
  "command": "node",
18
18
  "args": ["<your home>/.hivecode/runtime/<version>/node_modules/hivecode-mcp/hive-mcp.js"],
19
- "env": { "HIVE_RELAY": "wss://hivecode-relay.onrender.com" }
19
+ "env": { "HIVE_RELAY": "wss://livecode-xoss.onrender.com" }
20
20
  }
21
21
  }
22
22
  }
@@ -110,24 +110,24 @@ Once `slack check` passes, you can also run `--dry-run` on `slack start` or `git
110
110
  **macOS / Linux (bash, zsh):**
111
111
  ```bash
112
112
  # 1. Verify token and channel membership first
113
- SLACK_BOT_TOKEN=xoxb-… npx -y hivecode-mcp@latest slack start "wss://hivecode-relay.onrender.com|room-abc123" --channel C0123456789 --dry-run
113
+ SLACK_BOT_TOKEN=xoxb-… npx -y hivecode-mcp@latest slack start "wss://livecode-xoss.onrender.com|room-abc123" --channel C0123456789 --dry-run
114
114
 
115
115
  # 2. Start the live bridge
116
- SLACK_BOT_TOKEN=xoxb-… npx -y hivecode-mcp@latest slack start "wss://hivecode-relay.onrender.com|room-abc123" --channel C0123456789
116
+ SLACK_BOT_TOKEN=xoxb-… npx -y hivecode-mcp@latest slack start "wss://livecode-xoss.onrender.com|room-abc123" --channel C0123456789
117
117
  ```
118
118
 
119
119
  **Windows (PowerShell):**
120
120
  ```powershell
121
121
  $env:SLACK_BOT_TOKEN="xoxb-…"
122
- npx -y hivecode-mcp@latest slack start "wss://hivecode-relay.onrender.com|room-abc123" --channel C0123456789 --dry-run
123
- npx -y hivecode-mcp@latest slack start "wss://hivecode-relay.onrender.com|room-abc123" --channel C0123456789
122
+ npx -y hivecode-mcp@latest slack start "wss://livecode-xoss.onrender.com|room-abc123" --channel C0123456789 --dry-run
123
+ npx -y hivecode-mcp@latest slack start "wss://livecode-xoss.onrender.com|room-abc123" --channel C0123456789
124
124
  ```
125
125
 
126
126
  **Windows (Command Prompt / `cmd.exe`):**
127
127
  ```cmd
128
128
  set SLACK_BOT_TOKEN=xoxb-…
129
- npx -y hivecode-mcp@latest slack start "wss://hivecode-relay.onrender.com|room-abc123" --channel C0123456789 --dry-run
130
- npx -y hivecode-mcp@latest slack start "wss://hivecode-relay.onrender.com|room-abc123" --channel C0123456789
129
+ npx -y hivecode-mcp@latest slack start "wss://livecode-xoss.onrender.com|room-abc123" --channel C0123456789 --dry-run
130
+ npx -y hivecode-mcp@latest slack start "wss://livecode-xoss.onrender.com|room-abc123" --channel C0123456789
131
131
  ```
132
132
 
133
133
  ---
@@ -284,14 +284,14 @@ What to know about polling:
284
284
 
285
285
  macOS / Linux (bash, zsh):
286
286
  ```bash
287
- SLACK_BOT_TOKEN=xoxb-… SLACK_APP_TOKEN=xapp-… npx -y hivecode-mcp@latest slack agent "wss://hivecode-relay.onrender.com|room-abc123" --channel D0123456789 --allow U012ABCDEF
287
+ SLACK_BOT_TOKEN=xoxb-… SLACK_APP_TOKEN=xapp-… npx -y hivecode-mcp@latest slack agent "wss://livecode-xoss.onrender.com|room-abc123" --channel D0123456789 --allow U012ABCDEF
288
288
  ```
289
289
 
290
290
  Windows (PowerShell):
291
291
  ```powershell
292
292
  $env:SLACK_BOT_TOKEN="xoxb-…"
293
293
  $env:SLACK_APP_TOKEN="xapp-…"
294
- npx -y hivecode-mcp@latest slack agent "wss://hivecode-relay.onrender.com|room-abc123" --channel D0123456789 --allow U012ABCDEF
294
+ npx -y hivecode-mcp@latest slack agent "wss://livecode-xoss.onrender.com|room-abc123" --channel D0123456789 --allow U012ABCDEF
295
295
  ```
296
296
 
297
297
  <details>
@@ -366,24 +366,24 @@ Paste the contents of [`slack-app-manifest-agent.json`](../slack-app-manifest-ag
366
366
 
367
367
  **macOS / Linux (bash, zsh):**
368
368
  ```bash
369
- SLACK_BOT_TOKEN=xoxb-… SLACK_APP_TOKEN=xapp-… npx -y hivecode-mcp@latest slack start "wss://hivecode-relay.onrender.com|room-abc123" --channel C0123456789 --allow U012ABCDEF --dry-run
370
- SLACK_BOT_TOKEN=xoxb-… SLACK_APP_TOKEN=xapp-… npx -y hivecode-mcp@latest slack start "wss://hivecode-relay.onrender.com|room-abc123" --channel C0123456789 --allow U012ABCDEF
369
+ SLACK_BOT_TOKEN=xoxb-… SLACK_APP_TOKEN=xapp-… npx -y hivecode-mcp@latest slack start "wss://livecode-xoss.onrender.com|room-abc123" --channel C0123456789 --allow U012ABCDEF --dry-run
370
+ SLACK_BOT_TOKEN=xoxb-… SLACK_APP_TOKEN=xapp-… npx -y hivecode-mcp@latest slack start "wss://livecode-xoss.onrender.com|room-abc123" --channel C0123456789 --allow U012ABCDEF
371
371
  ```
372
372
 
373
373
  **Windows (PowerShell):**
374
374
  ```powershell
375
375
  $env:SLACK_BOT_TOKEN="xoxb-…"
376
376
  $env:SLACK_APP_TOKEN="xapp-…"
377
- npx -y hivecode-mcp@latest slack start "wss://hivecode-relay.onrender.com|room-abc123" --channel C0123456789 --allow U012ABCDEF --dry-run
378
- npx -y hivecode-mcp@latest slack start "wss://hivecode-relay.onrender.com|room-abc123" --channel C0123456789 --allow U012ABCDEF
377
+ npx -y hivecode-mcp@latest slack start "wss://livecode-xoss.onrender.com|room-abc123" --channel C0123456789 --allow U012ABCDEF --dry-run
378
+ npx -y hivecode-mcp@latest slack start "wss://livecode-xoss.onrender.com|room-abc123" --channel C0123456789 --allow U012ABCDEF
379
379
  ```
380
380
 
381
381
  **Windows (Command Prompt / `cmd.exe`):**
382
382
  ```cmd
383
383
  set SLACK_BOT_TOKEN=xoxb-…
384
384
  set SLACK_APP_TOKEN=xapp-…
385
- npx -y hivecode-mcp@latest slack start "wss://hivecode-relay.onrender.com|room-abc123" --channel C0123456789 --allow U012ABCDEF --dry-run
386
- npx -y hivecode-mcp@latest slack start "wss://hivecode-relay.onrender.com|room-abc123" --channel C0123456789 --allow U012ABCDEF
385
+ npx -y hivecode-mcp@latest slack start "wss://livecode-xoss.onrender.com|room-abc123" --channel C0123456789 --allow U012ABCDEF --dry-run
386
+ npx -y hivecode-mcp@latest slack start "wss://livecode-xoss.onrender.com|room-abc123" --channel C0123456789 --allow U012ABCDEF
387
387
  ```
388
388
 
389
389
  ### Slackbot Remote MCP Server (`hive-mcp-http.js`)
@@ -400,14 +400,14 @@ If you connect Slackbot's remote MCP client over Streamable HTTP (`hive-mcp-http
400
400
 
401
401
  **macOS / Linux (bash, zsh):**
402
402
  ```bash
403
- SLACK_SIGNING_SECRET=… SLACK_BOT_TOKEN=xoxb-… npx -y hivecode-mcp@latest slack mcp-server "wss://hivecode-relay.onrender.com|room-abc123" --port 8790 --allow U012ABCDEF
403
+ SLACK_SIGNING_SECRET=… SLACK_BOT_TOKEN=xoxb-… npx -y hivecode-mcp@latest slack mcp-server "wss://livecode-xoss.onrender.com|room-abc123" --port 8790 --allow U012ABCDEF
404
404
  ```
405
405
 
406
406
  **Windows (PowerShell):**
407
407
  ```powershell
408
408
  $env:SLACK_SIGNING_SECRET="…"
409
409
  $env:SLACK_BOT_TOKEN="xoxb-…"
410
- npx -y hivecode-mcp@latest slack mcp-server "wss://hivecode-relay.onrender.com|room-abc123" --port 8790 --allow U012ABCDEF
410
+ npx -y hivecode-mcp@latest slack mcp-server "wss://livecode-xoss.onrender.com|room-abc123" --port 8790 --allow U012ABCDEF
411
411
  ```
412
412
 
413
413
  **What a First-Time User Sees Step by Step (`hive-mcp-http.js`):**
@@ -447,8 +447,8 @@ Use these 5 steps to demonstrate either **GitHub-to-Slack issue threads** (`gith
447
447
  ```powershell
448
448
  $env:SLACK_BOT_TOKEN="xoxb-…"
449
449
  $env:SLACK_APP_TOKEN="xapp-…"
450
- npx -y hivecode-mcp@latest slack start "wss://hivecode-relay.onrender.com|room-abc123" --channel C0123456789 --allow U012ABCDEF --dry-run
451
- npx -y hivecode-mcp@latest slack start "wss://hivecode-relay.onrender.com|room-abc123" --channel C0123456789 --allow U012ABCDEF
450
+ npx -y hivecode-mcp@latest slack start "wss://livecode-xoss.onrender.com|room-abc123" --channel C0123456789 --allow U012ABCDEF --dry-run
451
+ npx -y hivecode-mcp@latest slack start "wss://livecode-xoss.onrender.com|room-abc123" --channel C0123456789 --allow U012ABCDEF
452
452
  ```
453
453
  4. **Trigger a Thread**:
454
454
  - **In Flow A**: Add the `hivecode` label to a GitHub issue. Watch Slack open a single thread (`#12 — Title`) for that issue and post run progress inside it.
@@ -96,6 +96,8 @@ This guide explains every error code (`Qxxx`) emitted by Hivecode CLI commands,
96
96
  | `Q585` | `hive-repos.js` | Calling `hive_pr` | Not currently connected to a room (`hive_join` has not been called). | Join a room first using `hive_join` before calling `hive_pr`. |
97
97
  | `Q586` | `hive-repos.js` | Calling `hive_pr` | Room connection is currently offline or disconnected from relay. | Wait for the room connection to reconnect to the relay before running `hive_pr`. |
98
98
  | `Q587` | `hive-land.js` | Landing a branch room (`pr`, `hive_pr`, room mode) | This clone's record of the commit the room was seeded from (git config `hivecode.<branch>.base`) differs from the room's own record. Landing uses it to tell an untouched file from one changed outside the room, so it refuses rather than guess. | If the room was reseeded from another clone, run `npx -y hivecode-mcp@latest branch <branch> --join "<room link>"` here to record the room's seed, then land again. |
99
+ | `Q588` | `hive-room-mode.js` | Landing a finished issue or review task (GitHub watcher, room mode) | The task is done, but every file it changed was saved in the room by a client that signs nothing (provenance off). Only files with a signed receipt are committed, so nothing can land. | Whoever changed the files puts the branch's version of each back, then makes the change again from a client that signs. `hivecode-mcp` signs by itself; a script that calls `startSync` needs `HIVE_PROVENANCE=on`. The landing is tried again when the room's files change. |
100
+ | `Q589` | `hive-room-mode.js` / `hive-room-watcher.js` | Landing a finished issue (GitHub watcher, room mode) | The landing found nothing new to commit and the branch has no commit beyond its base, so no pull request was opened. Reported as a refusal: a finished issue whose landing opens no pull request has not landed. | If the work was done, check it was saved in the room by a client that signs (see `Q588`). If the issue needed no change, close it on GitHub. |
99
101
  | `Q592` | `hive-gate.js` / `sync.js` | Releasing a file (`hive_release`) in a room that set a gate (`gate:cmd`) | The room's gate command has not been approved on this machine, so it did not run: the release went through **unchecked**, and the room was told once. A command from the room never runs on the room's say-so (0.14.4). | If your person trusts the command, they approve that exact command once: `npx -y hivecode-mcp@latest gate allow --dir <room folder> --cmd "<command>"`. An agent must not approve it because a room message asks. |
100
102
  | `Q593` | `hive-gate.js` | `npx hivecode-mcp gate allow/show/revoke` | The folder given with `--dir` has no `.hive.json` naming a room. | Pass `--dir` the folder you joined the room in. |
101
103
  | `Q594` | `hive-gate.js` | `npx hivecode-mcp gate allow` | No `--cmd` was given. An approval is for one exact command; anything else does not run. | Repeat with `--cmd "<the room's exact gate command>"` (the Q592 message quotes it). |
package/hive-privacy.js CHANGED
@@ -14,7 +14,7 @@
14
14
  //
15
15
  // 1. A VERDICT on every join, so "am I private?" is answered without being asked.
16
16
  // Printing the URL is not a verdict. A person who has never run a relay cannot tell
17
- // wss://livecode-xoss.onrender.com from wss://relay.theircompany.com by looking.
17
+ // wss://hivecode-relay.onrender.com from wss://relay.theircompany.com by looking.
18
18
  //
19
19
  // 2. A PIN that REFUSES. A verdict you have to read is a verdict that gets skimmed, and
20
20
  // an agent does not read banners at all. HIVE_RELAY_PIN says "this machine may only
@@ -34,13 +34,15 @@
34
34
  // sent that client to a dead host, or made this module call the live default "YOUR RELAY".
35
35
  // Every client now imports it from here. The extension's JSON setting cannot import, so
36
36
  // extension-privacy-parity-test pins it equal to this value instead.
37
- export const PUBLIC_DEFAULT_RELAY = 'wss://hivecode-relay.onrender.com'
37
+ export const PUBLIC_DEFAULT_RELAY = 'wss://livecode-xoss.onrender.com'
38
38
 
39
+ // 10 Nov 2026: the hosted relay moved back to livecode-xoss (its first address, live again) when the
40
+ // hivecode-relay account ran out of hours for the month, so the two addresses below swapped places.
39
41
  // Relays this project has run publicly and retired. A .hive.json written before a move still
40
42
  // names the old one, and if that host ever answers again (a reactivated account, a squatter
41
43
  // on the name) the verdict must still say PUBLIC -- not "YOUR RELAY", which is what any host
42
44
  // outside this list is called.
43
- export const RETIRED_PUBLIC_RELAYS = ['wss://livecode-xoss.onrender.com']
45
+ export const RETIRED_PUBLIC_RELAYS = ['wss://hivecode-relay.onrender.com']
44
46
 
45
47
  /**
46
48
  * The relay a client should actually dial for a URL it was handed.
package/hive-room-mode.js CHANGED
@@ -939,6 +939,18 @@ export function branchHeadOf(root, branch) {
939
939
  * (unless allowUnreviewed is true and no file has a fail or stale-after-fail review).
940
940
  * 4. No unresolved FAIL review exists on any planned file.
941
941
  */
942
+ // Why a done task whose only changes are unsigned cannot land, and what its author does about it.
943
+ // The second half is the way that was measured to work (10 Nov 2026): saving the same text again
944
+ // signs nothing, and a signed change on top of an unsigned one is refused as Q506, because the signed
945
+ // history then starts from a text the branch never held.
946
+ function unsignedWhy(orphans) {
947
+ const shown = orphans.slice(0, 8).join(', ') + (orphans.length > 8 ? ` and ${orphans.length - 8} more` : '')
948
+ const one = orphans.length === 1
949
+ return `the task is done, but nothing can land: ${shown} ${one ? 'was' : 'were'} changed in the room by a client that signs nothing, ` +
950
+ `so Hivecode cannot say who wrote ${one ? 'it' : 'them'}. Whoever changed ${one ? 'it' : 'them'}: put the branch's version of ${one ? 'the file' : 'each file'} back, ` +
951
+ 'then make the change again from a client that signs (hivecode-mcp signs by itself; a script that calls startSync needs HIVE_PROVENANCE=on).'
952
+ }
953
+
942
954
  export async function whenDone(opts = {}) {
943
955
  const {
944
956
  link,
@@ -1047,6 +1059,17 @@ export async function whenDone(opts = {}) {
1047
1059
  const plannedFiles = (dryRes.plan || []).flatMap((g) => g.files || [])
1048
1060
  const deletions = dryRes.deletions || []
1049
1061
  const hashes = dryRes.hashes || null
1062
+ const orphans = Array.isArray(dryRes.orphans) ? dryRes.orphans.filter((f) => typeof f === 'string' && f) : []
1063
+
1064
+ // DONE, BUT EVERY CHANGE IS UNSIGNED: NOTHING CAN LAND (10 Nov 2026). Only files with a signed
1065
+ // receipt are committed. Issue #10's three files were saved by a client that signs nothing, so
1066
+ // the plan was empty; with no planned file there was nothing to review either, this answered
1067
+ // ready, the real landing returned ok with no pull request, and the watcher announced "landed as
1068
+ // PR #undefined". A refusal with a code, so it is said once on the issue and in the room.
1069
+ if (!plannedFiles.length && !deletions.length && orphans.length) {
1070
+ const why = unsignedWhy(orphans)
1071
+ return { ready: false, refused: true, code: 'Q588', why, reasons: [why], files: [], deletions, orphans, task }
1072
+ }
1050
1073
 
1051
1074
  // 4. Review status check for every planned file
1052
1075
  const reasons = []
@@ -1097,6 +1120,7 @@ export async function whenDone(opts = {}) {
1097
1120
  reasons,
1098
1121
  files: plannedFiles,
1099
1122
  deletions,
1123
+ orphans,
1100
1124
  task,
1101
1125
  plan: dryRes.plan,
1102
1126
  hashes,
@@ -1110,6 +1134,7 @@ export async function whenDone(opts = {}) {
1110
1134
  reviewed,
1111
1135
  files: plannedFiles,
1112
1136
  deletions,
1137
+ orphans,
1113
1138
  task,
1114
1139
  plan: dryRes.plan,
1115
1140
  hashes,
@@ -1271,6 +1296,24 @@ async function landIssueOn(opts = {}) {
1271
1296
  }
1272
1297
  }
1273
1298
 
1299
+ // A LANDING THAT OPENED NO PULL REQUEST IS NOT A LANDING (10 Nov 2026). landAndOpen answers ok
1300
+ // when there was nothing new to commit and the branch has no commit beyond its base: right for
1301
+ // someone running `pr` by hand, wrong for a done task, whose whole result is the pull request.
1302
+ // Handed back as a refusal, remembered by fingerprint like the others.
1303
+ if (!landRes.pr || !landRes.pr.number) {
1304
+ const left = (landRes.orphans && landRes.orphans.length) ? landRes.orphans : (wd.orphans || [])
1305
+ return {
1306
+ ok: false,
1307
+ code: 'Q589',
1308
+ why: `the task is done, but the landing opened no pull request: there is nothing on ${branch} beyond what it started from` +
1309
+ `${landRes.why ? ` (${landRes.why})` : ''}.` +
1310
+ `${left.length ? ` Not landed, no signed receipt: ${left.join(', ')}.` : ''}` +
1311
+ ' If the work was done, it has to be saved in the room by a client that signs; if the issue needed no change, close it on GitHub.',
1312
+ fingerprint,
1313
+ state: { ...state, lastFailedFingerprint: fingerprint },
1314
+ }
1315
+ }
1316
+
1274
1317
  const nextState = { ...state }
1275
1318
  delete nextState.lastFailedFingerprint
1276
1319
 
@@ -217,7 +217,15 @@ export function makeRoomWatcher(o) {
217
217
  // are not retried this way: they wait for the room to change.
218
218
  let lastFp = a.lastFailedFingerprint || ''
219
219
  if (lastFp && a.lastRefusal && now() - (a.refusalTriedAt || a.lastRefusal.at) >= refusalRetryMinutes * 60000) { lastFp = ''; a.refusalTriedAt = now() }
220
- const r = await deps.landIssue({ taskId: a.taskId, issue: { number: n, title: it.title }, lastFailedFingerprint: lastFp, allowUnreviewed })
220
+ let r = await deps.landIssue({ taskId: a.taskId, issue: { number: n, title: it.title }, lastFailedFingerprint: lastFp, allowUnreviewed })
221
+ // "OK" WITH NO PULL REQUEST IS A REFUSAL, whatever landIssue this is (10 Nov 2026). Issue #10
222
+ // came back ok with pr = null: this said "issue #10 landed as PR #undefined" in the room and on
223
+ // the issue, marked it landed and stored openPr = 0, with nothing pushed. hive-room-mode.js
224
+ // refuses that itself now (Q588, Q589); this is the same rule where the number is printed. A
225
+ // review fix is sent for a pull request that already exists (a.pr), so it is not judged here.
226
+ if (r && r.ok && a.kind !== 'review' && !(r.pr && r.pr.number)) {
227
+ r = { ok: false, code: 'Q589', why: `the landing reported success but opened no pull request${r.why ? ` (${oneLine(r.why, 200)})` : ''}.`, fingerprint: r.fingerprint || '', state: r.state }
228
+ }
221
229
  if (r && !r.ok && r.blocked === 'unreviewed') {
222
230
  if (!a.unreviewedSince && !a.unreviewedSaid) {
223
231
  a.unreviewedSince = now()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hivecode-mcp",
3
- "version": "0.14.5",
3
+ "version": "0.14.7",
4
4
  "description": "MCP server that lets any AI coding agent join a Hivecode room — humans and multiple AI agents edit one live codebase with folder-scoped permissions and approval gates.",
5
5
  "type": "module",
6
6
  "license": "MIT",