aiterm-mcp 0.29.8 → 0.29.10

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