claude-spotter 1.1.4 → 1.1.5
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 +20 -0
- package/README.md +2 -2
- package/package.json +1 -1
- package/src/tool-db/investigate-mcp.mjs +6 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.1.5
|
|
4
|
+
|
|
5
|
+
**Windows で refresh 毎に cmd.exe console window が flash + 入力フォーカスを奪う UX 回帰を修正**。`listMcpServers` / `getStdioConfig` が `execClaude` 経由で spawn する `cmd.exe /c claude mcp list/get` に `windowsHide: true` が付いておらず、SessionStart 毎の bg refresh と install 時 seed で毎回黒いウィンドウが一瞬表示されキーボード入力が奪われていた。
|
|
6
|
+
|
|
7
|
+
### 変更点
|
|
8
|
+
|
|
9
|
+
- **編集 [src/tool-db/investigate-mcp.mjs](src/tool-db/investigate-mcp.mjs)**: `execClaude` ヘルパ内で `opts` を spread した上で `windowsHide: true` を強制。呼び出し側 (`listMcpServers`, `getStdioConfig`) の `execOpts` に毎回書かせるのではなく、helper 層で固定することで将来の call site も自動で守られる。
|
|
10
|
+
|
|
11
|
+
### 背景
|
|
12
|
+
|
|
13
|
+
Windows の `spawn` / `execFile` は `windowsHide` オプションが `false` のとき、child process の console window を visible で起動する。Spotter の spawn サイトは 6 箇所 (daemon spawn / refresh detached / haiku-caller / MCP stdio spawn / doctor / execClaude) あり、うち 5 箇所は個別に `windowsHide: true` を付けていたが、`execClaude` だけ opts 任せになっていて pass されていなかった。
|
|
14
|
+
|
|
15
|
+
SessionStart 毎の `spotter db refresh` で `listMcpServers` が 1 回、stdio MCP サーバーの数だけ `getStdioConfig` が呼ばれるため、MCP サーバー N 個の環境では SessionStart 毎に **1 + N 回** の flash が発生。加えて `spotter install` 時の seed でも同じ経路を通る。体感「結構な頻度で入力を奪われる」という UX 回帰の直接原因。
|
|
16
|
+
|
|
17
|
+
### 設計判断
|
|
18
|
+
|
|
19
|
+
- **helper 層で windowsHide 強制**: call site 毎に書かせる方針は 2 箇所の execOpts を更新するだけで済むが、新 call site 追加時に忘れるリスクが残る。`execClaude` は外部コマンド (`claude` CLI) 専用で Windows では常に cmd.exe 経由のため、「このヘルパ経由なら silent」という不変条件を layer 内で閉じた方が防御堅牢。
|
|
20
|
+
- **他 5 spawn サイトの監査**: `spawn-daemon.mjs` (daemon + refresh detached), `haiku-caller.mjs` (claude -p), `investigate-mcp.mjs:spawnAndQuery` (MCP stdio), `doctor.mjs` (claude --version) はすべて `windowsHide: true` 済みを確認。この修正で残る穴はゼロ。
|
|
21
|
+
- **テスト追加なし**: Windows console window visibility は cross-platform ユニットテストで検証しづらい (Windows 環境でも Node の test runner 経由で spawn した child の visibility を assert する API がない)。監査対象は 6 spawn サイト全件の源コード上の `windowsHide: true` の存在のみ、これは grep で機械検証できる。
|
|
22
|
+
|
|
3
23
|
## 1.1.4
|
|
4
24
|
|
|
5
25
|
**MCP 投資ロジックの 2 件の穴を修正**。どちらも「名乗っているスコープ」と「実際に参照されるスコープ」が一致していない silent mismatch。前者は projectRoot 引数が効かない経路、後者は baseline が現実を無視して常に 25 件投入される経路。
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Spotter
|
|
2
2
|
|
|
3
|
-
> **v1.1.
|
|
3
|
+
> **v1.1.4 released 2026-04-20**. **MCP 投資経路の 2 件の silent mismatch を修正**。(1) `claude mcp list / get` spawn 時の `cwd: projectRoot` 未指定、(2) claude.ai baseline (Gmail/Calendar/Drive 25 件) の無条件注入 — `claude mcp list` の実在確認を入れ、隔離 `CLAUDE_CONFIG_DIR` / 未連携環境で最大 25 件の幻ツールが catalog に残っていた状態を解消 (Bell 側実環境で 25 件消失を実測確認済み)。v1.1.0 からの柱 (install 時 tool-db 自動構築 + SessionStart での drift 自動追従) は継続、手動 `spotter db refresh` は通常不要。監査対象は v1.0.0 でユーザー追加分 (MCP / スキル / サブエージェント) に絞り込み済み、本プロジェクトでの実測で 268 件 resolved (MCP 40 + skills 181 + agents/bare 47)。設計思想は [docs/catalog-design.md](docs/catalog-design.md)、変更詳細は [CHANGELOG](CHANGELOG.md)。
|
|
4
4
|
|
|
5
5
|
**気づく役と実行する役を分離する。** Spotter は Claude Code の横で静かに並走し、Bell (主役の Claude) が**ツールを呼び忘れたとき**に指摘する監査役です。
|
|
6
6
|
|
|
@@ -44,7 +44,7 @@ Stop hook → Spotter が応答と使用済みツールを見て最終チェッ
|
|
|
44
44
|
見落としあれば差し戻し (max 1 回、Claude Code の stop_hook_active で自動担保)
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
監査対象のツール (name + description) は `~/.spotter/tool-db.json` (グローバル) と `<project>/.spotter/tool-db.json` (ローカル) に格納されます。**v1.1.0 以降、`spotter install` が初回 seed を自動実行し、Claude Code セッション起動ごとに SessionStart hook が bg で `spotter db refresh` を走らせる**ため、通常の運用で手動コマンドを叩く必要はありません。収集経路は (1) MCP サーバー: user/project scope の `.mcp.json` + `claude mcp list` で列挙、各サーバーの `tools/list` を JSON-RPC で取得、HTTP/SSE transport にも対応、(2) スキル: user/project/プラグインの SKILL.md frontmatter から `{name, description}` を抽出、(3) サブエージェント: user/project/プラグインの agent .md frontmatter から抽出、(4) claude.ai baseline: OAuth proxy 経由の Gmail/Calendar/Drive 25 件は手書き baseline
|
|
47
|
+
監査対象のツール (name + description) は `~/.spotter/tool-db.json` (グローバル) と `<project>/.spotter/tool-db.json` (ローカル) に格納されます。**v1.1.0 以降、`spotter install` が初回 seed を自動実行し、Claude Code セッション起動ごとに SessionStart hook が bg で `spotter db refresh` を走らせる**ため、通常の運用で手動コマンドを叩く必要はありません。収集経路は (1) MCP サーバー: user/project scope の `.mcp.json` + `claude mcp list` で列挙、各サーバーの `tools/list` を JSON-RPC で取得、HTTP/SSE transport にも対応、(2) スキル: user/project/プラグインの SKILL.md frontmatter から `{name, description}` を抽出、(3) サブエージェント: user/project/プラグインの agent .md frontmatter から抽出、(4) claude.ai baseline: OAuth proxy 経由の Gmail/Calendar/Drive 25 件は手書き baseline で補完 (v1.1.4 以降、`claude mcp list` に該当サーバーが存在する環境でのみ注入)。**手書きでツールリストを管理する必要はありません**。
|
|
48
48
|
|
|
49
49
|
## Throughline との関係
|
|
50
50
|
|
package/package.json
CHANGED
|
@@ -23,11 +23,15 @@ const HANDSHAKE_TIMEOUT_MS = 10_000;
|
|
|
23
23
|
// On Windows, `claude` is a .cmd shim; Node's execFile cannot locate it directly without
|
|
24
24
|
// going through cmd.exe. Matches the pattern in src/daemon/haiku-caller.mjs buildSpawnArgs.
|
|
25
25
|
// We use cmd.exe /c rather than shell:true to avoid DEP0190 on Node 24+.
|
|
26
|
+
// `windowsHide: true` is forced at this layer so every caller (listMcpServers,
|
|
27
|
+
// getStdioConfig, etc.) is silent — without it a cmd.exe console window flashes on every
|
|
28
|
+
// refresh, and those flashes steal keyboard focus on Windows.
|
|
26
29
|
async function execClaude(claudeBin, args, opts) {
|
|
30
|
+
const execOpts = { ...opts, windowsHide: true };
|
|
27
31
|
if (process.platform === 'win32') {
|
|
28
|
-
return execFileP('cmd.exe', ['/c', claudeBin, ...args],
|
|
32
|
+
return execFileP('cmd.exe', ['/c', claudeBin, ...args], execOpts);
|
|
29
33
|
}
|
|
30
|
-
return execFileP(claudeBin, args,
|
|
34
|
+
return execFileP(claudeBin, args, execOpts);
|
|
31
35
|
}
|
|
32
36
|
|
|
33
37
|
export class McpInvestigationError extends Error {
|