@agents-ensemble/cli 0.14.0 → 0.15.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.
Files changed (73) hide show
  1. package/README.md +13 -3
  2. package/config.example.yaml +7 -3
  3. package/dist/index.js +8 -3
  4. package/dist/index.js.map +1 -1
  5. package/dist/issue-command.d.ts +6 -4
  6. package/dist/issue-command.d.ts.map +1 -1
  7. package/dist/issue-command.js +13 -10
  8. package/dist/issue-command.js.map +1 -1
  9. package/dist/session-log-lines.js +1 -1
  10. package/dist/session-log-lines.js.map +1 -1
  11. package/dist/tui/activity-log.d.ts +1 -1
  12. package/dist/tui/activity-log.d.ts.map +1 -1
  13. package/dist/tui/activity-log.js +16 -2
  14. package/dist/tui/activity-log.js.map +1 -1
  15. package/dist/tui/create-issue-session-tui-host.d.ts.map +1 -1
  16. package/dist/tui/create-issue-session-tui-host.js +1 -1
  17. package/dist/tui/create-issue-session-tui-host.js.map +1 -1
  18. package/dist/tui/ink-test-keys.d.ts +4 -0
  19. package/dist/tui/ink-test-keys.d.ts.map +1 -1
  20. package/dist/tui/ink-test-keys.js +4 -0
  21. package/dist/tui/ink-test-keys.js.map +1 -1
  22. package/dist/tui/issue-session-tui-stream.d.ts.map +1 -1
  23. package/dist/tui/issue-session-tui-stream.js +77 -8
  24. package/dist/tui/issue-session-tui-stream.js.map +1 -1
  25. package/dist/tui/issue-session-tui-stream.test.js +257 -3
  26. package/dist/tui/issue-session-tui-stream.test.js.map +1 -1
  27. package/dist/tui/issue-session-tui.d.ts +3 -2
  28. package/dist/tui/issue-session-tui.d.ts.map +1 -1
  29. package/dist/tui/issue-session-tui.js +145 -12
  30. package/dist/tui/issue-session-tui.js.map +1 -1
  31. package/dist/tui/issue-session-tui.test.js +390 -16
  32. package/dist/tui/issue-session-tui.test.js.map +1 -1
  33. package/dist/tui/open-questions-pane.d.ts +19 -0
  34. package/dist/tui/open-questions-pane.d.ts.map +1 -1
  35. package/dist/tui/open-questions-pane.js +35 -34
  36. package/dist/tui/open-questions-pane.js.map +1 -1
  37. package/dist/tui/operator-command-suggestions.d.ts +15 -0
  38. package/dist/tui/operator-command-suggestions.d.ts.map +1 -1
  39. package/dist/tui/operator-input-history.d.ts +13 -0
  40. package/dist/tui/operator-input-history.d.ts.map +1 -0
  41. package/dist/tui/operator-input-history.js +51 -0
  42. package/dist/tui/operator-input-history.js.map +1 -0
  43. package/dist/tui/operator-input-layout.d.ts +2 -0
  44. package/dist/tui/operator-input-layout.d.ts.map +1 -1
  45. package/dist/tui/operator-input-layout.js +73 -0
  46. package/dist/tui/operator-input-layout.js.map +1 -1
  47. package/dist/tui/operator-text-area.d.ts +2 -0
  48. package/dist/tui/operator-text-area.d.ts.map +1 -1
  49. package/dist/tui/operator-text-area.js +16 -4
  50. package/dist/tui/operator-text-area.js.map +1 -1
  51. package/dist/tui/operator-text-area.test-double.d.ts.map +1 -1
  52. package/dist/tui/operator-text-area.test-double.js +13 -12
  53. package/dist/tui/operator-text-area.test-double.js.map +1 -1
  54. package/dist/tui/operator-text-area.test.js +16 -2
  55. package/dist/tui/operator-text-area.test.js.map +1 -1
  56. package/dist/tui/pane-layout.d.ts +2 -0
  57. package/dist/tui/pane-layout.d.ts.map +1 -1
  58. package/dist/tui/pane-layout.js +7 -3
  59. package/dist/tui/pane-layout.js.map +1 -1
  60. package/dist/tui/stream-layout.d.ts +3 -3
  61. package/dist/tui/stream-layout.d.ts.map +1 -1
  62. package/dist/tui/stream-layout.js +6 -6
  63. package/dist/tui/stream-layout.js.map +1 -1
  64. package/dist/tui/tui-layout-constants.d.ts +1 -1
  65. package/dist/tui/tui-layout-constants.d.ts.map +1 -1
  66. package/dist/tui/tui-layout-constants.js +1 -1
  67. package/dist/tui/tui-layout-constants.js.map +1 -1
  68. package/dist/tui/tui-view-model.d.ts.map +1 -1
  69. package/dist/tui/tui-view-model.js +2 -8
  70. package/dist/tui/tui-view-model.js.map +1 -1
  71. package/docs/config.md +107 -20
  72. package/docs/settings.md +9 -7
  73. package/package.json +3 -3
package/docs/config.md CHANGED
@@ -10,13 +10,18 @@ conductor に渡す MCP 設定もこの config.yaml とは別の JSON ファイ
10
10
 
11
11
  | 層 | パス | 優先度 |
12
12
  |----|------|--------|
13
- | プロジェクト | `<repoRoot>/.ensemble/config.yaml` | 高(上書き) |
13
+ | プロジェクト | `<repoRoot>/.ensemble/config.yaml` | 高(読み込み有効時) |
14
14
  | ユーザ | `~/.ensemble/config.yaml` | 低(既定) |
15
15
 
16
- - 両方ある場合は **deep merge**(プロジェクトがユーザを上書き)
16
+ - 両方あり、読み込みが有効な場合は **deep merge**(プロジェクトがユーザを上書き)
17
+ - user 設定で project 層を無効にした場合は **user 設定のみ**
17
18
  - どちらも無い場合は **コード内デフォルト**
18
19
  - **環境変数・CLI フラグは config より優先**(明示上書き)
19
20
 
21
+ ユーザ設定の `config.loadProjectConfig: false` を指定すると、project config を読み込まず user 設定だけで解決します。既定値は `true` です。この制御キーは `~/.ensemble/config.yaml` でのみ有効で、project 側に同じキーを書いても無視されます。project config を読み込んだ場合は絶対パスを、user 設定でスキップした場合はその旨を起動時に stderr へ表示します。project config が無く、読み込みが有効な場合は表示しません。
22
+
23
+ これは [#547 の名前付き config 切り替え](https://github.com/otolab/agents-ensemble/issues/547) とは別の設定です。`config.loadProjectConfig` は既定の project 層を読むかどうかを選びます。#547 は名前付き config や明示ファイルを選び、モデル・ACP などの設定内容を切り替える仕組みを扱います。
24
+
20
25
  ### 設定項目ごとの解決順(Phase 1)
21
26
 
22
27
  すべての Phase 1 キーで次の順序を **実装・テストで固定**している:
@@ -49,6 +54,9 @@ cp config.example.yaml ~/.ensemble/config.yaml
49
54
  profile:
50
55
  default: implementer-and-reviewer-v2 # ENSEMBLE_DEFAULT_PROFILE 相当
51
56
 
57
+ config:
58
+ loadProjectConfig: true # user config のみ有効。false で project config を無視
59
+
52
60
  conductor:
53
61
  backend: pi # cursor(既定) | pi
54
62
  model: default # CONDUCTOR_MODEL_ID 相当
@@ -61,8 +69,7 @@ conductor:
61
69
  acp:
62
70
  defaultPreset: codex # ENSEMBLE_DEFAULT_ACP_CLI 相当
63
71
  env: # codex-acp 子プロセス spawn に渡す env(user → project deep merge)
64
- MODEL_PROVIDER: litellm # 例: LiteLLM ゲートウェイ
65
- CODEX_CONFIG: ~/.codex/litellm.config.toml
72
+ MODEL_PROVIDER: litellm # Codex provider ID。接続設定は Codex config 側
66
73
 
67
74
  session:
68
75
  worktree: isolated # --worktree 既定(isolated | in-repo)
@@ -78,9 +85,9 @@ github:
78
85
  allowGhAuthTokenFallback: true
79
86
  monitor:
80
87
  enabled: true
81
- debounceMs: 30000
82
- pollIntervalMs: 60000
83
- activePollIntervalMs: 15000
88
+ debounceMs: 60000
89
+ pollIntervalMs: 120000
90
+ activePollIntervalMs: 60000
84
91
  stopPollWaitMs: 5000
85
92
 
86
93
  tui:
@@ -92,6 +99,7 @@ tui:
92
99
 
93
100
  | キー | 意味 | CLI 上書き | env 上書き |
94
101
  |------|------|-----------|-----------|
102
+ | `config.loadProjectConfig` | project `.ensemble/config.yaml` を読み込むか(既定: `true`、user config のみ有効) | — | — |
95
103
  | `profile.default` | 既定 team profile(名前またはパス) | `--profile` | `ENSEMBLE_DEFAULT_PROFILE` |
96
104
  | `conductor.model` | conductor モデル id | `--model` | `CONDUCTOR_MODEL_ID` |
97
105
  | `conductor.verbose` | harness 詳細 telemetry の表示 | `--verbose` | `CONDUCTOR_VERBOSE` |
@@ -111,6 +119,8 @@ tui:
111
119
  | `github.monitor.debounceMs` | 更新 debounce | `--github-monitor-debounce-ms` | — |
112
120
  | `github.monitor.pollIntervalMs` 他 | poll 間隔(コード内既定のみ) | — | — |
113
121
 
122
+ `config.loadProjectConfig` は config の merge 対象を決めるメタ設定です。project YAML の値は、設定結果にも project config の読み込み判断にも使われません。
123
+
114
124
  ### ACP spawn env(`acp.env`)
115
125
 
116
126
  `acp.env` は codex-acp 等の子プロセス spawn 時に渡す環境変数の正本です。**team profile に ACP 設定はない**(`acp` / `workers[].acp` を YAML に書くと load 時エラー)。
@@ -134,7 +144,31 @@ spawn 解決時、子プロセスへ渡す env は次の順でマージされま
134
144
 
135
145
  #### LiteLLM(OpenAI 互換ゲートウェイ)向け config 例
136
146
 
137
- **team profile ではなく ensemble config に書く。** 秘密情報はプレースホルダに置き換える。
147
+ Codex worker の接続先は Codex の provider 設定で定義し、`acp.env.MODEL_PROVIDER` で使う provider ID を選びます。ensemble はこの環境変数を `codex-acp` に渡すだけで、TOML ファイルを選んだり読み込んだりはしません。
148
+
149
+ `@agentclientprotocol/codex-acp` は `packages/core/package.json` で **2.2.2** に pin されています。この版では、`CODEX_CONFIG` は Codex session config に merge する **JSON オブジェクト文字列**として `JSON.parse` されます。TOML のパスを設定すると JSON parse に失敗します。`MODEL_PROVIDER` は新しい session に渡す **provider ID** で、設定ファイルの選択には使われません。ensemble はいずれの値も `acp.env` から子プロセスへ渡すだけです。
150
+
151
+ Codex の model ID はトップレベルの `model`、provider は `model_provider` で指定し、provider IDに対応する `[model_providers.<id>]` から接続先・API形式・認証方法を読みます。worker では Codex が通常の設定レイヤー(主に `~/.codex/config.toml`)を読み、必要であれば `CODEX_CONFIG` の JSON が session config に加わります。`MODEL_PROVIDER=litellm` だけでは、Codex は別ファイル `litellm.config.toml` を探さず、model IDも選びません。
152
+
153
+ `CODEX_CONFIG` の JSON には `model`、`model_provider`、`model_providers` などCodex session configのキーを含められます。ただし `MODEL_PROVIDER` を設定した場合は、codex-acp が新しいsessionの provider IDとしてその値を別途渡し、JSON内の `model_provider` より優先します。model IDとprovider IDに対応する定義は、それぞれCodexの通常configかJSON設定に必要です。model IDはLiteLLM側で提供されるものを指定してください。
154
+
155
+ 以下の例では秘密値を記載せず、環境変数名を使います。実際の `LITELLM_API_KEY` はシェル等で設定してください。
156
+
157
+ #### A. provider 設定を正本 config にまとめる(推奨)
158
+
159
+ provider 定義を `~/.codex/config.toml` に置き、ensemble config では provider ID だけを指定します。Codex CLI と worker が同じ provider 定義を参照し、worker の接続先は `MODEL_PROVIDER` で切り替えられます。
160
+
161
+ ```toml
162
+ # ~/.codex/config.toml
163
+ model = "YOUR_LITELLM_MODEL_ID"
164
+ model_provider = "litellm"
165
+
166
+ [model_providers.litellm]
167
+ name = "LiteLLM"
168
+ base_url = "https://litellm.example/v1"
169
+ wire_api = "responses"
170
+ env_key = "LITELLM_API_KEY"
171
+ ```
138
172
 
139
173
  ```yaml
140
174
  # ~/.ensemble/config.yaml または <repo>/.ensemble/config.yaml
@@ -142,23 +176,71 @@ acp:
142
176
  defaultPreset: codex
143
177
  env:
144
178
  MODEL_PROVIDER: litellm
145
- CODEX_CONFIG: ~/.codex/litellm.config.toml
146
179
  ```
147
180
 
148
- `litellm.config.toml` は Codex の [Profiles](https://developers.openai.com/codex/config-advanced) と同様に `~/.codex/` 配下に置く。`CODEX_CONFIG` でそのパスを codex-acp に指示する。
181
+ `model` にはLiteLLM側で提供する実際のmodel IDを指定します。Codex CLI とworkerの両方がこのmodel設定を使います。`MODEL_PROVIDER` はworker sessionで使うproviderだけを選び、model IDは変更しません。別providerへ切り替える場合は、そのproviderでも同じmodel IDが利用できることを確認してください。Codex CLIで別の既定providerを使う場合は、`model_provider` をそのprovider IDにします。認証値は設定ファイルに書かず、Codexが参照する環境変数で渡してください。
182
+
183
+ #### B. Codex CLI のprofile overlayを使う
184
+
185
+ Codex CLI の `codex --profile litellm` は、まず `~/.codex/config.toml` を読み、その上に `~/.codex/litellm.config.toml` を重ねます。profile ファイルには `[profiles.litellm]` ではなく通常のトップレベル設定を書きます。Codex 0.134.0 以降、`config.toml` 内の `[profiles.litellm]` と `profile = "litellm"` による指定は使われません。
186
+
187
+ ```toml
188
+ # ~/.codex/litellm.config.toml — Codex CLI 用 overlay
189
+ model = "YOUR_LITELLM_MODEL_ID"
190
+ model_provider = "litellm"
191
+
192
+ [model_providers.litellm]
193
+ name = "LiteLLM"
194
+ base_url = "https://litellm.example/v1"
195
+ wire_api = "responses"
196
+ env_key = "LITELLM_API_KEY"
197
+ ```
198
+
199
+ このprofile overlayは **Codex CLI 用**です。ensemble worker は `codex-acp` から Codex `app-server` を起動する経路であり、`codex --profile` を指定できません。worker にはAのように provider 定義を `~/.codex/config.toml` に置くか、Cのように `CODEX_CONFIG` でsession設定を渡してください。Codex の `config.toml` に別TOMLを読み込む公式include機能はありません。CLI profileとworkerで別ファイルを正本にする場合、worker側の設定にも同じprovider定義が必要です。手動で同期するか、設定生成で両方を作成してください。
149
200
 
150
- #### CLI `codex --profile litellm` と ensemble worker の対応
201
+ #### C. worker 用 JSON 設定を別ファイルで管理する
202
+
203
+ 小規模な設定や検証では、worker 専用の JSON ファイルを用意し、その**内容**を `CODEX_CONFIG` に渡せます。`CODEX_CONFIG` 自体にはファイルパスではなくJSON文字列を設定します。例えば、次のファイルを作成します。
204
+
205
+ ```json
206
+ {
207
+ "model": "YOUR_LITELLM_MODEL_ID",
208
+ "model_providers": {
209
+ "litellm": {
210
+ "name": "LiteLLM",
211
+ "base_url": "https://litellm.example/v1",
212
+ "wire_api": "responses",
213
+ "env_key": "LITELLM_API_KEY"
214
+ }
215
+ }
216
+ }
217
+ ```
218
+
219
+ そのファイルの内容を環境変数に読み込み、`acp.env` では `CODEX_CONFIG` を上書きしないで起動します。
220
+
221
+ ```sh
222
+ export CODEX_CONFIG="$(jq -c . "$HOME/.codex/ensemble-worker.json")"
223
+ ensemble issue 123
224
+ ```
225
+
226
+ ```yaml
227
+ # ~/.ensemble/config.yaml または <repo>/.ensemble/config.yaml
228
+ acp:
229
+ defaultPreset: codex
230
+ env:
231
+ MODEL_PROVIDER: litellm
232
+ ```
151
233
 
152
- | 手段 | profile レイヤー | config `acp.env` | 備考 |
153
- |------|------------------|------------------|------|
154
- | `codex --profile litellm`(CLI 直接) | Codex profile `litellm` | — | `~/.codex/config.toml` の `[profiles.litellm]` を読む |
155
- | `ensemble issue` + 上記 config 例 | — | `MODEL_PROVIDER` / `CODEX_CONFIG` | codex-acp → `codex app-server`(**`--profile` 非対応**)。env で config ファイルを指定 |
234
+ `jq -c` は JSON を1行に整形して環境変数へ渡します。`acp.env` に `CODEX_CONFIG` を設定した場合は、親プロセスから継承した値より `acp.env` の値が優先されます。設定を別ファイルで保ちたい場合は、ファイル内容を起動前に環境変数へ変換してください。CではCodex CLIのprovider設定は変わらず、JSONはworker sessionにのみ適用されます。
156
235
 
157
- `CODEX_CONFIG_PROFILE`(Codex 側 profile 名の env 指定)は [openai/codex#38104](https://github.com/openai/codex/issues/38104) で未実装。将来実装されたら `acp.env` に載せる想定。
236
+ #### Codex CLI と ensemble worker の違い
158
237
 
159
- #### `litellm.config.toml` を `~/.codex/config.toml` に統合する代替
238
+ | 起動方法 | 設定の選択・読み込み | LiteLLM の指定 |
239
+ |----------|--------------------|----------------|
240
+ | `codex --profile litellm` | Codex CLI が `~/.codex/config.toml` に `~/.codex/litellm.config.toml` をoverlay | profileファイルに `model`、`model_provider`、provider 定義を記述 |
241
+ | ensemble の Codex worker | `codex-acp` → Codex `app-server`。`--profile` は渡せない。Codex の通常 config とsession設定を利用 | `MODEL_PROVIDER` でprovider IDを選択し、`model` は通常config(A)または `CODEX_CONFIG` JSON(C)で指定 |
160
242
 
161
- `litellm` を Codex profile として `[profiles.litellm]` に書き、`codex --profile litellm` で使う方法もある。統合すると CLI と ensemble の設定が 1 ファイルにまとまるが、**ensemble worker は現状 `app-server` 経路で `--profile` を受け取れない**ため、CLI だけ統合しても worker 側は `CODEX_CONFIG` 等の env 指示が別途必要。profile 分割のまま `CODEX_CONFIG` でファイルを指す方が、CLI / ensemble の設定境界が明確になる。
243
+ `CODEX_CONFIG_PROFILE` によるprofile名指定は Codex 側で未実装です([openai/codex#38104](https://github.com/openai/codex/issues/38104))。したがって worker のprofile選択手段としては使えません。
162
244
 
163
245
  #### resume と `acp.env` 変更
164
246
 
@@ -261,7 +343,7 @@ conductor の system prompt の基底は modular-prompt のコンパイル結果
261
343
 
262
344
  **config 未作成時**は従来どおり env とコード default のみが効く(後方互換)。
263
345
 
264
- `session.lazyWorkers` は既定 `false` です。`true` にすると profile の全 worker を session に登録して TUI / `list_workers` に `sleeping` と表示し、初回の通常 `prompt_worker` で対象 worker だけを attach / init します。init prompt 完了後に最初の instruction を別ラウンドで送り、その後はセッション終了まで常駐します。resume は sidecar に保存した設定を使い、ACP session のある worker は再 attach、まだ使っていない worker は sleeping のままにします。lazy 設定のない旧 sidecar は eager として扱います。
346
+ `session.lazyWorkers` は既定 `false` です。`true` にすると profile の全 worker を session に登録して TUI / `list_workers` に `sleeping` と表示し、初回の通常 `prompt_worker` で対象 worker だけを attach / init します。init prompt 完了後に最初の instruction を別ラウンドで送り、その後はセッション終了まで常駐します。resume は SessionResumeStore に保存した設定を使い、ACP session のある worker は再 attach、まだ使っていない worker は sleeping のままにします。lazy 設定のない旧 SessionResumeStore は eager として扱います。
265
347
 
266
348
  ### team profile `acp` の削除
267
349
 
@@ -301,7 +383,7 @@ MCP 設定は次の 2 層から読み込み、`mcpServers` のサーバー名単
301
383
  }
302
384
  ```
303
385
 
304
- 解決済み設定は 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 を実装しない。
386
+ 解決済み設定は 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 を再注入する。SessionResumeStore にはこの map の canonical SHA-256 digest だけを保存し、resume 時に現在の digest と比較するため、設定変更は新しい session を要求する。digest に秘密値そのものは保存しない。MCP 接続の管理、tool discovery、OAuth、resource tools は Pi 公式 extension に委ね、core は MCP client/transport を実装しない。
305
387
 
306
388
  `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 の設定に従う。
307
389
 
@@ -321,6 +403,11 @@ YAML に未知のキーがあっても **無視する**(警告なし)。将
321
403
 
322
404
  - [pi-conductor-setup.md](pi-conductor-setup.md) — Pi conductor の初回セットアップ・認証・復旧(利用者向け正本)
323
405
  - [settings.md](settings.md) — 全設定層の一覧・解決パターン(本書は config.yaml 詳細)
406
+ - [ADR 0028](adr/0028-authentication-delegation-and-ensemble-auth.md) — worker の認証移譲とCodex runtime設定
407
+ - [Codex profiles / custom model providers](https://developers.openai.com/codex/config-advanced#profiles) — Codex CLI profile overlay、`model`、`model_provider` の現行仕様
408
+ - [codex-acp 2.2.2 runtime options](https://github.com/agentclientprotocol/codex-acp/blob/v2.2.2/README.md#runtime-options) — `CODEX_CONFIG` / `MODEL_PROVIDER` の説明
409
+ - [codex-acp 2.2.2 起動処理](https://github.com/agentclientprotocol/codex-acp/blob/v2.2.2/src/index.ts#L90-L99) — 環境変数の parse と ACP 起動時の読み込み
410
+ - [codex-acp 2.2.2 session開始](https://github.com/agentclientprotocol/codex-acp/blob/v2.2.2/src/CodexAcpClient.ts#L745-L755) — session config と provider ID を Codex app-server へ渡す処理
324
411
  - [ADR 0020](https://github.com/otolab/agents-ensemble/blob/main/docs/adr/0020-ensemble-config-setting-resolution.md) — 解決順の設計判断
325
412
  - [ADR 0018](https://github.com/otolab/agents-ensemble/blob/main/docs/adr/0018-team-profile-four-layer-resolution.md) — `.ensemble/` 配下の規約(team-profile)
326
413
  - [#223](https://github.com/otolab/agents-ensemble/issues/223) — config 基盤
package/docs/settings.md CHANGED
@@ -10,7 +10,7 @@
10
10
  | **環境変数** | シェル / CI | 一時上書き・秘密情報・自動化注入 |
11
11
  | **project config** | `<repoRoot>/.ensemble/config.yaml` | リポジトリ単位の既定 |
12
12
  | **user config** | `~/.ensemble/config.yaml` | マシン全体の既定 |
13
- | **user conductor instructions** | `~/.ensemble/AGENTS.md` | profile に依存しない conductor 向けの運用前提 |
13
+ | **user instructions** | `~/.ensemble/AGENTS.md` | profile に依存しない conductor / worker 共通の運用前提 |
14
14
  | **team profile** | `profile.yaml`([elements.md](elements.md)) | worker 構成・workspace(**ACP は含まない → [config.md](config.md)**) |
15
15
  | **Codex profile** | `~/.codex/config.toml` + `codex --profile` | Codex CLI の profile(ensemble team profile とは無関係) |
16
16
  | **MCP** | `.agents/mcp.json` / `~/.ensemble/mcp.json` | conductor 向け MCP([config.md § MCP](config.md#conductor-mcp-設定mcpjson)) |
@@ -30,13 +30,13 @@ CLI > 環境変数 > project config > user config > コード default
30
30
 
31
31
  `profile.default` / `conductor.model` / `acp.defaultPreset` など。設計判断は [ADR 0020](https://github.com/otolab/agents-ensemble/blob/main/docs/adr/0020-ensemble-config-setting-resolution.md)。
32
32
 
33
- `conductor.backend` は、選択した profile の `conductor.backend` を project/user の deep merge 済み config より優先し、どちらも未指定なら `cursor` を使います。`profile.conductor.builtinTools` は profile だけで制御し、省略・未指定は有効、`false` のみ built-in coding tools を無効にします。`profile.conductor.piSkills` は Pi backend のみで、Pi 標準の skill discovery を制御し、省略・未指定は有効、`false` で skill 索引を止めます。`config.yaml` や `settings.json.defaultTools` ではこの制御を行いません。`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 は Pi の `DefaultResourceLoader` で索引し、カタログを system prompt に載せて本文は `read` / `/skill:` で読みます。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 を起動せず失敗します。
33
+ `conductor.backend` は、選択した profile の `conductor.backend` を project/user の deep merge 済み config より優先し、どちらも未指定なら `cursor` を使います。`profile.conductor.builtinTools` は profile だけで制御し、省略・未指定は有効、`false` のみ built-in coding tools を無効にします。`profile.conductor.piSkills` は Pi backend のみで、Pi 標準の skill discovery を制御し、省略・未指定は有効、`false` で skill 索引を止めます。`config.yaml` や `settings.json.defaultTools` ではこの制御を行いません。`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 は Pi の `DefaultResourceLoader` で索引し、カタログを system prompt に載せて本文は `read` / `/skill:` で読みます。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 では SessionResumeStore に保存した backend と起動時の解決結果が一致しない場合、次のエラーで conductor を起動せず失敗します。
34
34
 
35
35
  ```text
36
- Session sidecar conductorBackend mismatch: pi !== cursor
36
+ Session resume state conductorBackend mismatch: pi !== cursor
37
37
  ```
38
38
 
39
- 旧 sidecar にこのフィールドがない場合は、従来どおり `cursor` として扱います。Pi の `conductorAgentId` は Pi の session id としても使われ、transcript は `<conductor-cwd>/.ensemble/pi/sessions/` の JSONL に保存されます。`--continue` / `--resume` ではその transcript を復元し、Issue context から compiled `systemPrompt` を毎回再コンパイルして native system prompt に再注入します。
39
+ 旧 SessionResumeStore にこのフィールドがない場合は、従来どおり `cursor` として扱います。Pi の `conductorAgentId` は Pi の session id としても使われ、transcript は `<conductor-cwd>/.ensemble/pi/sessions/` の JSONL に保存されます。`--continue` / `--resume` ではその transcript を復元し、Issue context から compiled `systemPrompt` を毎回再コンパイルして native system prompt に再注入します。
40
40
 
41
41
  ### パターン B — Phase 1 横断(env なし)
42
42
 
@@ -63,8 +63,10 @@ config キーなし。CI・スクリプト・端末検出、または 1 回限
63
63
  | 設定 | 環境変数 | config | CLI / API | コード default | 解決 |
64
64
  |------|----------|--------|-----------|----------------|------|
65
65
  | permission 停滞警告閾値 | — | — | `--permission-deadlock-stall-ms` / `RunConductorSessionOptions.permissionDeadlockStallMs` | `300_000ms`(300s) | 明示指定 > core default |
66
+ | dispatch hold reminder 間隔 | — | — | `--dispatch-hold-reminder-ms` / `RunConductorSessionOptions.dispatchHoldReminderMs` | `1_800_000ms`(30 分) | 明示指定 > core default |
66
67
 
67
68
  `permissionDeadlockPollMs` は `5_000ms`(5s)のままで、この実行時設定の対象外です。
69
+ dispatch hold reminder の poll 間隔も `5_000ms`(5s)で、この実行時設定の対象外です。
68
70
 
69
71
  ### パターン E — 認証(config は可否のみ)
70
72
 
@@ -97,7 +99,7 @@ config キーなし。CI・スクリプト・端末検出、または 1 回限
97
99
  | 監視 debounce | `github.monitor.debounceMs` | — | `--github-monitor-debounce-ms` | `30000` | B |
98
100
  | poll 間隔 | `github.monitor.pollIntervalMs` 他 | — | — | 各定数 | B |
99
101
 
100
- テンプレート: [`config.example.yaml`](../config.example.yaml)。`ensemble issue` 起動時(GitHub monitor より前)に `loadEnsembleConfig(repoRoot)` で読み込む。
102
+ テンプレート: [`config.example.yaml`](../config.example.yaml)。`ensemble issue` 起動時(GitHub monitor より前)に `loadEnsembleConfig(repoRoot)` で読み込む。user 設定の `config.loadProjectConfig: false` で project 層を無効にでき、project config の読み込み・スキップは同 loader を使う起動経路で stderr に表示する。詳細は [config.md](config.md#配置と解決順) を参照。
101
103
 
102
104
  ## 一覧 — TUI / オペレータ UI
103
105
 
@@ -134,7 +136,7 @@ TUI 設定は `loadEnsembleConfig` 結果を `createIssueSessionTuiHost` へ渡
134
136
  | 設定 | ファイル | 解決順 |
135
137
  |------|----------|--------|
136
138
  | conductor MCP | `.agents/mcp.json` / `~/.ensemble/mcp.json` | project > user(サーバー名単位 merge) |
137
- | conductor 向け user 文書 | `~/.ensemble/AGENTS.md` | user 固定。project 層なし |
139
+ | user instructions | `~/.ensemble/AGENTS.md` | user 固定。conductor と worker 全員に適用。project 層なし |
138
140
  | team profile | `.ensemble/profiles/…` / `--profile` パス | [ADR 0018](https://github.com/otolab/agents-ensemble/blob/main/docs/adr/0018-team-profile-four-layer-resolution.md) |
139
141
 
140
142
  ## 一覧 — ランタイム(利用者が「設定」しない)
@@ -149,7 +151,7 @@ TUI 設定は `loadEnsembleConfig` 結果を `createIssueSessionTuiHost` へ渡
149
151
 
150
152
  | やりたいこと | 推奨 |
151
153
  |--------------|------|
152
- | 複数 repo で conductor に共有する短い運用前提 | `~/.ensemble/AGENTS.md`([modular-prompt の文書の役割](modular-prompt.md)を参照) |
154
+ | 複数 repo で conductor と worker に共有する短い運用前提 | `~/.ensemble/AGENTS.md`([modular-prompt の文書の役割](modular-prompt.md)を参照) |
153
155
  | チーム / 個人の恒久既定(モデル、worktree、monitor) | `~/.ensemble/config.yaml` または project `.ensemble/config.yaml` |
154
156
  | CI で 1 ジョブだけ上書き | 環境変数(`CONDUCTOR_MODEL_ID` 等) |
155
157
  | 1 回限りの実行 | CLI フラグ(初回メッセージは `ensemble issue <ref> [message...]`) |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agents-ensemble/cli",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "type": "module",
5
5
  "description": "ensemble CLI — Issue-based agent orchestration",
6
6
  "bin": {
@@ -17,8 +17,8 @@
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.14.0",
21
- "@agents-ensemble/operator-agent": "0.2.0"
20
+ "@agents-ensemble/core": "0.15.0",
21
+ "@agents-ensemble/operator-agent": "0.3.0"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@types/js-yaml": "4.0.9",