aiterm-mcp 0.29.7 → 0.29.9

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 ADDED
@@ -0,0 +1,1476 @@
1
+ # Changelog
2
+
3
+ All notable changes to **aiterm-mcp** are documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.29.9] - 2026-08-31
11
+
12
+ ### Fixed
13
+
14
+ - Accept both `server` and `linux` factory profiles on native Linux for opt-in
15
+ runtime-error collection while keeping WSL restricted to its legacy `wsl` profile.
16
+ - Replace the nonexistent public `pty_kill_all` recovery guidance in the MCP error and both READMEs with the supported `pty_list` → `pty_close` → recreate flow.
17
+ - Keep the Grok credential-path contract in the authentication section instead of leaving it after the License heading.
18
+
19
+ ### Changed
20
+
21
+ - Deliver terminal text without classifying or blocking destructive-looking command content; command policy belongs to the shell, remote endpoint, or launched harness.
22
+ - Pass existing absolute Grok credential paths to Grok without inspecting their contents, permissions, ownership, links, ancestors, or file type. Keep only the explicit-path shape/existence preflight and the default-missing `XAI_API_KEY` branch.
23
+ - Let Claude Code interpret `/login` and `/logout` inside its own TUI while retaining the official CLI authentication preflight before session creation.
24
+ - Replace the retired `wsl2` and ambiguous `linux-native` factory CI labels with
25
+ separate `linux-server` and `linux-workstation` self-hosted runner contracts.
26
+ - Move completed, rejected, interrupted, expired, and superseded plans, audits, promotion notes, and obsolete design drafts under `docs/archive/`; retain only small compatibility stubs where Lattice, ADRs, or research evidence have immutable path references.
27
+ - Replace the release-by-release AGENTS log with a compact current product contract, and add product-owned DESIGN and RELEASE sources so Aiterm remains operable without dotagents.
28
+ - Ship the README-linked CHANGELOG and current product docs in the npm package, and document standalone npm update and version-pinned rollback for global and `npx` installations.
29
+ - Move the authoritative four-environment CI runner contract into this repository and have the release caller use the local reusable workflow instead of an external dotagents workflow.
30
+
31
+ ## [0.29.8] - 2026-08-30
32
+
33
+ ### Fixed
34
+
35
+ - Correct the `pty_open` MCP description and install-facing documentation to state the real platform contract: tmux on POSIX and psmux 3.3.8+ on native Windows.
36
+ - Add a tools/list regression that prevents the obsolete Windows-requires-tmux wording from returning.
37
+ - Do not mistake Claude Code 2.1.251's workspace-trust selection cursor for the composer; leave the initial prompt unsent and return an explicit blocking-UI error instead of selecting `No, exit` and issuing a false success receipt.
38
+ - Preserve the current composer when an old trust screen remains only in scrollback by classifying the last Claude `❯` marker rather than reversing the ready/action-required precedence.
39
+ - Use `TMPDIR` for the Windows managed-state root whenever it isolates the psmux namespace, preventing an isolated test process's `killAll()` from deleting live production agent metadata in the shared `%TEMP%` tree.
40
+ - Keep the existing `%TEMP%\aiterm-mcp-0` location for normal Windows servers where `TMPDIR` is unset.
41
+
42
+ ## [0.29.7] - 2026-08-29
43
+
44
+ ### Fixed
45
+
46
+ - Add a structured `wait_process` executable/argument boundary plus a PowerShell `Start-Process`-ready argument string to agent launch and dispatch receipts so Windows callers do not have to interpret npm's PowerShell bin shim or re-quote paths containing spaces.
47
+ - Launch the bundled waiter through the current Node executable while preserving the psmux backend, PowerShell 7 interactive shell, compatibility `wait_command`, and waiter outcome contract.
48
+
49
+ ## [0.29.6] - 2026-08-29
50
+
51
+ ### Fixed
52
+
53
+ - Give Windows runtime-error diagnostics and asynchronous recording enough time for their required PowerShell 7 private-DACL operations instead of killing healthy workers at the POSIX two-second deadline.
54
+ - Keep the explicit per-operation timeout override and the POSIX two-second default unchanged.
55
+
56
+ ## [0.29.5] - 2026-08-29
57
+
58
+ ### Fixed
59
+
60
+ - Select the PowerShell mark sentinel from the currently rendered PowerShell prompt when psmux briefly reports the launcher shell immediately after `pty_open`.
61
+ - Keep the failed, unpublished `v0.29.4` tag immutable and publish this corrected patch as 0.29.5.
62
+
63
+ ## [0.29.4] - 2026-08-29
64
+
65
+ ### Fixed
66
+
67
+ - Bypass psmux 3.3.8's unreliable CLI paste-buffer/send-keys path on Windows by sending paced 256-byte `SendBytes` commands over the authenticated per-session server protocol and retaining the send lock through the final ConPTY drain.
68
+ - Keep agent prompts atomic on Windows with explicit bracketed-paste wrappers after the TUI ready gate, while preserving tmux `paste-buffer -p` negotiation on POSIX.
69
+ - Cover 6,000-character delivery, same-session cross-process serialization, eight-session concurrent delivery, and platform-specific bracketed paste in native PTY regression tests.
70
+
71
+ ## [0.29.3] - 2026-08-29
72
+
73
+ ### Fixed
74
+
75
+ - Dispatch startup prompts for every harness through the live TUI ready gate instead of treating Grok/Composer/Cursor argv prompts as already running.
76
+ - Recognize Grok's current response markers as busy while allowing a stable visible composer without requiring a transcript initialization event.
77
+
78
+ ## [0.29.2] - 2026-08-29
79
+
80
+ ### Fixed
81
+
82
+ - Prefer the current idle composer over stale startup-dialog text left in scrollback, while still returning immediately for an actually active blocking UI.
83
+
84
+ ## [0.29.1] - 2026-08-29
85
+
86
+ ### Fixed
87
+
88
+ - Return the existing `initial_prompt=not_sent` error immediately when a known Codex/Claude startup approval UI blocks the TUI, leaving the session alive for the caller instead of waiting for the ready timeout.
89
+
90
+ ## [0.29.0] - 2026-08-25
91
+
92
+ ### Changed
93
+
94
+ - **起動時promptのready gate失敗を成功形receiptから明示エラーへ変更**(実被弾 2026-08-25:
95
+ Codexのupdate確認ダイアログでTUIが入力受付にならず、promptが未送信のまま
96
+ `wait_command: null`の成功形receiptが返り、呼び出し側が40分気づけなかった)。
97
+ `sendInitialAgentPrompt`はready失敗時にAitermError(code 2)を投げ、sessionは
98
+ 調査/復旧用に残す。エラーメッセージにsession_id・復旧手順(pty_read→pty_key→pty_send)を含む。
99
+
100
+ ### Added
101
+
102
+ - `codexLaunchBlockingDialog(screen)`: Codexの起動前modal(update確認・directory trust確認・
103
+ その他「Press enter to continue」型)を実機capture逐語で検知し、ready gate失敗エラーに
104
+ 塞いでいるダイアログ種別を明示する。ダイアログ表示中のCodexはheader/footerを描かないため
105
+ `codexTuiReady`では識別できない(実測フィクスチャをtestに収録)。
106
+
107
+ ## [0.28.4] - 2026-08-25
108
+
109
+ ### Fixed
110
+
111
+ - Native Windowsの`pty_open`既定shellをPowerShell 7(`pwsh.exe`)へ統一し、明示
112
+ `powershell`/`powershell.exe`も検証済みPowerShell 7実体へ正規化した。検出実体自身の
113
+ `PSEdition=Core`/major 7以上を確認し、Windows PowerShell 5.1・PowerShell 6・`cmd.exe`へ
114
+ fallbackしない。未導入時はMicrosoft公式WinGet入口を案内する。
115
+ - runtime error DACL、process identity、Throughline shimも同じ絶対PowerShell 7を使う。
116
+ DACLはPowerShell 7対応の`FileSystemAclExtensions` static APIへ移し、current SID only・
117
+ FullControl・継承遮断・owner readbackを維持した。
118
+
119
+ ## [0.28.3] - 2026-08-24
120
+
121
+ ### Changed
122
+
123
+ - campaign 32のmaintenance queueに積んだ重複を解消: stop hook 2本とagent-sharedに
124
+ 三重実装されていた`uid()`/`runtimeStateBase()`を、node builtinだけに依存する新設の
125
+ 最下層`src/state-root.ts`へ一本化した。stop hookの「内部moduleへ依存しない」設計は
126
+ state-rootがbuiltin依存だけであることで維持される。挙動・15-tool API・schemaは不変。
127
+
128
+ ## [0.28.2] - 2026-08-24
129
+
130
+ ### Changed
131
+
132
+ - 内部用語をharnessへ統一した(オーナー裁定: AIの実行基盤分類を「vendor」でなく「harness」と呼ぶ)。
133
+ `src/vendors/`を`src/harnesses/`へ改名し、内部識別子(`harnessLauncherDiagnostic`等)とコメント・
134
+ 現役文書の分類語をharnessへ置換した。挙動・15-tool API・schemaは不変。
135
+ - 互換のため公開wire契約は据え置く: receipt/event fileの`vendor`・`vendor_session_id`field、
136
+ diagnosticsの`vendor_dependencies`、runtime error code `AITERM.VENDOR_LAUNCHER_FAILED`は
137
+ 従来どおり(正本fieldは0.28.0以降`harness`)。
138
+
139
+ ## [0.28.1] - 2026-08-24
140
+
141
+ ### Changed
142
+
143
+ - 現行正典をv0.28の実装へ全面同期した。Windows nativeはWSL bridgeでなくpsmux 3.3.8以上+
144
+ Git for Windowsを直接使うこと、公開面は15 toolsで標準`agent_launch`と旧4 aliasを持つこと、
145
+ harness固有/OS固有コードの所有境界をCONTRIBUTING、SECURITY、README、AGENTS、design planへ反映した。
146
+ - Cursorの通常agent transcriptによる回答回収と`turn_ended(status:"success")`完了相関、同一sessionの
147
+ model/effort変更、複数harness運用を英日READMEと設計正本へ補完した。archive、過去版ADR、RAG rawは
148
+ 当時の証跡なので書き換えていない。
149
+ - ランタイムコードと15-tool APIは0.28.0から不変。npmへ含まれるREADMEを同期して届けるため、
150
+ 再公開不能な0.28.0を動かさず、文書同期版を0.28.1として公開する。
151
+
152
+ ## [0.28.0] - 2026-08-24
153
+
154
+ ### Added
155
+
156
+ - 正規の単一起動入口`agent_launch({ harness, model?, ... })`を追加した。`harness`は
157
+ `claude-code`/`codex-cli`/`grok-cli`/`cursor-cli`で、agent loop・認証・hook・session・
158
+ transcriptを所有する実行基盤を表す。`model`は別軸で、Cursor harness上のGPT/Claude/Grokも
159
+ Cursor方式の完了相関を維持する。ComposerはGrok CLIのmodel presetとして指定する。
160
+ - Cursor Agent CLI adapterを追加した。通常`~/.cursor`を共有し、初回user recordのlaunch IDで通常
161
+ agent transcriptを一意にbindする。末尾`turn_ended(status:"success")`を完了、同じturnのassistant textを
162
+ 回答正本として、既存`aiterm-wait`/`pty_read(agent_transcript:true)`契約へ接続する。
163
+ - Cursorの`write_scope:"read-only"`を公式`--mode ask`で実効化し、model+effortは
164
+ 現行`model-effort` IDへ変換してlive catalogへ照合する。起動中変更は標準`/model`とmodel pickerの
165
+ parameter editorを使う。CLI未導入・未認証・不正指定はPTY作成前に明示失敗する。
166
+
167
+ ### Changed
168
+
169
+ - `claude_agent`/`codex_agent`/`grok_agent`/`composer_agent`はdeprecated thin aliasとなり、
170
+ 正規入口と同じ共通実装へ流れる。旧receiptの`provider`は互換fieldとして残し、`harness`を追加した。
171
+ - `pty_send`のagent dispatch、`aiterm-wait`、`agent_configure`、`pty_list`にも正規の`harness`を追加し、
172
+ 起動後の操作でも同じ実行基盤語彙を使えるようにした。旧`vendor`/`provider`/`agent`は互換用に残す。
173
+ - `event_cursor`はvendor別の完了正本境界を表すopaqueな0以上の整数とした。Cursorではfollow-up時に
174
+ 直前末尾の`turn_ended`が書き換わる実挙動へ合わせ、単調に残るuser turn数を使う。
175
+ - Cursor実行ファイルは`CURSOR_AGENT_BIN`、`~/.local/bin/cursor-agent`、PATH上の`cursor-agent`だけを
176
+ 解決し、Grok等と衝突し得る曖昧な`agent`名を使わない。導入・更新はCursor公式installer/
177
+ `agent update`を正本とし、独自tarball経路を追加しない。
178
+
179
+ ### Fixed
180
+
181
+ - MCPB stagingが`dist`直下のJavaScriptだけをcopyし、v0.27.7以降の`dist/vendors/*.js`を欠いた
182
+ 起動不能archiveをvalidatorが通していた欠陥を修理した。runtime JavaScriptを再帰copyし、staged serverの
183
+ initialize/15-tool list/stderr 0まで公開前smokeで固定する。
184
+
185
+ ## [0.27.9] - 2026-08-23
186
+
187
+ ### Fixed
188
+
189
+ - Windows native の PowerShell pane で `pty_send(mark:true)` が POSIX 用 `printf` を
190
+ 連結して失敗し、コマンド本体が成功しても完了 sentinel を生成できず timeout していた。
191
+ 前面が `powershell` / `pwsh` のときは PowerShell 構文で sentinel を実行時生成し、
192
+ 成功を `rc=0`、失敗を `rc=1` として返す。command echo は `rc={0}` のままなので
193
+ 数字アンカーによる早期完了防止を維持する。POSIX shell の既存形式は変更しない。
194
+ - 日本語 README の Windows 要件が廃止済み WSL bridge の説明を残していたため、現行の
195
+ native psmux 3.3.8+ と Git for Windows を使う契約へ訂正した。
196
+
197
+ ## [0.27.8] - 2026-08-23
198
+
199
+ ### Fixed
200
+
201
+ - 0.27.7 の npm package に `dist/vendors/` が同梱されず、公開版が起動時
202
+ `ERR_MODULE_NOT_FOUND` になっていた(package.json `files` の `dist/*.js` glob が
203
+ サブディレクトリを含まなかった)。`dist/vendors/*.js` を files へ追加し、
204
+ `npm pack --dry-run` で build 済み runtime dist の全 .js が tarball に含まれることを
205
+ 固定する回帰テストを追加した(repo 内 dist で回る CI では検出できない欠陥クラスの封じ)。
206
+
207
+ ## [0.27.7] - 2026-08-23(npm同梱漏れにより公開版は起動不能・0.27.8が修正版)
208
+
209
+ ### Changed
210
+
211
+ - vendor固有コードとOS固有コードを専用モジュールへ分離した(外部挙動不変のリファクタ・
212
+ campaign正本は `docs/archive/32-vendor-os-adapter-refactor-plan.md`)。`src/vendors/{claude,codex,grok}.ts` が各ベンダーの起動引数・
213
+ ready/画面判定・完了検出・transcript回収・metadata生成・auth/catalog検証を所有し、
214
+ `src/agent-shared.ts` がvendor中立の共有プリミティブ(state path・metadata型・完了event型・
215
+ lineage)を所有する。psmuxのOS差(load-buffer一時ファイル・paste-buffer -r非対応・
216
+ pipe-pane sink settle・NUL device・mode bit検証可否・Git Bash cwd変換)は
217
+ `src/tmux-runtime.ts` へ集約した。依存方向は core → vendors → agent-shared →
218
+ (tmux-runtime, errors) の一方向。公開tool面・schema・receipt・エラーメッセージ・
219
+ タイミング定数は不変。core.ts は 4,912→3,647行。
220
+
221
+ ## [0.27.3] - 2026-08-22
222
+
223
+ ### Fixed
224
+
225
+ - agent metadata の codex_home / grok_home 照合が「現在の process env の home と等しいこと」を
226
+ 要求し、席専用 CODEX_HOME / GROK_HOME で起動した正当な session が別の aiterm instance から
227
+ 拒否された(2026-08-22 実測: 承認ダイアログで停止した席を親が救えず円卓が止まった)。
228
+ per-launch の記録値を正とし、検証は絶対パスの形だけにする。
229
+ - Windows CI の listSessions テストが、psmux の pane_current_command が起動直後に
230
+ git→bash と遷移するレースで落ちた(v0.27.1/0.27.2 の publish を連続で止めた)。
231
+ 行が安定するまで待ってから基準を取る。
232
+
233
+ ## [0.27.2] - 2026-08-22(CI 失敗により未 publish)
234
+
235
+ ### Changed
236
+
237
+ - OS依存コードを独立モジュールへ分離した(挙動不変のリファクタ)。errors(AitermErrorと
238
+ telemetry所有の失敗経路)、tmux-runtime(tmux/psmuxの解決・socket/namespace・locale注入・
239
+ 起動)、agent-resolver(claude/codex/grok/throughline/pane shellの実行ファイル解決と
240
+ 起動経路)、runtime-error-os(パス規約・Windows DACL・host profile・process観測・
241
+ force kill)。OS分岐の規約は各モジュールだけが所有し、core.tsとruntime-error-store.tsは
242
+ OS非依存ロジックに保つ。
243
+
244
+ ### Fixed
245
+
246
+ - process start identity の `ps -o lstart=` 観測が observer の locale に依存していた
247
+ (lstart の日付書式は LC_TIME で変わる。Lattice 0.63.4 で実被弾した同族の罠)。
248
+ 観測 env を `LC_ALL=C` へ固定した。
249
+ - smoke の公開version検査が 0.27.0 固定のまま 0.27.1 が release され、`npm test` が
250
+ 素で赤になっていた。versionへ追随した。
251
+
252
+ ## [0.27.1] - 2026-08-20
253
+
254
+ ### Fixed
255
+
256
+ - `claude_agent` が `--model` / `--effort` を渡しても、launch 固有 `--settings` に
257
+ model が無く Claude Code 既定(Fable 5 / high)へ落ちていた。要求した model と
258
+ effort をその settings JSON へ焼き、席が Fable 固定にならないようにした。
259
+
260
+ ## [0.27.0] - 2026-08-19
261
+
262
+ ### Changed
263
+
264
+ - **Windows基盤をWSL橋からnative psmuxへ置換**(`e3f5fc8`+本版で完成)。全tmux呼び出しは
265
+ tmux CLI互換のnative psmux(`-L` namespace隔離・`AITERM_PSMUX`上書き可)を直接叩き、
266
+ pane shellはGit for Windowsの`bash.exe`(`AITERM_BASH`上書き可)。WSL2・interop anchor・
267
+ `/mnt/c`変換・`WSLENV`搬送は全廃。前提のpsmux忠実度修正3件(pipe-pane直接ファイルsink・
268
+ paste逐語hex wire・前面`#{pane_current_command}`)はupstream貢献 psmux/psmux#577 として
269
+ mergeされ **psmux v3.3.8** に収録=Windows nativeの動作前提はpsmux ≥ 3.3.8。
270
+ - **共有/tmpの敵対的同居主体を前提とした安全設備を全プラットフォームで撤去**
271
+ (オーナー裁定 2026-08-19): agent state系のsymlink・hard link・owner uid比較・
272
+ mode bit検査・`O_NOFOLLOW`。対応OSの既定配置(`XDG_RUNTIME_DIR`/per-user tmp)では
273
+ 前提が成立しないため。短書き込み検出、`dev`/`ino`同一性(operation相関)、size上限、
274
+ 作成時0o600/0o700は維持。Grok auth検証とsend/wait lockは対象外(撤去していない)。
275
+
276
+ ### Fixed
277
+
278
+ - **Windowsで`grok_agent`/`composer_agent`の完了eventが一度も書かれなかった**:
279
+ `grok-stop-hook`が`process.getuid`不在で即failしていた(claude側だけ修理され
280
+ grok側が取り残されていた)。`aiterm-wait`が常に600秒timeoutする実害の根治。
281
+ - **受入契約が通したscript binをcontrol commandが実行できなかった**: Windowsで
282
+ shebang script(受入が正式に許す形)をGit Bash経由、`.cmd`/`.bat`をshell経由で
283
+ 実行する。従来は`claude auth status --json` preflightが必ず失敗し起動不能だった。
284
+
285
+ ### Tests
286
+
287
+ - テスト側の`process.getuid`ハードコード述語を製品側`currentUid()`と同規則へ揃え、
288
+ Windows覆域を回復(skip 155→45・full 344件でfail 0)。fake vendor bin・Throughline
289
+ fixtureをWindows実行形へ移植。撤去済み安全設備を検証していたテストは削除し、
290
+ 「envの任意pathへ書かない」等の撤去と無関係な不変条件は残して固定。
291
+
292
+ ## [0.26.0] - 2026-08-15
293
+
294
+ ### Changed
295
+
296
+ - Windows hostの`grok_agent`/`composer_agent`はWindows nativeの`grok.exe`だけを起動する
297
+ (オーナー裁定 2026-08-15: WindowsネイティブはWindowsネイティブで完結させ、WSL2へ持ち込まない)。
298
+ WSL側grokを起動するとvendor実体がWSL processになり、session記録(events/chat_history)が
299
+ WSL home側へ分裂して`pty_read(agent_transcript:true)`と`aiterm-wait`の完了帰属が回収不能だった
300
+ (実被弾: olc-plan-review-grok2)。非nativeな解決先はsession作成前に明示エラーにし、
301
+ Windowsの既定候補へ`~/.grok/bin/grok.exe`を追加した。native実体はWindows側`~/.grok`へ
302
+ 記録するため、transcript/completion読取・auth検証(0.25.3)と同じ面で完結する。
303
+ v0.25.3の`GROK_AUTH_PATH`の`/mnt/c`変換(WSL grok前提)は撤回し、Windowsドライブ形のまま渡す。
304
+ - `grok_agent`のツール既定modelをdotagents規範(xAI旗艦)どおり`grok-4.6`へ更新した
305
+ (実catalogで現行defaultであることを確認済み)。
306
+
307
+ ### Fixed
308
+
309
+ - Windowsのtmux bridgeでは各`wsl.exe`呼び出しが短命なため、paneが継承する`WSL_INTEROP`が
310
+ 死んだsocketを指し、pane内からのWindows `.exe`起動(binfmt interop)が
311
+ `UtilAcceptVsock accept4=110`で失敗していた。aitermが長寿命のinterop anchor(sleepする
312
+ `wsl.exe` process)を1本所有し、native `.exe`起動のenvへ生きたsocketを供給する。
313
+ あわせてWSL側envはinterop先のWindows processへ既定では渡らないため(実測)、注入envを
314
+ `WSLENV`(`/w`)で明示的に運ぶ。Windows native grok.exe 1.0.4の入力欄marker `>` を
315
+ ready判定・submit残存観測へ追加した(`❯`は従来どおり)。
316
+ - Windows(`process.getuid`不在)で`existingAgentsDir()`が常に`null`を返し、close/killAll/
317
+ 同名再起動時のagent state掃除がno-opになっていた。閉じたsessionのmetadataが残り、同名の
318
+ 再起動が「agent metadata が複数あります」で失敗する実害を確認し、`currentUid()`の既知制約
319
+ 受容(uid 0)へ揃えて根治した。
320
+ - `grok_agent`/`composer_agent`の`write_scope:"read-only"`起動へ`--always-approve`を付与し、
321
+ 無人subagentがMCPツール初回使用の許可ダイアログで停止しないようにした。sandboxが実効
322
+ 書込み禁止を作るread-only起動だけが対象で、read-only以外のlaunchコマンドラインには
323
+ 従来どおり`--always-approve`を入れない(権限拡大なし)。
324
+
325
+ ## [0.25.3] - 2026-08-15
326
+
327
+ <!-- 公開受入: docs/adr/0032-release-0.25.3-acceptance.md -->
328
+
329
+ ### Fixed
330
+
331
+ - Windows hostで`grok_agent`/`composer_agent`が「Grok 認証正本の安全検証に失敗しました」で
332
+ 構造的に起動不能だった。WindowsのNode `fs.Stats`はPOSIX permission bitを持たない(fileは常に
333
+ 666、directoryは777相当)ため、`resolveAndValidateGrokAuth`のmode bit検証をWindowsでは
334
+ 除外する(`currentUid`と同じ既知制約の明示的受容。owner・nlink・size・O_NOFOLLOW・realpath・
335
+ 祖先symlink検証は全platform共通のまま維持)。
336
+ - Windowsで検証を通過しても、WSL内bashで走る起動コマンドへ`GROK_AUTH_PATH`をWindowsドライブ
337
+ 形式のまま渡していたため、WSL側grokが認証正本を開けず接続段階で無応答のまま停止していた。
338
+ bin/cwdと同じ`toWslPath`変換を適用する。
339
+
340
+ ## [0.25.2] - 2026-08-14
341
+
342
+ ### Fixed
343
+
344
+ - Grok Build 1.0.3で`/model`成功通知が次の再描画までに消えた場合、実際にはmodel/effortが
345
+ 変更済みでも`agent_configure`が失敗と返していた。変更前には無かった要求model/effortが
346
+ 常駐footerへ現れた場合もvendorの最終状態として確認し、同一sessionの連続変更を正しく返す。
347
+
348
+ ## [0.25.1] - 2026-08-13
349
+
350
+ ### Changed
351
+
352
+ - GitHub移転後の正規repositoryを`kitepon/aiterm-mcp`へ統一した。README、contributor/security案内、
353
+ npm metadata、MCPB manifest、Official MCP Registry manifest、公開runbookを同じ正本へ揃えた。
354
+ - 工場管理製品の最終CIをself-hostedのmacOS native・Linux native・Windows native・WSL2へ移し、
355
+ 4環境すべてで同じ`npm test`を同時実行する。OS別の縮小suiteやGitHub-hosted runnerで代用しない。
356
+ - npm publishは4環境full greenとrelease commitの`origin/main`祖先確認を必須条件とし、
357
+ GitHub Actions OIDC Trusted Publisherは移転後の`kitepon/aiterm-mcp`へ対応させる。
358
+
359
+ ### Fixed
360
+
361
+ - 移転前のTrusted Publisherが発行するOIDC claimと現在のrepository ownerが食い違い、provenance署名後の
362
+ npm publishがE404になる公開障害を修理する。失敗済み`v0.25.0`は動かさず、修正版を`v0.25.1`として出す。
363
+ - Linux native/WSL2でも長いPTY入力を一括pasteするとtmuxが成功を返したまま中間を欠落させるため、
364
+ 全OSでUTF-8境界を守る256byte chunkと10msのdrain間隔を使う。
365
+ - `until`/`mark`を指定したreadが、shell builtin処理中の一瞬の出力静止をquiescent完了と誤認して
366
+ 指定証拠より先に返る欠陥を修理し、指定したmarker/sentinelを優先する。
367
+ - Windows nativeのself-hosted runnerをWSL所有者のinteractive taskで起動し、`NETWORK SERVICE`から
368
+ 見えないWSL/tmuxのためWindows fullが一括失敗する工場設定を修理する。
369
+
370
+ ### Verification
371
+
372
+ - tag CI/Trusted Publishing `31747150072`はself-hostedのmacOS native・Linux native・
373
+ Windows native・WSL2で同じ`npm test`を各347/347通過し、npm 0.25.1をSLSA provenance付きで公開した。
374
+ - GitHub ReleaseへMCPBを添付。Official Registry初回runのdescription 100文字超過422を根治後、
375
+ run `31748407046`で`io.github.kitepon/aiterm-mcp` 0.25.1を`active`/latestへ公開した。
376
+ - npm由来global/隔離install、3 bin、14 tools、4 launcher schema、stderr 0、配布`dist`一致、
377
+ Grok live smoke、Composer model不在時のsession作成前fail-loudと残骸ゼロを確認した。
378
+
379
+ ## [0.25.0] - 2026-08-13
380
+
381
+ ### Added
382
+
383
+ - `grok_agent`/`composer_agent`が起動時`reasoning_effort`をGrok Build TUIの
384
+ `--reasoning-effort`へ渡すようにした。
385
+ - `agent_configure`をGrok/Composerへ拡張し、同一PTY・同一会話contextのまま
386
+ `/model <model> [effort]`または`/effort <effort>`で変更できるようにした。
387
+ - Grok/Composerの`write_scope:"read-only"`を`--sandbox read-only`へ接続し、
388
+ Codexと同じ実効書込み壁にした。パス説明は引き続き宣言記録だけである。
389
+
390
+ ### Changed
391
+
392
+ - 明示したGrok/Composer modelとComposer既定`grok-composer-2.5-fast`を、PTY作成前に
393
+ 現在の`grok models` catalogへ照合する。取得失敗、形式不正、model不在は別modelへ
394
+ fallbackせず明示失敗する。現行catalogにComposer modelが無い場合、Composer既定起動も
395
+ 利用可能と偽らずsession作成前に失敗する。
396
+
397
+ ### Verification
398
+
399
+ - 起動時effort、read-only sandbox、Grok/Composerの同一session model/effort変更、
400
+ catalog不在時の残骸ゼロ拒否をfocused regressionで固定した。
401
+ - 既存agent関連回帰117/117とMCP schema smokeがgreen。
402
+ - 最初のfull regressionは新catalog境界を持たない既存MCP fixtureだけが失敗して344/345。fixtureを
403
+ focusedに修正後、最終full regression 345/345を確認した。
404
+ - npm pack dry-runは13 files、MCPB validate/packは0.25.0・2261 files、staged MCPは
405
+ version 0.25.0/14 tools/4 provider schema/stderr 0でgreen。
406
+
407
+ ## [0.24.3] - 2026-08-13
408
+
409
+ ### Fixed
410
+
411
+ - Agent launcherの`env_vars`で、現在のMCP processにある指定名の値だけを起動agentへ継承できるようにした。MCP processより先にtmux serverが存在していても、呼出元が所有する席identityやworkflow変数を失わない。
412
+ - Codex v0.147がreasoning effortの後ろへ`fast`を表示するfooterもCodex frontendとして認識する。
413
+ `medium fast ·`のidle実席を`agent_configure`が誤拒否していた欠陥を、vendor表示文法の判定で修理した。
414
+
415
+ ### Security
416
+
417
+ - `env_vars`は名前だけをtool引数に受け取り、値は現在のMCP processから起動時に読む。全環境の暗黙継承や
418
+ name/value mapは追加しない。指定値はshell quoteして起動コマンドへ入るため、起動先agent、PTY、`.lastcmd`へ
419
+ 到達する。この機能を秘密転送路として扱わず、同じOS userとvendorへ開示してよい変数だけを指定する。
420
+
421
+ ### Verification
422
+
423
+ - 既存tmux serverを現在のMCP processより先に起動した条件で、指定した現在値だけがagentへ届くこと、
424
+ 不正な変数名がsession作成前に失敗することをfocused regressionで固定した。
425
+ - Peertableの実席9席で、各launcherへ渡したactor値が起動agentから読めることを確認した。
426
+ - `fast`入りfooterのready/idle readyをpure regressionで固定し、実席soraを同じsessionのまま
427
+ LunaからTerraへ変更できることを確認した。
428
+ - final full regression 342/342、npm pack dry-run(13 files)、MCPB validate/pack、staged MCPの
429
+ version 0.24.3/14 tools/4 launcher schema/stderr 0がgreen。
430
+ - release commit `6ccb1a3add62e183d321e1ad97cd008da31026a2`のmain CI `31664655592`、
431
+ tag CI/Trusted Publishing `31664795704`、Official MCP Registry workflow `31664974149`がsuccess。
432
+ npm latest 0.24.3、SLSA provenance、GitHub Release+MCPB、Registry active/latest、registry由来
433
+ global install、3 bins、14 tools、schema、stderr 0、installed dist一致、2件の根治smokeを確認した。
434
+ - v0.24.3の完全な公開receiptは[archive plan](https://github.com/kitepon/aiterm-mcp/blob/main/docs/archive/28-agent-env-vars-release-plan.md)へ記録する。
435
+
436
+ ## [0.24.2] - 2026-08-13
437
+
438
+ ### Fixed
439
+
440
+ - 長寿命Codex sessionで`OpenAI Codex`ヘッダが直近のcapture範囲外へ流れた後も、常駐する
441
+ model/effort footerと入力欄をCodex TUIのready表現として認識する。idleの実席を
442
+ `agent_configure`が「入力待ちではありません」と誤拒否していた欠陥を修理した。
443
+ - Runtime error storeのbakery queueが固定1.5秒をqueue全体の総待ち時間として扱い、macOSでは
444
+ 各waiterが各pollで外部`ps`を起動して自ら進行を遅らせていた欠陥を修理した。期限を同じ先頭ownerの
445
+ 無進捗時間として測り、正常なticket進行ごとに更新する。通常pollは`kill(pid, 0)`だけを使い、
446
+ PID再利用を防ぐprocess-start identity照合はstall時だけ行う。
447
+
448
+ ### Verification
449
+
450
+ - headerが画面外へ流れた長寿命Codexのready/idle readyと、footerだけ・入力欄だけ・busy表示の
451
+ 負経路をpure regressionで固定した。
452
+ - Peertableの実席で、同じAiterm sessionと会話contextを維持したままLuna medium→Terra highの
453
+ `agent_configure`が成功することを確認した。
454
+ - v0.24.1 tag CI `31610402851`のmacOS Node 20で20並行queueの5 processが総待ち期限を超えた
455
+ failureを再現根拠にした。前任ticketが各900msで進み総待ち1.8秒になるregressionをred→greenで固定し、
456
+ 20並行時の`ps`起動を258回から20回へ削減した。
457
+ - focused 67/67、full regression 339/339、npm pack dry-run(13 files)、MCPB validate/packと
458
+ staged MCPのversion 0.24.2/14 tools/`agent_configure` schema/stderr 0がgreen。
459
+ - release commit `9febb994370a270acd0d38a80be508318d481060`のmain CI `31611936274`、
460
+ tag CI/Trusted Publishing `31612206338`、Official MCP Registry workflow `31612570435`がsuccess。
461
+ npm latest 0.24.2、GitHub Release+MCPB、Registry active/latest、registry由来global install、
462
+ 3 bins、14 tools、schema、stderr 0、installed dist一致、長寿命Codex ready根治を確認した。
463
+
464
+ ## [0.24.1] - 2026-08-12
465
+
466
+ ### Release status
467
+
468
+ - Git tagのCI `31610402851`はmacOS Node 20のruntime error store高競合試験で失敗し、publish jobは
469
+ 実行前にskipされた。npm、GitHub Release、Official MCP Registryへは公開せず、tagを動かさず
470
+ 長寿命Codex ready修正とqueue根治を0.24.2へ継承する。
471
+
472
+ ## [0.24.0] - 2026-08-12
473
+
474
+ ### Added
475
+
476
+ - `agent_configure`を追加。起動済みのCodex/Claude agent sessionへ各CLI標準のmodel/effort変更操作を送り、
477
+ PTYと会話contextを維持したまま設定を変更する。
478
+
479
+ ### Verification
480
+
481
+ - Codex 0.147.0の実TUIでLuna low→Terra highを同一session内で確認。
482
+ - Claude Code 2.1.228をAitermの実PTYでSonnet low→Opus high→Sonnet lowへ変更し、同一sessionの
483
+ 画面表示と標準`/model`・`/effort`成功応答を確認。対話fixtureでも同一sessionへの2コマンド送信を固定した。
484
+ - local full regression 337/337、MCPB validate/pack、npm pack dry-runがgreen。release commit
485
+ `764e83857c8c63416ca9da5311b73cac9364e490`のmain CI `31587209848`、tag CI/Trusted Publishing
486
+ `31587248091`はsuccess。npm latest 0.24.0、global install、公開MCPの14 tools/stderr 0、
487
+ installed distとrelease commitのバイト一致を確認した。
488
+
489
+ ### Documentation
490
+
491
+ - Codex/Claudeの入口、日英README、設計索引、運用文書、旧plan/ADRをv0.22.0の共有agent環境契約へ同期。
492
+ 旧managed home/設定snapshotの本文は歴史的証拠として保持しつつ、現行契約ではない文書をADR 0025による
493
+ superseded/historicalとして明示した。runtime、package version、公開成果物に変更はない。
494
+ - v0.23.0 portable forkの公開後全域監査を行い、`AGENTS.md`、contributor guide、security policy、
495
+ docs索引、Lattice計画を`throughline_source_session`とread-only DB所有境界へ同期した。README、
496
+ CLAUDE、ADR 0027、PROMOTIONは既に一致していたため内容を維持し、履歴ADR/archive/evidence/RAGは
497
+ 当時の証拠として改稿していない。
498
+
499
+ ## [0.23.0] - 2026-08-04
500
+
501
+ ### Added
502
+
503
+ - `claude_agent`/`codex_agent`/`grok_agent`/`composer_agent`へ任意の
504
+ `throughline_source_session`を追加。指定時はローカルの`throughline >= 0.9.0`から対象sessionの
505
+ 読み取り専用handoff contextをPTY作成前に取得し、context+固定区切り+必須の新ミッションを
506
+ そのまま初回promptにする。Throughline側のDB row所属、`merged_into`、batonは変更しない。
507
+ - portable forkは`launch_operation_id`と併用不可。Throughline不在、非zero、不正schema、空contextは
508
+ clean launchへfallbackせず、session残骸ゼロで明示失敗する。引数を省略した通常clean launchは不変。
509
+
510
+ ### Verification
511
+
512
+ - Codex型TUI後送経路とGrok型argv経路で、contextがmissionより前へ一度だけ入ることをfocused testで固定。
513
+ 外部Throughlineのmissing/nonzero/invalid schema/empty contextと、clean launch非依存も回帰した。
514
+ 最終full regressionは335/335 green。
515
+ - main CI `30919026450`、tag CI `30919295270`とnpm provenance publish、GitHub Release+MCPB、
516
+ Registry workflow `30919622861`がsuccess。Official Registry 0.23.0はactive/latestで、global install済み。
517
+ - Codex source memoryをClaudeへportable forkする代表live smokeで、source marker `creates: true`と
518
+ mission marker `MISSION_OK`を同じ回答から回収。前後のDB ownershipは完全一致し、session残骸0。
519
+
520
+ ## [0.22.0] - 2026-08-04
521
+
522
+ ### Changed
523
+
524
+ - `claude_agent`/`codex_agent`/`grok_agent`/`composer_agent`を、直接CLI起動と同じ通常`HOME`、
525
+ vendor home、project/user/local設定、MCP、plugin、skill、permission、trust、memory、historyを使う
526
+ 単一契約へ移行。旧fake home、private vendor home、設定snapshotはfallbackを残さず撤去した。
527
+ - aitermがlaunchごとに所有する範囲を、相関ID、完了event/cursor、bounded result、cleanup metadataへ限定。
528
+ 既存`managed_completion:true`は後方互換fieldとして残すが、環境隔離ではなく完了相関を表す。
529
+ - 起動子へ`role=subagent`、親session、delegation depth、lineage、`delegation_allowed=true`を注入。
530
+ 孫以降への再委譲は禁止せず、固定depth capも設けない。
531
+
532
+ ### Fixed
533
+
534
+ - Grok/Composerは通常環境のMCP初期化中にも入力欄を描画するため、画面readyだけでpromptを早送信して
535
+ 消失し得た。通常sessionの`mcp_init_completed` eventと現行model footer/入力欄の両方が揃うまで
536
+ dispatchしない。
537
+
538
+ ### Verification
539
+
540
+ - Claude/Codex/Grok/Composerのdepth 1 live smokeで、sub-agent自己認識、親session、depth、lineage、
541
+ 再委譲可を回収。Claude親がaitermの`claude_agent`を1回使うnested smokeで、孫のdepth 2と伸びた
542
+ lineageを実回収し、親子session残骸ゼロを確認。
543
+ - focused ready-gate回帰と関連testを追加。最終full regressionは329/329 green。公開package、CI/Registry
544
+ receiptはADR 0026へ固定。main CI `30880757338`、tag CI `30880912526`、npm provenance、GitHub Release、
545
+ Registry workflow `30880912702`がsuccess。npm registry由来の隔離installは0.22.0、3 bins、13 tools、
546
+ stderr 0で、4 launcherすべての共有契約文言を確認。この端末のglobal installをregistry版へ更新し、
547
+ global installed coreから実Claudeのsub-agent/depth 1/lineageを回収してdone。
548
+
549
+ ## [0.21.4] - 2026-08-04
550
+
551
+ ### Fixed
552
+
553
+ - managed Claudeの`--setting-sources ""`が通常hookだけでなくuser scope MCPまで不可視にし、fresh
554
+ sessionからAIShell等が使えなかった。`~/.claude.json`のtop-level `mcpServers`だけをlaunch単位の
555
+ 0600 configへsnapshotして`--mcp-config`で渡す。通常hook/plugin/permissionとproject/local MCPの
556
+ 隔離は維持し、破損/型不正configはsession作成前に残骸ゼロでfail loudする。
557
+
558
+ ### Verification
559
+
560
+ - snapshot内容、0600 mode、argv、config欠落、破損、metadata path再束縛、close cleanupをfocused testで固定。
561
+ 関連test 130/130、full regression 324/324がgreen。
562
+
563
+ ## [0.21.3] - 2026-08-03
564
+
565
+ ### Added
566
+
567
+ - `codex_agent`のtool descriptionへ、委譲時に`prompt`・`model`・`reasoning_effort`・
568
+ `cwd`・`write_scope`を揃えた完全な呼び出し例を追加。
569
+
570
+ ### Fixed
571
+
572
+ - Codex完了検出の正本をmanaged Stop hookからCodex自身のrollout transcript
573
+ `task_complete.turn_id`へ変更。dispatch直前のtranscript byte境界を既存`event_cursor`で返し、
574
+ `aiterm-wait`と`agent_transcript`が同じ構造化記録からturnを帰属する。Codex managed homeには
575
+ Stop hookを生成せず、未使用になったCodex hook実装も配布物から撤去して、hook失敗・hook trust・
576
+ Node実行パスをCodex完了の依存から除去した。build前に既存`dist/*.js`を消すことで、旧hookが
577
+ dirty workspaceのtarballやMCPBへ残留する経路も閉じた。
578
+ - follow-up dispatchも毎回TUI idleを確認してから完了境界を切り、同じcursorへ複数turnが
579
+ 帰属する経路を閉じた。後発sub-agent rolloutはroot TUIの完了へ誤帰属しない。
580
+ - Claude/Grokのmanaged Stop hookは、長寿命server起動時の`process.execPath`(Homebrew Cellarの
581
+ 版付き実体)を設定へ焼き付けず、hook実行時に継承`PATH`から`node`を解決する。Node更新で
582
+ 旧Cellar実体が消えた後の`exit 127`を防ぐ。
583
+ - `write_scope`指定時だけMCP structured launch receiptから`write_scope`と
584
+ `write_scope_enforcement`が欠落していた逆条件を修正。Codex/Grok/Composerの指定時と省略時を
585
+ 実MCP境界で回帰化し、宣言値・実効性の表示と既存receipt shapeを両立する。
586
+ - Grok/Composerの`write_scope`回帰が開発端末の実Grok CLIを暗黙利用し、clean CI runnerでは
587
+ CLI不在で失敗する非hermetic fixtureを偽binへ固定した。
588
+ - Windowsのruntime-error-storeがlock ownerのPID再利用を防ぐprocess start identity取得だけ
589
+ PowerShellを1秒で打ち切り、clean runnerのcold startで失敗する不整合を修正。DACL適用と同じ
590
+ 設定済みWindows command timeout(既定5秒)へ統一した。
591
+
592
+ ### Verification
593
+
594
+ - full regression 322/322。main CI `30813089848`、tag CI/npm provenance publish
595
+ `30813318513`、Official MCP Registry workflow `30813724499`がsuccess。
596
+ - npm由来の隔離installとglobal installでversion 0.21.3、3 bins、13 tools、stderr 0、
597
+ Codex launcherの5引数完全例、廃止Codex hook非同梱を確認。公開receiptは
598
+ [ADR 0023](https://github.com/kitepon/aiterm-mcp/blob/main/docs/adr/0023-release-0.21.3-acceptance.md)に固定した。
599
+
600
+ ## [0.21.2] - 2026-08-03
601
+
602
+ ### Release status
603
+
604
+ - Git tagのCIでWindows 20のprocess start identity取得が1秒上限を超え、publish jobは実行前にskipされた。
605
+ npm、GitHub Release、Official MCP Registryへは公開せず、tagを動かさず0.21.3で置き換える。
606
+
607
+ ## [0.21.1] - 2026-08-03
608
+
609
+ ### Release status
610
+
611
+ - Git tagのCIが上記非hermetic fixtureで失敗し、publish jobは実行前にskipされた。npm、GitHub Release、
612
+ Official MCP Registryへは公開せず、tagを動かさずfixtureを0.21.2で修正した。0.21.2もpublish前に
613
+ Windows gateで止まったため、公開成果は0.21.3へ継承する。
614
+
615
+ ## [0.21.0] - 2026-08-02
616
+
617
+ ### Added
618
+
619
+ - `codex_agent`、`grok_agent`、`composer_agent`へ任意の`write_scope`能力宣言を追加。
620
+ 指定値はlaunch receipt、per-launch metadata、`pty_list`へ保存する。Codexの
621
+ `write_scope:"read-only"`はCLIの`--sandbox read-only`で実効禁止する。Grok/Composerと
622
+ Codexのパス説明は対応するsandbox/allowlist CLI機構がないため、
623
+ `write_scope_enforcement:"declaration_only_unsupported"`で宣言記録だけであることを明示する。
624
+
625
+ ### Unchanged
626
+
627
+ - `write_scope`省略時のagent launcher argv、launch receipt、metadata表示は従来どおり。
628
+
629
+ ## [0.20.3] - 2026-08-01
630
+
631
+ ### Fixed
632
+
633
+ - managed Claude/Fableの新規起動は、tmux sessionを作る前に同じCLIの
634
+ `auth status --json`を検証し、正常な共有認証だけを複数sessionから再利用する。
635
+ 未認証・壊れた応答・失敗exit・timeoutは残骸を作らず明示失敗し、各sessionが
636
+ `/login`へ流れて共有credentialを奪い合う状態を作らない。
637
+ - managed Claude内のexact `/login`・`/logout`は通常dispatchとforce送信の双方で
638
+ 副作用前に拒否する。認証の変更は通常端末で一度だけ行い、aitermはvendor所有の
639
+ credentialを複製・symlink・lock・自動更新しない。
640
+ - Stop hookのdone event公開直後にactive marker削除だけが遅れるraceでは、同じmarkerより
641
+ 新しいresultと相関eventが揃った場合だけ回収側が短時間settleし、完了済みのexact resultを
642
+ 誤ってactive扱いしない。
643
+
644
+ ### Verification
645
+
646
+ - 関連test 99/99、release full regression 317/317、実Claude Code v2.1.220/Fable 5 low effortを独立process
647
+ 3本×2波(計6 process)で同時・反復起動し、追加loginなしで全件done、exact result回収、close。
648
+
649
+ ## [0.20.2] - 2026-07-26
650
+
651
+ ### Fixed
652
+
653
+ - npmがauthor名の丸括弧をURL記法として再解釈し、指定したXプロフィールを
654
+ `kitepon.dev`へ置き換えたため、author名を`Quo / クオ at kitepon.dev`へ訂正した。
655
+ これにより作者名・所属ブランド・Xへのリンクを同時に保持する。
656
+
657
+ ### Unchanged
658
+
659
+ - 0.20.1のREADME、検索語、短い説明、14ファイルのnpm tarball、およびruntime挙動は不変。
660
+
661
+ ## [0.20.1] - 2026-07-26
662
+
663
+ ### Changed
664
+
665
+ - npmの短い説明を、Claude CodeからCodex CLIの対話TUI(スラッシュコマンドや
666
+ `$imagegen`を含む)を操作できる差別化点が先頭で伝わる文へ更新した。
667
+ - npm authorを`Quo / クオ (kitepon.dev)`とXプロフィールへ結び、検索語へ
668
+ `codex-cli`、`terminal-mcp`、`persistent-terminal`、`interactive-cli`を追加した。
669
+ - 現行README(npm版・週間ダウンロード数バッジ、`npx` quickstart、
670
+ Claude Code / Claude Desktop / Cursor設定、作者帰属)をnpmへ反映するため再公開した。
671
+ - Official MCP RegistryとMCPBの説明・版・作者帰属を同じ公開面へ同期した。
672
+ - npmの`files`を実行に必要な`dist/*.js`へ限定し、Smithery向けの旧版bundleや
673
+ 展開済み依存をnpm利用者へ重複配布しないようにした。
674
+
675
+ ### Unchanged
676
+
677
+ - MCPの13ツール、3つのbin、stdio transport、PTY/agent runtimeの挙動は
678
+ 0.20.0から変更しない。公開面だけのpatch release。
679
+
680
+ ## [0.20.0] - 2026-07-26
681
+
682
+ ### Added
683
+
684
+ - `aiterm-wait` の outcome に `running`(まだ終わっていない)を追加。exit code は 5。
685
+ `--timeout 0` は以前から「待たずに一度だけ観測する照会」として動いていたが、未完了を
686
+ `timeout`(既定600秒待って終わらなかった)と同じ語で返していたため、軽い照会の答えが
687
+ 失敗・異常として親へ届いていた。これで「投げる → 自分の作業をする → 一度だけ様子を見る →
688
+ まだなら作業へ戻る」が語彙として表現できる(ADR 0018)。
689
+
690
+ ### Changed
691
+
692
+ - outcome → exit code の対応表を型で網羅強制。語を足して表を直し忘れると `undefined` から
693
+ exit 0 になり、未完了が完了として親へ届く。その取りこぼしを compile error で止める。
694
+
695
+ ### Unchanged
696
+
697
+ - 1秒以上を指定した待機の未完了は従来どおり `timeout` / exit 3。待ち方の意味は変えない。
698
+ - `done`=0 / `timeout`=3 / `closed`=4 / エラー=1、MCP の公開 tool と schema も変更なし。
699
+ - 照会は receipt・tool description で宣伝しない。押し込み機構を持たない親向けの逃げ道として
700
+ README にだけ置き、ADR 0017 で排した「親が子のお守りをする」誘惑を戻さない。
701
+
702
+ ## [0.19.3] - 2026-07-26
703
+
704
+ ### Changed
705
+
706
+ - dispatch/起動時 prompt 送信後の案内を「投げっぱなし」正典へ反転した。第一文で
707
+ 「投げっぱなしでよい=ここで待たない」を宣言し、待ち方は後段へ置き、foreground 実行の
708
+ 禁止を案内本文へ含める。従来は「即返る」の直後に完了待ち手順が続き、dispatch→wait が
709
+ 一続きの手順に見えて親がブロックする使い方へ流れていた(ADR 0017)。
710
+ - 完了待ちの起動形を親ホスト別に名指しするようにした。MCP initialize の `clientInfo.name`
711
+ が `claude-code` の時は receipt に `Bash(command: ..., run_in_background: true)` を出す。
712
+ 取れない/未知のホストは汎用の非ブロック指示へ落ちる。抽象名詞の
713
+ 「ホストのバックグラウンドタスクとして実行」だけでは親が foreground 実行へ落ちるため。
714
+ - 未完了 session へ触れた時の復旧案内も同じ文型へ揃えた。取りこぼしゼロの `--cursor 0` は維持する。
715
+
716
+ ### Unchanged
717
+
718
+ - `aiterm-wait` の既定 timeout・exit 契約・outcome 語彙・公開 schema・完了判定は変更なし。
719
+ 待つ主体は waiter プロセスであって親ではない、が本変更の分界。
720
+
721
+ ## [0.19.2] - 2026-07-20
722
+
723
+ ### Fixed
724
+ - Native Windows factory diagnostics now report `session_count: null` when
725
+ the WSL-backed tmux server is not running and `pty_list.status` is
726
+ `not_applicable`. This restores the published status/count invariant and
727
+ lets strict factory adapters distinguish an absent session set from a
728
+ verified empty list.
729
+
730
+ ## [0.19.1] - 2026-07-19
731
+
732
+ ### Fixed
733
+ - Ordinary PTY sends no longer let a pager or REPL started by an earlier line
734
+ consume the beginning of later lines from the same multiline payload. When
735
+ the foreground process is a POSIX shell, sanitized multiline text is encoded
736
+ as one newline-free `eval` input, so the shell owns the complete script before
737
+ execution begins. Single-line input, raw byte sends, and non-shell frontends
738
+ keep their existing direct-paste behavior.
739
+
740
+ ## [0.19.0] - 2026-07-19
741
+
742
+ ### Added
743
+ - New `claude_approval` tool for managed Claude permission prompts. `inspect`
744
+ binds the currently visible `Do you want to proceed?` UI to the active
745
+ operation and a SHA-256 screen digest; `respond` relays only
746
+ `approve_once` or `deny` while that same operation and digest remain
747
+ current. Anonymous `pty_send` turns are supported with a null operation ID.
748
+ - Approval decisions are recorded as an owner-only, prompt-free structured
749
+ receipt and cleaned up with the managed session.
750
+
751
+ ### Fixed
752
+ - Managed Claude turns no longer deadlock when Claude Code requests a normal
753
+ permission confirmation. Previously active-operation protection rejected
754
+ raw `pty_send(force:true)` and every `pty_key` except `C-c`, leaving no
755
+ supported way to answer the UI and therefore no Stop event.
756
+ - The documented `force:true` manual-intervention escape now states its real
757
+ boundary: it does not bypass an active managed-Claude operation. Arbitrary
758
+ text, persistent-allow choices, unknown prompt layouts, operation mismatch,
759
+ and screens changed after inspection fail explicitly.
760
+
761
+ ### Changed
762
+ - The public MCP surface is now 13 tools. Package, lockfile, server manifest,
763
+ English/Japanese README, contributor guide, design docs, and release
764
+ metadata are synchronized at `0.19.0`.
765
+
766
+ ## [0.18.2] - 2026-07-18
767
+
768
+ ### Fixed
769
+ - Managed Codex homes now snapshot-copy `agents/*.toml` custom-role
770
+ definitions from the source `CODEX_HOME`. Symlinked definitions are resolved
771
+ into private regular-file copies, so `codex_agent` sessions can discover the
772
+ same custom roles without sharing mutable sessions, caches, or other home
773
+ state. A missing or empty source `agents/` directory remains valid.
774
+ - Hook trust state is deliberately not copied as a separate credential/state
775
+ artifact: aiterm's launch-owned Stop hook already uses
776
+ `--dangerously-bypass-hook-trust` for that process. Project directory trust
777
+ remains a separate safety gate and continues to come from the private
778
+ `config.toml` snapshot; an untrusted cwd is not auto-approved.
779
+
780
+ ## [0.18.1] - 2026-07-18
781
+
782
+ ### Fixed
783
+ - The `aiterm-wait` / agent-metadata "not a managed session" error still
784
+ suggested launching with `codex_agent(agent_done:true)` — an argument
785
+ removed in v0.16 (launchers are always managed). It now points to the
786
+ launchers themselves.
787
+
788
+ ## [0.18.0] - 2026-07-18
789
+
790
+ ### Added
791
+ - **Submit-strand observation** (`submit_residue`, additive nullable). Field
792
+ report: a managed Codex child hung during MCP initialize; the initial prompt
793
+ stayed **unsubmitted in the composer** for 2h18m while the TUI kept showing
794
+ "Working", and nothing surfaced it. After every agent dispatch (initial
795
+ prompt and follow-up), aiterm now runs a bounded screen poll for the sent
796
+ text's tail lingering in the composer region (below the last input-marker
797
+ line). `aiterm.pty-send-result.v1`, `aiterm.agent-launch-result.v1`,
798
+ `aiterm.claude-operation-result.v1` (issue) and the
799
+ dispatch hint carry the observation: `true` = residue confirmed (submit
800
+ likely did not take effect; the hint explains recovery via
801
+ `pty_key Enter` / `Escape`), `false` = no residue observed (not a proof of
802
+ submission), `null` = not applicable / undecidable. Positive evidence only —
803
+ no auto-retry, no silent fallback.
804
+ - Agent prompt injection now pastes with tmux `paste-buffer -p` (bracketed
805
+ paste). tmux negotiates: panes that requested bracketed-paste mode (the
806
+ vendor TUIs) receive the text wrapped in `ESC[200~/201~` — per paste chunk
807
+ (macOS splits long prompts into 256-byte chunks, so a long prompt arrives as
808
+ several consecutive bracketed pastes) — which hardens pastes against
809
+ mid-word key-interpretation corruption and
810
+ dropped submits; panes that did not request it receive the text unchanged.
811
+ Regular shell `pty_send` behaviour is untouched. Byte-level regression fixed
812
+ in `test/core-tmux.test.mjs`.
813
+
814
+ ### Changed
815
+ - The pre-initial-prompt TUI ready gate no longer counts a Codex/Claude screen
816
+ as ready while it shows a busy indicator ("esc to interrupt"), closing the
817
+ window where the initial prompt was pasted into a TUI whose startup work
818
+ (e.g. MCP initialize) was still running behind a visible composer.
819
+ Grok/Composer keep the previous gate (no captured busy-string evidence yet).
820
+
821
+ ### Fixed
822
+ - Removed stale v0.15-era guidance from six error/hint messages that still
823
+ told the caller to retry `pty_send(wait:"agent_done")` — an argument that no
824
+ longer exists since v0.16. They now point to the actual v0.17 procedure
825
+ (`aiterm-wait --cursor 0` for initial-prompt completion — cursor 0 is safe
826
+ because the event file is per-launch, and omitting `--cursor` would start at
827
+ the waiter's EOF and could skip an already-written done event — plain
828
+ `pty_send` dispatch, `pty_open` for manual operation).
829
+
830
+ ## [0.17.0] - 2026-07-18
831
+
832
+ ### Changed (BREAKING)
833
+ - `aiterm-wait` exit codes now mirror the receipt's `outcome` so exit status
834
+ alone can never be misread as completion: `0` = `done`, `3` = `timeout`
835
+ (turn **not** finished; default `--timeout` is 600 s), `4` = `closed`,
836
+ `1` = error. Previously every observed outcome exited `0`. The receipt's
837
+ `outcome` remains authoritative.
838
+
839
+ ### Added
840
+ - `aiterm.agent-launch-result.v1` gains two additive nullable fields:
841
+ `event_cursor` and `wait_command` (a copy-pasteable
842
+ `aiterm-wait --session <id> --cursor <n>`), non-null exactly when the launch
843
+ carried an initial `prompt` (a turn is in flight from launch). Durable
844
+ callers no longer need to discover the completion procedure from other
845
+ tools' descriptions.
846
+
847
+ ### Fixed
848
+ - Tool descriptions, launch/dispatch hints, and not-yet-complete errors no
849
+ longer imply that an `aiterm-wait` exit means completion. All four launcher
850
+ descriptions now state the completion procedure; `pty_read(agent_transcript)`
851
+ "not complete yet" errors point to the `aiterm-wait` background run instead
852
+ of leaving the caller to poll.
853
+
854
+ ## [0.16.0] - 2026-07-18
855
+
856
+ ### Changed (BREAKING)
857
+ - **The blocking wait surface is gone.** A parent agent never blocks on aiterm:
858
+ - `pty_send` no longer accepts `wait` / `timeout` / `screen` / `lines` /
859
+ `operation_id`. Sending to an agent session is now automatically a
860
+ **dispatch**: the TUI ready gate and submit separation still run, the call
861
+ returns immediately, and the result envelope
862
+ (`aiterm.pty-send-result.v1`, `mode: "sent" | "agent_dispatch"`) carries an
863
+ `event_cursor` — the event-file boundary taken just before the send.
864
+ Completion is observed by running
865
+ `aiterm-wait --session <id> --cursor <event_cursor>` as a host background
866
+ task (its exit is the push notification); results are collected with
867
+ `pty_read(agent_transcript: true)` or `claude_turn recover` as before.
868
+ `force: true` bypasses dispatch for manual intervention on non-Claude
869
+ agent sessions. An active managed-Claude turn remains protected; v0.19.0
870
+ adds the dedicated approval relay for its permission UI.
871
+ - `claude_turn issue` no longer takes `timeout`; it is dispatch-only and
872
+ returns `accepted` immediately. Recovery semantics are unchanged.
873
+ - Launchers (`claude_agent` / `codex_agent` / `grok_agent` /
874
+ `composer_agent`) no longer accept `agent_done` / `wait` / `timeout` /
875
+ `screen` / `lines`. **Every launch is managed** (Stop-hook completion
876
+ detection installed); an initial `prompt` is submitted through the ready
877
+ gate and the launcher returns without waiting. For raw manual TUI driving,
878
+ open a plain `pty_open` session and start the vendor CLI yourself.
879
+ - `aiterm-wait` gained `--cursor <n>` so the waiter can start after the
880
+ dispatch without missing a completion (start-order independent for every
881
+ vendor, not just Claude's `--operation`).
882
+
883
+ ### Fixed
884
+ - tmux is now always spawned with a UTF-8 `LC_CTYPE` when the effective locale
885
+ is unset or plain `C`/`POSIX` (common for GUI-launched MCP clients). A tmux
886
+ server started under a C locale corrupts multibyte input — dropped and
887
+ reordered bytes in `send-keys`/paste (Japanese prompts garbled) — and a C
888
+ locale client sanitizes tabs in `list-sessions -F` output to `_`, which
889
+ silently broke the `pty_list` agent column. Explicit non-C locales (including
890
+ `C.UTF-8`) are respected; a stale `LC_ALL=C` is dropped so the injection can
891
+ take effect. Note: an already-running tmux server keeps its startup locale
892
+ until restarted.
893
+
894
+ ## [0.15.0] - 2026-07-18
895
+
896
+ ### Added
897
+ - Interactive Claude Code sessions now use the same persistent, user-visible
898
+ PTY model as the other agent launchers. Managed turns correlate a durable
899
+ caller operation ID through dispatch, Stop result, timeout recovery, and
900
+ transcript read without re-sending the prompt.
901
+ - `pty_close` now returns an `aiterm.pty-close-result.v1` structured receipt
902
+ with `closed` or `already_closed`. Retrying the same session ID after an MCP
903
+ response loss therefore recovers the terminal close outcome exactly.
904
+ - New `aiterm-wait` binary for fire-and-forget ("B-style") orchestration: it
905
+ observes the vendor Stop-hook completion event as a pure reader and exits with
906
+ a one-line `aiterm.agent-wait-result.v1` receipt (`done` / `timeout` /
907
+ `closed`). Run it as a parent harness background task so a completion becomes a
908
+ process exit — a harness that re-invokes its agent on background-task exit
909
+ (Claude Code) is woken with zero polling, and the parent tool call never
910
+ blocks. The waiter takes no locks and never writes session or dispatch state,
911
+ so any number run beside the MCP server and beside each other; `--operation`
912
+ makes Claude recovery start-order-independent. Backed by the exported
913
+ `observeAgentDone()` core primitive. A Codex parent has no equivalent
914
+ wake-on-completion hook yet (upstream openai/codex#17543 / #18056), so it keeps
915
+ using the blocking wait or manual recovery.
916
+
917
+ ## [0.12.3] - 2026-07-14
918
+
919
+ ### Fixed
920
+ - Grok/Composer `agent_done` launches now pass the validated canonical OAuth
921
+ file through vendor-owned `GROK_AUTH_PATH`. The per-launch isolated homes no
922
+ longer symlink auth/lock files that Grok's atomic replacement can detach from
923
+ the real credential store; refresh and browser approval now persist to the
924
+ normal credential without weakening hook/config isolation.
925
+ - PTY text delivery now loads uniquely named tmux buffers through stdin. macOS
926
+ uses UTF-8-safe 256-byte paste chunks to avoid the observed long-input PTY
927
+ truncation, while Linux and WSL keep a single bounded paste. Per-session
928
+ cross-process locks prevent concurrent sends from interleaving, inputs above
929
+ 64 KiB fail before any bytes are sent, and partial failures never press Enter
930
+ automatically. A stale send lock fails closed until the session is stopped,
931
+ avoiding unsafe automatic-recovery ABA races. Runtime capability discovery preserves exact control bytes
932
+ and line feeds across older tmux (without `paste-buffer -S`) and newer tmux
933
+ (where `-S` disables the new `vis(3)` conversion).
934
+ - Runtime error-store contention no longer misclassifies ordinary hostile
935
+ error text as a replaced lock entry; only typed disappearance/replacement
936
+ races are skipped, while malformed ownership/mode/link state still fails
937
+ loudly.
938
+
939
+ ## [0.12.2] - 2026-07-13
940
+
941
+ ### Added
942
+ - `diagnostics`: a read-only, machine-readable factory diagnostic that reports
943
+ package version, MCP call readiness, a privacy-safe PTY-list summary, and
944
+ optional Codex/Grok launcher availability. It never launches a PTY or agent,
945
+ and excludes paths, environment values, credentials, command text, terminal
946
+ output, and raw logs. Optional unset dependencies report `not_applicable`;
947
+ indeterminate probes report `unverified`.
948
+ - Product-owned local runtime error aggregation and the `aiterm-runtime-errors`
949
+ snapshot/ack/resolve/reopen CLI. Collection is explicit opt-in through the
950
+ canonical dotagents `collection.enabled` JSON boolean; the store is offline,
951
+ accepts only fixed error codes/templates, preserves unacknowledged records,
952
+ and exposes only bounded privacy-safe status through `diagnostics`.
953
+ MCP-side collection/diagnostics run in timeout-bounded child processes;
954
+ persisted input is exact-validated with fingerprint recomputation; locks bind
955
+ PID/start identity/token; permissions are revalidated; and typed ownership
956
+ prevents lower PTY failures from being counted again as launcher failures.
957
+ - Collection is disabled by default and the local store performs no network I/O.
958
+ Public commit `239e7e4`, provenance CI `29245251184`, npm `latest`, tag /
959
+ GitHub Release, MCP Registry workflow `29245462227`, and a registry-derived
960
+ isolated install were verified.
961
+
962
+ ### Fixed
963
+ - `aiterm-runtime-errors` now recognizes npm's POSIX bin symlink as its direct
964
+ entrypoint, preventing a successful empty response from packed/global installs.
965
+
966
+ ## [0.12.1] - 2026-07-11
967
+
968
+ Hardening sweep that clears the audit's remaining low-priority notes
969
+ (`docs/11` section C — now fully consumed). Regression suite 203 → 205.
970
+
971
+ ### Fixed
972
+ - Stop hooks now check the `writeSync` return value when appending an event
973
+ line; a short write (e.g. ENOSPC) is truncated back to the pre-write size
974
+ and reported, so a fragment can never corrupt the next event line.
975
+ - `latestAgentDoneEvent` no longer goes silently blind when the events file
976
+ exceeds 1 MB: it now reads a bounded 64 KB tail (dropping the first partial
977
+ line), so `agent_event_seen` / `last_turn_id` metadata stays live on
978
+ long-lived agent sessions — and mid-size files are read more cheaply than
979
+ before (the old path read the whole file up to 1 MB on every read).
980
+ - Non-agent sessions no longer pay the agent-metadata directory probe on
981
+ every `pty_read`: a 2-second in-process negative cache (absence-only,
982
+ read-suffix path only, invalidated on `openAgent`/`closeSession`/`killAll`)
983
+ skips the redundant filesystem work.
984
+
985
+ ## [0.12.0] - 2026-07-11
986
+
987
+ Full-repo adversarial audit (multi-agent find → adversarial refutation → live
988
+ smoke) plus the fixes and one feature that survived it. Design record and
989
+ rejection ledger: `docs/archive/11_audit-2026-07-11.md`; transcript-read design:
990
+ `docs/archive/12_agent-transcript-read-plan.md`. Regression suite 183 → 203.
991
+
992
+ ### Added
993
+ - `pty_read({ agent_transcript: true })` recovers an agent session's most
994
+ recently completed turn's final assistant message, in plain text, from the
995
+ vendor's structured session transcript (JSONL under the managed home). This
996
+ fixes the case where a long agent answer is truncated by the `wait:
997
+ "agent_done"` screen tail (pane height ≈ 24 lines). Codex joins on the Stop
998
+ hook `turn_id`; Grok/Composer take the assistant rows after the last
999
+ non-synthetic user row. The extracted text is bounded through the normal
1000
+ reduction pipeline. Mutually exclusive with `screen`/`full`/`rtk`/
1001
+ `line_range`/`wait` (`lines` is allowed). Missing transcript / non-agent
1002
+ session / no extractable message are explicit errors, never a silent empty.
1003
+ - `pty_list` now appends agent metadata (`agent=<kind> agent_done=true`, plus
1004
+ `vendor_session_id` once bound) to agent session rows, so a resumable
1005
+ Codex/Grok/Composer session is distinguishable after an MCP server restart.
1006
+ Plain shell rows are unchanged.
1007
+ - `codex_agent` launch responses now surface the inherited managed-config
1008
+ reality: `managed config: mcp_servers <N> 個継承 / approval_policy=… /
1009
+ sandbox_mode=… / hook trust bypass 有効`. The inheritance itself is the
1010
+ intended design (the child matches the terminal's Codex behavior); this only
1011
+ makes its consequences visible so a "review-only" child isn't silently
1012
+ full-access.
1013
+
1014
+ ### Fixed
1015
+ - Agent `wait` file locks now reclaim stale locks. A lock left behind by a
1016
+ crashed/killed waiter (the pid recorded in the lock is dead, or the lock is
1017
+ old and unreadable) no longer rejects `wait:"agent_done"` on that session
1018
+ forever; the live-pid check (`process.kill(pid, 0)`) reclaims dead locks and
1019
+ fails safe (rejects) when liveness is indeterminate. `closeSession`/`killAll`
1020
+ now also honor a live cross-process wait lock (previously only the in-process
1021
+ set), with the holder pid in the message. Agent metadata writes are now
1022
+ atomic (temp + rename).
1023
+ - `reduceOutput` now bounds over-long single lines (head + tail with a restore
1024
+ hint), so a few huge lines — e.g. a full-screen TUI's absolute-cursor repaint
1025
+ stream — no longer slip past the line-count fold and blow the response token
1026
+ budget. Line count and order are preserved (the `line_range` domain is
1027
+ unchanged); `raw: true` is untouched.
1028
+ - Reading from a mid-multibyte offset (full/range 8 MB truncation and the
1029
+ incremental path) no longer emits a leading U+FFFD; the skipped bytes are
1030
+ accounted into the next offset.
1031
+ - The pytest reducer returns `null` (falls back to generic) when the output has
1032
+ no pytest evidence, instead of replacing an unrelated command's output with a
1033
+ fabricated "Pytest: No tests collected". `classify` is unchanged, so genuine
1034
+ pytest wrappers still reduce; the six golden fixtures stay byte-exact. Empty
1035
+ input now yields `null` too.
1036
+ - The destructive-command tripwire now absorbs a `--` option terminator
1037
+ (`rm -rf -- /` was previously waved through), and `pty_send({ rtk: true })`
1038
+ re-checks the tripwire against the post-`rtk`-rewrite text before sending.
1039
+ - `pty_read` with an inverted `line_range` (`"5:3"`) is now an explicit error
1040
+ instead of a silent empty result.
1041
+ - Quiescence detection no longer mis-attributes a completion when output
1042
+ arrives during the foreground-shell probe: the size samples are from the
1043
+ past while the `pane_current_command` check is now, and output landing in
1044
+ that gap used to be returned as `via quiescent` even though a `mark`
1045
+ sentinel (or `until` match) was already in the log. The stability window is
1046
+ now re-validated (re-stat) after the probe; if the log grew, the loop
1047
+ re-runs and the sentinel/`until` claims the completion. Found by CI on slow
1048
+ macOS runners (the B1 regression test), where the `sleep 0.6` margin over
1049
+ the 0.5 s quiescence window was routinely blown.
1050
+ - The `force` / `mark` argument descriptions now state their full effect
1051
+ (`force` also lifts the initial-prompt mixing guard; `mark` needs `enter` to
1052
+ actually run the sentinel). Codex managed-config pin overrides now also match
1053
+ quoted TOML keys.
1054
+
1055
+ ### Tests
1056
+ - Added `tools/call` dispatch coverage to the smoke test (unknown tool, bad
1057
+ args, inverted `line_range` — all `isError`), plus regressions for wait-lock
1058
+ reclamation, transcript recovery (both vendor shapes), the line/byte guards,
1059
+ and the tripwire gaps.
1060
+
1061
+ ## [0.11.0] - 2026-07-11
1062
+
1063
+ ### Added
1064
+ - Agent launchers accept a `model` argument. `codex_agent` passes it as `-m`
1065
+ and, when `agent_done: true` creates a managed `CODEX_HOME`, explicitly
1066
+ passed `model` / `reasoning_effort` values also rewrite the corresponding
1067
+ top-level pins in the managed `config.toml` copy, so terminal pins (for
1068
+ example an `ultra` effort pin, which enables proactive multi-agent
1069
+ delegation) no longer silently leak into interactive children.
1070
+ `grok_agent` / `composer_agent` use it to override `--model`.
1071
+ - Codex launch responses now state the effective model and effort with their
1072
+ origin — argument, terminal-config inheritance, or CLI default — and warn
1073
+ explicitly when the effective effort is `ultra`.
1074
+
1075
+ ### Changed
1076
+ - `grok_agent` default model moved from the stale `grok-build` slug to
1077
+ `grok-4.5` (`grok-build` no longer exists in the live model catalog).
1078
+ - `grok_agent` / `composer_agent` now reject `reasoning_effort` with a clear
1079
+ error before creating a session, instead of forwarding `--effort` to the
1080
+ interactive TUI where the grok CLI warns and ignores it (the flag is
1081
+ headless-only, and Composer does not support reasoning effort at all). The
1082
+ former `low/medium/high/xhigh/max` enum on these tools is gone; `codex_agent`
1083
+ keeps an unconstrained string (CLI-version dependent, up to `ultra`).
1084
+
1085
+ ## [0.10.0] - 2026-07-09
1086
+
1087
+ ### Added
1088
+ - Codex launcher initial-prompt waits: `codex_agent` now exposes `wait`,
1089
+ `timeout`, `screen`, and `lines` for the launch-time `prompt`.
1090
+ `prompt + wait: "agent_done"` starts the persistent TUI first, waits for the
1091
+ TUI input area, submits the initial prompt, and waits for that first turn's
1092
+ Stop hook. `wait: "agent_done"` requires both `prompt` and
1093
+ `agent_done: true`; it does not implicitly enable hooks. Grok/Composer
1094
+ initial-prompt waits are intentionally not exposed until the post-OAuth smoke
1095
+ passes; their existing follow-up `pty_send(wait:"agent_done")` route remains
1096
+ unchanged.
1097
+ - Agent-session reads now include auxiliary metadata such as
1098
+ `initial_prompt`, `agent_event_seen`, `completion_attribution=none`,
1099
+ `last_turn_id`, and a best-effort `frontend` hint. Stale hook events are not
1100
+ promoted to `is_complete=True`.
1101
+
1102
+ ### Fixed / Hardened
1103
+ - Codex initial launcher prompts are no longer placed on the shell command line
1104
+ in the MCP launcher path, avoiding shell continuation display for long or
1105
+ multiline prompts. If the TUI is blocked before input, for example on a
1106
+ vendor login screen, the prompt is not sent and the launcher returns the
1107
+ session with `initial_prompt=not_sent`.
1108
+ - Ordinary `pty_send` now refuses to type into a session while a launch-time
1109
+ initial prompt is still `pending` or `sent`, preventing follow-up input from
1110
+ mixing into the same live TUI turn. Manual takeover is still possible with
1111
+ `pty_key` or intentional `pty_send(..., force:true)`.
1112
+ - Post-launch initial-prompt failures preserve the created `session_id` in the
1113
+ error text, so the caller can inspect or recover the remaining session instead
1114
+ of losing the handle.
1115
+
1116
+ ### Changed
1117
+ - Synced release-facing documentation, RAG notes, and distribution playbooks to
1118
+ the `v0.10.0` state after adversarial documentation verification.
1119
+ - Added release metadata version-sync coverage so `package.json`,
1120
+ `package-lock.json`, and `server.json` stay aligned after release hardening.
1121
+
1122
+ ### Docs / Verification
1123
+ - Rechecked the public docs against npm/global install/Official MCP Registry
1124
+ state, current CI shape, and the **177-test** regression suite.
1125
+ - Verified real Codex launcher `prompt + agent_done:true + wait:"agent_done"`
1126
+ smoke for single-line, long Japanese, and multiline Japanese prompts.
1127
+ - Attempted the internal Grok/Composer initial-prompt route before exposing it;
1128
+ the current environment stopped at OAuth browser approval and correctly
1129
+ returned `initial_prompt=not_sent` without sending the prompt. Public schema
1130
+ therefore remains Codex-only for launch-time initial-prompt waits.
1131
+ - Archived completed planning/checklist documents so `docs/` keeps only live
1132
+ docs and current operational notes at top level.
1133
+
1134
+ ## [0.9.1] - 2026-07-07
1135
+
1136
+ ### Fixed / Hardened
1137
+ - Codex `agent_done` managed `CODEX_HOME` now allowlists only the required
1138
+ normal-home files: `auth.json` is linked for authentication and `config.toml`
1139
+ is copied privately. Other normal `~/.codex` entries are no longer symlinked
1140
+ into the managed home, reducing write-through side effects while still keeping
1141
+ aiterm-owned Stop hooks isolated from the user's normal `hooks.json`.
1142
+
1143
+ ## [0.9.0] - 2026-07-07
1144
+
1145
+ ### Added
1146
+ - **Hook-backed agent turn completion**: `codex_agent` / `grok_agent` /
1147
+ `composer_agent` can opt into `agent_done: true`, and `pty_send` now accepts
1148
+ `wait: "agent_done"` to wait for the launched agent CLI's turn boundary before
1149
+ returning the final terminal observation. This adds no new tools; it keeps the
1150
+ existing persistent-PTY model and uses vendor Stop hooks only as the completion
1151
+ boundary.
1152
+ - `pty_send` schema fields for agent waits: `wait`, `timeout`, `screen`, and
1153
+ `lines`. `wait: "none"` remains the default and preserves the existing send
1154
+ behavior.
1155
+ - Managed Codex/Grok/Composer hook route: launch-local vendor homes install
1156
+ aiterm-owned Stop hooks without editing the user's normal hook files. Grok and
1157
+ Composer isolate `GROK_HOME` / `HOME` to suppress compat hook and plugin
1158
+ contamination while sharing the normal Grok home's `auth.json` and
1159
+ `auth.json.lock` as a pair.
1160
+
1161
+ ### Fixed / Hardened
1162
+ - Prevent stale or unrelated hook events from completing the wrong turn:
1163
+ `launch_id`, `vendor_session_id`, initial prompt completion, pre-send EOF, and
1164
+ post-bind missing/null vendor ids are all guarded.
1165
+ - Wait for the launched agent TUI to reach its input prompt before the first
1166
+ unbound `pty_send(wait:"agent_done")`; if the TUI is not ready, aiterm now
1167
+ fails before sending text instead of dropping input and later timing out.
1168
+ - Reject concurrent `wait:"agent_done"` calls for the same session across both
1169
+ in-process and cross-process MCP server instances with an agent wait lock file.
1170
+ - Harden hook event files and Grok auth lock handling against symlink/hard-link
1171
+ attacks, loose state directories, malformed or oversized JSONL, and cleanup
1172
+ that could otherwise follow symlink targets.
1173
+ - Treat a configured but missing `XDG_RUNTIME_DIR` as unusable and fall back to
1174
+ the normal temp dir for agent state, matching CI and non-login Linux shells.
1175
+ - Improve screen settling after hook completion so an old stable screen is not
1176
+ returned before the agent's rendered output catches up.
1177
+
1178
+ ### Docs / Tests
1179
+ - Documented `agent_done` usage, limits, and platform support in README,
1180
+ design docs, ADR, and RAG. `agent_done` is supported on Linux, WSL2, and
1181
+ macOS; native Windows keeps the core PTY tools and agent launchers but not
1182
+ `agent_done` yet.
1183
+ - Expanded regression coverage to **167 tests**, including hook wrappers,
1184
+ managed homes, event parsing, race/security cases, MCP schema, and screen
1185
+ settle / TUI-ready behavior.
1186
+ - Verified real MCP `tools/call` smoke for Codex, Grok, and Composer
1187
+ `agent_done` plus a normal Python REPL PTY smoke.
1188
+
1189
+ ## [0.8.0] - 2026-07-05
1190
+
1191
+ ### Fixed (全域監査スイープ 2026-07-05 — 詳細は docs/archive/03_audit-sweep-2026-07.md)
1192
+ - **pytest 収集エラーの誤変換**: `read rtk:true` で pytest の収集エラー(import 失敗等)が
1193
+ `Pytest: No tests collected` や `Pytest: 1 passed` に潰れ、赤を無害/緑と誤読していた問題を修正(C1)。
1194
+ - **mark 完了検出のエコー誤爆**: `pty_send(mark:true)` の sentinel がコマンドエコーに部分一致し、
1195
+ 長時間コマンドで早期に「完了」と偽っていた問題を修正。数字アンカー sentinel で自動検出(B1)。
1196
+ - **エージェント起動の破壊ゲート誤爆**: `codex_agent`/`grok_agent`/`composer_agent` の初手 prompt に
1197
+ `rm -rf /`・`git reset --hard` 等の語を含めると起動が拒否されていた誤検知を解消(A4)。
1198
+ - **破壊ゲートのすり抜け**: `rm -rf ./*`・`rm -rf "/"`・`rm -rf ..`・`rm -rf ./` を遮断対象に追加(B2)。
1199
+ - **セッションログの復活**: 外部 kill 後に残った同名ログを新規出力として返す問題を truncate で修正(B5)。
1200
+ - **UTF-8 境界分断 / DCS・APC 残存**: 増分読みの文字境界丸めと制御シーケンス除去を強化(B3/B10)。
1201
+ - エージェント起動の Windows 対応(bin/cwd の WSL パス変換)・env bin 実在検証・cwd の空/`~` 検証(A1/A3/A6)。
1202
+ - reducer の分類/除去精度(stripShellFrame の過剰除去、`python3 -m pytest`・`uv/poetry run` 等の分類)(C2-C6)。
1203
+
1204
+ ### Changed
1205
+ - **`pty_read` の `until` を既定でリテラル部分一致に**(従来は正規表現直解釈)。`$ ` や `[..]` 等が
1206
+ メタ化して永遠に待つ事故を防ぐ。正規表現が必要なときは `until_regex: true` でオプトイン(B4)。
1207
+ - `pty_send(mark:true)` は `pty_read(wait:true)` が until 無しでも完了を自動検出するように(B1)。
1208
+ - `pty_read` の `screen+wait`(完了後に画面取得)・`full+lines`(末尾 N 行)を機能化(従来は黙殺)(B11)。
1209
+ - 読み取り・完了検出のメモリ/tmux spawn を削減(fd 範囲読み・伸長中の生存確認省略)(B6/B7)。
1210
+
1211
+ ### CI / Infra
1212
+ - ネイティブ Windows CI(windows-latest, Node 20/22, 非ブロッキング)を追加。純粋層を検証(C9)。
1213
+ - registry publish が npm publish の完了を待つ/再 publish は idempotent にスキップ(C10/C11)。
1214
+ - テストのタイミング依存(固定 sleep・smoke の timeout 挙動)を解消しフレイキーを除去(C8)。
1215
+
1216
+ ### Added
1217
+ - `.github/workflows/registry.yml`: publishes `server.json` to the Official MCP
1218
+ Registry via GitHub OIDC (on release, or manual dispatch). aiterm-mcp is now
1219
+ listed in the Official MCP Registry (which auto-propagates to PulseMCP and the
1220
+ GitHub MCP Registry) and on mcp.so.
1221
+ - `.github/avatar.svg` + `.github/avatar.png`: square avatar mark (terminal
1222
+ `>_` prompt) for directory listings and social cards.
1223
+
1224
+ ### Changed (metadata)
1225
+ - CI: bump `actions/checkout` and `actions/setup-node` to v5 (the Node 20 action
1226
+ runtime is being removed from GitHub Actions).
1227
+
1228
+ ## [0.7.1]
1229
+
1230
+ Codex 独立レビュー(gpt-5.5 high・実 CLI 検証つき)の指摘5件+追加発見2件の修正。
1231
+
1232
+ ### Fixed
1233
+ - **`openAgent` が失敗時に session を残さない**: 前提検証(effort → CLI bin → cwd)を session
1234
+ 作成前に完了させ、起動コマンド投入(send)が失敗した場合は作成済み session を片付けてから
1235
+ エラーを伝える。特に cwd 不存在は従来 `cd` がシェル内で静かに失敗し「起動した」と偽の成功を
1236
+ 返していた——事前検証で明示エラーに。
1237
+ - **`reasoning_effort` の検証**: grok/composer は有限集合(low/medium/high/xhigh/max)を
1238
+ スキーマ(z.enum)と core の両方で拒否(session 作成前)。codex は CLI 側の値集合が版で
1239
+ 変わるため縛らない。
1240
+ - **`pipe-pane` の失敗を検知**: 従来は戻り値を無視して成功を装い、以後の `pty_read` が永遠に
1241
+ 空を返した。失敗時は作成した session を破棄して明示エラー。
1242
+ - **自動採番の高並行スケール**: 線形 t{i} リトライは全員が同じ「最小の空き番号」に殺到して
1243
+ 上限20回でも枯渇し得た。衝突時は乱数 nonce 名(`t-xxxxxx`・1600万空間)へ切替え。
1244
+ 実測: 20プロセス同時 open で 20/20 成功・全一意。
1245
+ - **smoke テストの期待値置き去り**: v0.7.0 で agent ツール3個を追加した際にツール一覧の期待値を
1246
+ 更新し忘れテストが赤のままだった(6→9 ツールに更新)。
1247
+
1248
+ ### Changed
1249
+ - `codex_agent` の説明を実態に合わせた: 「gpt-5.5」固定の断定を外し「モデルは Codex CLI の既定」
1250
+ に(実装は `-m` を渡していないため。モデル固定が要るなら将来 model 引数を追加する)。
1251
+
1252
+ ### Added
1253
+ - `test/core-agent.test.mjs`: openAgent の前提検証・残骸ゼロ保証の characterization テスト4本
1254
+ (CODEX_BIN 偽装で CLI 未導入環境でも走る・隔離ソケット)。
1255
+
1256
+ ## [0.7.0]
1257
+
1258
+ ### Added
1259
+ - **対話型エージェント起動ツール**(モデルごとに1つ=ツール名/説明でどのモデルか一目瞭然):
1260
+ - `codex_agent` — Codex (OpenAI・モデルは Codex CLI の既定) の対話 TUI を永続端末に起動
1261
+ - `grok_agent` — Grok Build の Grok モデル (grok-build) の対話 TUI を起動
1262
+ - `composer_agent` — Grok Build の Composer モデル (grok-composer-2.5-fast) の対話 TUI を起動
1263
+ いずれも session_id を返し、以後は `pty_read`/`pty_send` で対話操作する(=aiterm の対話パラダイム)。
1264
+ `reasoning_effort`(思考レベル)・`cwd`・`prompt`(初手)・`session_name` を引数で受ける。
1265
+
1266
+ ### Changed
1267
+ - `openSession` の自動採番を並行安全化: 複数エージェントが同時に名前なし open した際の TOCTOU
1268
+ 競合を、衝突時に静かに次名でリトライして解消(明示名は従来どおり既存でエラー=意図的共有と区別)。
1269
+
1270
+ ### Removed
1271
+ - `delegate` tool(v0.5.0-0.6.0)を撤去。非対話ワンショットは aiterm(対話型端末)の責務でなく、
1272
+ 非対話 codex 委譲は codex-sidecar(codex_work/review/generate 等)が担う。aiterm は対話に専念。
1273
+
1274
+ ## [0.6.0]
1275
+
1276
+ ### Added
1277
+ - `delegate` tool に `backend`(codex|grok)パラメータ: MODELS.md の第一選択(Codex=OpenAI枠/Grok
1278
+ Build=xAI枠)に構造を合わせた。**codex は稼働**、**grok は要 `grok login`+非対話呼び出しの実測が
1279
+ 未完のため明示的に「未確定」を返す**(動くフリを避ける。login+実測後に有効化)。
1280
+
1281
+ ### Changed
1282
+ - `delegate` の出力を整形: codex の生 stdout(思考過程・セッションメタ込みで巨大)でなく、
1283
+ `codex exec --output-last-message` でエージェントの**最終メッセージだけ**を回収して返す
1284
+ (review 出力が 60k字→数十字に。空/失敗時のみ生出力へ明示フォールバック)。
1285
+
1286
+ ## [0.5.0]
1287
+
1288
+ ### Added
1289
+ - `delegate` tool: 実装の物量や独立レビューを Claude レート非依存の外部AI(Codex)へ委譲する。
1290
+ `mode=exec`(codex に実装させる・workspace-write)/`mode=review`(read-only レビューさせ指摘を返す)。
1291
+ 統括(Claude)のレート窓を温存する。`prompt`/`mode`/`cwd`/`timeout_sec` を取り、codex 未導入環境では
1292
+ 明示 no-op を返す(公開レジストリの他利用者を壊さない)。ロジックは `core.delegate`。
1293
+
1294
+ ## [0.4.1] - 2026-06-08
1295
+
1296
+ ### Changed
1297
+ - Discoverability metadata & docs (no code or behavior change from 0.4.0):
1298
+ added `mcpName` and an Official MCP Registry `server.json` manifest (npm /
1299
+ stdio), a Glama `glama.json` claim file, and expanded npm keywords
1300
+ (`mcp-server`, `claude-code`, `cursor`, `devtools`).
1301
+ - README (EN + JA) reworked for first-time visitors: leads with the
1302
+ SSH-persistence pitch, replaces the placeholder demo mock with **real captured
1303
+ `pty_read` output** (token-reduction and completion detection shown on genuine
1304
+ bytes), names comparison competitors, de-duplicates the install steps, and
1305
+ moves the constraints list below the fold.
1306
+
1307
+ ## [0.4.0] - 2026-06-02
1308
+
1309
+ ### Added
1310
+ - Nested completion early-return: while nested (ssh/docker/REPL foreground) with no `until`, `pty_read({ wait: true })` now returns `is_complete=False via nested` as soon as output settles, instead of waiting the full `timeout` for a signal that cannot fire there. The read advises passing `until` (a prompt regex) or `mark: true` for a confirmed completion. Certainty is unchanged (still none in that case) — only the wasted wait is removed.
1311
+
1312
+ ### Changed
1313
+ - `is_complete` is reported `True` only for confirmed completion layers (`until` / `dead` / `quiescent`); `timeout` and the new `nested` are reported `False`.
1314
+
1315
+ ## [0.3.1] - 2026-06-02
1316
+
1317
+ ### Changed
1318
+ - Documentation-only release so the npm package page reflects the refreshed README (Quickstart, Demo, and a clearer call to action). No code or behavior changes from 0.3.0.
1319
+
1320
+ ## [0.3.0] - 2026-06-02
1321
+
1322
+ Native macOS support. macOS previously rode the generic POSIX path (`isWin=false`)
1323
+ but was never verified on real hardware; this release closes the macOS-specific
1324
+ operational gaps in the tmux resolution layer. Verified on Apple Silicon
1325
+ (Homebrew tmux 3.6b): 92/92 tests plus a live E2E run (open / send / quiescence /
1326
+ mark+until / screen / list / close). The POSIX and Windows paths are unchanged.
1327
+
1328
+ ### Added
1329
+ - `resolveTmux()` in `src/core.ts`: resolves the tmux binary in the order
1330
+ `AITERM_TMUX` (explicit override) → `PATH` → Homebrew defaults
1331
+ (`/opt/homebrew/bin` on Apple Silicon, `/usr/local/bin` on Intel), then caches
1332
+ the result. This finds tmux even under GUI launch, where the default `PATH`
1333
+ lacks the Homebrew bin directory. When tmux is found off `PATH`, the chosen
1334
+ path is announced on stderr (no silent fallback).
1335
+ - CI `test-macos` job on `macos-latest` (Node 18/20/22, `brew install tmux`); the
1336
+ `publish` job now gates on `needs: [test, test-macos]`.
1337
+ - `test/core-resolve.test.mjs` covering the POSIX tmux-resolution negative path
1338
+ (a bad `AITERM_TMUX` yields a clear code-2 error instead of an empty-stderr
1339
+ failure; skipped on native Windows, which uses the WSL bridge).
1340
+
1341
+ ### Fixed
1342
+ - Missing tmux now produces a clear `brew install tmux` diagnostic instead of a
1343
+ cryptic empty-stderr failure; the `tmux()` `ENOENT` case is distinguished from
1344
+ a generic non-zero exit.
1345
+ - The bash 3.2 "switch to zsh" deprecation banner is suppressed via
1346
+ `new-session -e BASH_SILENCE_DEPRECATION_WARNING=1`. The `-e` flag is
1347
+ darwin-gated (and applied only when the shell is `bash`) because it requires
1348
+ tmux ≥ 3.2 and would break older Linux tmux.
1349
+
1350
+ ## [0.2.0] - 2026-06-02
1351
+
1352
+ Native Windows support via a WSL tmux bridge. Windows has no tmux, so every tmux
1353
+ call is bridged through `wsl.exe -e tmux`. The POSIX (Linux / WSL2 / macOS) path
1354
+ is behaviorally unchanged.
1355
+
1356
+ ### Added
1357
+ - Native Windows backend: all tmux invocations routed through `wsl.exe -e tmux`,
1358
+ with the control socket on the WSL-native filesystem and pipe-pane logs read
1359
+ back via `/mnt` (with a Windows-only settle step before declaring completion).
1360
+ Requires WSL with tmux installed inside it.
1361
+ - `toWslPath()` drive-path translation, plus `test/core-space-path.test.mjs`
1362
+ (pipe-pane capture under a space-containing temp path). The existing
1363
+ `core-pure`, `core-readoutput`, and `core-tmux` suites were extended with
1364
+ regression coverage for the bridge, session-name validation, path traversal,
1365
+ and offset clamping.
1366
+
1367
+ ### Changed
1368
+ - Session-name validation hardened and enforced at every entry point to block
1369
+ path traversal and shell injection (names must match `/^[A-Za-z0-9_-]{1,64}$/`).
1370
+
1371
+ ## [0.1.0] - 2026-06-02
1372
+
1373
+ Initial npm publish (with provenance): a Node/TypeScript rewrite of the Python MVP
1374
+ prototype (preserved under `prototype/python/` as the porting source and reference).
1375
+
1376
+ ### Added
1377
+ - stdio MCP server exposing exactly 6 tools: `pty_open`, `pty_send`, `pty_read`,
1378
+ `pty_key`, `pty_close`, `pty_list`. SSH, containers, and REPLs are not separate
1379
+ tools — you nest into the one PTY by `pty_send`-ing `ssh host`, `docker exec …`,
1380
+ etc.
1381
+ - tmux backend: one persistent local PTY per session, surviving MCP server/client
1382
+ restarts via the tmux daemon. tmux is started with `-f /dev/null` (ignores
1383
+ `~/.tmux.conf` for reproducibility); all sessions live on one socket, so
1384
+ `tmux kill-server` removes them all. A human can co-drive any session via
1385
+ `tmux -S … attach -t <id>` (the attach command is printed by `pty_open`).
1386
+ - Token-reducing reads: strip control characters, collapse repeats, head+tail
1387
+ elision with a restore hint and a meta line. `pty_read({rtk:true})` applies
1388
+ per-command reducers (git status/log, grep, pytest, df, make, …) as a
1389
+ self-contained reimplementation — no `rtk` binary required.
1390
+ `pty_send({rtk:true})` delegates to the external `rtk` binary if present and
1391
+ passes through otherwise (`src/rtk.ts`).
1392
+ - Four-layer completion detection: process exit (dead) / until-regex /
1393
+ quiescence (output settled AND shell is back) / timeout. While nested
1394
+ (ssh/docker), quiescence cannot fire by design — use `until` or `mark`.
1395
+ - Safety gate: `pty_send` blocks destructive commands (`rm -rf /`, `mkfs`,
1396
+ `dd of=/dev/`, `DROP TABLE`, fork bomb, `git reset --hard`, `curl … | sh`, …),
1397
+ overridable with `force:true`. It is a tripwire, not a sandbox: it does not
1398
+ catch relative-path `rm`, post-`$VAR`-expansion danger, or commands on the far
1399
+ side of an ssh hop. `pty_read` neutralizes control characters in returned text.
1400
+ - Node regression suite (`node:test`, `npm test`, tmux required) and CI on
1401
+ `ubuntu-latest` for Node 18/20/22, publishing to npm on `v*` tags with
1402
+ provenance.
1403
+
1404
+ [Unreleased]: https://github.com/kitepon/aiterm-mcp/compare/v0.29.9...HEAD
1405
+ [0.29.9]: https://github.com/kitepon/aiterm-mcp/compare/v0.29.8...v0.29.9
1406
+ [0.29.8]: https://github.com/kitepon/aiterm-mcp/compare/v0.29.7...v0.29.8
1407
+ [0.29.7]: https://github.com/kitepon/aiterm-mcp/compare/v0.29.6...v0.29.7
1408
+ [0.29.6]: https://github.com/kitepon/aiterm-mcp/compare/v0.29.5...v0.29.6
1409
+ [0.29.5]: https://github.com/kitepon/aiterm-mcp/compare/v0.29.4...v0.29.5
1410
+ [0.29.4]: https://github.com/kitepon/aiterm-mcp/compare/v0.29.3...v0.29.4
1411
+ [0.29.3]: https://github.com/kitepon/aiterm-mcp/compare/v0.29.2...v0.29.3
1412
+ [0.29.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.29.1...v0.29.2
1413
+ [0.29.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.29.0...v0.29.1
1414
+ [0.29.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.28.4...v0.29.0
1415
+ [0.28.4]: https://github.com/kitepon/aiterm-mcp/compare/v0.28.3...v0.28.4
1416
+ [0.28.3]: https://github.com/kitepon/aiterm-mcp/compare/v0.28.2...v0.28.3
1417
+ [0.28.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.28.1...v0.28.2
1418
+ [0.28.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.28.0...v0.28.1
1419
+ [0.28.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.27.9...v0.28.0
1420
+ [0.27.9]: https://github.com/kitepon/aiterm-mcp/compare/v0.27.8...v0.27.9
1421
+ [0.27.8]: https://github.com/kitepon/aiterm-mcp/compare/v0.27.7...v0.27.8
1422
+ [0.27.7]: https://github.com/kitepon/aiterm-mcp/compare/v0.27.3...v0.27.7
1423
+ [0.27.3]: https://github.com/kitepon/aiterm-mcp/compare/v0.27.2...v0.27.3
1424
+ [0.27.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.27.1...v0.27.2
1425
+ [0.27.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.27.0...v0.27.1
1426
+ [0.27.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.26.0...v0.27.0
1427
+ [0.26.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.25.3...v0.26.0
1428
+ [0.25.3]: https://github.com/kitepon/aiterm-mcp/compare/v0.25.2...v0.25.3
1429
+ [0.25.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.25.1...v0.25.2
1430
+ [0.25.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.25.0...v0.25.1
1431
+ [0.25.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.24.3...v0.25.0
1432
+ [0.24.3]: https://github.com/kitepon/aiterm-mcp/compare/v0.24.2...v0.24.3
1433
+ [0.24.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.24.1...v0.24.2
1434
+ [0.24.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.24.0...v0.24.1
1435
+ [0.24.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.23.0...v0.24.0
1436
+ [0.23.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.22.0...v0.23.0
1437
+ [0.22.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.21.4...v0.22.0
1438
+ [0.21.4]: https://github.com/kitepon/aiterm-mcp/compare/v0.21.3...v0.21.4
1439
+ [0.21.3]: https://github.com/kitepon/aiterm-mcp/compare/v0.21.2...v0.21.3
1440
+ [0.21.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.21.1...v0.21.2
1441
+ [0.21.1]: https://github.com/kitepon/aiterm-mcp/compare/b8c4dbc...v0.21.1
1442
+ [0.21.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.20.3...b8c4dbc
1443
+ [0.20.3]: https://github.com/kitepon/aiterm-mcp/compare/v0.20.2...v0.20.3
1444
+ [0.20.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.20.1...v0.20.2
1445
+ [0.20.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.20.0...v0.20.1
1446
+ [0.20.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.19.3...v0.20.0
1447
+ [0.19.3]: https://github.com/kitepon/aiterm-mcp/compare/v0.19.2...v0.19.3
1448
+ [0.19.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.19.1...v0.19.2
1449
+ [0.19.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.19.0...v0.19.1
1450
+ [0.19.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.18.2...v0.19.0
1451
+ [0.18.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.18.1...v0.18.2
1452
+ [0.18.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.18.0...v0.18.1
1453
+ [0.18.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.17.0...v0.18.0
1454
+ [0.17.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.16.0...v0.17.0
1455
+ [0.16.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.15.1...v0.16.0
1456
+ [0.15.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.15.0...v0.15.1
1457
+ [0.15.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.12.3...v0.15.0
1458
+ [0.12.3]: https://github.com/kitepon/aiterm-mcp/compare/v0.12.2...v0.12.3
1459
+ [0.12.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.12.1...v0.12.2
1460
+ [0.12.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.12.0...v0.12.1
1461
+ [0.12.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.11.0...v0.12.0
1462
+ [0.11.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.10.0...v0.11.0
1463
+ [0.10.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.9.1...v0.10.0
1464
+ [0.9.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.9.0...v0.9.1
1465
+ [0.9.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.8.0...v0.9.0
1466
+ [0.8.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.7.1...v0.8.0
1467
+ [0.7.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.7.0...v0.7.1
1468
+ [0.7.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.6.0...v0.7.0
1469
+ [0.6.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.5.0...v0.6.0
1470
+ [0.5.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.4.1...v0.5.0
1471
+ [0.4.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.4.0...v0.4.1
1472
+ [0.4.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.3.1...v0.4.0
1473
+ [0.3.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.3.0...v0.3.1
1474
+ [0.3.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.2.0...v0.3.0
1475
+ [0.2.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.1.0...v0.2.0
1476
+ [0.1.0]: https://github.com/kitepon/aiterm-mcp/releases/tag/v0.1.0