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 +5 -5
- package/docs/MCP.md +1 -1
- package/docs/SLACK_SETUP.md +18 -18
- package/docs/TROUBLESHOOTING.md +2 -0
- package/hive-privacy.js +5 -3
- package/hive-room-mode.js +43 -0
- package/hive-room-watcher.js +9 -1
- package/package.json +1 -1
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://
|
|
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://
|
|
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://
|
|
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://
|
|
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 `
|
|
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://
|
|
19
|
+
"env": { "HIVE_RELAY": "wss://livecode-xoss.onrender.com" }
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
}
|
package/docs/SLACK_SETUP.md
CHANGED
|
@@ -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://
|
|
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://
|
|
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://
|
|
123
|
-
npx -y hivecode-mcp@latest slack start "wss://
|
|
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://
|
|
130
|
-
npx -y hivecode-mcp@latest slack start "wss://
|
|
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://
|
|
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://
|
|
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://
|
|
370
|
-
SLACK_BOT_TOKEN=xoxb-… SLACK_APP_TOKEN=xapp-… npx -y hivecode-mcp@latest slack start "wss://
|
|
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://
|
|
378
|
-
npx -y hivecode-mcp@latest slack start "wss://
|
|
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://
|
|
386
|
-
npx -y hivecode-mcp@latest slack start "wss://
|
|
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://
|
|
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://
|
|
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://
|
|
451
|
-
npx -y hivecode-mcp@latest slack start "wss://
|
|
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.
|
package/docs/TROUBLESHOOTING.md
CHANGED
|
@@ -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://
|
|
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://
|
|
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://
|
|
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
|
|
package/hive-room-watcher.js
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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",
|