aiterm-mcp 0.52.2 → 0.53.0
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 +63 -1
- package/README.ja.md +15 -4
- package/README.md +15 -4
- package/dist/core.js +13 -11
- package/dist/harnesses/codex.js +33 -4
- package/dist/harnesses/cursor.js +5 -0
- package/dist/harnesses/grok.js +19 -3
- package/dist/index.js +5 -1
- package/dist/parent-hook-diagnostic.js +5 -11
- package/docs/DESIGN.md +9 -1
- package/docs/RELEASE.md +3 -2
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,66 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.53.0] - 2026-10-05
|
|
11
|
+
|
|
12
|
+
### 追加
|
|
13
|
+
|
|
14
|
+
- `agent_auth`の`start`に`relogin`を足す(既定false)。trueの時は、公式の状態が認証済みでも公式ログインを開始し、
|
|
15
|
+
`session_id`付きの結果を返す(`authenticated`かつ`session_id:null`は返さない)。別のアカウントへ入り直す時と、
|
|
16
|
+
ログインの期限切れを状態から見抜けない時に使う。Aitermは資格情報を消さず、置き換えは公式CLIが行う。
|
|
17
|
+
公式CLIがログインを始めた時点で元のログインを消す事がある(Codex 0.160.0の`codex login --device-auth`は、
|
|
18
|
+
始めた時点で`auth.json`を消し、途中で`cancel`しても戻らない。期限切れのログインの写しで確認)。
|
|
19
|
+
Claude CodeとCursorは、途中で`cancel`すれば元の資格情報が残った(無効な資格情報で確認)。
|
|
20
|
+
結果の形(`aiterm.agent-auth-result.v1`)は変えていない。
|
|
21
|
+
- `agent_auth`の`status`(sessionなし)が、Grokの認証状態を答える。今までは「公式ログインsessionの終了結果で確認します」の
|
|
22
|
+
`blocked`だけだった。`grok models`が`You are not authenticated.`と答えれば`blocked`、答えなければ`authenticated`。
|
|
23
|
+
これに伴い、Grokが認証済みの時の`start`(`relogin`なし)は、何も起こさず`authenticated`を返す(今までは毎回ログインを始めていた)。
|
|
24
|
+
|
|
25
|
+
### 修正
|
|
26
|
+
|
|
27
|
+
- 期限が切れたCodexのログインを、`agent_auth`の`status`と`start`が`authenticated`と返していた(ADR 0090)。
|
|
28
|
+
`codex login status`は`auth.json`の有無だけを見て、ログインから30日でrefresh tokenが切れた後も「Logged in」と答える
|
|
29
|
+
(2026-10-05、Codex 0.160.0、BellTeamのコンテナ)。`start`は入り直しを始めず、`auth.json`の名前を手で変えるまで戻せなかった。
|
|
30
|
+
「Logged in」の時は公式App Serverへ`getAuthStatus`、`account/read`の順に聞き、`account`が`null`なら
|
|
31
|
+
`status`は`blocked`(「Codexのログインの期限が切れています」)、`start`は入り直しを始める。
|
|
32
|
+
生きているログインへ余計なtokenの取り直しはかけず、資格情報のfileも読まない。
|
|
33
|
+
App Serverがこの問い合わせを知らない旧版のCodexでは、今までどおり`codex login status`の答えに従う。
|
|
34
|
+
- Cursorの公式statusが`Logged in (unable to fetch user details)`と答える時(無効なtoken。期限切れか通信できないかは分からない)、
|
|
35
|
+
`authenticated`でなく`failed`を返す。入り直しは`relogin:true`で始められる。
|
|
36
|
+
- Grokのログインが無い・切れている時、`agent_launch`が30秒待ってから`unrecognized_screen`で返っていた。
|
|
37
|
+
Grokが起動してすぐ自分で始めるサインイン画面(`Approve in your browser to finish signing in`)を見分け、
|
|
38
|
+
すぐ`startup.status: blocked`/`reason: startup_dialog`で返す。Codexのサインイン画面も同じ`startup_dialog`のまま、
|
|
39
|
+
種別を「サインイン画面(ログインが必要)」と読む。
|
|
40
|
+
|
|
41
|
+
### 分かっている限界
|
|
42
|
+
|
|
43
|
+
- Claude Codeの期限切れは、`status`では見抜けない(`claude auth status --json`が`loggedIn:true`と答える)。
|
|
44
|
+
`agent_launch`は通り、最初のturnが認証の誤りで終わる。入り直しは`relogin:true`。
|
|
45
|
+
- Cursorのログインが無効な時、`agent_launch`はsessionを作る前に
|
|
46
|
+
「Cursor model catalog を取得できません: Error: Authentication required…」の誤りで返る(今までと同じ)。
|
|
47
|
+
|
|
48
|
+
## [0.52.3] - 2026-10-05
|
|
49
|
+
|
|
50
|
+
### 修正
|
|
51
|
+
|
|
52
|
+
- Claude Code親の配送hookの登録を、`args`を使わずshellを通す1行で書く(aiterm-steer-delivery 0.2.0、ADR 0089)。
|
|
53
|
+
Grokは共有の`~/.claude/settings.json`のhookも動かすが、`args`を落として`command`だけを動かす。
|
|
54
|
+
0.52.2までの`command=node, args=[claude-parent-hook.js]`の形では、Grokがnodeだけを起こし、nodeがhookの入力を
|
|
55
|
+
scriptとして読んで、会話の終わりのたびに`[stdin]:1`で失敗の記録を残していた(Grok 1.0.46、LinuxとWindowsで再現)。
|
|
56
|
+
POSIXは`exec '<node>' '<hook>'`、Windowsは`& '<node>' '<hook>'; exit (Get-Variable LASTEXITCODE -ValueOnly)`と
|
|
57
|
+
`shell: "powershell"`。`aiterm-setup`(`--hooks-only`も)を流すと、0.52.2までの登録をこの形へ置き換える。
|
|
58
|
+
Grokから起こされたhookは何もせず0で終わる。PreToolUseのhookは、間に挟まるshellではなくClaude Code本体を
|
|
59
|
+
依頼元として記録する。
|
|
60
|
+
- Windowsで、Claude Code親へ子の回答が届いているのに、配送が`CLAUDE_PARENT_HOOK_CLOSED`(結果不明)で終わる事があった。
|
|
61
|
+
process表を読む間(約1秒)に受信hookが本文を出し終えて終わると、出し終えた後のhookを「途中で終わった」と数えていた。
|
|
62
|
+
- `diagnostics`の親配送hookの状態は、0.52.2までの登録と新しい登録のどちらも「登録済み」と読む。
|
|
63
|
+
|
|
64
|
+
### 注意
|
|
65
|
+
|
|
66
|
+
- 0.52.2以前へ戻す時は、旧版のinstall前に`aiterm-setup --remove-claude-parent-hooks`を実行する。
|
|
67
|
+
0.52.2以前は新しい形の登録を自分の物と数えず、もう1組を足す。
|
|
68
|
+
- Windowsでは、子の回答を待っているhook1つにつき、Claude Codeが起こすPowerShellのprocessが1つ残る。
|
|
69
|
+
|
|
10
70
|
## [0.52.2] - 2026-10-05
|
|
11
71
|
|
|
12
72
|
### 修正
|
|
@@ -2135,7 +2195,9 @@ prototype (preserved under `prototype/python/` as the porting source and referen
|
|
|
2135
2195
|
`ubuntu-latest` for Node 18/20/22, publishing to npm on `v*` tags with
|
|
2136
2196
|
provenance.
|
|
2137
2197
|
|
|
2138
|
-
[Unreleased]: https://github.com/kitepon/aiterm-mcp/compare/v0.
|
|
2198
|
+
[Unreleased]: https://github.com/kitepon/aiterm-mcp/compare/v0.53.0...HEAD
|
|
2199
|
+
[0.53.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.52.3...v0.53.0
|
|
2200
|
+
[0.52.3]: https://github.com/kitepon/aiterm-mcp/compare/v0.52.2...v0.52.3
|
|
2139
2201
|
[0.52.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.52.1...v0.52.2
|
|
2140
2202
|
[0.52.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.52.0...v0.52.1
|
|
2141
2203
|
[0.52.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.51.3...v0.52.0
|
package/README.ja.md
CHANGED
|
@@ -209,7 +209,7 @@ runtime-error store は canonical dotagents config の `collection.enabled: true
|
|
|
209
209
|
場合だけ収集し、既定OFF、network送信は行いません。tag起点CIのnpm provenance(OIDC Trusted
|
|
210
210
|
Publishing)で公開し、GitHub Release が Official MCP Registry を再登録します。
|
|
211
211
|
|
|
212
|
-
**状態:** 開発継続中 · 現行公開版 **v0.
|
|
212
|
+
**状態:** 開発継続中 · 現行公開版 **v0.53.0** · 動作対象は Linux · WSL2 · macOS · Windows ネイティブ · MIT · [変更履歴](CHANGELOG.md)。
|
|
213
213
|
|
|
214
214
|
### 更新と巻き戻し
|
|
215
215
|
|
|
@@ -561,7 +561,7 @@ Claudeの相関済み承認は既存の`claude_approval`を使う。
|
|
|
561
561
|
| `pty_list` | textと構造化したsession一覧、明示した非秘密環境変数の照会 | `env_keys?` |
|
|
562
562
|
| `pty_observe` | pane/harnessの生存、native process identity、状態と活動 | `session_id`, `cursor?` |
|
|
563
563
|
| `agent_launch` | harnessとmodelを別軸で選ぶ正規agent起動入口 | `harness`, `prompt?`, `model?`, `reasoning_effort?`, `cwd?`, `write_scope?`, `trust_project?`, `env_vars?`, `throughline_source_session?`, `throughline_supplement_file?` |
|
|
564
|
-
| `agent_auth` | 公式CLIの認証を開始・確認・取消し、公式URL・device code・入力待ちを返す | `harness`, `action`, `session_id?`, `cwd?`, `env_vars?` |
|
|
564
|
+
| `agent_auth` | 公式CLIの認証を開始・確認・取消し、公式URL・device code・入力待ちを返す | `harness`, `action`, `session_id?`, `cwd?`, `env_vars?`, `relogin?` |
|
|
565
565
|
| `agent_models` | harnessが今選べるmodelとreasoning effortを、そのharness自身の一覧からpromptを送らずに取得 | `harness`, `cwd?`, `include_hidden?` |
|
|
566
566
|
| `agent_approval` | Codexの現在の承認を検査し、単発許可・拒否を送る | `action`, `session_id`, `approval_choice?`, `observed_prompt_digest?` |
|
|
567
567
|
| `claude_agent` / `codex_agent` / `grok_agent` | deprecated互換alias(`composer_agent`は0.41.0で削除。Composerは`agent_launch`の`cursor-cli`で使う) | 旧launcher引数 |
|
|
@@ -597,7 +597,18 @@ Aitermは、既定では実行時エラーをどこへも送らない。送る
|
|
|
597
597
|
|
|
598
598
|
`agent_configure({ session_id, model?, reasoning_effort? })`はharness標準操作で起動中のClaude/Codex/Grok/Cursorを変更し、PTYと会話contextを維持する。
|
|
599
599
|
|
|
600
|
-
`agent_auth({ harness, action:"start"|"status"|"cancel", session_id?, cwd?, env_vars? })`は、各harnessの公式CLIで認証を進める。Claudeは`claude auth login`、CodexとGrokは`login --device-auth`、Cursorは`NO_OPEN_BROWSER=1 cursor-agent login`を使い、資格情報は各CLIだけが保存する。Aitermは資格情報を読取り・copy・編集せず、独自OAuthも実装しない。`remote`は他toolと同じ標準対応。
|
|
600
|
+
`agent_auth({ harness, action:"start"|"status"|"cancel", session_id?, cwd?, env_vars?, relogin? })`は、各harnessの公式CLIで認証を進める。Claudeは`claude auth login`、CodexとGrokは`login --device-auth`、Cursorは`NO_OPEN_BROWSER=1 cursor-agent login`を使い、資格情報は各CLIだけが保存する。Aitermは資格情報を読取り・copy・編集せず、独自OAuthも実装しない。`remote`は他toolと同じ標準対応。
|
|
601
|
+
|
|
602
|
+
`start`は、公式の状態が認証済みなら何も起こさず`authenticated`(`session_id:null`)を返す。`relogin:true`を付けると、認証済みに見えても公式ログインを開始し、`session_id`付きの結果を返す。別のアカウントへ入り直す時と、ログインの期限切れを状態から見抜けない時に使う。Aitermは資格情報を消さず、置き換えは公式CLIが行う。ただし、公式CLIがログインを始めた時点で元のログインを消す事がある(Codex 0.160.0の`codex login --device-auth`は、始めた時点で`auth.json`を消す。途中で`cancel`しても戻らない)。Claude CodeとCursorは、途中で`cancel`すれば元の資格情報が残る(無効な資格情報で確認)。
|
|
603
|
+
|
|
604
|
+
`status`(sessionなし)は、公式CLIに今の状態を聞く。
|
|
605
|
+
|
|
606
|
+
| harness | 聞き方 | 期限が切れたログイン |
|
|
607
|
+
|---|---|---|
|
|
608
|
+
| Codex | `codex login status`が「Logged in」の時、公式App Serverの`getAuthStatus`→`account/read` | `blocked`(`account`が`null`)。`codex login status`だけでは「Logged in」のままで見抜けない |
|
|
609
|
+
| Claude Code | `claude auth status --json` | **見抜けない**(公式の答えが`loggedIn:true`のまま)。起動は通り、最初のturnが認証の誤りで終わる |
|
|
610
|
+
| Grok | `grok models`(状態の命令は無い) | `blocked`(`You are not authenticated.`)。Grokは使えない資格情報を自分で消す |
|
|
611
|
+
| Cursor | `cursor-agent status` | `failed`(`Logged in (unable to fetch user details)`。期限切れか通信できないかは区別できない)。`relogin:true`で入り直す |
|
|
601
612
|
|
|
602
613
|
結果は`aiterm.agent-auth-result.v1`。`status`は`waiting`/`authenticated`/`blocked`/`failed`、`session_id`・`url`・`user_code`・`input_required`・`message`を返す。`start`のsession IDを保存して`status`へ渡す。公式HTTPS URLと明示device codeだけを返し、CLIの生出力・token・OAuth callback codeを結果へ載せない。`input_required:true`なら同じsessionの`pty_read(screen:true)`で公式画面を表示し、`pty_send`/`pty_key`で人の入力を中継する。
|
|
603
614
|
|
|
@@ -655,7 +666,7 @@ Claude Codeは2.1.259以上の対話sessionに対応する。`aiterm-setup`が
|
|
|
655
666
|
|
|
656
667
|
`/clear`などで会話を終了すると未送信の旧回答の配送を止め、本文は保存する。受信hookの上限は24時間で、終了や出力失敗を成功扱いしない。hookが無効な場合は送信前に明示errorにし、waiterへ黙って切り替えない。Claude Desktopのチャット、Web、`agent_id`付きの会話(`--agent`起動とnative subagent)はこの受信契約に含めない。
|
|
657
668
|
|
|
658
|
-
hook
|
|
669
|
+
hookを持たない旧版、または0.52.2以前へ戻す時は、install前に`aiterm-setup --remove-claude-parent-hooks`を実行する。Aiterm専用hookだけを解除し、他製品のhookと設定は保持する。
|
|
659
670
|
|
|
660
671
|
Cursor親(`clientInfo.name`が`cursor-vscode`)も同じ完了観測と本文保存を使う。`aiterm-setup`が`~/.cursor/hooks.json`へ`afterMCPExecution`と`postToolUse`を追加し、他製品のhookと順序は保持する。hookが無い場合は子への送信前に`CURSOR_PARENT_HOOK_UNAVAILABLE`で止める。作業を続けていれば次のツール返りへ`additional_context`で本文が差し込まれ、ターンを終える前にreceiptの`wait_process`を背景で起動しておけばidle中の完了でも起きられる。`wait_command`はnull。`submitted`はhookまたは受け口が本文を受け取った状態であり、modelの読了ではない。24時間以内に受け取りが無ければ`failed`とし、本文は残して自動再送しない。解除は`aiterm-setup --remove-cursor-parent-hooks`。Cursor Cloud Agent/Background Agentはこの受信契約に含めない。
|
|
661
672
|
|
package/README.md
CHANGED
|
@@ -223,7 +223,7 @@ collection is off by default and performs no network I/O. It ships via
|
|
|
223
223
|
tag-triggered CI with npm provenance (OIDC Trusted Publishing); the GitHub
|
|
224
224
|
Release re-registers the Official MCP Registry entry.
|
|
225
225
|
|
|
226
|
-
**Status:** actively maintained · current public release **v0.
|
|
226
|
+
**Status:** actively maintained · current public release **v0.53.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).
|
|
227
227
|
|
|
228
228
|
### Update and rollback
|
|
229
229
|
|
|
@@ -598,7 +598,7 @@ continue to use `claude_approval`.
|
|
|
598
598
|
| `pty_list` | Text and structured session list, with explicitly requested non-secret environment values | `env_keys?` |
|
|
599
599
|
| `pty_observe` | Pane/harness liveness, native process identity, state, and activity | `session_id`, `cursor?` |
|
|
600
600
|
| `agent_launch` | Canonical agent launch; harness and model are independent | `harness`, `prompt?`, `model?`, `reasoning_effort?`, `cwd?`, `write_scope?`, `trust_project?`, `env_vars?`, `throughline_source_session?`, `throughline_supplement_file?` |
|
|
601
|
-
| `agent_auth` | 公式CLIの認証を開始・確認・取消し、公式URL・device code・入力待ちを返す | `harness`, `action`, `session_id?`, `cwd?`, `env_vars?` |
|
|
601
|
+
| `agent_auth` | 公式CLIの認証を開始・確認・取消し、公式URL・device code・入力待ちを返す | `harness`, `action`, `session_id?`, `cwd?`, `env_vars?`, `relogin?` |
|
|
602
602
|
| `agent_models` | List the models and reasoning efforts a harness offers now, read from that harness's own catalog without sending a prompt | `harness`, `cwd?`, `include_hidden?` |
|
|
603
603
|
| `agent_approval` | Inspect a Codex approval and submit a one-time approval or denial | `action`, `session_id`, `approval_choice?`, `observed_prompt_digest?` |
|
|
604
604
|
| `claude_agent` / `codex_agent` / `grok_agent` | Deprecated compatibility aliases (`composer_agent` was removed in 0.41.0; run Composer with `agent_launch` on `cursor-cli`) | legacy launcher arguments |
|
|
@@ -637,7 +637,18 @@ enables collection on that host.
|
|
|
637
637
|
|
|
638
638
|
`agent_configure({ session_id, model?, reasoning_effort? })` changes a running Claude, Codex, Grok, or Cursor TUI through the harness's standard controls, preserving the PTY and conversation context.
|
|
639
639
|
|
|
640
|
-
`agent_auth({ harness, action:"start"|"status"|"cancel", session_id?, cwd?, env_vars? })`は、各harnessの公式CLIで認証を進める。Claudeは`claude auth login`、CodexとGrokは`login --device-auth`、Cursorは`NO_OPEN_BROWSER=1 cursor-agent login`を使い、資格情報は各CLIだけが保存する。Aitermは資格情報を読取り・copy・編集せず、独自OAuthも実装しない。`remote`は他toolと同じ標準対応。
|
|
640
|
+
`agent_auth({ harness, action:"start"|"status"|"cancel", session_id?, cwd?, env_vars?, relogin? })`は、各harnessの公式CLIで認証を進める。Claudeは`claude auth login`、CodexとGrokは`login --device-auth`、Cursorは`NO_OPEN_BROWSER=1 cursor-agent login`を使い、資格情報は各CLIだけが保存する。Aitermは資格情報を読取り・copy・編集せず、独自OAuthも実装しない。`remote`は他toolと同じ標準対応。
|
|
641
|
+
|
|
642
|
+
`start`は、公式の状態が認証済みなら何も起こさず`authenticated`(`session_id:null`)を返す。`relogin:true`を付けると、認証済みに見えても公式ログインを開始し、`session_id`付きの結果を返す。別のアカウントへ入り直す時と、ログインの期限切れを状態から見抜けない時に使う。Aitermは資格情報を消さず、置き換えは公式CLIが行う。ただし、公式CLIがログインを始めた時点で元のログインを消す事がある(Codex 0.160.0の`codex login --device-auth`は、始めた時点で`auth.json`を消す。途中で`cancel`しても戻らない)。Claude CodeとCursorは、途中で`cancel`すれば元の資格情報が残る(無効な資格情報で確認)。
|
|
643
|
+
|
|
644
|
+
`status`(sessionなし)は、公式CLIに今の状態を聞く。
|
|
645
|
+
|
|
646
|
+
| harness | 聞き方 | 期限が切れたログイン |
|
|
647
|
+
|---|---|---|
|
|
648
|
+
| Codex | `codex login status`が「Logged in」の時、公式App Serverの`getAuthStatus`→`account/read` | `blocked`(`account`が`null`)。`codex login status`だけでは「Logged in」のままで見抜けない |
|
|
649
|
+
| Claude Code | `claude auth status --json` | **見抜けない**(公式の答えが`loggedIn:true`のまま)。起動は通り、最初のturnが認証の誤りで終わる |
|
|
650
|
+
| Grok | `grok models`(状態の命令は無い) | `blocked`(`You are not authenticated.`)。Grokは使えない資格情報を自分で消す |
|
|
651
|
+
| Cursor | `cursor-agent status` | `failed`(`Logged in (unable to fetch user details)`。期限切れか通信できないかは区別できない)。`relogin:true`で入り直す |
|
|
641
652
|
|
|
642
653
|
結果は`aiterm.agent-auth-result.v1`。`status`は`waiting`/`authenticated`/`blocked`/`failed`、`session_id`・`url`・`user_code`・`input_required`・`message`を返す。`start`のsession IDを保存して`status`へ渡す。公式HTTPS URLと明示device codeだけを返し、CLIの生出力・token・OAuth callback codeを結果へ載せない。`input_required:true`なら同じsessionの`pty_read(screen:true)`で公式画面を表示し、`pty_send`/`pty_key`で人の入力を中継する。
|
|
643
654
|
|
|
@@ -696,7 +707,7 @@ Claude Codeは2.1.259以上の対話sessionに対応する。`aiterm-setup`が
|
|
|
696
707
|
|
|
697
708
|
`/clear`等の会話終了後は未送信の旧回答を送らず、本文を保存する。受信hookの上限は24時間。hookの終了・出力失敗・無効化を成功扱いせず、別の待機経路へ黙って切り替えない。Claude Desktopのチャット、Web、`agent_id`付きの会話(`--agent`起動とnative subagent)はこの受信契約に含めない。
|
|
698
709
|
|
|
699
|
-
hook
|
|
710
|
+
hookを持たない旧版、または0.52.2以前へ戻す時は、install前に`aiterm-setup --remove-claude-parent-hooks`を実行する。Aiterm専用hookだけを解除し、他製品のhookと設定は保持する。
|
|
700
711
|
|
|
701
712
|
Cursor parents (`clientInfo.name` of `cursor-vscode`) use the same completion capture. `aiterm-setup` adds `afterMCPExecution` and `postToolUse` to `~/.cursor/hooks.json` and keeps every other hook and its position. A missing registration fails the dispatch with `CURSOR_PARENT_HOOK_UNAVAILABLE` before the child is sent. While the parent keeps calling tools, the answer is injected through `additional_context` on the next tool result. If the parent ends the turn, start the receipt `wait_process` in the background first; that receiver exits when the answer arrives. `wait_command` is null. `submitted` means the hook or the receiver claimed the text, not that the model has read it. No claim within 24 hours is `failed`, the text is kept, and nothing is resent. Remove only Aiterm's entries with `aiterm-setup --remove-cursor-parent-hooks`. Cursor Cloud Agents and Background Agents are outside this contract.
|
|
702
713
|
|
package/dist/core.js
CHANGED
|
@@ -2125,9 +2125,6 @@ async function acquireAgentSendFileLock(name, deadline, waitMs) {
|
|
|
2125
2125
|
}
|
|
2126
2126
|
}
|
|
2127
2127
|
if (dead && reapDeadAgentSendLock(name, replacedToken) === "stuck") {
|
|
2128
|
-
// BellTeamのため: 先頭の「agent session '<名前>' に、終了した送信のlockを片付ける途中で残った印があります。」と、
|
|
2129
|
-
// 文中の「文字列は送信していません。」で見分け、pty_close→起動し直しへ回している(2026-10-05)。
|
|
2130
|
-
// この文面と、pty_closeがこの印を片付ける事を変える時は、変える前に知らせる。
|
|
2131
2128
|
throw new AitermError(`agent session '${name}' に、終了した送信のlockを片付ける途中で残った印があります。` +
|
|
2132
2129
|
`自動回収は並行送信の混線を招くため行いません。文字列は送信していません。` +
|
|
2133
2130
|
`pty_listで対象を確認し、pty_closeでsessionを閉じてから同じIDで再作成してください`, 2);
|
|
@@ -3713,11 +3710,11 @@ function authPlan(kind, phase) {
|
|
|
3713
3710
|
case "cursor": return cursorAuthPlan();
|
|
3714
3711
|
}
|
|
3715
3712
|
}
|
|
3716
|
-
function authStatus(kind, bin, cwd, env = process.env) {
|
|
3713
|
+
async function authStatus(kind, bin, cwd, env = process.env) {
|
|
3717
3714
|
switch (kind) {
|
|
3718
3715
|
case "claude": return claudeAuthStatus(bin, cwd, env);
|
|
3719
|
-
case "codex": return codexAuthStatus(bin, cwd, env);
|
|
3720
|
-
case "grok": return grokAuthStatus();
|
|
3716
|
+
case "codex": return await codexAuthStatus(bin, cwd, env);
|
|
3717
|
+
case "grok": return grokAuthStatus(bin, cwd, env);
|
|
3721
3718
|
case "cursor": return cursorAuthStatus(bin, cwd, env);
|
|
3722
3719
|
}
|
|
3723
3720
|
}
|
|
@@ -3784,7 +3781,11 @@ function launchAuthProcess(name, meta) {
|
|
|
3784
3781
|
const cmd = ["exec", "env", ...env, shq(agentBinForPaneShell(meta.bin)), ...plan.args.map(shq)].join(" ");
|
|
3785
3782
|
send(name, `cd ${shq(paneCwdArgument(meta.cwd))} && ${cmd}`, { enter: true, force: true, raw: true });
|
|
3786
3783
|
}
|
|
3787
|
-
/**
|
|
3784
|
+
/**
|
|
3785
|
+
* 公式CLIの認証processを起動・観測する。資格情報の読取り・copy・独自OAuthは行わない。
|
|
3786
|
+
* startは、公式の状態が認証済みなら何も起こさない。`relogin`は、認証済みに見えても公式ログインを始める
|
|
3787
|
+
* (別のアカウントへ入り直す時と、期限切れを状態から見抜けない時のため)。資格情報を消すことはせず、置き換えは公式CLIが行う。
|
|
3788
|
+
*/
|
|
3788
3789
|
export async function authenticateAgent(kind, options) {
|
|
3789
3790
|
const result = (status, session, message, pane) => ({ schema: "aiterm.agent-auth-result.v1", harness: agentHarness(kind),
|
|
3790
3791
|
status, session_id: session, url: pane?.url ?? null, user_code: pane?.user_code ?? null,
|
|
@@ -3812,7 +3813,8 @@ export async function authenticateAgent(kind, options) {
|
|
|
3812
3813
|
const bin = resolveAgentBin(kind);
|
|
3813
3814
|
if (!bin)
|
|
3814
3815
|
return result("failed", null, `${agentLabel(kind)}の公式CLIが見つかりません。`);
|
|
3815
|
-
|
|
3816
|
+
// reloginは今の状態を聞かない。状態を確認できない時(failed)でも、入り直しは始められる。
|
|
3817
|
+
const before = options.relogin ? { status: "unauthenticated", message: null } : await authStatus(kind, bin, cwd);
|
|
3816
3818
|
if (before.status === "failed")
|
|
3817
3819
|
return result("failed", null, before.message);
|
|
3818
3820
|
if (before.status === "authenticated" && !before.verify_onboarding)
|
|
@@ -3840,7 +3842,7 @@ export async function authenticateAgent(kind, options) {
|
|
|
3840
3842
|
const bin = resolveAgentBin(kind);
|
|
3841
3843
|
if (!bin)
|
|
3842
3844
|
return result("failed", null, `${agentLabel(kind)}の公式CLIが見つかりません。`);
|
|
3843
|
-
const checked = authStatus(kind, bin, cwd);
|
|
3845
|
+
const checked = await authStatus(kind, bin, cwd);
|
|
3844
3846
|
return result(checked.status === "authenticated" ? "authenticated" : checked.status === "failed" ? "failed" : "blocked", null, checked.message ?? (checked.status === "unauthenticated" ? "公式CLIの認証が必要です。agent_authのstartで開始してください。" : null));
|
|
3845
3847
|
}
|
|
3846
3848
|
else {
|
|
@@ -3864,7 +3866,7 @@ export async function authenticateAgent(kind, options) {
|
|
|
3864
3866
|
if (dead === "1") {
|
|
3865
3867
|
if (exit !== "0")
|
|
3866
3868
|
return result("failed", session, `公式認証processが失敗しました(exit=${/^\d+$/.test(exit ?? "") ? exit : "unknown"})。`);
|
|
3867
|
-
const checked = authStatus(kind, meta.bin, meta.cwd, authSessionEnvironment(session, meta.env_vars));
|
|
3869
|
+
const checked = await authStatus(kind, meta.bin, meta.cwd, authSessionEnvironment(session, meta.env_vars));
|
|
3868
3870
|
if (checked.status === "failed")
|
|
3869
3871
|
return result("failed", session, checked.message);
|
|
3870
3872
|
if (checked.status === "unauthenticated")
|
|
@@ -3884,7 +3886,7 @@ export async function authenticateAgent(kind, options) {
|
|
|
3884
3886
|
if (dead !== "0")
|
|
3885
3887
|
return result("failed", session, "認証processの生存状態の形式を認識できません。");
|
|
3886
3888
|
if (pane.onboarding_complete) {
|
|
3887
|
-
const checked = authStatus(kind, meta.bin, meta.cwd, authSessionEnvironment(session, meta.env_vars));
|
|
3889
|
+
const checked = await authStatus(kind, meta.bin, meta.cwd, authSessionEnvironment(session, meta.env_vars));
|
|
3888
3890
|
if (checked.status === "authenticated")
|
|
3889
3891
|
return result("authenticated", session, null);
|
|
3890
3892
|
return result("failed", session, checked.message ?? "公式CLIのstatusが未認証です。");
|
package/dist/harnesses/codex.js
CHANGED
|
@@ -575,6 +575,9 @@ export function codexLaunchBlockingDialog(screen) {
|
|
|
575
575
|
return "directory trust確認ダイアログ";
|
|
576
576
|
if (screen.includes("Trust this folder?"))
|
|
577
577
|
return "folder trust確認ダイアログ";
|
|
578
|
+
// ログインが無い・期限が切れた時の最初の画面(Codex 0.160.0)。
|
|
579
|
+
if (screen.includes("Sign in with ChatGPT") && screen.includes("Sign in with Device Code"))
|
|
580
|
+
return "サインイン画面(ログインが必要)";
|
|
578
581
|
if (screen.includes("Press enter to continue"))
|
|
579
582
|
return "起動時ダイアログ(種別未特定)";
|
|
580
583
|
return null;
|
|
@@ -788,14 +791,40 @@ export function codexCatalogFromPages(pages) {
|
|
|
788
791
|
});
|
|
789
792
|
}
|
|
790
793
|
export function codexAuthPlan() { return { args: ["login", "--device-auth"], env: [] }; }
|
|
791
|
-
|
|
794
|
+
const CODEX_AUTH_CHECK_TIMEOUT_MS = 15_000;
|
|
795
|
+
/**
|
|
796
|
+
* `codex login status`は`auth.json`があるかだけを見る。ログインの期限が切れた後(refresh tokenの失効)も「Logged in」と答える
|
|
797
|
+
* (2026-10-05、Codex 0.160.0、ログインから30日後)。使えるログインかは、公式App Serverに聞く。
|
|
798
|
+
* `getAuthStatus`(`refreshToken:false`)は、Codex自身が要ると判断した時だけtokenを取り直す。取り直しが恒久的に失敗していると、
|
|
799
|
+
* 続く`account/read`が`account: null`を返す。Aitermは資格情報を読まず、生きているログインへ余計な取り直しもかけない。
|
|
800
|
+
*/
|
|
801
|
+
export async function codexAuthStatus(bin, cwd, env = process.env) {
|
|
792
802
|
const result = spawnAgentControlCommand(bin, ["login", "status"], cwd, { cwd, env, encoding: "utf8", timeout: 5000, maxBuffer: 64 * 1024 });
|
|
793
803
|
const output = `${result.stdout ?? ""}\n${result.stderr ?? ""}`;
|
|
794
|
-
if (!result.error && result.status === 0 && /Logged in/i.test(output))
|
|
795
|
-
return { status: "authenticated", message: null };
|
|
796
804
|
if (!result.error && /Not logged in/i.test(output))
|
|
797
805
|
return { status: "unauthenticated", message: null };
|
|
798
|
-
|
|
806
|
+
if (result.error || result.status !== 0 || !/Logged in/i.test(output))
|
|
807
|
+
return { status: "failed", message: "Codex CLIの公式認証状態を確認できません。" };
|
|
808
|
+
const parent = { thread_id: "00000000-0000-4000-8000-000000000000", codex_home: path.resolve(env.CODEX_HOME || steer.realCodexHome()) };
|
|
809
|
+
let read;
|
|
810
|
+
try {
|
|
811
|
+
read = await steer.withCodexReceiver(AITERM_PROFILE, parent, async (request) => {
|
|
812
|
+
await request("getAuthStatus", { includeToken: false, refreshToken: false });
|
|
813
|
+
return await request("account/read", { refreshToken: false });
|
|
814
|
+
}, { executable: bin, timeout_ms: CODEX_AUTH_CHECK_TIMEOUT_MS, env });
|
|
815
|
+
}
|
|
816
|
+
catch (error) {
|
|
817
|
+
// App Serverがこの問い合わせを知らない旧版は、今までどおり公式statusの答えに従う(期限切れは見抜けない)。
|
|
818
|
+
if (error instanceof steer.CodexDeliveryError && error.delivery_code === "CODEX_RECEIVER_REJECTED")
|
|
819
|
+
return { status: "authenticated", message: null };
|
|
820
|
+
return { status: "failed", message: "Codexのログインが使えるかを、公式App Serverで確認できません。" };
|
|
821
|
+
}
|
|
822
|
+
if (read?.requiresOpenaiAuth === false || (read?.account !== null && typeof read?.account === "object"))
|
|
823
|
+
return { status: "authenticated", message: null };
|
|
824
|
+
if (read?.account === null) {
|
|
825
|
+
return { status: "unauthenticated", message: "Codexのログインの期限が切れています。agent_authのstartで入り直してください。" };
|
|
826
|
+
}
|
|
827
|
+
return { status: "failed", message: "Codexの公式App Serverが返した認証状態の形式を認識できません。" };
|
|
799
828
|
}
|
|
800
829
|
export function codexAuthPane(screen) {
|
|
801
830
|
return { url: authUrl(screen, ["auth.openai.com", "auth0.openai.com", "login.openai.com"]),
|
package/dist/harnesses/cursor.js
CHANGED
|
@@ -581,6 +581,11 @@ export function cursorAuthStatus(bin, cwd, env = process.env) {
|
|
|
581
581
|
const output = `${result.stdout ?? ""}\n${result.stderr ?? ""}`;
|
|
582
582
|
if (!result.error && /not logged in|unauthenticated|sign in/i.test(output))
|
|
583
583
|
return { status: "unauthenticated", message: null };
|
|
584
|
+
// 無効なtoken(期限切れ等)の時、公式statusは「Logged in (unable to fetch user details)」と終了0で答える(2026-10-05)。
|
|
585
|
+
// 期限切れか、通信できないだけかは、この答えからは分からない。認証済みとは返さない。
|
|
586
|
+
if (!result.error && /unable to fetch user details/i.test(output)) {
|
|
587
|
+
return { status: "failed", message: "Cursorのログインを確認できません(期限切れか、通信できない状態です)。入り直す時はagent_authのstartにrelogin:trueを付けてください。" };
|
|
588
|
+
}
|
|
584
589
|
// launcherと同じ公式status契約。stderrやアカウント情報はreceiptへ載せない。
|
|
585
590
|
if (!result.error && result.status === 0)
|
|
586
591
|
return { status: "authenticated", message: null };
|
package/dist/harnesses/grok.js
CHANGED
|
@@ -355,6 +355,13 @@ export function assertGrokSandboxNotRejected(screen) {
|
|
|
355
355
|
"CLIが示した設定の問題を、その設定の管理元で修正してください。修正後はpty_closeで対象sessionを閉じ、agent_launchで起動し直してください。", 2);
|
|
356
356
|
}
|
|
357
357
|
export function grokLaunchBlockingDialog(screen) {
|
|
358
|
+
// ログインが無い・期限が切れた時、Grok 1.0.46は起動してすぐdevice codeのサインインを自分で始め、承認を待つ。
|
|
359
|
+
const signInAt = screen.lastIndexOf("Approve in your browser to finish signing in");
|
|
360
|
+
if (signInAt >= 0) {
|
|
361
|
+
const afterSignIn = screen.slice(signInAt);
|
|
362
|
+
if (afterSignIn.includes("Waiting for approval") && !/(?:^|\n)[ \t]*(?:│[ \t]*)?[❯>]/u.test(afterSignIn))
|
|
363
|
+
return "サインイン画面(ログインが必要)";
|
|
364
|
+
}
|
|
358
365
|
const trustAt = screen.lastIndexOf("Do you trust the contents of this directory?");
|
|
359
366
|
if (trustAt < 0)
|
|
360
367
|
return null;
|
|
@@ -523,9 +530,18 @@ export function createGrokAgentMetadata(kind, name, cwd, initialPrompt, authPath
|
|
|
523
530
|
return meta;
|
|
524
531
|
}
|
|
525
532
|
export function grokAuthPlan() { return { args: ["login", "--device-auth"], env: [] }; }
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
533
|
+
/**
|
|
534
|
+
* Grokには認証状態を答える公式commandが無い。`grok models`は、使えるログインが無い時に`You are not authenticated.`と答える
|
|
535
|
+
* (1.0.46。ログイン無しと、期限切れ・無効なtokenの両方。後者ではGrokが`auth.json`を自分で消す)。auth fileの存在は見ない。
|
|
536
|
+
*/
|
|
537
|
+
export function grokAuthStatus(bin, cwd, env = process.env) {
|
|
538
|
+
const result = spawnAgentControlCommand(bin, ["models"], cwd, { cwd, env, encoding: "utf8", timeout: 20000, maxBuffer: 256 * 1024 });
|
|
539
|
+
const output = `${result.stdout ?? ""}\n${result.stderr ?? ""}`;
|
|
540
|
+
if (!result.error && /You are not authenticated|Not signed in/i.test(output))
|
|
541
|
+
return { status: "unauthenticated", message: null };
|
|
542
|
+
if (!result.error && result.status === 0 && /Available models/i.test(output))
|
|
543
|
+
return { status: "authenticated", message: null };
|
|
544
|
+
return { status: "failed", message: "Grokの公式CLIで認証状態を確認できません。" };
|
|
529
545
|
}
|
|
530
546
|
export function grokAuthPane(screen) {
|
|
531
547
|
const url = authUrl(screen, ["auth.x.ai", "accounts.x.ai", "grok.com"]);
|
package/dist/index.js
CHANGED
|
@@ -758,13 +758,17 @@ registerRemoteAwareTool("claude_approval", {
|
|
|
758
758
|
registerRemoteAwareTool("agent_auth", {
|
|
759
759
|
description: "各harnessの公式CLI認証を開始・確認・取消する。CLIごとのコマンドと認証URL/codeの抽出はAitermが所有し、資格情報は各CLIだけが保存する。" +
|
|
760
760
|
"waitingのURL/codeを人へ表示し、input_requiredなら同じsessionのpty_send/pty_keyで公式画面へ入力する。" +
|
|
761
|
-
"authenticatedは認証の結果であり、agent_launchの起動準備完了とは別。remoteは他toolと同じ標準対応。"
|
|
761
|
+
"authenticatedは認証の結果であり、agent_launchの起動準備完了とは別。remoteは他toolと同じ標準対応。" +
|
|
762
|
+
"startは公式の状態が認証済みなら何も起こさずauthenticatedを返す。relogin:trueを付けると、認証済みに見えても公式ログインを開始する" +
|
|
763
|
+
"(別のアカウントへ入り直す時、ログインの期限切れを状態から見抜けない時)。Aitermは資格情報を消さず、置き換えは公式CLIが行う。" +
|
|
764
|
+
"Codexの公式ログインは、始めた時点で元のログインを消す(途中でcancelしても戻らない)。",
|
|
762
765
|
inputSchema: {
|
|
763
766
|
harness: z.enum(["claude-code", "codex-cli", "grok-cli", "cursor-cli"]),
|
|
764
767
|
action: z.enum(["start", "status", "cancel"]),
|
|
765
768
|
session_id: z.string().regex(/^[A-Za-z0-9_-]{1,64}$/).optional(),
|
|
766
769
|
cwd: z.string().optional().describe("公式CLIを実行する作業ディレクトリの絶対パス"),
|
|
767
770
|
env_vars: z.array(z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/)).optional().describe("startで認証PTYへ引き継ぐ環境変数名。値はreceiptへ返さない"),
|
|
771
|
+
relogin: z.boolean().optional().describe("startで、公式の状態が認証済みでも公式ログインを開始する。既定false。trueの時、authenticatedかつsession_idがnullの結果は返さない"),
|
|
768
772
|
},
|
|
769
773
|
outputSchema: {
|
|
770
774
|
schema: z.literal("aiterm.agent-auth-result.v1"),
|
|
@@ -40,21 +40,15 @@ export function claudeParentHookDiagnostic(file) {
|
|
|
40
40
|
return unreadable;
|
|
41
41
|
if (settings.disableAllHooks === true)
|
|
42
42
|
return required("hooks_disabled");
|
|
43
|
-
|
|
44
|
-
const
|
|
45
|
-
const scripts = [];
|
|
46
|
-
for (const event of Object.keys(steer.claudeParentHookEntries(AITERM_PROFILE, { command: "", script: entry }))) {
|
|
43
|
+
// 登録の形(0.52.2までの`args`形式と、今のshellを通す1行)は配送ライブラリが読む。ここで`args`を直接読まない。
|
|
44
|
+
for (const event of Object.keys(steer.claudeParentHookEntries(AITERM_PROFILE, { command: "", script: AITERM_PROFILE.hooks.claude }))) {
|
|
47
45
|
const groups = settings.hooks[event];
|
|
48
46
|
if (groups !== undefined && !Array.isArray(groups))
|
|
49
47
|
return unreadable;
|
|
50
|
-
const found = (groups ?? []).flatMap(group => record(group) && Array.isArray(group.hooks) ? group.hooks : [])
|
|
51
|
-
.filter(hook => record(hook) && hook.type === "command" && Array.isArray(hook.args) && typeof hook.args[0] === "string" && owned(hook.args[0]))
|
|
52
|
-
.map(hook => hook.args[0]);
|
|
53
|
-
if (found.length === 0)
|
|
54
|
-
return required("hooks_not_registered");
|
|
55
|
-
scripts.push(...found);
|
|
56
48
|
}
|
|
57
|
-
|
|
49
|
+
if (!steer.claudeParentHooksRegistered(AITERM_PROFILE, settings))
|
|
50
|
+
return required("hooks_not_registered");
|
|
51
|
+
return steer.claudeParentHookScripts(AITERM_PROFILE, settings).every(script => existsSync(script)) ? ready : required("hook_script_missing");
|
|
58
52
|
}
|
|
59
53
|
export function cursorParentHookDiagnostic(file) {
|
|
60
54
|
const document = readSettings(file);
|
package/docs/DESIGN.md
CHANGED
|
@@ -186,6 +186,11 @@ hookはNodeの実行ファイルと引数配列で直接起動し、shellやWind
|
|
|
186
186
|
子の予約は既存の`parent-deliveries/claims`で共有し、親の種類をまたぐ並行送信を防ぐ。
|
|
187
187
|
hookとの受け渡しはAiterm stateの`claude-parent-hooks`へ置く。
|
|
188
188
|
|
|
189
|
+
hookの登録は、`args`を使わずshellを通す1行で書く(ADR 0089)。POSIXは`exec '<node>' '<hook>'`、Windowsは
|
|
190
|
+
`& '<node>' '<hook>'; exit (Get-Variable LASTEXITCODE -ValueOnly)`と`shell: "powershell"`。同じ設定をGrokも読み、
|
|
191
|
+
`args`を落として`command`だけを動かすためである。Grokから起こされたhookは何もせず0で終わる。
|
|
192
|
+
PreToolUseのhookは、間に挟まるshellを飛ばして、Claude Code本体を依頼元のprocessとして記録する。
|
|
193
|
+
|
|
189
194
|
`PostToolUse`は`asyncRewake:true`で待機し、保存済み本文をstderrへ出してexit 2を返す。
|
|
190
195
|
exit 2はClaudeが規定する再開信号であり、子の成功・失敗は本文の`outcome`で区別する。
|
|
191
196
|
親は待機中も別作業や次のturnへ進める。Claudeの画面では`Stop hook feedback`として届く。
|
|
@@ -288,7 +293,10 @@ shell、接続先、各harnessの公式CLIが所有する。
|
|
|
288
293
|
|
|
289
294
|
PTYが消失した場合は、相関記録の有無にかかわらず`status`が`failed`、`cancel`が既に終了・取消済みを示す`blocked`を返し、どちらも`session_id:null`となる。保存したsession IDを解除して`start`で再開始できる。生存中の通常PTYやharness不一致、記録の破損・読取り失敗はエラーを返す。
|
|
290
295
|
|
|
291
|
-
Claude/Codex/Cursorは公式statusを照合する。Grokは公式status command
|
|
296
|
+
Claude/Codex/Cursorは公式statusを照合する。Grokは公式status commandが無いため、`grok models`が`You are not authenticated.`と答えるかで見る(ADR 0090)。auth fileの存在は見ない。
|
|
297
|
+
Codexの`codex login status`は`auth.json`の有無だけを答え、ログインの期限が切れた後も「Logged in」を返す。「Logged in」の時は、公式App Serverへ`getAuthStatus`(`refreshToken:false`)、`account/read`の順に聞き、`account`が`null`なら未認証とする。App Serverを起こす環境は、認証sessionへ引き継いだ環境を使う。
|
|
298
|
+
Cursorの公式statusが`unable to fetch user details`を返す時は、認証済みとせず`failed`とする。Claudeの期限切れは、公式statusからは見抜けない。
|
|
299
|
+
`start`の`relogin:true`は、今の状態を聞かずに公式ログインを始める。資格情報を消す処理は持たない。Claudeはlogin完了後に同じPTYへ公式の初回TUIを用意し、初回案内の入力待ちを`blocked`/`input_required:true`へ写す。認証とlauncherの起動準備は別の結果であり、`agent_launch`のready gateを省略しない。
|
|
292
300
|
|
|
293
301
|
公開receiptは`aiterm.agent-auth-result.v1`で、公式HTTPS URLと明示device codeだけを抽出する。生の画面本文・credential・token・OAuth callback codeは含めない。人の入力は既存の`pty_send`/`pty_key`で同じPTYへ送る。`remote`は標準のremote tool中継を使い、callerはCLI commandや環境ごとの入力方言を組み立てない。
|
|
294
302
|
|
package/docs/RELEASE.md
CHANGED
|
@@ -83,8 +83,9 @@ aiterm-setup --json
|
|
|
83
83
|
互換launcherを共有していた場合はAitermのSteer選択だけを解除し、所有外の起動設定を保持する。
|
|
84
84
|
回答record schemaは従来と共通であり、新方式のSteer相当配送も`queued_submission_id`を保持する。
|
|
85
85
|
|
|
86
|
-
Claude親配送hook
|
|
87
|
-
実行する。Aiterm専用の3 hookだけを解除し、他製品のhookと設定を保持する。
|
|
86
|
+
Claude親配送hookのない旧版、または0.52.2以前へ戻す場合は、旧版のinstall前に`aiterm-setup --remove-claude-parent-hooks`を
|
|
87
|
+
実行する。Aiterm専用の3 hookだけを解除し、他製品のhookと設定を保持する。0.52.2以前は、shellを通す1行の登録(ADR 0089)を
|
|
88
|
+
自分の物と数えず、もう1組を足す。
|
|
88
89
|
|
|
89
90
|
```bash
|
|
90
91
|
npm install -g "aiterm-mcp@<known-good-version>"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aiterm-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.53.0",
|
|
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": [
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
73
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
74
|
-
"aiterm-steer-delivery": "^0.1
|
|
74
|
+
"aiterm-steer-delivery": "^0.2.1",
|
|
75
75
|
"ws": "8.21.3",
|
|
76
76
|
"zod": "^4.4.3"
|
|
77
77
|
},
|