aiterm-mcp 0.38.0 → 0.38.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -1
- package/README.ja.md +3 -1
- package/README.md +3 -1
- package/dist/cursor-parent-receiver.js +9 -1
- package/dist/harnesses/claude.js +15 -0
- package/dist/index.js +7 -2
- package/docs/DESIGN.md +2 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.38.2] - 2026-09-25
|
|
11
|
+
|
|
12
|
+
### 修正
|
|
13
|
+
|
|
14
|
+
- Claude Code初回起動時のテーマ選択を、画面で選択済みの項目を確定して通過する。続くログイン方式の選択は入力欄と誤認せず、公式CLIでの初回設定が必要と明示する。
|
|
15
|
+
- WindowsのCursor親受け口試験で、Windows専用の起動引数を誤って`null`と期待していた判定を修正する。
|
|
16
|
+
|
|
17
|
+
## [0.38.1] - 2026-09-22
|
|
18
|
+
|
|
19
|
+
### 修正
|
|
20
|
+
|
|
21
|
+
- Cursor親のhookへ渡るtool結果は本文だけで、`structuredContent`の`delivery_id`が落ちる。dispatchの本文へ`delivery_id`行を出し、hookがその行から会話へ束縛する。
|
|
22
|
+
|
|
10
23
|
## [0.38.0] - 2026-09-22
|
|
11
24
|
|
|
12
25
|
### 追加
|
|
@@ -1738,7 +1751,9 @@ prototype (preserved under `prototype/python/` as the porting source and referen
|
|
|
1738
1751
|
`ubuntu-latest` for Node 18/20/22, publishing to npm on `v*` tags with
|
|
1739
1752
|
provenance.
|
|
1740
1753
|
|
|
1741
|
-
[Unreleased]: https://github.com/kitepon/aiterm-mcp/compare/v0.38.
|
|
1754
|
+
[Unreleased]: https://github.com/kitepon/aiterm-mcp/compare/v0.38.2...HEAD
|
|
1755
|
+
[0.38.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.38.1...v0.38.2
|
|
1756
|
+
[0.38.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.38.0...v0.38.1
|
|
1742
1757
|
[0.38.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.37.10...v0.38.0
|
|
1743
1758
|
[0.37.10]: https://github.com/kitepon/aiterm-mcp/compare/v0.37.9...v0.37.10
|
|
1744
1759
|
[0.37.9]: https://github.com/kitepon/aiterm-mcp/compare/v0.37.8...v0.37.9
|
package/README.ja.md
CHANGED
|
@@ -202,7 +202,7 @@ runtime-error store は canonical dotagents config の `collection.enabled: true
|
|
|
202
202
|
場合だけ収集し、既定OFF、network送信は行いません。tag起点CIのnpm provenance(OIDC Trusted
|
|
203
203
|
Publishing)で公開し、GitHub Release が Official MCP Registry を再登録します。
|
|
204
204
|
|
|
205
|
-
**状態:** 開発継続中 · 現行公開版 **v0.38.
|
|
205
|
+
**状態:** 開発継続中 · 現行公開版 **v0.38.2** · 動作対象は Linux · WSL2 · macOS · Windows ネイティブ · MIT · [変更履歴](CHANGELOG.md)。
|
|
206
206
|
|
|
207
207
|
### 更新と巻き戻し
|
|
208
208
|
|
|
@@ -486,6 +486,8 @@ aiterm は同じ核心の洞察——端末を出会いの場にする——を
|
|
|
486
486
|
|
|
487
487
|
`agent_launch({ harness, cwd, trust_project: true })`はpromptなしでも既知のworkspace・project hooks・MCP初期同意を
|
|
488
488
|
進め、入力受付とharness生存を確認して`startup.status="ready"`を返す。指定なしのpromptなし起動は`not_checked`。
|
|
489
|
+
Claude Code初回起動の文字表示テーマ選択では、画面で選択済みの項目を確定して起動を続ける。
|
|
490
|
+
続いてログイン方式の選択が出た場合は`vendor_onboarding_required`を返す。公式の対話型Claude Code CLIで初回設定を完了する。
|
|
489
491
|
WindowsのCodexもhook確認を認識し、npm shim経由の起動を一つのharnessとして識別する。
|
|
490
492
|
初手の`initial_prompt.status`は`not_requested`/`not_sent`/`submitted_unconfirmed`/`started`を区別する。
|
|
491
493
|
未送信・未確認の失敗もsession付きstructuredContentを保持する。未確認のpromptを再送せず、返ったcursorで観測する。
|
package/README.md
CHANGED
|
@@ -216,7 +216,7 @@ collection is off by default and performs no network I/O. It ships via
|
|
|
216
216
|
tag-triggered CI with npm provenance (OIDC Trusted Publishing); the GitHub
|
|
217
217
|
Release re-registers the Official MCP Registry entry.
|
|
218
218
|
|
|
219
|
-
**Status:** actively maintained · current public release **v0.38.
|
|
219
|
+
**Status:** actively maintained · current public release **v0.38.2** · runs on Linux · WSL2 · macOS · native Windows (tmux on POSIX, the tmux-CLI-compatible [psmux](https://github.com/psmux/psmux) on native Windows — no WSL required) · MIT · see the [CHANGELOG](CHANGELOG.md).
|
|
220
220
|
|
|
221
221
|
### Update and rollback
|
|
222
222
|
|
|
@@ -517,6 +517,8 @@ displayed token count or null. Callers do not need raw argv or pane-text parsing
|
|
|
517
517
|
|
|
518
518
|
`agent_launch({ harness, cwd, trust_project: true })` completes known workspace, project-hook, and project-MCP startup
|
|
519
519
|
consent even without a prompt, then verifies input readiness and harness liveness before returning `startup.status="ready"`.
|
|
520
|
+
For Claude Code's first-run text-style menu, it confirms the item already selected on screen before continuing startup.
|
|
521
|
+
If the CLI then requests an account login method, the launch reports `vendor_onboarding_required`; complete that choice in the official interactive Claude Code CLI.
|
|
520
522
|
A prompt-free launch without this option retains `startup.status="not_checked"`. `initial_prompt.status` distinguishes
|
|
521
523
|
`not_requested`, `not_sent`, `submitted_unconfirmed`, and `started`. Failure responses retain structured session information.
|
|
522
524
|
WindowsのCodexもhook確認を認識し、npm shim経由の起動を一つのharnessとして識別する。
|
|
@@ -126,7 +126,7 @@ function deliveryIdFromResult(value, depth = 0) {
|
|
|
126
126
|
if (entry !== null && typeof entry === "object" && entry.type === "text") {
|
|
127
127
|
const text = entry.text;
|
|
128
128
|
if (typeof text === "string") {
|
|
129
|
-
const id = deliveryIdFromResult(text, depth + 1);
|
|
129
|
+
const id = deliveryIdFromResult(text, depth + 1) ?? deliveryIdInText(text);
|
|
130
130
|
if (id)
|
|
131
131
|
return id;
|
|
132
132
|
}
|
|
@@ -135,6 +135,14 @@ function deliveryIdFromResult(value, depth = 0) {
|
|
|
135
135
|
}
|
|
136
136
|
return null;
|
|
137
137
|
}
|
|
138
|
+
function deliveryIdInText(text) {
|
|
139
|
+
for (const line of text.split("\n")) {
|
|
140
|
+
const match = /^delivery_id=([0-9a-f-]{36})$/i.exec(line.trim());
|
|
141
|
+
if (match && deliveryIdSchema.safeParse(match[1]).success)
|
|
142
|
+
return match[1];
|
|
143
|
+
}
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
138
146
|
function toolBaseName(name) {
|
|
139
147
|
const tail = name.split(/[:.]/).pop() ?? name;
|
|
140
148
|
return tail.replace(/^mcp__aiterm__/, "");
|
package/dist/harnesses/claude.js
CHANGED
|
@@ -180,6 +180,8 @@ export function claudeLaunchNote(model, effort, meta) {
|
|
|
180
180
|
export function claudeTuiReady(screen) {
|
|
181
181
|
if (!screen.includes("Claude Code"))
|
|
182
182
|
return false;
|
|
183
|
+
if (claudeLoginMethodMenu(screen))
|
|
184
|
+
return false;
|
|
183
185
|
const lastMarker = screen.split(/\r?\n/u).filter((line) => /^\s*❯/u.test(line)).at(-1)?.trim();
|
|
184
186
|
if (!lastMarker)
|
|
185
187
|
return false;
|
|
@@ -190,6 +192,8 @@ export function claudeTuiReady(screen) {
|
|
|
190
192
|
}
|
|
191
193
|
export function claudePaneObservation(screen) {
|
|
192
194
|
const tail = screen.split("\n").slice(-32).join("\n");
|
|
195
|
+
if (claudeLoginMethodMenu(screen))
|
|
196
|
+
return { state: "blocked", reason: "vendor_onboarding_required" };
|
|
193
197
|
if (/Do you want to proceed\?/.test(tail) && /(?:^|\n)\s*[❯>]?\s*\d+\.\s+(?:Yes|No)\s*$/m.test(tail))
|
|
194
198
|
return { state: "blocked", reason: "tool_approval" };
|
|
195
199
|
if (/esc to interrupt/i.test(tail))
|
|
@@ -202,7 +206,18 @@ export function claudePaneObservation(screen) {
|
|
|
202
206
|
return { state: "blocked", reason: "startup_dialog" };
|
|
203
207
|
return { state: "unknown", reason: "unrecognized_screen" };
|
|
204
208
|
}
|
|
209
|
+
function claudeLoginMethodMenu(screen) {
|
|
210
|
+
const tail = screen.split("\n").slice(-32).join("\n");
|
|
211
|
+
const lastMarker = tail.split(/\r?\n/u).filter(line => /^\s*❯/u.test(line)).at(-1)?.trim();
|
|
212
|
+
return tail.includes("Select login method:")
|
|
213
|
+
&& /^❯\s*(?:Claude account with subscription|Anthropic Console account|3rd-party platform)/u.test(lastMarker ?? "");
|
|
214
|
+
}
|
|
205
215
|
export function claudeStartupAction(screen, trustProject) {
|
|
216
|
+
const tail = screen.split("\n").slice(-32).join("\n");
|
|
217
|
+
const lastMarker = tail.split(/\r?\n/u).filter(line => /^\s*❯/u.test(line)).at(-1)?.trim();
|
|
218
|
+
if (tail.includes("Choose the text style that looks best with your terminal")
|
|
219
|
+
&& /^❯\s*[1-7]\.\s*(?:Auto \(match terminal\)|Dark mode|Light mode)/u.test(lastMarker ?? ""))
|
|
220
|
+
return { kind: "initial_theme_selected", keys: ["Enter"] };
|
|
206
221
|
// 既存launcherで扱っていた2確認は従来の起動契約を維持する。
|
|
207
222
|
if (screen.includes("Is this a project you created or one you trust")
|
|
208
223
|
&& screen.includes("No, exit") && screen.includes("Yes, I trust this folder"))
|
package/dist/index.js
CHANGED
|
@@ -42,6 +42,10 @@ async function deliveryForRequest(extra) {
|
|
|
42
42
|
await parentDelivery.prepare(parent);
|
|
43
43
|
return parentDelivery.request(parent);
|
|
44
44
|
}
|
|
45
|
+
function deliveryIdLine(delivery) {
|
|
46
|
+
const id = delivery?.result()?.delivery_id;
|
|
47
|
+
return id ? `\ndelivery_id=${id}` : "";
|
|
48
|
+
}
|
|
45
49
|
function completionWait(delivery, session, eventCursor) {
|
|
46
50
|
if (eventCursor === null)
|
|
47
51
|
return { wait_process: null, wait_command: null };
|
|
@@ -213,7 +217,8 @@ server.registerTool("pty_send", {
|
|
|
213
217
|
type: "text",
|
|
214
218
|
text: `dispatchした(harness=${receipt.harness}, vendor=${receipt.vendor})。\n` +
|
|
215
219
|
core.agentDispatchGuide(receipt.session_id, receipt.event_cursor) +
|
|
216
|
-
core.agentSubmitResidueWarning(receipt.session_id, receipt.submit_residue)
|
|
220
|
+
core.agentSubmitResidueWarning(receipt.session_id, receipt.submit_residue) +
|
|
221
|
+
deliveryIdLine(delivery),
|
|
217
222
|
},
|
|
218
223
|
],
|
|
219
224
|
structuredContent: {
|
|
@@ -718,7 +723,7 @@ async function launchAgent(kind, args, extra) {
|
|
|
718
723
|
: {}),
|
|
719
724
|
};
|
|
720
725
|
return {
|
|
721
|
-
content: [{ type: "text", text: `session_id: ${sid}\n${hint}` }],
|
|
726
|
+
content: [{ type: "text", text: `session_id: ${sid}\n${hint}${deliveryIdLine(delivery)}` }],
|
|
722
727
|
structuredContent: structured,
|
|
723
728
|
...(initialDelivery.status === "submitted_unconfirmed" ? { isError: true } : {}),
|
|
724
729
|
};
|
package/docs/DESIGN.md
CHANGED
|
@@ -171,6 +171,8 @@ APIエラー監視の参照先を一致させ、監視中のリンク変更で
|
|
|
171
171
|
hookを外す時は`aiterm-setup --remove-cursor-parent-hooks`で専用entryだけを解除する。
|
|
172
172
|
|
|
173
173
|
`trust_project:true`は対象projectの既知のworkspace、hooks、MCP初期同意を起動準備として進める意図である。
|
|
174
|
+
Claude Codeの初回テーマ選択は選択済みの項目を確定し、後続の起動準備へ進める。
|
|
175
|
+
ログイン方式の選択はユーザーのアカウント設定として扱い、composerと誤認せず`vendor_onboarding_required`で止める。
|
|
174
176
|
promptなしでも入力受付とharness生存を確認して`startup.ready`を返す。指定なしのpromptなし起動は
|
|
175
177
|
従来どおり`startup.not_checked`で返す。初手receiptは未要求・未送信・送信済み未確認・開始確認を分ける。
|
|
176
178
|
開始の証拠は送信後の実行表示、実行中の既知承認、または同じcursor以降の完了だけとし、残存なしでは代用しない。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aiterm-mcp",
|
|
3
|
-
"version": "0.38.
|
|
3
|
+
"version": "0.38.2",
|
|
4
4
|
"mcpName": "io.github.kitepon/aiterm-mcp",
|
|
5
5
|
"description": "Persistent terminal MCP with one harness-based launcher for Claude Code, Codex CLI, Grok CLI, and Cursor Agent CLI, plus durable PTYs for SSH, containers, and REPLs.",
|
|
6
6
|
"keywords": [
|