@link-assistant/hive-mind 1.54.5 → 1.54.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/CHANGELOG.md +13 -0
- package/README.hi.md +10 -10
- package/README.md +13 -13
- package/README.ru.md +10 -10
- package/README.zh.md +10 -10
- package/package.json +2 -2
- package/src/configure-claude.lib.mjs +1 -1
- package/src/solve.mjs +2 -2
- package/src/solve.results.lib.mjs +8 -8
- package/pr-1607-body.md +0 -34
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @link-assistant/hive-mind
|
|
2
2
|
|
|
3
|
+
## 1.54.7
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 06b1a41: Fix `--auto-attach-solution-summary` so the AI-comment scan starts at the current work session instead of the older feedback reference time.
|
|
8
|
+
|
|
9
|
+
## 1.54.6
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 2c15727: Migrate Docker images and deployment paths from `konard/sandbox` to the current
|
|
14
|
+
full `konard/box` base image with the `box` user and `/home/box` home directory.
|
|
15
|
+
|
|
3
16
|
## 1.54.5
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
package/README.hi.md
CHANGED
|
@@ -197,22 +197,22 @@ docker attach hive-mind
|
|
|
197
197
|
|
|
198
198
|
# Extract auth data from a running (or stopped) container to the host:
|
|
199
199
|
mkdir -p ~/.hive-mind
|
|
200
|
-
docker cp hive-mind:/
|
|
201
|
-
docker cp hive-mind:/
|
|
202
|
-
docker cp hive-mind:/
|
|
200
|
+
docker cp hive-mind:/home/box/.claude ~/.hive-mind/claude
|
|
201
|
+
docker cp hive-mind:/home/box/.claude.json ~/.hive-mind/claude.json
|
|
202
|
+
docker cp hive-mind:/home/box/.config/gh ~/.hive-mind/gh
|
|
203
203
|
|
|
204
|
-
# Fix ownership to match the
|
|
205
|
-
|
|
206
|
-
chown -R $
|
|
207
|
-
chown $
|
|
204
|
+
# Fix ownership to match the box user inside the container:
|
|
205
|
+
BOX_UID=$(docker exec hive-mind id -u box)
|
|
206
|
+
chown -R $BOX_UID:$BOX_UID ~/.hive-mind/claude ~/.hive-mind/gh
|
|
207
|
+
chown $BOX_UID:$BOX_UID ~/.hive-mind/claude.json
|
|
208
208
|
|
|
209
209
|
# On subsequent runs, mount the auth data to keep it between restarts:
|
|
210
210
|
docker run -dit \
|
|
211
211
|
--name hive-mind \
|
|
212
212
|
--restart unless-stopped \
|
|
213
|
-
-v /root/.hive-mind/claude:/
|
|
214
|
-
-v /root/.hive-mind/claude.json:/
|
|
215
|
-
-v /root/.hive-mind/gh:/
|
|
213
|
+
-v /root/.hive-mind/claude:/home/box/.claude \
|
|
214
|
+
-v /root/.hive-mind/claude.json:/home/box/.claude.json \
|
|
215
|
+
-v /root/.hive-mind/gh:/home/box/.config/gh \
|
|
216
216
|
konard/hive-mind:latest
|
|
217
217
|
```
|
|
218
218
|
|
package/README.md
CHANGED
|
@@ -203,19 +203,19 @@ docker attach hive-mind
|
|
|
203
203
|
mkdir -p /root/.hive-mind/claude /root/.hive-mind/codex /root/.hive-mind/gh
|
|
204
204
|
touch -a /root/.hive-mind/claude.json
|
|
205
205
|
|
|
206
|
-
# In our Docker images HOME=/
|
|
206
|
+
# In our Docker images HOME=/home/box, so Codex stores its data in /home/box/.codex.
|
|
207
207
|
# Mount the full Codex directory so auth.json, config.toml, and sessions survive restarts.
|
|
208
|
-
docker run -dit --user
|
|
209
|
-
-v /root/.hive-mind/claude:/
|
|
210
|
-
-v /root/.hive-mind/codex:/
|
|
211
|
-
-v /root/.hive-mind/claude.json:/
|
|
212
|
-
-v /root/.hive-mind/gh:/
|
|
213
|
-
konard/hive-mind:latest bash -l -c 'bash /
|
|
214
|
-
|
|
215
|
-
# After the first start, fix ownership to match the
|
|
216
|
-
|
|
217
|
-
chown -R $
|
|
218
|
-
chown $
|
|
208
|
+
docker run -dit --user box --name hive-mind --restart unless-stopped \
|
|
209
|
+
-v /root/.hive-mind/claude:/home/box/.claude \
|
|
210
|
+
-v /root/.hive-mind/codex:/home/box/.codex \
|
|
211
|
+
-v /root/.hive-mind/claude.json:/home/box/.claude.json \
|
|
212
|
+
-v /root/.hive-mind/gh:/home/box/.config/gh \
|
|
213
|
+
konard/hive-mind:latest bash -l -c 'bash /home/box/start-bot.sh'
|
|
214
|
+
|
|
215
|
+
# After the first start, fix ownership to match the box user inside the container:
|
|
216
|
+
BOX_UID=$(docker exec hive-mind id -u box)
|
|
217
|
+
chown -R $BOX_UID:$BOX_UID /root/.hive-mind/claude /root/.hive-mind/codex /root/.hive-mind/gh
|
|
218
|
+
chown $BOX_UID:$BOX_UID /root/.hive-mind/claude.json
|
|
219
219
|
|
|
220
220
|
# Important: mounted ~/.codex data overrides the image-baked Codex config.
|
|
221
221
|
# If the host directory was created before Playwright MCP was added to the image,
|
|
@@ -231,7 +231,7 @@ docker exec -it hive-mind bash -lc 'codex mcp list && codex mcp add playwright -
|
|
|
231
231
|
- ✅ Easy to run multiple instances with different GitHub accounts
|
|
232
232
|
- ✅ Consistent environment across different machines
|
|
233
233
|
|
|
234
|
-
The Docker image itself now registers Playwright MCP for both Claude and Codex during build, and CI verifies those registrations in the built container. If `codex mcp list` is still empty in a running container, the usual cause is not the published image itself but a mounted `/
|
|
234
|
+
The Docker image itself now registers Playwright MCP for both Claude and Codex during build, and CI verifies those registrations in the built container. If `codex mcp list` is still empty in a running container, the usual cause is not the published image itself but a mounted `/home/box/.codex` directory from the host that replaces the image's default Codex configuration.
|
|
235
235
|
|
|
236
236
|
See [docs/DOCKER.md](./docs/DOCKER.md) for advanced Docker usage.
|
|
237
237
|
|
package/README.ru.md
CHANGED
|
@@ -197,22 +197,22 @@ docker attach hive-mind
|
|
|
197
197
|
|
|
198
198
|
# Extract auth data from a running (or stopped) container to the host:
|
|
199
199
|
mkdir -p ~/.hive-mind
|
|
200
|
-
docker cp hive-mind:/
|
|
201
|
-
docker cp hive-mind:/
|
|
202
|
-
docker cp hive-mind:/
|
|
200
|
+
docker cp hive-mind:/home/box/.claude ~/.hive-mind/claude
|
|
201
|
+
docker cp hive-mind:/home/box/.claude.json ~/.hive-mind/claude.json
|
|
202
|
+
docker cp hive-mind:/home/box/.config/gh ~/.hive-mind/gh
|
|
203
203
|
|
|
204
|
-
# Fix ownership to match the
|
|
205
|
-
|
|
206
|
-
chown -R $
|
|
207
|
-
chown $
|
|
204
|
+
# Fix ownership to match the box user inside the container:
|
|
205
|
+
BOX_UID=$(docker exec hive-mind id -u box)
|
|
206
|
+
chown -R $BOX_UID:$BOX_UID ~/.hive-mind/claude ~/.hive-mind/gh
|
|
207
|
+
chown $BOX_UID:$BOX_UID ~/.hive-mind/claude.json
|
|
208
208
|
|
|
209
209
|
# On subsequent runs, mount the auth data to keep it between restarts:
|
|
210
210
|
docker run -dit \
|
|
211
211
|
--name hive-mind \
|
|
212
212
|
--restart unless-stopped \
|
|
213
|
-
-v /root/.hive-mind/claude:/
|
|
214
|
-
-v /root/.hive-mind/claude.json:/
|
|
215
|
-
-v /root/.hive-mind/gh:/
|
|
213
|
+
-v /root/.hive-mind/claude:/home/box/.claude \
|
|
214
|
+
-v /root/.hive-mind/claude.json:/home/box/.claude.json \
|
|
215
|
+
-v /root/.hive-mind/gh:/home/box/.config/gh \
|
|
216
216
|
konard/hive-mind:latest
|
|
217
217
|
```
|
|
218
218
|
|
package/README.zh.md
CHANGED
|
@@ -197,22 +197,22 @@ docker attach hive-mind
|
|
|
197
197
|
|
|
198
198
|
# Extract auth data from a running (or stopped) container to the host:
|
|
199
199
|
mkdir -p ~/.hive-mind
|
|
200
|
-
docker cp hive-mind:/
|
|
201
|
-
docker cp hive-mind:/
|
|
202
|
-
docker cp hive-mind:/
|
|
200
|
+
docker cp hive-mind:/home/box/.claude ~/.hive-mind/claude
|
|
201
|
+
docker cp hive-mind:/home/box/.claude.json ~/.hive-mind/claude.json
|
|
202
|
+
docker cp hive-mind:/home/box/.config/gh ~/.hive-mind/gh
|
|
203
203
|
|
|
204
|
-
# Fix ownership to match the
|
|
205
|
-
|
|
206
|
-
chown -R $
|
|
207
|
-
chown $
|
|
204
|
+
# Fix ownership to match the box user inside the container:
|
|
205
|
+
BOX_UID=$(docker exec hive-mind id -u box)
|
|
206
|
+
chown -R $BOX_UID:$BOX_UID ~/.hive-mind/claude ~/.hive-mind/gh
|
|
207
|
+
chown $BOX_UID:$BOX_UID ~/.hive-mind/claude.json
|
|
208
208
|
|
|
209
209
|
# On subsequent runs, mount the auth data to keep it between restarts:
|
|
210
210
|
docker run -dit \
|
|
211
211
|
--name hive-mind \
|
|
212
212
|
--restart unless-stopped \
|
|
213
|
-
-v /root/.hive-mind/claude:/
|
|
214
|
-
-v /root/.hive-mind/claude.json:/
|
|
215
|
-
-v /root/.hive-mind/gh:/
|
|
213
|
+
-v /root/.hive-mind/claude:/home/box/.claude \
|
|
214
|
+
-v /root/.hive-mind/claude.json:/home/box/.claude.json \
|
|
215
|
+
-v /root/.hive-mind/gh:/home/box/.config/gh \
|
|
216
216
|
konard/hive-mind:latest
|
|
217
217
|
```
|
|
218
218
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@link-assistant/hive-mind",
|
|
3
|
-
"version": "1.54.
|
|
3
|
+
"version": "1.54.7",
|
|
4
4
|
"description": "AI-powered issue solver and hive mind for collaborative problem solving",
|
|
5
5
|
"main": "src/hive.mjs",
|
|
6
6
|
"type": "module",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"hive-telegram-bot": "./src/telegram-bot.mjs"
|
|
15
15
|
},
|
|
16
16
|
"scripts": {
|
|
17
|
-
"test": "node tests/solve-queue.test.mjs && node tests/limits-display.test.mjs && node tests/test-usage-limit.mjs && node tests/test-codex-support.mjs && node tests/test-build-cost-info-string.mjs && node tests/test-claude-code-install-method.mjs && node tests/test-claude-quiet-config.mjs && node tests/test-configure-claude-bin.mjs && node tests/test-docker-release-order.mjs && node tests/test-issue-1616-pr-issue-link-preservation.mjs && node tests/test-pre-pr-failure-notifier-1640.mjs && node tests/test-telegram-message-filters.mjs && node tests/test-telegram-bot-command-aliases.mjs && node tests/test-solve-queue-command.mjs && node tests/test-queue-display-1267.mjs && node tests/test-telegram-bot-launcher.mjs",
|
|
17
|
+
"test": "node tests/solve-queue.test.mjs && node tests/limits-display.test.mjs && node tests/test-usage-limit.mjs && node tests/test-codex-support.mjs && node tests/test-build-cost-info-string.mjs && node tests/test-claude-code-install-method.mjs && node tests/test-claude-quiet-config.mjs && node tests/test-configure-claude-bin.mjs && node tests/test-docker-release-order.mjs && node tests/test-docker-box-migration.mjs && node tests/test-issue-1616-pr-issue-link-preservation.mjs && node tests/test-pre-pr-failure-notifier-1640.mjs && node tests/test-telegram-message-filters.mjs && node tests/test-telegram-bot-command-aliases.mjs && node tests/test-solve-queue-command.mjs && node tests/test-queue-display-1267.mjs && node tests/test-telegram-bot-launcher.mjs",
|
|
18
18
|
"test:queue": "node tests/solve-queue.test.mjs",
|
|
19
19
|
"test:limits-display": "node tests/limits-display.test.mjs",
|
|
20
20
|
"test:usage-limit": "node tests/test-usage-limit.mjs",
|
|
@@ -51,7 +51,7 @@ Options:
|
|
|
51
51
|
Examples:
|
|
52
52
|
configure-claude # apply defaults to ~/.claude/settings.json
|
|
53
53
|
configure-claude --verify # check only, non-zero exit if drift detected
|
|
54
|
-
configure-claude -s /
|
|
54
|
+
configure-claude -s /home/box/.claude/settings.json
|
|
55
55
|
|
|
56
56
|
Reference: https://github.com/link-assistant/hive-mind/issues/1642
|
|
57
57
|
`;
|
package/src/solve.mjs
CHANGED
|
@@ -642,7 +642,7 @@ try {
|
|
|
642
642
|
// Continue mode is a manual resume via PR URL
|
|
643
643
|
sessionType = SESSION_TYPES.RESUME;
|
|
644
644
|
}
|
|
645
|
-
await startWorkSession({
|
|
645
|
+
const workStartTime = await startWorkSession({
|
|
646
646
|
isContinueMode,
|
|
647
647
|
prNumber,
|
|
648
648
|
argv,
|
|
@@ -1190,7 +1190,7 @@ try {
|
|
|
1190
1190
|
} else if (argv.autoAttachSolutionSummary) {
|
|
1191
1191
|
// Auto mode - only attach if AI didn't create comments
|
|
1192
1192
|
await log('🔍 Checking if AI created any comments during session (--auto-attach-solution-summary)...');
|
|
1193
|
-
const aiCreatedComments = await checkForAiCreatedComments(
|
|
1193
|
+
const aiCreatedComments = await checkForAiCreatedComments(workStartTime, owner, repo, prNumber, issueNumber);
|
|
1194
1194
|
if (aiCreatedComments) {
|
|
1195
1195
|
await log('ℹ️ AI created comments during session, skipping solution summary attachment');
|
|
1196
1196
|
} else {
|
|
@@ -1058,14 +1058,14 @@ export const { TOOL_GENERATED_COMMENT_MARKERS, isToolGeneratedComment, trackTool
|
|
|
1058
1058
|
* Issue #1625: Filter out comments produced by solve.mjs itself (session start,
|
|
1059
1059
|
* log upload, auto-restart, etc.) so they do not falsely count as AI-authored.
|
|
1060
1060
|
*
|
|
1061
|
-
* @param {Date}
|
|
1061
|
+
* @param {Date} sessionStartTime - The timestamp when this solve work session started
|
|
1062
1062
|
* @param {string} owner - Repository owner
|
|
1063
1063
|
* @param {string} repo - Repository name
|
|
1064
1064
|
* @param {number} prNumber - Pull request number (null if working on issue only)
|
|
1065
1065
|
* @param {number} issueNumber - Issue number
|
|
1066
1066
|
* @returns {Promise<boolean>} - True if AI created comments during the session
|
|
1067
1067
|
*/
|
|
1068
|
-
export const checkForAiCreatedComments = async (
|
|
1068
|
+
export const checkForAiCreatedComments = async (sessionStartTime, owner, repo, prNumber, issueNumber) => {
|
|
1069
1069
|
try {
|
|
1070
1070
|
// Get the current user's GitHub username
|
|
1071
1071
|
const userResult = await $`gh api user --jq .login`;
|
|
@@ -1077,10 +1077,10 @@ export const checkForAiCreatedComments = async (referenceTime, owner, repo, prNu
|
|
|
1077
1077
|
return false;
|
|
1078
1078
|
}
|
|
1079
1079
|
|
|
1080
|
-
await log(`🔎 Checking comments by '${currentUser}' after ${
|
|
1080
|
+
await log(`🔎 Checking comments by '${currentUser}' after session start ${sessionStartTime.toISOString()} (PR #${prNumber ?? 'none'}, issue #${issueNumber ?? 'none'})`, { verbose: true });
|
|
1081
1081
|
|
|
1082
1082
|
// Issue #1625: A comment counts as an "AI comment" only if it was posted
|
|
1083
|
-
// by the current user AFTER
|
|
1083
|
+
// by the current user AFTER sessionStartTime AND solve.mjs did NOT post it
|
|
1084
1084
|
// itself. We identify tool-posted comments in two ways, in order:
|
|
1085
1085
|
// 1. Primary: comment ID is in the in-memory tracked set populated by
|
|
1086
1086
|
// every solve.mjs posting site (postTrackedComment / trackToolCommentId).
|
|
@@ -1097,7 +1097,7 @@ export const checkForAiCreatedComments = async (referenceTime, owner, repo, prNu
|
|
|
1097
1097
|
const skippedByIdCount = { n: 0 };
|
|
1098
1098
|
for (const comment of comments) {
|
|
1099
1099
|
if (!comment || !comment.user || comment.user.login !== currentUser) continue;
|
|
1100
|
-
if (!(new Date(comment.created_at) >
|
|
1100
|
+
if (!(new Date(comment.created_at) > sessionStartTime)) continue;
|
|
1101
1101
|
|
|
1102
1102
|
const isReview = kind === 'review';
|
|
1103
1103
|
if (!isReview) {
|
|
@@ -1132,7 +1132,7 @@ export const checkForAiCreatedComments = async (referenceTime, owner, repo, prNu
|
|
|
1132
1132
|
if (prCommentsResult.code === 0) {
|
|
1133
1133
|
const prComments = JSON.parse(prCommentsResult.stdout.toString().trim() || '[]');
|
|
1134
1134
|
const newPrComments = filterNewAiComments(prComments, 'pr');
|
|
1135
|
-
await log(` 📨 PR conversation comments after
|
|
1135
|
+
await log(` 📨 PR conversation comments after session start by '${currentUser}' (excluding tool-generated): ${newPrComments.length}`, { verbose: true });
|
|
1136
1136
|
if (newPrComments.length > 0) {
|
|
1137
1137
|
return true;
|
|
1138
1138
|
}
|
|
@@ -1143,7 +1143,7 @@ export const checkForAiCreatedComments = async (referenceTime, owner, repo, prNu
|
|
|
1143
1143
|
if (reviewCommentsResult.code === 0) {
|
|
1144
1144
|
const reviewComments = JSON.parse(reviewCommentsResult.stdout.toString().trim() || '[]');
|
|
1145
1145
|
const newReviewComments = filterNewAiComments(reviewComments, 'review');
|
|
1146
|
-
await log(` 📝 PR review (inline) comments after
|
|
1146
|
+
await log(` 📝 PR review (inline) comments after session start by '${currentUser}': ${newReviewComments.length}`, { verbose: true });
|
|
1147
1147
|
if (newReviewComments.length > 0) {
|
|
1148
1148
|
return true;
|
|
1149
1149
|
}
|
|
@@ -1156,7 +1156,7 @@ export const checkForAiCreatedComments = async (referenceTime, owner, repo, prNu
|
|
|
1156
1156
|
if (issueCommentsResult.code === 0) {
|
|
1157
1157
|
const issueComments = JSON.parse(issueCommentsResult.stdout.toString().trim() || '[]');
|
|
1158
1158
|
const newIssueComments = filterNewAiComments(issueComments, 'issue');
|
|
1159
|
-
await log(` 📨 Issue comments after
|
|
1159
|
+
await log(` 📨 Issue comments after session start by '${currentUser}' (excluding tool-generated): ${newIssueComments.length}`, { verbose: true });
|
|
1160
1160
|
if (newIssueComments.length > 0) {
|
|
1161
1161
|
return true;
|
|
1162
1162
|
}
|
package/pr-1607-body.md
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
## Summary
|
|
2
|
-
|
|
3
|
-
Fixes #1606 by documenting and verifying Playwright MCP registration for Codex in addition to Claude Code, including the Docker-specific case where persisted Codex state overrides the image defaults.
|
|
4
|
-
|
|
5
|
-
## Root Cause
|
|
6
|
-
|
|
7
|
-
The reported environment had `@playwright/mcp` installed and registered in Claude, but `codex mcp list` had no configured servers. The immediate cause was missing Codex MCP registration. Local reproduction confirmed that `/workspace/.codex/config.toml` can exist without a Playwright MCP entry and that `codex mcp add playwright ...` fixes the state immediately. In Docker deployments, the most likely explanation is that a host-mounted `/workspace/.codex` directory preserved an older Codex config and replaced the image-baked MCP registration. Existing docs and helper scripts also focused mainly on Claude setup, so the mismatch was easy to miss even though `/version` already reported it correctly.
|
|
8
|
-
|
|
9
|
-
## Changes
|
|
10
|
-
|
|
11
|
-
- added regression coverage for the mixed MCP state where Claude is connected and Codex is not
|
|
12
|
-
- updated Playwright MCP verification and integration scripts to check Codex MCP registration explicitly
|
|
13
|
-
- updated Docker verification to fail if Claude or Codex is missing the Playwright MCP registration
|
|
14
|
-
- updated configuration and Docker docs to include both `claude mcp add ...` and `codex mcp add ...`
|
|
15
|
-
- documented that mounting `/workspace/.codex` can override the image defaults and reintroduce the problem
|
|
16
|
-
- added the investigation record and collected evidence under `docs/case-studies/issue-1606`
|
|
17
|
-
|
|
18
|
-
## Reproduction
|
|
19
|
-
|
|
20
|
-
1. Install `@playwright/mcp` and register it only with Claude.
|
|
21
|
-
2. Run `claude mcp list` and confirm `playwright` is present.
|
|
22
|
-
3. Run `codex mcp list` and observe `No MCP servers configured yet`.
|
|
23
|
-
4. Run `/version` and observe `Playwright MCP: <version> | Claude Code: connected | Codex: not connected`.
|
|
24
|
-
|
|
25
|
-
## Verification
|
|
26
|
-
|
|
27
|
-
- `node tests/test-version-info.mjs`
|
|
28
|
-
- `node tests/test-version-parsing.mjs`
|
|
29
|
-
- `bash scripts/verify-docker-image.sh`
|
|
30
|
-
|
|
31
|
-
## Evidence
|
|
32
|
-
|
|
33
|
-
- case study: `docs/case-studies/issue-1606/README.md`
|
|
34
|
-
- PR: https://github.com/link-assistant/hive-mind/pull/1607
|