@agents-ensemble/cli 0.8.0 → 0.9.1

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/README.md CHANGED
@@ -32,13 +32,13 @@ Pi backend は Pi の設定ファイルを読みます。モデル設定は次
32
32
  | ユーザ | `~/.ensemble/pi/` |
33
33
  | プロジェクト | `<repoRoot>/.ensemble/pi/` |
34
34
 
35
- `ensemble auth login` は設定済みの conductor backend に分岐します。Cursor は Cursor SDK のブラウザログイン、Pi は **provider 単位のログイン**です。Pi では `--provider <id>` を指定でき、省略時は Pi `settings.json` の `defaultProvider`(または選択モデル)から決まります。API-key provider は TTY の secret prompt から `~/.ensemble/pi/auth.json`(または `conductor.pi.agentDir` の `auth.json`)へ保存し、OAuth provider は Pi の `AuthStorage.login` を使って URL・device code を stderr に表示します。`ensemble auth logout` は選択 provider の user 層 credential を削除し、`ensemble auth status` は秘密値を表示せず状態・保存先を示します。プロジェクト層の `<repoRoot>/.ensemble/pi/auth.json` は既存の project-over-user 読取優先を保ち、login が書き換えることはありません。project 層の明示的な OAuth credential は refresh できないため実行時には使わず、`ensemble auth login --provider <id>` で user 層へ保存する必要があります。`ensemble models list` は認証済み Pi model のみを表示します。
35
+ `ensemble auth login` は設定済みの conductor backend に分岐します。Cursor は Cursor SDK のブラウザログイン、Pi は **provider 単位のログイン**です。Pi では `--provider <id>` を指定でき、省略時は Pi `settings.json` の `defaultProvider`(または選択モデル)から決まります。API-key provider は TTY の secret prompt から `~/.ensemble/pi/auth.json`(または `conductor.pi.agentDir` の `auth.json`)へ保存し、OAuth provider は Pi 1.x の `ModelRuntime.login` を使って URL・device code を stderr に表示します。`ensemble auth logout` は選択 provider の user 層 credential を削除し、`ensemble auth status` は秘密値を表示せず状態・保存先を示します。プロジェクト層の `<repoRoot>/.ensemble/pi/auth.json` は既存の project-over-user 読取優先を保ち、login が書き換えることはありません。project 層の明示的な OAuth credential は refresh できないため実行時には使わず、`ensemble auth login --provider <id>` で user 層へ保存する必要があります。MCP HTTP OAuth は Pi 公式 MCP extension が別に管理します。`ensemble models list` は認証済み Pi model のみを表示します。
36
36
 
37
37
  Pi の resource root は `~/.ensemble/pi/` と `<repoRoot>/.ensemble/pi/` です。`conductor.pi.agentDir` / `conductor.pi.projectDir` で root のみ上書きできます。`settings.json` / `auth.json` / `models.json` / `extensions/` / `skills/` / `prompts/` / `themes/` を解決し、skills は compiled system prompt に追加され、prompts は `/name args` として展開されます。themes は headless conductor で読み込み・project 同名解決まで行いますが、TUI renderer がないため色・表示設定は適用しません。`.ensemble/pi/SYSTEM.md` / `APPEND_SYSTEM.md` は conductor の system prompt には使わず、modular-prompt のコンパイル結果を優先します。
38
38
 
39
39
  `settings.json` の headless 対応は、モデル選択(`defaultProvider` / `defaultModel`)、認証 fallback(`apiKey` / `apiKeys`)、resource path(`extensions` / `skills` / `prompts` / `themes`)に限定されます。`defaultThinkingLevel`、`thinkingBudgets`、`packages`、`enableSkillCommands` など Pi coding-agent の挙動・TUI・package 設定は警告なしで無視します。詳細な対応キーと失敗モードは [config.md の headless 対応範囲](../config.md#settingsjson-の-headless-対応範囲) を参照してください。
40
40
 
41
- MCP は #354 の harness 内蔵 in-process bridge で Pi に接続します。解決済み `mcp.json` がある場合は MCP tools が、設定が無い場合も harness tools が、最小起動から常に有効です。bridge は Pi ExtensionAPI extension ではなく、harness が管理する tool adapter です。設計上の前提と制限は [ADR 0025](../adr/0025-conductor-agent-backend-sdk-and-pi.md) を参照してください。
41
+ MCP は harness が解決した `mcp.json` の map を Pi 1.x の公式 `createMcpExtension({ loadConfig })` へ注入します。Pi の `createAgentSession` は stdio / Streamable HTTP を扱い、SSE はサポートしません。MCP tool 名は `mcp__<server>__<tool>`、resource tools は `list_mcp_resources` / `list_mcp_resource_templates` / `read_mcp_resource` です。HTTP OAuth は公式 extension の対話フロー・credential store が担当します。解決済み設定が無い場合も harness tools と local extension tools は有効です。sidecar には MCP map の digest を保存し、resume 時に変更を検出した場合は fail fast します。Pi `.pi/mcp.json` への同期や core 独自の MCP client はありません。設計上の前提と制限は [ADR 0025](../adr/0025-conductor-agent-backend-sdk-and-pi.md) を参照してください。
42
42
 
43
43
  backend はセッション開始時に選択され、resume の途中では切り替えられません。system prompt の渡し方、認証、resume の差分は [ADR 0025](../adr/0025-conductor-agent-backend-sdk-and-pi.md) にまとまっています。
44
44
 
package/docs/config.md CHANGED
@@ -107,7 +107,7 @@ profile / worker に `acp` がある worker は `--default-acp-*` / config `acp.
107
107
 
108
108
  ### Pi resource root
109
109
 
110
- `conductor.backend: pi` のとき、Pi の標準ファイル名・ディレクトリを次の 2 層から解決します。プロジェクト層がユーザ層を上書きします。
110
+ `conductor.backend: pi` のとき、Pi 1.x の標準ファイル名・ディレクトリを次の 2 層から解決します。プロジェクト層がユーザ層を上書きします。
111
111
 
112
112
  | 層 | 既定パス |
113
113
  |----|----------|
@@ -118,16 +118,16 @@ profile / worker に `acp` がある worker は `--default-acp-*` / config `acp.
118
118
 
119
119
  - `settings.json` / `auth.json`: user → project の deep merge。credential は provider 単位で project entry を優先します。
120
120
  - `models.json`: Pi 標準の `providers` / `models` / built-in `modelOverrides` / request headers を model 解決へ反映します。
121
- - `extensions/`: ExtensionAPI の tool を読み込み、fixed harness tools → MCP bridge → local extension の順で追加します。同名の harness/MCP tool は上書きしません。
121
+ - `extensions/`: ExtensionAPI の tool を読み込み、fixed harness tools と local extension tools を conductor の custom tools として追加します。同名の harness tool は上書きしません。MCP は下記の Pi 公式 extension が担当します。
122
122
  - `skills/`: `SKILL.md` を読み込み、model invocation が有効な skill 本文を compiled system prompt の後ろに追加します。`/skill:<name>` で明示的に展開できます。
123
123
  - `prompts/`: Markdown template を読み込み、`/name args` の user prompt を Pi 標準の引数置換で展開します。
124
- - `themes/`: Pi 標準 JSON として読み込み、project 同名を優先します。conductor は headless `pi-agent-core` のため TUI renderer がなく、theme の色・表示設定はモデル入出力には適用しません。
124
+ - `themes/`: Pi 標準 JSON として読み込み、project 同名を優先します。conductor は headless `AgentSession` のため TUI renderer がなく、theme の色・表示設定はモデル入出力には適用しません。
125
125
 
126
- Pi の認証 CLI は provider 単位です。`ensemble auth login --provider <id>` は API-key provider なら secret prompt の値を user root の `auth.json`(既定 `~/.ensemble/pi/auth.json`)へ `AuthStorage.set` し、OAuth provider なら Pi の `AuthStorage.login` を TTY / stderr 経由で実行します。`--provider` を省略した場合は `settings.json` の `defaultProvider` または選択モデルから解決します。`logout` / `status` も同じ provider 解決を使います。project `auth.json` は既存の project-over-user 読取優先を維持しますが、login の書込み先にはなりません。project 層の明示的な OAuth credential は `AuthStorage` の refresh 対象外なので stale access token を使わず、実行時にエラーとして user 層ログインを案内します。OAuth は `ensemble auth login --provider <id>` で user 層へ保存してください。`ensemble models list` は `ModelRegistry` と project resource の解決結果から認証済み model だけを表示します。
126
+ Pi の認証 CLI は provider 単位です。`ensemble auth login --provider <id>` は API-key provider なら secret prompt の値を user root の `auth.json`(既定 `~/.ensemble/pi/auth.json`)へ保存し、OAuth provider なら Pi 1.x の `ModelRuntime.login` を TTY / stderr 経由で実行します。`--provider` を省略した場合は `settings.json` の `defaultProvider` または選択モデルから解決します。`logout` / `status` も同じ provider 解決を使います。project `auth.json` は既存の project-over-user 読取優先を維持しますが、login の書込み先にはなりません。project 層の明示的な OAuth credential は runtime が安全に refresh できないため実行時には使わず、user 層でのログインを案内します。Pi 標準どおり `models.json` / `settings.json` の API キーと header には `!command`(シェルコマンドの stdout)も指定できます。このコマンドは conductor プロセスの shell で実行され、同プロセスの OS 権限・環境を使うため、信頼できる設定でのみ使用してください。これは Pi と同じ accepted risk です。Pi の MCP HTTP OAuth は conductor provider OAuth とは別に、公式 MCP extension が `mcp-auth.json` と対話フローを管理します。`ensemble models list` は `ModelRegistry` と project resource の解決結果から認証済み model だけを表示します。
127
127
 
128
128
  #### `settings.json` の headless 対応範囲
129
129
 
130
- conductor は `pi-agent-core` を直接使い、`pi-coding-agent` の設定適用器・TUI・package manager は起動しません。そのため `settings.json` は Pi 標準のファイル名と resource path の意味を保ちますが、headless conductor が実際に参照するキーだけを契約とします。
130
+ conductor は Pi 1.x の `createAgentSession` / `DefaultResourceLoader` を headless で使います。TUI と package manager は起動しないため、`settings.json` は Pi 標準のファイル名と resource path の意味を保ちますが、headless conductor が実際に参照するキーだけを契約とします。
131
131
 
132
132
  実際に効くキーは次のとおりです。
133
133
 
@@ -143,7 +143,7 @@ Pi の `settings.md` にあるが headless conductor が適用しないキーは
143
143
  |------------------------------|------------------|
144
144
  | `defaultThinkingLevel` / `modelThinkingLevels` / `thinkingBudgets` / `enabledModels` | thinking level、budget、model cycling の設定 |
145
145
  | `hideThinkingBlock` / `showCacheMissNotices` / `cacheWarming` / `steeringMode` / `followUpMode` | transcript 表示、cache、対話キューの設定 |
146
- | `defaultTools` / `codemode.*` | Pi built-in coding tools の選択。conductor は harness / MCP / local extension の tool loadout を使います。 |
146
+ | `defaultTools` / `codemode.*` | Pi built-in coding tools の選択。conductor は built-in coding tools を無効にし、harness / MCP / local extension と公式 codemode/tool-search extension の loadout を使います。 |
147
147
  | `packages` | Pi package の install・解決。package が提供する resource は自動導入しません。 |
148
148
  | `enableSkillCommands` | skill command の登録 toggle。読み込んだ skill の `/skill:<name>` 展開可否はこのキーで変更できません。 |
149
149
  | `sessionDir` / `compaction.*` / `branchSummary.*` | Pi の session・compact・branch summary。session は harness の `.ensemble/pi/sessions/` が管理します。 |
@@ -211,17 +211,17 @@ MCP 設定は次の 2 層から読み込み、`mcpServers` のサーバー名単
211
211
  }
212
212
  ```
213
213
 
214
- 解決済み設定は conductor の両 backend に同じ map として渡す。Cursor SDK では `Agent.create` / `Agent.resume` の inline MCP として、Pi では harness 内蔵 MCP bridge が MCP client と Pi `AgentTool` に変換して使う。この bridge は Pi の ExtensionAPI extension をロードするものではなく、`@agents-ensemble/core` 内で `@modelcontextprotocol/sdk` client を接続する in-process thin bridge である。どちらも `resume` と認証・transport エラーからの in-process reconnect で同じ設定を再注入する。Pi は MCP 設定がある場合、session 開始前に全サーバーへ接続して tools を発見するため、接続または bridge の読み込みに失敗したら起動を fail する。
214
+ 解決済み設定は conductor の両 backend に同じ map として渡す。Cursor SDK では `Agent.create` / `Agent.resume` の inline MCP として、Pi では Pi 1.x の `DefaultResourceLoader` に `createMcpExtension({ loadConfig })` を extension factory として登録し、`createAgentSession` の起動時に注入する。Pi 側で `.pi/mcp.json` へ同期・コピー・symlink は行わず、resume 時も harness が解決した同じ map を再注入する。sidecar にはこの map の canonical SHA-256 digest だけを保存し、resume 時に現在の digest と比較するため、設定変更は新しい session を要求する。digest に秘密値そのものは保存しない。MCP 接続の管理、tool discovery、OAuth、resource tools は Pi 公式 extension に委ね、core は MCP client/transport を実装しない。
215
215
 
216
- 設定値の `${env:...}` や `${workspaceFolder}` などの展開は Cursor SDK では SDK に任せ、Pi bridge では起動時の process environment と conductor cwd を使って同じ参照を展開する。Pi bridge は `stdio` / `http`(Streamable HTTP)/ `sse`、`env`、`cwd`、`headers` を扱う。Cursor SDK が提供する OAuth 対話(`auth` 定義)は Pi bridge の制限により未対応で、該当定義は明確なエラーにする。`.cursor/mcp.json` や `.pi/mcp.json` へのコピー・symlink、`settings.json` の書き換えは行わず、ACP worker にはこの設定を渡さない。Pi MCP tools は `mcp_<server>_<tool>` という衝突回避済みの名前で表示され、resources/prompts の専用 API は今回の bridge の対象外とする。Pi MCP tool の `callTool` 例外または MCP `isError` は成功結果に変換せず、`AgentTool.execute` の throw として model loop に伝える。Pi では extension の読み込み有無にかかわらず、harness tools と解決済み MCP bridge tools が conductor の tool loadout に含まれる。
216
+ `env` / `headers` / `cwd` は harness 境界で Cursor 形式の placeholder を解決してから Pi 公式 extension に渡す。`${env:VAR}` は現在の process environment の値、`${workspaceFolder}` / `${workspaceFolderBasename}` は conductor の cwd へ変換し、値が見つからない placeholder は literal のまま渡さず明確なエラーにする。Pi 標準の `$VAR` / `${VAR}` は公式 resolver に委ねる。Pi は `stdio` と Streamable HTTP (`http`) をサポートするが、shared `mcp.json` の `sse` 定義は Pi 1.x ではサポートしないため、Pi conductor の起動時に明確なエラーにする。HTTP の `auth` (`CLIENT_ID` / `CLIENT_SECRET` / `scopes`) は Pi の MCP OAuth 設定へ渡され、認可フローと credential 保存は公式 extension が管理する。`.cursor/mcp.json` や `.pi/mcp.json` へのコピー・symlink、`settings.json` の書き換えは行わず、ACP worker にはこの設定を渡さない。MCP server tool は公式名 `mcp__<server>__<tool>`(長すぎる・衝突する場合は Pi の hash suffix)で公開される。resources がある場合は公式の `list_mcp_resources`、`list_mcp_resource_templates`、`read_mcp_resource` が提供される。`codemode` / `tool_search` の exposure は公式 extension の設定に従う。
217
217
 
218
- Pi bridge は `@modelcontextprotocol/sdk@1.30.0` を core に同梱する。依存が欠落した環境で MCP 設定を持つ Pi backend を起動した場合は、インストールすべき固定バージョンを含むエラーで停止する。MCP 未設定時は bridge をロードせず、両 backend とも従来どおり MCP なしで起動する。
218
+ Pi backend は `@earendil-works/pi-coding-agent@1.0.x` の公式 MCP extension を使う。MCP 未設定時は extension に空の解決結果を渡し、conductor は harness tools と local extension tools だけで起動する。
219
219
 
220
- JSON が不正、または `mcpServers` / サーバー定義の形式が不正な場合は、そのファイルを `[mcp]` 警告とともにスキップする。もう一方の層が有効ならそちらは引き続き読み込み、両方をスキップした場合は MCP なしで起動する。MCP のホットリロードは行わないため、変更後は新しいセッションを開始する。
220
+ JSON が不正、または `mcpServers` / サーバー定義の形式が不正な場合は、そのファイルを `[mcp]` 警告とともにスキップする。もう一方の層が有効ならそちらは引き続き読み込み、両方をスキップした場合は MCP なしで起動する。MCP のホットリロードは行わない。実行中の session の設定を変更した場合は、resume 時に digest mismatch として fail fast するため、新しい session を開始する。
221
221
 
222
222
  ## 秘密情報を config に書かない
223
223
 
224
- **token 本体を config に平文で保存しない。** 認証は環境変数、`gh auth login`、Cursor の `ensemble auth login`、または Pi の provider 単位 `ensemble auth login` / `AuthStorage` を使う。
224
+ **token 本体を config に平文で保存しない。** 認証は環境変数、`gh auth login`、Cursor の `ensemble auth login`、または Pi の provider 単位 `ensemble auth login` / `ModelRuntime` を使う。MCP HTTP OAuth の credential は Pi 公式 extension の管理領域に保存する。
225
225
 
226
226
  ## スキーマ外キー
227
227
 
package/docs/settings.md CHANGED
@@ -28,7 +28,7 @@ CLI > 環境変数 > project config > user config > コード default
28
28
 
29
29
  `profile.default` / `conductor.model` / `acp.defaultPreset` など。設計判断は [ADR 0020](https://github.com/otolab/agents-ensemble/blob/main/docs/adr/0020-ensemble-config-setting-resolution.md)。
30
30
 
31
- `conductor.backend` は、選択した profile の `conductor.backend` を project/user の deep merge 済み config より優先し、どちらも未指定なら `cursor` を使います。`cursor` は Cursor SDK 経路、`pi` は Pi Agent Core 経路を選びます。Pi は compiled conductor instructions を native system prompt に載せ、`~/.ensemble/pi` と `<repoRoot>/.ensemble/pi` の `settings.json` / `auth.json` / `models.json` / `extensions/` / `skills/` / `prompts/` / `themes/` を解決します。skills は system prompt へ追加し、prompts は `/name args` で展開します。themes は headless conductor のため読み込み・project 同名解決のみ行い、TUI 表示には使いません。root は `conductor.pi.agentDir` / `conductor.pi.projectDir` で上書きできます。`.ensemble/pi/SYSTEM.md` / `APPEND_SYSTEM.md` は無視します。`ensemble auth login|logout|status` は backend に分岐し、Pi では provider 単位に `AuthStorage` を使います。API key は TTY の secret prompt から user 層へ保存し、OAuth は Pi の OAuth flow を stderr 対話で実行します(SSH でも URL / device code を利用できます)。resume では sidecar に保存した backend と起動時の解決結果が一致しない場合、次のエラーで conductor を起動せず失敗します。
31
+ `conductor.backend` は、選択した profile の `conductor.backend` を project/user の deep merge 済み config より優先し、どちらも未指定なら `cursor` を使います。`cursor` は Cursor SDK 経路、`pi` は Pi 1.x `createAgentSession` 経路を選びます。Pi は compiled conductor instructions を native system prompt に載せ、`~/.ensemble/pi` と `<repoRoot>/.ensemble/pi` の `settings.json` / `auth.json` / `models.json` / `extensions/` / `skills/` / `prompts/` / `themes/` を解決します。skills は system prompt へ追加し、prompts は `/name args` で展開します。themes は headless conductor のため読み込み・project 同名解決のみ行い、TUI 表示には使いません。root は `conductor.pi.agentDir` / `conductor.pi.projectDir` で上書きできます。`.ensemble/pi/SYSTEM.md` / `APPEND_SYSTEM.md` は無視します。`ensemble auth login|logout|status` は backend に分岐し、Pi では provider 単位に `ModelRuntime` を使います。API key は TTY の secret prompt から user 層へ保存し、OAuth は Pi の OAuth flow を stderr 対話で実行します(SSH でも URL / device code を利用できます)。MCP HTTP OAuth は Pi 公式 MCP extension が別の credential store で扱います。resume では sidecar に保存した backend と起動時の解決結果が一致しない場合、次のエラーで conductor を起動せず失敗します。
32
32
 
33
33
  ```text
34
34
  Session sidecar conductorBackend mismatch: pi !== cursor
@@ -62,7 +62,7 @@ config キーなし。CI・スクリプト・端末検出、または 1 回限
62
62
  |------|--------|
63
63
  | GitHub API | `GITHUB_TOKEN` > `GH_TOKEN` > (`allowGhAuthTokenFallback: true` 時のみ)`gh auth token` |
64
64
  | conductor (cursor) | `CURSOR_API_KEY` > `~/.cursor/sdk/auth.json`(`ensemble auth login`) |
65
- | conductor (pi) | project `auth.json` の読取優先 > user `AuthStorage`(`~/.ensemble/pi/auth.json`、`conductor.pi.agentDir` で上書き) > `settings.json` fallback > provider 環境変数。`ensemble auth` は user 層へ provider 単位で保存。project 層の明示的な OAuth credential は refresh できないため使わず、user 層の `AuthStorage` へログインする |
65
+ | conductor (pi) | project `auth.json` の読取優先 > user `ModelRuntime`(`~/.ensemble/pi/auth.json`、`conductor.pi.agentDir` で上書き) > `settings.json` fallback > provider 環境変数。`ensemble auth` は user 層へ provider 単位で保存。project 層の明示的な OAuth credential は refresh できないため使わず、user 層の runtime へログインする |
66
66
  | worker ACP(preset 依存) | preset ごとに README / ADR 0019 参照 |
67
67
 
68
68
  ## 一覧 — Phase 1(config.yaml)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agents-ensemble/cli",
3
- "version": "0.8.0",
3
+ "version": "0.9.1",
4
4
  "type": "module",
5
5
  "description": "ensemble CLI — Issue-based agent orchestration",
6
6
  "bin": {
@@ -17,7 +17,7 @@
17
17
  "react": "19.2.0",
18
18
  "react-ink-textarea": "npm:@otolab/react-ink-textarea@0.4.1-otolab.3",
19
19
  "string-width": "8.1.0",
20
- "@agents-ensemble/core": "0.8.0"
20
+ "@agents-ensemble/core": "0.9.1"
21
21
  },
22
22
  "devDependencies": {
23
23
  "@types/js-yaml": "4.0.9",