aiterm-mcp 0.43.0 → 0.43.2

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 CHANGED
@@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.43.2] - 2026-09-29
11
+
12
+ ### 修正
13
+
14
+ - 起動元のAitermと子のagentとで状態の置き場が割れ、子の完了が親へ届かないことがあった(rabbitでCodex・Cursor・Grokを親にした時に再現)。Aitermは置き場を`XDG_RUNTIME_DIR`から決めるが、Codex等が起動したMCPの環境にはこの変数が無く、子のpaneの環境にはあるため、子のStop hookが別の場所へ完了を書いていた。子の起動時に自分の置き場を`AITERM_STATE_BASE`で渡し、子とhookはそれを最優先で使う。
15
+
16
+ ## [0.43.1] - 2026-09-29
17
+
18
+ ### 修正
19
+
20
+ - Codexを親にすると、子のClaude Codeの完了が親へ届かないことがあった(rabbitで再現)。子へ渡すStop hookが`node`をPATHから探す形で、Codexが起動したAitermのPATHにnodeの場所が入っていない端末では、hookが動かず完了の記録が書かれていなかった。hookのnodeは絶対pathで呼び、Homebrewの版付きの実体は更新でも残るopt側へ置き換える。
21
+ - Windowsで、PATHを固定したMCP登録(Cursor等)から起動されたAitermがpsmuxを見つけられなかった(foxで再現)。利用者用に加えて、PC全体用のWinGet Links(`C:\Program Files\WinGet\Links`)も探す。
22
+
10
23
  ## [0.43.0] - 2026-09-29
11
24
 
12
25
  ### 変更
@@ -1861,7 +1874,9 @@ prototype (preserved under `prototype/python/` as the porting source and referen
1861
1874
  `ubuntu-latest` for Node 18/20/22, publishing to npm on `v*` tags with
1862
1875
  provenance.
1863
1876
 
1864
- [Unreleased]: https://github.com/kitepon/aiterm-mcp/compare/v0.43.0...HEAD
1877
+ [Unreleased]: https://github.com/kitepon/aiterm-mcp/compare/v0.43.2...HEAD
1878
+ [0.43.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.43.1...v0.43.2
1879
+ [0.43.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.43.0...v0.43.1
1865
1880
  [0.43.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.42.2...v0.43.0
1866
1881
  [0.42.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.42.1...v0.42.2
1867
1882
  [0.42.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.42.0...v0.42.1
package/README.ja.md CHANGED
@@ -203,7 +203,7 @@ runtime-error store は canonical dotagents config の `collection.enabled: true
203
203
  場合だけ収集し、既定OFF、network送信は行いません。tag起点CIのnpm provenance(OIDC Trusted
204
204
  Publishing)で公開し、GitHub Release が Official MCP Registry を再登録します。
205
205
 
206
- **状態:** 開発継続中 · 現行公開版 **v0.43.0** · 動作対象は Linux · WSL2 · macOS · Windows ネイティブ · MIT · [変更履歴](CHANGELOG.md)。
206
+ **状態:** 開発継続中 · 現行公開版 **v0.43.2** · 動作対象は Linux · WSL2 · macOS · Windows ネイティブ · MIT · [変更履歴](CHANGELOG.md)。
207
207
 
208
208
  ### 更新と巻き戻し
209
209
 
package/README.md CHANGED
@@ -217,7 +217,7 @@ collection is off by default and performs no network I/O. It ships via
217
217
  tag-triggered CI with npm provenance (OIDC Trusted Publishing); the GitHub
218
218
  Release re-registers the Official MCP Registry entry.
219
219
 
220
- **Status:** actively maintained · current public release **v0.43.0** · runs on Linux · WSL2 · macOS · native Windows (tmux on POSIX, the tmux-CLI-compatible [psmux](https://github.com/psmux/psmux) on native Windows — no WSL required) · MIT · see the [CHANGELOG](CHANGELOG.md).
220
+ **Status:** actively maintained · current public release **v0.43.2** · runs on Linux · WSL2 · macOS · native Windows (tmux on POSIX, the tmux-CLI-compatible [psmux](https://github.com/psmux/psmux) on native Windows — no WSL required) · MIT · see the [CHANGELOG](CHANGELOG.md).
221
221
 
222
222
  ### Update and rollback
223
223
 
package/dist/core.js CHANGED
@@ -3906,6 +3906,7 @@ function cursorAgentEnvEntries(meta, sid, envVars = []) {
3906
3906
  ["AITERM_AGENT_DEPTH", String(meta.delegation_depth ?? 1)],
3907
3907
  ["AITERM_AGENT_LINEAGE", meta.lineage ?? `host-root>${meta.kind}:${sid}`],
3908
3908
  ["AITERM_AGENT_DELEGATION_ALLOWED", meta.delegation_allowed === true ? "true" : "false"],
3909
+ ["AITERM_STATE_BASE", runtimeStateBase()],
3909
3910
  ];
3910
3911
  }
3911
3912
  function agentEnvPrefix(meta, sid, envVars = []) {
@@ -3927,6 +3928,7 @@ function agentEnvPrefix(meta, sid, envVars = []) {
3927
3928
  `AITERM_AGENT_DEPTH=${shq(String(meta.delegation_depth ?? 1))}`,
3928
3929
  `AITERM_AGENT_LINEAGE=${shq(meta.lineage ?? `host-root>${meta.kind}:${sid}`)}`,
3929
3930
  `AITERM_AGENT_DELEGATION_ALLOWED=${shq(meta.delegation_allowed === true ? "true" : "false")}`,
3931
+ `AITERM_STATE_BASE=${shq(runtimeStateBase())}`,
3930
3932
  ];
3931
3933
  if (meta.kind === "claude" || meta.kind === "codex" || meta.kind === "cursor")
3932
3934
  return common;
@@ -48,11 +48,18 @@ function claudeHookScriptPath() {
48
48
  // この module は dist/harnesses/ に置かれるが、stop hook 実体は dist/ 直下に build される。
49
49
  return path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "claude-stop-hook.js");
50
50
  }
51
- // process.execPath は Homebrew 等では Cellar の版付き実体を指す。長寿命 MCP server の起動後に
52
- // runtime が更新されるとその実体だけが消え、既に生成済みの hook が exit 127 になる。
53
- // hook は server と同じ継承 PATH から node を毎回解決し、安定した package script を実行する。
51
+ // hook は子の pane の環境で動くので、PATH に node が無い親(Codexが起動したMCP等)でも動くよう絶対pathで呼ぶ。
52
+ // process.execPath は Homebrew では Cellar の版付き実体を指し、runtime の更新でその実体だけが消えて
53
+ // 生成済みの hook が exit 127 になる。Cellar の実体は同じ formula の opt(更新でも残る)へ置き換える。
54
+ export function hookNodeExecutable(execPath = process.execPath, exists = fs.existsSync) {
55
+ const brew = /^(.*)\/Cellar\/(node(?:@\d+)?)\/[^/]+\/bin\/node$/.exec(execPath);
56
+ if (!brew)
57
+ return execPath;
58
+ const opt = `${brew[1]}/opt/${brew[2]}/bin/node`;
59
+ return exists(opt) ? opt : "node";
60
+ }
54
61
  function nodeHookCommand(hookScript) {
55
- return `${shq("node")} ${shq(hookScript)}`;
62
+ return `${shq(hookNodeExecutable())} ${shq(hookScript)}`;
56
63
  }
57
64
  export function createClaudeCorrelationSettings(name, launchId, model, effort) {
58
65
  const hookScript = claudeHookScriptPath();
@@ -16,6 +16,19 @@ export function currentUid() {
16
16
  return process.getuid();
17
17
  }
18
18
  export function runtimeStateBase() {
19
+ // 子のagentとそのhookは、起動したAitermと同じ置き場を使う。起動元(例: Codexが起動したMCP)と子のpaneとで
20
+ // XDG_RUNTIME_DIR の有無が違うと置き場が割れ、子の完了記録が親に見えなくなる(rabbitで再現)。
21
+ // 起動時に AITERM_STATE_BASE を子の環境へ渡し、それがあれば最優先で使う。
22
+ const inherited = process.env.AITERM_STATE_BASE;
23
+ if (inherited) {
24
+ try {
25
+ if (fs.statSync(inherited).isDirectory())
26
+ return inherited;
27
+ }
28
+ catch {
29
+ /* 渡された置き場が無ければ通常の決め方へ戻す */
30
+ }
31
+ }
19
32
  // Windows Node の os.tmpdir() は TMPDIR を参照せず TEMP を返す。一方、psmux namespace は
20
33
  // tmux-runtime.ts で TMPDIR を最優先する。test/隔離processがTMPDIRだけを変えた時に
21
34
  // PTYは隔離されてもmanaged metadataが本番TEMPへ残ると、隔離側killAllが本番相関だけを
@@ -23,11 +23,16 @@ export const WIN_NS = `aiterm-${createHash("sha1").update(SOCKDIR).digest("hex")
23
23
  // Windows で最初の呼び出し前に一度だけ native psmux の可用性を確かめ、失敗は原因別に投げる。
24
24
  // psmux は tmux CLI 互換の Windows ネイティブ実装(ConPTY・WSL 不要)。AITERM_PSMUX で
25
25
  // バイナリを明示上書きできる(POSIX の AITERM_TMUX に対応)。
26
- function psmuxBin() {
27
- if (process.env.AITERM_PSMUX)
28
- return process.env.AITERM_PSMUX;
29
- const wingetLink = process.env.LOCALAPPDATA && path.join(process.env.LOCALAPPDATA, "Microsoft", "WinGet", "Links", "psmux.exe");
30
- return wingetLink && fs.existsSync(wingetLink) ? wingetLink : "psmux";
26
+ // PATHを固定したMCP登録(Cursor等)から起動されてもWinGetの導入先を見つけられるよう、利用者用と
27
+ // PC全体用(winget --scope machine)のLinksを先に見る。どちらも無ければPATHの psmux。
28
+ export function psmuxBin(env = process.env, exists = fs.existsSync) {
29
+ if (env.AITERM_PSMUX)
30
+ return env.AITERM_PSMUX;
31
+ const links = [
32
+ env.LOCALAPPDATA && path.win32.join(env.LOCALAPPDATA, "Microsoft", "WinGet", "Links", "psmux.exe"),
33
+ path.win32.join(env.ProgramFiles ?? "C:\\Program Files", "WinGet", "Links", "psmux.exe"),
34
+ ].filter((file) => !!file);
35
+ return links.find(file => exists(file)) ?? "psmux";
31
36
  }
32
37
  export function psmuxVersionSupported(output) {
33
38
  const match = /^psmux (\d+)\.(\d+)\.(\d+)(?:\s|$)/mu.exec(output);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiterm-mcp",
3
- "version": "0.43.0",
3
+ "version": "0.43.2",
4
4
  "mcpName": "io.github.kitepon/aiterm-mcp",
5
5
  "description": "Persistent terminal MCP with one harness-based launcher for Claude Code, Codex CLI, Grok CLI, and Cursor Agent CLI, plus durable PTYs for SSH, containers, and REPLs.",
6
6
  "keywords": [