aiterm-mcp 0.51.3 → 0.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -1
- package/README.ja.md +4 -2
- package/README.md +4 -2
- package/dist/core.js +31 -33
- package/dist/index.js +11 -2
- package/docs/DESIGN.md +10 -0
- package/docs/RELEASE.md +1 -0
- package/package.json +3 -3
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.52.0] - 2026-10-04
|
|
11
|
+
|
|
12
|
+
### 修正
|
|
13
|
+
|
|
14
|
+
- 席の中で起動した試験が`AITERM_STATE_BASE`を本番から引き継ぎ、`killAll`で他のsocketのagent登録まで
|
|
15
|
+
削除していた(ADR 0087)。BellTeamで複数席の送信が通常PTYの`mode=sent`となり、完了待ちと回答の表示が
|
|
16
|
+
失敗した。`killAll`は現在のsocketのsessionと控えに属する登録だけを消し、他のsocketの待機lockも保持する。
|
|
17
|
+
試験入口は本番の保存場所・系譜・tmux環境を外して一時領域を指定する。既に失った登録は対象sessionを
|
|
18
|
+
閉じて同じIDで起動し直して復旧する。登録の形式と公開toolの返却形式は変えていない。
|
|
19
|
+
- `pty_send`に`require_agent:true`を追加した。agent登録が無いsessionには打鍵せず、
|
|
20
|
+
`AGENT_SESSION_REQUIRED`と「文字列は送信していません」を返す。連携元は、登録消失後の二重送信を避けて復旧できる。
|
|
21
|
+
省略時は従来の通常PTY送信を維持する。`force:true`との併用は未送信で拒否する。
|
|
22
|
+
|
|
10
23
|
## [0.51.3] - 2026-10-04
|
|
11
24
|
|
|
12
25
|
### 修正
|
|
@@ -2090,7 +2103,8 @@ prototype (preserved under `prototype/python/` as the porting source and referen
|
|
|
2090
2103
|
`ubuntu-latest` for Node 18/20/22, publishing to npm on `v*` tags with
|
|
2091
2104
|
provenance.
|
|
2092
2105
|
|
|
2093
|
-
[Unreleased]: https://github.com/kitepon/aiterm-mcp/compare/v0.
|
|
2106
|
+
[Unreleased]: https://github.com/kitepon/aiterm-mcp/compare/v0.52.0...HEAD
|
|
2107
|
+
[0.52.0]: https://github.com/kitepon/aiterm-mcp/compare/v0.51.3...v0.52.0
|
|
2094
2108
|
[0.51.3]: https://github.com/kitepon/aiterm-mcp/compare/v0.51.2...v0.51.3
|
|
2095
2109
|
[0.51.2]: https://github.com/kitepon/aiterm-mcp/compare/v0.51.1...v0.51.2
|
|
2096
2110
|
[0.51.1]: https://github.com/kitepon/aiterm-mcp/compare/v0.51.0...v0.51.1
|
package/README.ja.md
CHANGED
|
@@ -209,7 +209,7 @@ runtime-error store は canonical dotagents config の `collection.enabled: true
|
|
|
209
209
|
場合だけ収集し、既定OFF、network送信は行いません。tag起点CIのnpm provenance(OIDC Trusted
|
|
210
210
|
Publishing)で公開し、GitHub Release が Official MCP Registry を再登録します。
|
|
211
211
|
|
|
212
|
-
**状態:** 開発継続中 · 現行公開版 **v0.
|
|
212
|
+
**状態:** 開発継続中 · 現行公開版 **v0.52.0** · 動作対象は Linux · WSL2 · macOS · Windows ネイティブ · MIT · [変更履歴](CHANGELOG.md)。
|
|
213
213
|
|
|
214
214
|
### 更新と巻き戻し
|
|
215
215
|
|
|
@@ -259,6 +259,8 @@ pty_read(id, { wait: true }) → 削減済みの出力を読む(完了
|
|
|
259
259
|
|
|
260
260
|
ClaudeがAPIエラーや安全判定の拒否で終了した時は、Stop hookが発火しなくても次の`pty_send`を新しいturnとして扱う。現在のturn開始後のエラー記録だけを確認し、過去のエラーで実行中のturnを解除しない。上流の拒否はエラーのまま返す。
|
|
261
261
|
|
|
262
|
+
agent配送だけを期待する連携では、`pty_send`に`require_agent:true`を指定する。agent登録が無ければ、打鍵前に`AGENT_SESSION_REQUIRED`と「文字列は送信していません」を返す。省略時は通常PTY送信を維持する。`force:true`との併用は未送信で拒否する。
|
|
263
|
+
|
|
262
264
|
`agent_launch`・`pty_send`(agent session宛て)は任意の`image`(画像ファイルの絶対パスの配列。png/jpg/jpeg/gif/webp)を受ける。aitermが本文末尾へ添付行を付け、どのharnessも自分のfile読取toolでそのpathを画像として開く。呼出し側はharness別の添付手順を覚えない。不正なpathは送信前に拒否する。
|
|
263
265
|
|
|
264
266
|
`agent_launch`は任意の`write_scope`も受ける。Codex/Grokのread-onlyは`--sandbox read-only`、Cursorは公式`--mode ask`で実効化する。path説明は同等CLI引数がないためdeclaration-only。
|
|
@@ -550,7 +552,7 @@ Claudeの相関済み承認は既存の`claude_approval`を使う。
|
|
|
550
552
|
| ツール | 役割 | 主な引数 |
|
|
551
553
|
| --- | --- | --- |
|
|
552
554
|
| `pty_open` | 端末を1個開き`session_id`を返す | `name?`, `shell?`, `env_vars?` |
|
|
553
|
-
| `pty_send` | テキストを送る。agent sessionでは子のturnが実行中なら現在のturnへ差し込み(`agent_steer`)、それ以外は非ブロックdispatchとして`event_cursor`を返す(`agent_dispatch`)。差し込みでGrokが待ち行列へ入れない時とCursorの入力欄に残った時は失敗する | `session_id`, `text`, `enter=true`, `mark`, `force`, `rtk`, `raw` |
|
|
555
|
+
| `pty_send` | テキストを送る。agent sessionでは子のturnが実行中なら現在のturnへ差し込み(`agent_steer`)、それ以外は非ブロックdispatchとして`event_cursor`を返す(`agent_dispatch`)。差し込みでGrokが待ち行列へ入れない時とCursorの入力欄に残った時は失敗する | `session_id`, `text`, `enter=true`, `mark`, `force`, `require_agent=false`, `rtk`, `raw` |
|
|
554
556
|
| `pty_read` | 出力を削減して読む(既定は増分) | `session_id`, `wait`, `until`, `until_regex`, `timeout`, `screen`, `full`, `lines`, `line_range`, `raw`, `rtk`, `agent_transcript`, `operation_id` |
|
|
555
557
|
| `pty_key` | 制御キーを送る | `session_id`, `key`(`C-c`/`Enter`/`Up`…) |
|
|
556
558
|
| `pty_close` | 冪等に閉じ、`closed` / `already_closed`を返す | `session_id` |
|
package/README.md
CHANGED
|
@@ -223,7 +223,7 @@ collection is off by default and performs no network I/O. It ships via
|
|
|
223
223
|
tag-triggered CI with npm provenance (OIDC Trusted Publishing); the GitHub
|
|
224
224
|
Release re-registers the Official MCP Registry entry.
|
|
225
225
|
|
|
226
|
-
**Status:** actively maintained · current public release **v0.
|
|
226
|
+
**Status:** actively maintained · current public release **v0.52.0** · runs on Linux · WSL2 · macOS · native Windows (tmux on POSIX, the tmux-CLI-compatible [psmux](https://github.com/psmux/psmux) on native Windows — no WSL required) · MIT · see the [CHANGELOG](CHANGELOG.md).
|
|
227
227
|
|
|
228
228
|
### Update and rollback
|
|
229
229
|
|
|
@@ -280,6 +280,8 @@ The same primitive hosts another agent's TUI. `agent_launch` starts a selected e
|
|
|
280
280
|
|
|
281
281
|
起動結果には正規`harness`を含む`aiterm.agent-launch-result.v1`が付き、旧`provider`は互換fieldとして残る。同じ`harness`はagent dispatch、`aiterm-wait`、`agent_configure`、`pty_list`にも載る。Codexは通常rollout、Grokは通常session event、Claudeはlaunch固有Stop hook、Cursorは通常agent transcriptの`turn_ended`を完了正本に使う。agentへの送信は`pty_send`だけで行い、Aitermが送る時点で子の状態を見て振り分ける。Claudeは画面の実行中表示ではなくStopまで残るturnの印で判定する。実行中のturnへは差し込み(`mode=agent_steer`、新しい`event_cursor`と配送は作らない)、それ以外は非ブロックdispatch(`mode=agent_dispatch`)で、harnessごとの完了境界を表す整数`event_cursor`を返す。Codex親は選択に応じて公式Steerまたはqueue、Claude Code親は公式非同期hookで本文を自動受信する。他の親は[`aiterm-wait`](#completion-push-for-parent-agents-aiterm-wait)を使う。CursorのsubmitはadapterがCLIのextended keyboard protocolへ変換し、送信本文がcomposerへ残る場合は明示errorにする。
|
|
282
282
|
|
|
283
|
+
Set `require_agent:true` on `pty_send` when the integration requires agent delivery. If the agent registration is missing, Aiterm refuses before sending any text and returns `AGENT_SESSION_REQUIRED` with an explicit unsent message. The default preserves ordinary PTY sends; combining it with `force:true` is rejected before sending.
|
|
284
|
+
|
|
283
285
|
`agent_launch` and `pty_send` (to an agent session) accept an optional `image`: an array of absolute paths to image files (png/jpg/jpeg/gif/webp). Aiterm appends an attachment block to the prompt, and every harness opens the path with its own file-reading tool and sees the image; the caller never learns harness-specific attachment tricks. Invalid paths are rejected before anything is sent.
|
|
284
286
|
|
|
285
287
|
`agent_launch` accepts an optional `write_scope`: either `"read-only"` or a human-readable description of writable paths. Codex/Grok use `--sandbox read-only`; Cursor uses its official read-only `--mode ask`. A path description remains declaration-only because these CLI launch surfaces provide no equivalent path allowlist flag.
|
|
@@ -587,7 +589,7 @@ continue to use `claude_approval`.
|
|
|
587
589
|
| Tool | Role | Key args |
|
|
588
590
|
| --- | --- | --- |
|
|
589
591
|
| `pty_open` | Open one terminal and return a `session_id` | `name?`, `shell?`, `env_vars?` |
|
|
590
|
-
| `pty_send` | Send text. On an agent session Aiterm picks the route when it sends: if the child's turn is running, it steers the text into that turn (`agent_steer`); otherwise it is a non-blocking **dispatch** returning an `event_cursor` (`agent_dispatch`). Steering fails when Grok does not queue the text or Cursor leaves it in the composer | `session_id`, `text`, `enter=true`, `mark`, `force`, `rtk`, `raw` |
|
|
592
|
+
| `pty_send` | Send text. On an agent session Aiterm picks the route when it sends: if the child's turn is running, it steers the text into that turn (`agent_steer`); otherwise it is a non-blocking **dispatch** returning an `event_cursor` (`agent_dispatch`). Steering fails when Grok does not queue the text or Cursor leaves it in the composer | `session_id`, `text`, `enter=true`, `mark`, `force`, `require_agent=false`, `rtk`, `raw` |
|
|
591
593
|
| `pty_read` | Read output, token-reduced (incremental by default) | `session_id`, `wait`, `until`, `until_regex`, `timeout`, `screen`, `full`, `lines`, `line_range`, `raw`, `rtk`, `agent_transcript`, `operation_id` |
|
|
592
594
|
| `pty_key` | Send a control key | `session_id`, `key` (`C-c`/`Enter`/`Up`…) |
|
|
593
595
|
| `pty_close` | Close idempotently; return `closed` / `already_closed` | `session_id` |
|
package/dist/core.js
CHANGED
|
@@ -1370,9 +1370,33 @@ export function closeSessionResult(name) {
|
|
|
1370
1370
|
};
|
|
1371
1371
|
}
|
|
1372
1372
|
export function killAll() {
|
|
1373
|
+
// agentsはAITERM_STATE_BASEを共有する別socketの席も含み得る。終了対象はこのsocketから確定する。
|
|
1374
|
+
const sessions = new Set();
|
|
1375
|
+
const listed = tmux("list-sessions", "-F", "#{session_name}");
|
|
1376
|
+
if (listed.code !== 0 && !/no server running|No such file or directory|failed to connect/i.test(listed.stderr)) {
|
|
1377
|
+
throw new AitermError("killAllの対象sessionを取得できません: " + listed.stderr.trim(), 2);
|
|
1378
|
+
}
|
|
1379
|
+
if (listed.code === 0)
|
|
1380
|
+
for (const name of listed.stdout.trim().split(/\r?\n/).filter(Boolean)) {
|
|
1381
|
+
assertSessionName(name);
|
|
1382
|
+
sessions.add(name);
|
|
1383
|
+
}
|
|
1384
|
+
// serverが外から終了した時の控えも、このsocketの中に残る名前だけ片付ける。
|
|
1385
|
+
let socketFiles = [];
|
|
1386
|
+
try {
|
|
1387
|
+
socketFiles = fs.readdirSync(SOCKDIR);
|
|
1388
|
+
}
|
|
1389
|
+
catch {
|
|
1390
|
+
/* socketの置き場が無い */
|
|
1391
|
+
}
|
|
1392
|
+
for (const file of socketFiles) {
|
|
1393
|
+
const name = file.replace(/\.(?:log|offset|lastcmd|mark|send\.lock)$/, "");
|
|
1394
|
+
if (name !== file && /^[A-Za-z0-9_-]{1,64}$/.test(name))
|
|
1395
|
+
sessions.add(name);
|
|
1396
|
+
}
|
|
1373
1397
|
{
|
|
1374
1398
|
// 別プロセスの待機(file lock が生きているもの)も巻き添えにしない
|
|
1375
|
-
const foreign = liveWaitLocks(null);
|
|
1399
|
+
const foreign = liveWaitLocks(null).filter((lock) => sessions.has(lock.session));
|
|
1376
1400
|
if (foreign.length > 0) {
|
|
1377
1401
|
const list = foreign.map((d) => `${d.session}${d.pid != null ? `(pid ${d.pid})` : ""}`).join(",");
|
|
1378
1402
|
throw new AitermError(`agent_done 待機中の session があるため killAll できません: ${list}`, 2);
|
|
@@ -1385,7 +1409,10 @@ export function killAll() {
|
|
|
1385
1409
|
throw new AitermError(`送信中の session があるため killAll できません: ${list}`, 2);
|
|
1386
1410
|
}
|
|
1387
1411
|
}
|
|
1388
|
-
tmux("kill-server");
|
|
1412
|
+
const killed = tmux("kill-server");
|
|
1413
|
+
if (killed.code !== 0 && !/no server running|No such file or directory|failed to connect/i.test(killed.stderr)) {
|
|
1414
|
+
throw new AitermError("このsocketのserverを終了できません: " + killed.stderr.trim(), 2);
|
|
1415
|
+
}
|
|
1389
1416
|
// B9: SOCKDIR 内の .log/.offset/.lastcmd/.mark/.send.lock 残骸も掃除する。
|
|
1390
1417
|
try {
|
|
1391
1418
|
for (const f of fs.readdirSync(SOCKDIR)) {
|
|
@@ -1402,37 +1429,8 @@ export function killAll() {
|
|
|
1402
1429
|
catch {
|
|
1403
1430
|
/* SOCKDIR 不在等は無視 */
|
|
1404
1431
|
}
|
|
1405
|
-
const
|
|
1406
|
-
|
|
1407
|
-
try {
|
|
1408
|
-
for (const f of fs.readdirSync(adir)) {
|
|
1409
|
-
if (f.endsWith(".agent.json") ||
|
|
1410
|
-
f.endsWith(".events.jsonl") ||
|
|
1411
|
-
f.endsWith(".wait.lock") ||
|
|
1412
|
-
f.endsWith(".claude-settings.json") ||
|
|
1413
|
-
f.endsWith(".claude-mcp.json") ||
|
|
1414
|
-
f.endsWith(".claude-result.json") ||
|
|
1415
|
-
f.endsWith(".claude-operation.json") ||
|
|
1416
|
-
f.endsWith(".claude-dispatch") ||
|
|
1417
|
-
f.endsWith(".interim.json") ||
|
|
1418
|
-
f.endsWith(".auth.json") ||
|
|
1419
|
-
f.endsWith(".codex-home") ||
|
|
1420
|
-
f.endsWith(".grok-home") ||
|
|
1421
|
-
f.endsWith(".home")) {
|
|
1422
|
-
try {
|
|
1423
|
-
fs.rmSync(path.join(adir, f), { recursive: true, force: true });
|
|
1424
|
-
}
|
|
1425
|
-
catch {
|
|
1426
|
-
/* noop */
|
|
1427
|
-
}
|
|
1428
|
-
}
|
|
1429
|
-
}
|
|
1430
|
-
}
|
|
1431
|
-
catch {
|
|
1432
|
-
/* agent state dir 不在等は無視 */
|
|
1433
|
-
}
|
|
1434
|
-
}
|
|
1435
|
-
agentMetadataNegativeCache.clear();
|
|
1432
|
+
for (const name of sessions)
|
|
1433
|
+
cleanupAgentState(name);
|
|
1436
1434
|
return "killed all sessions on this socket";
|
|
1437
1435
|
}
|
|
1438
1436
|
function readAgentLineageSeed() {
|
package/dist/index.js
CHANGED
|
@@ -273,6 +273,7 @@ registerRemoteAwareTool("pty_send", {
|
|
|
273
273
|
"receipt の event_cursor を返す。" +
|
|
274
274
|
NON_BLOCKING_RULE +
|
|
275
275
|
"自動配送以外の結果回収は pty_read(agent_transcript:true)、Claude の durable turn は claude_turn を使う。" +
|
|
276
|
+
"require_agent:true はagent登録が無いsessionへ打鍵せず、AGENT_SESSION_REQUIREDで未送信を返す。" +
|
|
276
277
|
"force:true は非Claude agent sessionへの手動介入用の素送信。aiterm相関付きClaudeの承認UIはclaude_approvalを使う。",
|
|
277
278
|
inputSchema: {
|
|
278
279
|
session_id: z.string(),
|
|
@@ -291,6 +292,7 @@ registerRemoteAwareTool("pty_send", {
|
|
|
291
292
|
.boolean()
|
|
292
293
|
.default(false)
|
|
293
294
|
.describe("非Claude agent sessionでは自動dispatchせず素送信する。aiterm相関付きClaudeのactive turnには使えない"),
|
|
295
|
+
require_agent: z.boolean().default(false).describe("agent登録が無いsessionは打鍵前に拒否する。force:trueとは併用できない"),
|
|
294
296
|
rtk: z.boolean().default(false).describe("既知コマンドを rtk 形へ委譲して送る(rtk 不在なら素通し)"),
|
|
295
297
|
raw: z.boolean().default(false).describe("送信前サニタイズを無効化"),
|
|
296
298
|
image: z
|
|
@@ -315,10 +317,17 @@ registerRemoteAwareTool("pty_send", {
|
|
|
315
317
|
// dispatch前に行った pane 入力の回復("fg" / "fg_stopped" / "stty_raw")。通常送信では省略(additive)。
|
|
316
318
|
pane_input_recovery: z.array(z.string()).optional(),
|
|
317
319
|
},
|
|
318
|
-
}, async ({ session_id, text, enter, mark, force, rtk, raw, image }, extra) => {
|
|
320
|
+
}, async ({ session_id, text, enter, mark, force, require_agent, rtk, raw, image }, extra) => {
|
|
319
321
|
let delivery = null;
|
|
320
322
|
try {
|
|
321
|
-
if (
|
|
323
|
+
if (require_agent && force) {
|
|
324
|
+
throw new Error("require_agent:true は force:true と併用できません。文字列は送信していません。");
|
|
325
|
+
}
|
|
326
|
+
const agentSession = !force && core.isAgentSession(session_id);
|
|
327
|
+
if (require_agent && !agentSession) {
|
|
328
|
+
throw new Error(`AGENT_SESSION_REQUIRED: session '${session_id}' のagent登録がありません。文字列は送信していません。`);
|
|
329
|
+
}
|
|
330
|
+
if (agentSession) {
|
|
322
331
|
if (enter === false)
|
|
323
332
|
throw new Error("agent session への dispatch は enter:false と併用できません(手動介入は force:true)");
|
|
324
333
|
if (mark)
|
package/docs/DESIGN.md
CHANGED
|
@@ -47,6 +47,16 @@ psmuxが出力した余分な環境値を返さない。通常PTYとagentへ`AIT
|
|
|
47
47
|
sessionの表には環境が丸ごと入るので、名指しで登録した名前をsessionのoption `@aiterm_env_keys`に控え、
|
|
48
48
|
`env_keys`はその名前だけを返す。psmuxは元から端末ごとに呼び出し元の環境を継ぐ。
|
|
49
49
|
|
|
50
|
+
内部の`killAll`は終了するsocketのsession一覧と、そのsocketのログ等に残るsession名だけを対象にする。
|
|
51
|
+
別socketが同じ`AITERM_STATE_BASE`を使っていても、他のsessionの登録・完了記録・待機lockを削除しない。
|
|
52
|
+
対象の一覧取得やserver終了が失敗した場合は登録を削除しない(ADR 0087)。
|
|
53
|
+
試験の正規入口(`npm test`とCI)は`test/seat-env.mjs`を前処理として読み、席の保存場所・系譜・tmux環境を外し、
|
|
54
|
+
試験processごとの一時領域を指定する。個別試験が指定する`TMPDIR`と`XDG_RUNTIME_DIR`もそのまま利用できる。
|
|
55
|
+
|
|
56
|
+
agent配送だけを期待する連携元は`pty_send(require_agent:true)`を指定する。agent登録が無ければ、通常PTYへ送る前に
|
|
57
|
+
`AGENT_SESSION_REQUIRED`と「文字列は送信していません」を返す。未送信を確定してから対象sessionを復旧できる。
|
|
58
|
+
省略時の通常PTY送信は維持し、`force:true`との併用は打鍵前に拒否する。
|
|
59
|
+
|
|
50
60
|
`pty_observe`は存在、pane/harnessの生存、画面状態と理由、native process identityを分ける。
|
|
51
61
|
PIDは開始識別子・argv digestと組にし、paneとharnessを同一視しない。特定できないidentityはnull。
|
|
52
62
|
同じlaunchに属するnpm shimとnative本体は、中間の非候補processも含めた祖先関係から一つの起動として扱う。
|
package/docs/RELEASE.md
CHANGED
|
@@ -17,6 +17,7 @@ Aitermのreleaseはこのrepositoryが所有する。`.github/workflows/product-
|
|
|
17
17
|
## Release手順
|
|
18
18
|
|
|
19
19
|
1. 変更に直結するfocused testを手元で通す。full regressionは手元で回さず、CIに任せる。
|
|
20
|
+
個別試験も`node --import ./test/seat-env.mjs --test ...`で起動する。稼働中の席の保存場所を試験へ継承しない。
|
|
20
21
|
2. `CHANGELOG.md`の`## [Unreleased]`へ内容を書き、mainへcommitしてpushする。
|
|
21
22
|
3. 一回で公開する。
|
|
22
23
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aiterm-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.52.0",
|
|
4
4
|
"mcpName": "io.github.kitepon/aiterm-mcp",
|
|
5
5
|
"description": "Persistent terminal MCP with one harness-based launcher for Claude Code, Codex CLI, Grok CLI, and Cursor Agent CLI, plus durable PTYs for SSH, containers, and REPLs.",
|
|
6
6
|
"keywords": [
|
|
@@ -64,10 +64,10 @@
|
|
|
64
64
|
"mcpb:build": "npm run build && node scripts/build-mcpb.mjs && npm ci --omit=dev --ignore-scripts --no-audit --no-fund --prefix dist/mcpb-stage/server && npx --yes @anthropic-ai/mcpb@2.1.2 validate dist/mcpb-stage/manifest.json && npx --yes @anthropic-ai/mcpb@2.1.2 pack dist/mcpb-stage dist/aiterm-mcp.mcpb",
|
|
65
65
|
"verify:release-commit": "node scripts/verify-release-commit.mjs",
|
|
66
66
|
"release": "node scripts/release.mjs",
|
|
67
|
-
"test:docs": "node --test test/repository-contract.test.mjs",
|
|
67
|
+
"test:docs": "node --import ./test/seat-env.mjs --test test/repository-contract.test.mjs",
|
|
68
68
|
"prepublishOnly": "npm run verify:release-commit && npm run build",
|
|
69
69
|
"start": "node dist/index.js",
|
|
70
|
-
"test": "npm run build && node --test scripts/verify-release-commit.test.mjs test/*.test.mjs"
|
|
70
|
+
"test": "npm run build && node --import ./test/seat-env.mjs --test scripts/verify-release-commit.test.mjs test/*.test.mjs"
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
73
|
"@modelcontextprotocol/sdk": "^1.29.0",
|