codexteer 0.18.2 → 0.19.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.
@@ -0,0 +1,508 @@
1
+ import { OPTIONS_INVALID, RUNTIME_NOT_READY, RUNTIME_UNAVAILABLE } from "./help-errors.mjs";
2
+ const RESTART_SHARED = "ユーザーが作業を終えてDesktopを終了し、codexteer desktop startで起動し直す。codexteerは自動で起動・再起動しない。";
3
+
4
+ const sharedRuntimeErrors = [
5
+ RUNTIME_UNAVAILABLE,
6
+ RUNTIME_NOT_READY,
7
+ ];
8
+
9
+ const desktopReadOnlyError = {
10
+ code: "DESKTOP_READ_ONLY",
11
+ when: "--connection desktop(観測専用)で、送信・作成・撤回・修復・UI操作などを実行した",
12
+ action: "接続は自動で切り替わらない。必要なら既定sharedで別に実行する。監督中に--connectionを外して送信を回避しない。",
13
+ };
14
+
15
+ const supervisorForbiddenError = {
16
+ code: "SUPERVISOR_CONTROL_FORBIDDEN",
17
+ when: "監督本文の--supervisor付きで、担当タスクの外に及ぶ操作(作成・照合・修復・Desktop更新など)を実行した",
18
+ action: "ユーザーの端末から--supervisorなしで、ユーザーが委任した範囲で実行する。",
19
+ };
20
+
21
+ const remoteHostUnsupportedError = {
22
+ code: "REMOTE_HOST_OPERATION_UNSUPPORTED",
23
+ when: "--hostまたはhostId付きリンクでリモートホストを指定した",
24
+ action: "Mac上のDesktopを直接操作するコマンドで、リモートには使えない。ローカルDesktopを対象にするときだけ--hostなしで実行する。何も実行されていない。",
25
+ };
26
+
27
+ const desktopUiFailedError = {
28
+ code: "DESKTOP_UI_FAILED",
29
+ when: "Desktopを開く・画面を操作する処理(open・osascript)が失敗した",
30
+ action: "error.messageを確かめ、ユーザーにDesktopの状態と端末のAccessibility権限の確認を依頼する。自動で再試行しない。",
31
+ };
32
+
33
+ const remoteContextError = {
34
+ code: "REMOTE_CONTEXT_REQUIRED",
35
+ when: "pairedのリモートで作成・表示するのに、呼出し元のローカルチャット(--context-threadまたはCODEX_THREAD_ID)がない",
36
+ action: "保存済みターンのある実在ローカルチャットのUUIDを--context-threadで渡す(Codex内ではCODEX_THREAD_IDが使われる)。",
37
+ };
38
+
39
+ export const topics = {
40
+ overview: {
41
+ title: "別のAIと、Codexタスクの進行を共有する",
42
+ when: "タスクを探す → 現状を読む → 指示を送る → 変化を確認する、という順で使う。目的に合うトピックを下の一覧から選び、codexteer help <TOPIC>で詳細を読む。",
43
+ use_cases: [
44
+ { need: "プロジェクトと目標だけを渡し、担当編成から統合まで任せる", command: "help orchestrate" },
45
+ { need: "その初期プロンプト本文だけを取得する(起動しない)", command: "help orchestrate prompt" },
46
+ { need: "既存タスクにClaudeまたはCodex CLIの監督役を付けて起動・一時停止・停止する", command: "help supervise" },
47
+ { need: "監督役(オーケストレーター)へ渡す本文だけを取得する(起動しない)", command: "help supervise prompt" },
48
+ { need: "監督の観測→介入→結果確認の手順、Claude CodeのMonitorから使う", command: "help monitor" },
49
+ { need: "指摘・解決条件・評価を追跡し、同じ指摘の重複介入を防ぐ", command: "help findings" },
50
+ { need: "作成先プロジェクトのIDとソースフォルダを調べる", command: "help projects" },
51
+ { need: "送信先タスクのIDを探す", command: "help threads" },
52
+ { need: "初回指示付きでタスクを作る・作成結果を照合する・URLをIDにする・残留ターンを修復する", command: "help thread" },
53
+ { need: "実行中・停止中・承認待ちかを確認する", command: "help status" },
54
+ { need: "発言・コマンド・変更ファイルと前回からの差分を読む", command: "help read" },
55
+ { need: "変化・完了・ユーザー対応待ちまで待つ", command: "help watch" },
56
+ { need: "方針・レビュー・仮説を根拠付きで送る", command: "help send" },
57
+ { need: "送った指示が届いたか・対応されたかを確認する", command: "help history" },
58
+ { need: "古い診断や指示を訂正・撤回する", command: "help instructions" },
59
+ { need: "テストしたソースと結果・成果物を照合する", command: "help checkpoint" },
60
+ { need: "画面・Unity・Gitなどの利用を複数AIで調整する", command: "help resource" },
61
+ { need: "接続(shared/desktop/cloud/desktop-cloud)を選ぶ・接続とIDの不一致を直す", command: "help connection" },
62
+ { need: "接続・実行環境・互換性を診断する", command: "help doctor" },
63
+ { need: "Desktopをwrapper付きで起動・更新する", command: "help desktop" },
64
+ { need: "タスクを画面で開く", command: "help open" },
65
+ { need: "UI送信のために画面構造を診断する", command: "help debug-ui" },
66
+ { need: "Web Cloud(task_ ID)の環境とタスクを使う", command: "help cloud" },
67
+ { need: "Cloudタスクの記録済み差分を見る", command: "help diff" },
68
+ { need: "Desktop Cloud(durable_ ID)を使う", command: "help desktop-cloud" },
69
+ { need: "Desktop Cloudの実行環境を一覧する", command: "help environments" },
70
+ { need: "別ホスト(hostId付きリンク)のプロジェクト・タスクを扱う", command: "help remote" },
71
+ { need: "Remote Controlで既存のactiveターンへ指示する", command: "help remote-control" },
72
+ { need: "codexteer専用の端末鍵を登録・ペアリングする", command: "help remote-device" },
73
+ { need: "この目的別一覧と全コマンドの概要を表示する(このページ)", command: "help overview" },
74
+ ],
75
+ usage: [
76
+ "help [TOPIC]",
77
+ "projects list",
78
+ "threads list [--desktop-only] [--limit N]",
79
+ "thread create --project ID|NAME [--context-thread THREAD-ID] <MESSAGE>",
80
+ "thread verify <ATTEMPT-ID>",
81
+ "thread resolve <THREAD>",
82
+ "status <THREAD>",
83
+ "read <THREAD> [--since CURSOR] [--limit N]",
84
+ "watch <THREAD> [--since CURSOR] [--until change|idle|attention]",
85
+ "send <THREAD> <MESSAGE...> [--new-turn] [--dry-run] [--no-sound]",
86
+ "history list|show|check|mark <THREAD> ...",
87
+ "instructions list|retract <THREAD> ...",
88
+ "findings create|list|show|resolve|dismiss|reopen|evaluate|stats <THREAD> ...",
89
+ "checkpoint capture|run|attach|verify|list|show <THREAD> ...",
90
+ "resource acquire|status|list|renew|release|run ...",
91
+ "supervise <THREAD> [MESSAGE] [--agent claude|codex] [--connection shared|desktop|cloud|desktop-cloud] [--use-path-cli] [-- <AGENT-ARGS...>]",
92
+ "supervise prompt <THREAD> [MESSAGE] [--agent claude|codex] [--connection shared|desktop|cloud|desktop-cloud] [--use-path-cli]",
93
+ "supervise status|pause|resume|stop <THREAD>",
94
+ "supervise list",
95
+ "orchestrate --project ID|NAME <GOAL> [--agent claude|codex] [--use-path-cli] [-- <AGENT-ARGS...>]",
96
+ "orchestrate prompt --project ID|NAME <GOAL> [--agent claude|codex] [--use-path-cli]",
97
+ "doctor [--backend app-server|ui]",
98
+ "desktop start [--dry-run]",
99
+ "desktop update [--dry-run] [--timeout-ms N]",
100
+ "desktop update-status",
101
+ "open <THREAD>",
102
+ "debug-ui <THREAD> [--wait-ms N]",
103
+ "diff <CLOUD_TASK_ID|URL> [--attempt N]",
104
+ "--connection shared|desktop|cloud|desktop-cloud <COMMAND> ...",
105
+ "--host HOST-ID [--remote-transport native|control|paired] <COMMAND> ...",
106
+ ],
107
+ options: [
108
+ { name: "TOPIC", default: "overview", text: "上の一覧のトピック名(例: send、supervise prompt)。<COMMAND> --helpでも同じ内容を表示する。" },
109
+ ],
110
+ returns: "--jsonを付けると、成功時は{ok:true, command, data}、失敗時は{ok:false, error:{message, code, …}}を標準出力へ1行で返し、失敗時の終了コードは1。対話起動のsupervise <THREAD>とorchestrate(promptなし)は--json非対応で、エージェントの標準入出力と終了コードをそのまま引き継ぐ。watch --streamは常にJSON Lines。",
111
+ examples: [
112
+ "codexteer supervise <THREAD>",
113
+ "codexteer supervise <THREAD> --use-path-cli",
114
+ "codexteer threads list --desktop-only --json",
115
+ "codexteer read <THREAD> --json",
116
+ "codexteer help send --json",
117
+ ],
118
+ notes: [
119
+ "THREADはDesktopのUUIDかcodex://threads/<UUID>、Web Cloudのtask_ IDか公式タスクURL、Desktop Cloudのdurable_ IDかhostId=durable付きリンク。",
120
+ "hostId付きのcodex://threadsリンクは別ホストのタスクを指す(help remote)。",
121
+ "help自体も--jsonに対応する。引数なしのcodexteerとcodexteer helpはこのoverviewを表示する。",
122
+ "各トピックには使い所・オプションと既定値・出力・エラーと対処・例・制約を載せている。",
123
+ "--connection・--host・--remote-transport・--context-threadは、どのコマンドでも -- より前に置ける。",
124
+ "ローカル経路の引数の誤りはerror.code=OPTIONS_INVALIDで、送信やコマンド実行の前に止まる。CloudはCLOUD_OPTIONS_INVALID。",
125
+ "CODEX_HOME/codex-steer/の記録の所有者・権限・種類が安全でなければSTORE_UNSAFEで止まり、自動修復しない。",
126
+ ],
127
+ },
128
+
129
+ connection: {
130
+ title: "--connectionで接続先を選ぶ(既定shared・観測専用desktop・cloud・desktop-cloud)",
131
+ when: "通常起動したDesktopを再起動せずに観測したいとき、またはタスクIDと接続の不一致で拒否されたとき。Web Cloudはhelp cloud、Desktop Cloudはhelp desktop-cloud、別ホストはhelp remote。",
132
+ usage: [
133
+ "--connection shared|desktop|cloud|desktop-cloud doctor --thread <THREAD>",
134
+ "--connection desktop read|status <THREAD>",
135
+ "--connection desktop watch <THREAD> --stream [--notify all|digest] [--settle-ms N] [--max-hold-ms N] [--since CURSOR]",
136
+ "supervise <THREAD> [MESSAGE] --connection desktop [--agent claude|codex]",
137
+ "supervise prompt <THREAD> [MESSAGE] --connection desktop [--agent claude|codex]",
138
+ ],
139
+ options: [
140
+ { name: "--connection shared|desktop|cloud|desktop-cloud", default: "shared", text: "全コマンド共通の接続指定。-- より前ならどこに置いてもよい。省略時だけ、task_/公式URLはcloud、durable_/hostId=durableはdesktop-cloudを自動で選ぶ。" },
141
+ { name: "--connection shared", text: "desktop startで起動したwrapper経由。観測・送信・作成のすべてに使う既定の接続。" },
142
+ { name: "--connection desktop", text: "通常起動Desktopの既存制御ソケットを読むだけの観測専用接続。" },
143
+ { name: "--connection cloud", text: "Web Cloud(task_ ID・chatgpt.com/codex/tasksのURL)。宛先のない一覧・作成ではこの明示が必要。" },
144
+ { name: "--connection desktop-cloud", text: "Desktop Cloud(durable_ ID・hostId=durableリンク)。" },
145
+ ],
146
+ returns: "--connection desktopのdoctorはconnection.mode=desktop・observation_only=trueを返し、runtime_compatibility.operationsのsend・send_new_turnはunsupported。read/status/watchのJSONは使った接続をconnection_modeで返す。不一致の拒否ではerror.expected_connection(修正候補)とerror.connection(指定値)を返す。",
147
+ errors: [
148
+ { code: "CLOUD_TARGET_CONFLICT", when: "--connectionとタスクIDの種類が合わない(例: desktopにtask_、desktop-cloudにローカルUUID)", action: "エラー文の--connectionかerror.expected_connectionの値で実行し直す。error.connectionは指定した値。自動では切り替えない。" },
149
+ { code: "CLOUD_OPTIONS_INVALID", when: "--connection cloudにWeb Cloud以外のID(ローカルUUID・durable_)を渡した。Cloud IDやオプションが不正なときも出る", action: "error.expected_connectionがあればその接続で実行し直す。なければIDとオプションを直す。" },
150
+ desktopReadOnlyError,
151
+ { code: "DESKTOP_CONNECTION_UNAVAILABLE", when: "CODEX_HOME/app-server-control/app-server-control.sockがない(Desktopが共有ローカルdaemonを使っていない、またはCODEX_HOMEが違う)", action: "desktop接続は使えない。CODEX_HOMEを確認するか既定sharedを使う(help desktop)。codexteerはdaemonを起動しない。" },
152
+ { code: "DESKTOP_CONNECTION_UNSAFE", when: "CODEX_HOME・制御ディレクトリ・ソケットの所有者・権限・種類・リンク先が検査に通らない", action: "自動修復しない。ユーザーに所有者と権限の確認を依頼する。" },
153
+ { code: "DESKTOP_CONNECTION_CHANGED", when: "観測の途中で制御エンドポイントが消えた・入れ替わった", action: "接続先を確認してから、改めて明示的にread/watchを始める。" },
154
+ { code: "DESKTOP_THREAD_NOT_LOADED", when: "対象タスクがこのDesktopのthread/loaded/listにない", action: "対応するプロフィール(CODEX_HOME)と、Desktopで読み込み済みのタスクを選ぶ。codexteerは暗黙にresumeしない。" },
155
+ { code: "HOST_CONNECTION_MISMATCH", when: "--hostまたはhostId付きリンクのリモート対象に--connection desktopなどを付けた", action: "--connectionを外す。リモートは選んだホストの経路で観測する(help remote)。" },
156
+ ...sharedRuntimeErrors,
157
+ ],
158
+ examples: [
159
+ "codexteer --connection desktop doctor --thread <THREAD> --json",
160
+ "codexteer --connection desktop read <THREAD> --include-output --json",
161
+ "codexteer supervise <THREAD> --agent codex --connection desktop",
162
+ ],
163
+ notes: [
164
+ "ID種別と接続: ローカルUUID→shared(観測だけならdesktopも可)、task_/公式URL→cloud、durable_/hostId=durable→desktop-cloud。",
165
+ "明示した--connectionは自動で切り替えない。sharedとdesktopの間でも、失敗時に別の接続・プロフィール・daemonへフォールバックしない。",
166
+ "desktopはCODEX_HOME/app-server-control/app-server-control.sockを使う。Desktopが共有ローカルdaemonを使う環境だけにあり、通常起動なら必ずあるわけではない。",
167
+ "CODEX_HOMEは実体パスへ解決し、本人所有でgroup/otherが書き込めないディレクトリだけを受け入れる。",
168
+ "app-server-controlは、group/otherの権限がない本人所有の実ディレクトリに限る。シンボリックリンクなら拒否する。",
169
+ "ソケットがリンクなら、公式の配置(/tmp/codex-daemon-<uid>/<リンク実体パスのsha256>、親は0700、本人所有の実ソケット)を指す場合だけ受け入れ、他は拒否する。",
170
+ "権限やリンクを自動修復しない。接続の前後と各API要求の前後で、エンドポイントの同一性(デバイス・inode等)を確かめ直す。",
171
+ "対象がthread/loaded/listにある場合だけ履歴を読む。暗黙のthread/resume、daemonの起動・再起動、設定変更はしない。",
172
+ "desktop接続で使えるのはread/status/watch、doctor(app-server)、threads list、thread resolve、supervise、findings・history・instructions list・checkpoint・resource。",
173
+ "desktop接続では送信・new-turn・UI送信・撤回送信・作成・修復と、projects・open・debug-ui・desktop・orchestrateをDESKTOP_READ_ONLYで拒否する。",
174
+ "通常起動Desktopでの送信・UI表示・承認の往復は実機での互換性が未検証。",
175
+ ],
176
+ see: ["doctor", "desktop", "cloud", "desktop-cloud", "remote", "supervise"],
177
+ },
178
+
179
+ doctor: {
180
+ title: "接続・実行環境・観測APIの互換性を診断する",
181
+ when: "接続できないとき、監督の開始時、Desktop更新後。対象タスクを読めるかまで確かめるときは--thread、UI送信の前提だけを見るときは--backend ui。",
182
+ usage: [
183
+ "doctor [--backend app-server|ui]",
184
+ "doctor --thread <THREAD> [--backend app-server]",
185
+ "--connection desktop|cloud|desktop-cloud doctor [--thread <THREAD>]",
186
+ ],
187
+ options: [
188
+ { name: "--thread <THREAD>", text: "指定タスクを1件だけ読み、観測経路まで検証する。app-server専用。Cloud・Desktop Cloud・hostId付きリンクも指定できる。" },
189
+ { name: "--backend app-server|ui", default: "app-server", text: "uiはUI送信の前提(macOS・ChatGPT.app・同梱AppleScript・端末のAccessibility権限)だけを確認する。--threadとは併用できない。" },
190
+ { name: "--connection shared|desktop|cloud|desktop-cloud", default: "shared", text: "診断する接続。値の意味はhelp connection。" },
191
+ ],
192
+ returns: "app-serverはready・checks・desktop_version・cli_version・cli_version_status・codex_steer_compatibility・runtime_compatibility・desktop_subscription・connection・compatibility・failure・remediationを返す。uiはready・checks・desktop_settings・remediation。readyがfalseなら終了コード1。",
193
+ errors: [
194
+ ...sharedRuntimeErrors,
195
+ { code: "WRAPPER_NODE_UNVERIFIED", when: "起動中のwrapperがDesktop同梱のNodeで動いていると確認できない(Appツールの署名認可が失敗しうる)", action: RESTART_SHARED },
196
+ { code: "RUNTIME_PROTOCOL_UNSUPPORTED", when: "wrapperが宣言した共通通信仕様の版に、このCLIが対応していない", action: "runtime_compatibility.protocolを確認し、対応するCLIを使うか、作業を終えてからwrapperを更新する(desktop start)。" },
197
+ { code: "RUNTIME_PROTOCOL_UNVERIFIED", when: "通信仕様の宣言が不正、または宣言のない旧環境で送信系の操作を求めた", action: "runtime_compatibility.protocolを確認し、対応するCLIを使うか、作業を終えてからwrapperを更新する(desktop start)。" },
198
+ { code: "CAPABILITY_UNSUPPORTED", when: "操作に必要な機能(thread_read・turn_steer・turn_start・desktop_subscribeなど)が未対応と宣言されている", action: "runtime_compatibility.operationsでsupportedの操作だけを使う。必要なら対応するCLI・wrapperにする。" },
199
+ { code: "CAPABILITY_UNVERIFIED", when: "機能の宣言が不正で、対応を確認できない", action: "runtime_compatibility.featuresを確認し、supportedの操作だけを使う。" },
200
+ { code: "DESKTOP_SUBSCRIPTION_UNAVAILABLE", when: "desktop_subscription.codeに出る。新規ターン用のDesktop購読エンドポイントがない", action: "send_new_turnだけunsupportedになる。観測と通常送信はoperationsの判定どおり使える。" },
201
+ desktopReadOnlyError,
202
+ OPTIONS_INVALID,
203
+ ],
204
+ examples: [
205
+ "codexteer doctor --json",
206
+ "codexteer doctor --thread <THREAD> --json",
207
+ "codexteer --connection desktop doctor --thread <THREAD> --json",
208
+ "codexteer doctor --backend ui --json",
209
+ ],
210
+ notes: [
211
+ "診断の失敗はエラー終了ではなく、failure(code・rpc_code・method、該当時はcapability)とremediationで返す。上のエラーコードはfailure.codeに入る。",
212
+ "readyはchecksがすべて真で失敗がないこと。checksはmacOS・同梱CLI・Desktop・runtime・初期化・同梱Node(desktop接続では省略)、--thread時はobservation。",
213
+ "codex_steer_compatibilityはパッケージ名と版の比較(matched/mismatch/unverified)で、違いだけではreadyに影響しない。",
214
+ "cli_version_statusは同梱CLIと起動中wrapperのCLIの版の一致(matched/mismatch/unverified)。",
215
+ "runtime_compatibilityは通信仕様(protocol)・機能(features)・操作(operations)ごとにsupported/unsupported/unverifiedを返す。",
216
+ "operationsはread・watch・monitor・history_check・send・send_new_turn。新規ターンだけ未対応でも、観測と通常送信はそれぞれの判定で使える。",
217
+ "宣言のない旧環境は読み取りをプローブで検証する。未知の送信仕様は試験送信せず、RUNTIME_PROTOCOL_UNVERIFIEDで止める。",
218
+ "--threadなしは接続だけを診断し、compatibility.scope=connection-only・status=unverified。--thread成功時はscope=target-observation・status=verified。",
219
+ "compatibility.statusはverified/unverified/unsupported/failed。verifiedは対象の初回観測の成功で、履歴全体・送信・画面表示・承認往復は保証しない。",
220
+ "api_checksは呼び出したAPIだけが判定され、呼び出していないAPIはunverifiedのまま。",
221
+ "タスク本文を診断出力に含めない。タスクの再開・送信・承認回答・Desktop再起動・設定変更はしない。",
222
+ "--connection cloudは環境一覧(--thread時は対象の1件読み取り)で確かめ、成功時はready:trueとCloudの操作一覧を返す。",
223
+ "--connection desktop-cloudは--thread時に1件読み取り、--projectを付けると所属と割当APIの可否も返す(help desktop-cloud)。",
224
+ "リモートでRemote Controlの認証前に止まった場合は、remote_control_authに詳細を返す(help remote-control)。",
225
+ "sharedが使えなくても、Desktopの制御ソケットがある環境では--connection desktopで観測だけはできる(help connection)。",
226
+ ],
227
+ see: ["connection", "desktop", "cloud", "desktop-cloud", "remote-control", "debug-ui"],
228
+ },
229
+
230
+ desktop: {
231
+ title: "Desktopをwrapper付きで起動し、公式更新後もwrapper付きで再起動する",
232
+ when: "既定sharedの接続を用意するとき(RUNTIME_UNAVAILABLEなど)、またはDesktopを公式更新するとき。startはDesktop終了後、updateは起動中のDesktopの作業を終えてから実行する。通常起動のまま観測だけならhelp connection。",
233
+ usage: [
234
+ "desktop start [--dry-run]",
235
+ "desktop update [--dry-run] [--timeout-ms N]",
236
+ "desktop update-status",
237
+ ],
238
+ options: [
239
+ { name: "--dry-run", text: "startは接続・配置・起動をせずstarted:falseを返す。updateは状態・権限も確認せず、手順(steps)とtimeout_msだけを返す。" },
240
+ { name: "--timeout-ms N", default: "600000", text: "updateで更新と再起動を待つ上限(ms)。10000〜3600000。" },
241
+ ],
242
+ returns: "startはstarted・desktop_version・cli_version・deployment(directory・wrapper_path・version・sha256・reused)。updateはworkerの起動受付(started・worker_pid・status_command・status_path)だけ。update-statusはphase・worker_alive・wrapper_verified、失敗時はerror(code・message)とrecovery。",
243
+ errors: [
244
+ { code: "DEPLOYMENT_BUSY", when: "配置ロック(CODEX_HOME/codex-steer/runtimes/.install-<id>)が残っている", action: "ロックは自動で奪わない。並行実行がないか確かめ、中断した配置ならロックを調べてから実行し直す。" },
245
+ { code: "DEPLOYMENT_MODIFIED", when: "保存済みの配置が配布物の内容と一致しない", action: "上書きしない。ユーザーに配置先の確認を依頼する。" },
246
+ { code: "UPDATE_APP_STATE", when: "起動中のDesktopがちょうど1つではない", action: "Desktopを1つだけ起動した状態で実行し直す。" },
247
+ { code: "UPDATE_COMMAND_FAILED", when: "osascript・PlistBuddy・psが失敗した(更新メニューがない・無効、Accessibility/Automation権限がないなど)", action: "メッセージを確かめ、ユーザーに端末の権限許可や更新メニューの状態確認を依頼して実行し直す。" },
248
+ { code: "UPDATE_UI_UNAVAILABLE", when: "事前確認でCodexの更新メニューに到達できない(Codexのプロセスが見つからないなど)", action: "ユーザーに端末のAccessibility/Automation許可を依頼して実行し直す。" },
249
+ { code: "UPDATE_NODE", when: "Desktop同梱のNode(.app内)でupdateを実行した", action: "外部にインストールしたNodeで実行する。" },
250
+ { code: "UPDATE_BUSY", when: "更新ロック(CODEX_HOME/codex-steer/desktop-update/lock)が残っている", action: "update-statusを確かめる。workerが止まっていれば、アプリを確認してからユーザーがロックを削除する。" },
251
+ { code: "UPDATE_TIMEOUT", when: "update-statusのerror.code。期限内に更新・再起動が終わらなかった", action: "Codexと更新画面のダイアログを確認する。プロセスは強制終了されていない。" },
252
+ { code: "UPDATE_QUIT_TIMEOUT", when: "update-statusのerror.code。更新後のDesktopが30秒以内に正常終了しなかった", action: RESTART_SHARED },
253
+ { code: "UPDATE_WRAPPER_UNVERIFIED", when: "update-statusのerror.code。更新後のdoctorでshared接続・同梱Node・CLI版一致を確認できなかった", action: "doctor --jsonで原因を確かめる。" },
254
+ { code: "DESKTOP_START_UNSUPPORTED", when: "startをmacOS以外で実行した、またはCODEX_APP_SERVER_WS_URLが設定されている", action: "macOSで、CODEX_APP_SERVER_WS_URLを外した環境から実行する。何も起動していない。" },
255
+ { code: "DESKTOP_ALREADY_RUNNING", when: "startの時点でDesktopが起動している", action: "起動中のDesktopは終了させない。ユーザーに作業を終えてDesktopを終了してもらい、desktop startを実行し直す。" },
256
+ { code: "DESKTOP_START_FAILED", when: "startでDesktopの起動確認(ps)か起動(open)が失敗した", action: "ユーザーの端末からdesktop startを実行し直してもらう。Dockからの通常起動はできるが、その場合sharedは使えない(観測だけならhelp connection)。" },
257
+ { ...RUNTIME_NOT_READY, when: "startでDesktopは起動したが、shared App Serverが準備完了にならなかった" },
258
+ supervisorForbiddenError,
259
+ remoteHostUnsupportedError,
260
+ desktopReadOnlyError,
261
+ OPTIONS_INVALID,
262
+ ],
263
+ examples: [
264
+ "codexteer desktop start --dry-run --json",
265
+ "codexteer desktop start",
266
+ "codexteer desktop update --json",
267
+ "codexteer desktop update-status --json",
268
+ ],
269
+ notes: [
270
+ "macOS専用。CODEX_APP_SERVER_WS_URLが設定された環境ではstartもupdateも拒否する。",
271
+ "start --dry-runは環境・Desktopの起動状態を確かめずに返す。",
272
+ "startは起動中のDesktopを終了させない。起動中ならエラーで止まる。通常起動へ戻すには、終了後にDockなどから開き直す。",
273
+ "startは呼び出した配布物をCODEX_HOME/codex-steer/runtimes/<version>-<sha256>へ検証して置き、そのwrapperをCODEX_CLI_PATHに指定してDesktopを開く。",
274
+ "配置先の所有者・権限・リンク・内容を検証し、既存の配置は上書きしない。同じ内容なら検証して再利用する(deployment.reused)。",
275
+ "startは起動後、今回の配布物のwrapperが動きshared App Serverへ接続できることまで確かめて返る。",
276
+ "npxで使うパッケージ名はcodexteer。通常は版指定なしでよく、特定の版で始めたいときだけcodexteer@<版>とする。",
277
+ "起動したwrapperと操作するCLIの製品版が違っても、通信・機能仕様が対応していれば使える(doctorのruntime_compatibility)。",
278
+ "updateは公式の更新メニューと更新ボタン(英語・日本語のラベル)をAccessibilityで操作し、残りを外部Nodeの独立プロセス(worker)で続ける。",
279
+ "updateは既知のラベルを照合するだけで、更新ウィンドウ自体の真正性は確かめない。更新以外のダイアログは閉じておく。",
280
+ "ラベル不一致やOSの許可ダイアログでは自動操作を進めず、時間切れで止まる。Desktopを強制終了しない。",
281
+ "updateは新しいビルドとプロセスに替わったことを確かめてからDesktopを正常終了させ、wrapper付きで起動し、doctorで確認する。",
282
+ "起動受付は完了ではない。update-statusでphase=completeかつwrapper_verified=trueを確認する。",
283
+ "既に最新ならphase=up_to_dateで終わり、再起動しない(wrapper_verified=false)。",
284
+ "update-statusはCODEX_HOME/codex-steer/desktop-update/status.jsonを読む。未実行ならphase=not_started。",
285
+ ],
286
+ see: ["connection", "doctor"],
287
+ },
288
+
289
+ projects: {
290
+ title: "登録プロジェクト(ローカル・リモート登録・接続先・Cloud環境)を一覧する",
291
+ when: "thread createの--projectに使うIDを調べるとき、チャットの所属・ソースフォルダ・ホストを確認するとき。",
292
+ usage: [
293
+ "projects list [--remote | --all] [--host HOST-ID]",
294
+ "--host HOST-ID --remote-transport paired projects list",
295
+ "--connection cloud projects list",
296
+ "--connection desktop-cloud projects list",
297
+ ],
298
+ options: [
299
+ { name: "--remote", text: "CODEX_HOMEにあるDesktopのリモート登録だけを読む。--allとは併用できない。" },
300
+ { name: "--all", text: "ローカル一覧とリモート登録を併合する。--hostとは併用できない。" },
301
+ { name: "--host HOST-ID", text: "そのホストのリモート登録に絞る。--remote-transport pairedなら接続先のproject/listを読む。" },
302
+ ],
303
+ returns: "projectsとcount。ローカルはApp Serverのcanonical ID(project_id)・desktop_project_ids・name・全roots。リモートはproject_kind:remote・host_id・source・availabilityも返す。テキストは1行目にIDと名前、続く行に各root。",
304
+ errors: [
305
+ ...sharedRuntimeErrors,
306
+ desktopReadOnlyError,
307
+ { code: "PROJECT_REGISTRY_UNSAFE", when: "CODEX_HOME/.codex-global-state.jsonが本人所有の通常ファイルでない、またはgroup/otherが書き込める", action: "自動修復しない。ユーザーにファイルの所有者と権限の確認を依頼する。" },
308
+ ],
309
+ examples: [
310
+ "codexteer projects list --json",
311
+ "codexteer projects list --remote --json",
312
+ "codexteer projects list --all --json",
313
+ "codexteer projects list --host remote-control:env_example --json",
314
+ "codexteer --connection cloud projects list --json",
315
+ ],
316
+ notes: [
317
+ "引数なしのローカル一覧はshared wrapperのApp Server(project/list)を読む。desktop startで起動していないとRUNTIME_UNAVAILABLE。",
318
+ "--remoteとpaired以外の--hostは、CODEX_HOME/.codex-global-state.jsonのDesktop登録を読むだけで、状態ファイルは変更しない。",
319
+ "登録一覧のsourceはdesktop-registration、availabilityはunverified。登録はホストの接続や現存を意味しない。",
320
+ "pairedの--host指定は接続先のproject/listを読み、live ID・source:remote-app-server・availability:verifiedを返す。rootsの存在は未確認(roots_availability)。",
321
+ "pairedの結果のdesktop_project_idsは同じrootsを持つDesktop登録のIDで、pairedのthread createに使える。docs/remote-operations.md。",
322
+ "Windows/UNCパスをローカルパスへ変換しない。",
323
+ "Desktopのnative一覧はリモートのGitメタデータ取得に失敗した項目を省くため、完全な登録一覧とは扱わない。",
324
+ "同名のローカルプロジェクトが複数あるときはproject_idで選ぶ(名前ではPROJECT_AMBIGUOUS)。",
325
+ "--connection cloudはCloud環境(ID・名前・リポジトリと既定ブランチ)を返す。詳細はhelp cloud。",
326
+ "--connection desktop-cloudはDesktopの正規プロジェクトをdesktop_project_idごとに返す。Cloud環境の一覧はhelp environments。",
327
+ ],
328
+ see: ["thread", "remote", "cloud", "desktop-cloud", "environments"],
329
+ },
330
+
331
+ threads: {
332
+ title: "送信先タスクのIDとリンクを探す",
333
+ when: "宛先の正確なIDやhostId付きリンクを確認するとき。本文は読まないため、内容を見るときはread。",
334
+ usage: [
335
+ "threads list [--desktop-only] [--limit N]",
336
+ "--host HOST --remote-transport paired threads list [--cursor CURSOR] [--project ID] [--search TEXT]",
337
+ "--connection cloud threads list [--limit N] [--cursor CURSOR] [--env ENV_ID]",
338
+ "--connection desktop-cloud threads list [--limit N] [--cursor CURSOR]",
339
+ ],
340
+ options: [
341
+ { name: "--limit N", default: "20", text: "返す最大件数。ローカル・paired・cloudは1〜500、desktop-cloudは1〜100。" },
342
+ { name: "--desktop-only", text: "originatorがCodex Desktopのタスクだけを返す(ローカル・paired)。" },
343
+ { name: "--cursor CURSOR", text: "前回のnext_cursor/cursorから続きを読む。paired・cloud・desktop-cloudのみ。" },
344
+ { name: "--project ID / --search TEXT", text: "pairedの接続先で、プロジェクトIDまたは検索語で絞る。" },
345
+ { name: "--env ENV_ID", text: "cloudで環境IDに絞る。" },
346
+ ],
347
+ returns: "threadsとcount。ローカルはthread_id・updated_at・created_at・cwd・originator・deep_link。pairedはtitle・project_id・hostId付きdeep_link・next_cursor・has_moreも返す。cloudはtask_id・title・status・url・cursor・has_more。ローカル・pairedのテキストは1行1件(ID・更新日時・作業場所)。",
348
+ errors: [
349
+ { code: "REMOTE_READ_ONLY", when: "既定nativeのリモート(--host)で一覧した", action: "--remote-transport pairedを明示する。専用登録とペアリングが必要(help remote-device)。経路は自動で切り替えない。" },
350
+ OPTIONS_INVALID,
351
+ ],
352
+ examples: [
353
+ "codexteer threads list --desktop-only --limit 20 --json",
354
+ "codexteer --connection cloud threads list --limit 50 --json",
355
+ ],
356
+ notes: [
357
+ "ローカルはCODEX_HOME/sessions配下の保存履歴を更新の新しい順に調べ、各ファイル先頭のsession_metaだけを読む。本文は読まない。",
358
+ "ローカル一覧はApp Serverへ接続しないため、Desktopやwrapperが起動していなくても使える。",
359
+ "--cursor・--project・--searchはローカルでは使えない(pairedのリモートが必要)。",
360
+ "cloudは公式CLIの一覧からID・URL・名前・状態とページcursorを返す。本文は読まない。",
361
+ ],
362
+ see: ["read", "thread", "projects", "remote", "cloud", "desktop-cloud"],
363
+ },
364
+
365
+ thread: {
366
+ title: "タスクを作成・作成結果を照合し、IDの解決と残留ターンの修復を行う",
367
+ when: "プロジェクトに初回指示付きの新しいタスクを作るとき、作成済みreceiptを照合し直すとき、URLをIDへ変換するとき、古いターンが実行中のまま残ったとき。Web Cloudの作成はhelp cloud、Desktop Cloudはhelp desktop-cloud。",
368
+ usage: [
369
+ "thread create --project ID|NAME [--context-thread THREAD-ID] [--timeout-ms N] [--title TEXT] [--model MODEL] [--thinking EFFORT] [--dry-run] <MESSAGE...>|-",
370
+ "thread verify <ATTEMPT-ID> [--timeout-ms N]",
371
+ "thread resolve <THREAD>",
372
+ "thread repair <THREAD> [--dry-run | --apply]",
373
+ "--connection cloud thread create --project ENV_ID_OR_NAME [--branch BRANCH] [--dry-run] <MESSAGE...>|-",
374
+ "--connection cloud thread receipt <ATTEMPT_ID>",
375
+ "--connection desktop-cloud thread create --environment ID|NAME [--title TEXT] [--dry-run] <MESSAGE...>|-",
376
+ "--connection desktop-cloud thread assign TARGET --project ID|NAME",
377
+ "--connection desktop-cloud thread receipt <ATTEMPT_ID> [--resolve-unknown --note TEXT]",
378
+ ],
379
+ options: [
380
+ { name: "--project ID|NAME", text: "作成先。projects listのproject_id、desktop_project_idsのID、または完全一致の名前。cloudでは環境IDか名前。" },
381
+ { name: "<MESSAGE...>|-", text: "初回指示。複数の語は空白でつなぐ。- は標準入力。--で始まる本文は -- の後に置く。" },
382
+ { name: "--context-thread THREAD-ID", text: "ローカルで指定したときだけ、そのチャットを呼出し元にDesktopのnative create_threadで作る。省略するとstandalone作成。" },
383
+ { name: "--title TEXT", text: "タスク名(空は不可)。standaloneで省略すると、初回指示の空白をまとめた先頭80文字。" },
384
+ { name: "--model MODEL", text: "モデルを明示する(空は不可)。" },
385
+ { name: "--thinking EFFORT", text: "none|minimal|low|medium|high|xhigh|max|ultra。" },
386
+ { name: "--timeout-ms N", default: "120000", text: "create・verifyの各RPCの待機上限(ms)。1000〜600000。" },
387
+ { name: "--dry-run", text: "createは接続・プロジェクト・native schemaを読んで確かめるだけで、タスク・指示・記録を作らない。repairは既定でこのモード。" },
388
+ { name: "--apply", text: "repairで候補へ終了記録を追記する。全Codexを終了してから外部ターミナルで実行する。" },
389
+ { name: "--branch BRANCH", text: "cloud作成のブランチ。省略時は環境のリポジトリが1つならその既定ブランチ。" },
390
+ { name: "--environment ID|NAME", text: "desktop-cloud作成のCloud環境(help desktop-cloud)。" },
391
+ ],
392
+ returns: "createはthread_id・deep_link、project_id・desktop_project_id・project_name、cwdと全フォルダ、title、creation_status・delivery_status・verification_status、attempt_id・receipt_path。verifyは更新したreceiptとverification_history。resolveはthread_idとdeep_link。repairはmode・status・candidates・source_sha256、--apply成功時はbackup_path・receipt_path・repaired_sha256。",
393
+ errors: [
394
+ { code: "PROJECT_NOT_FOUND", when: "--projectに一致するプロジェクトがない", action: "projects listでIDか完全一致の名前を選ぶ。" },
395
+ { code: "PROJECT_AMBIGUOUS", when: "同名のプロジェクトが複数ある", action: "projects listのproject_idで指定する。" },
396
+ { code: "INVALID_CREATION_OPTIONS", when: "cwd・権限・承認設定の上書き、空の--title/--model、不正な--thinking・--timeout-msを指定した", action: "上書きは非対応。値を直して実行し直す。" },
397
+ { code: "DESKTOP_PROJECT_MAPPING_UNVERIFIED", when: "選んだプロジェクトをDesktopのプロジェクトへ一意に対応付けられない", action: "creation_statusを確かめる。desktop_project_idsが複数なら、そのIDの一つを--projectに指定する。" },
398
+ { code: "DESKTOP_SUBSCRIPTION_UNAVAILABLE", when: "standalone作成に必要なDesktop購読エンドポイントがない", action: `creation_statusを確かめる(not_createdなら未作成)。${RESTART_SHARED}` },
399
+ { code: "NATIVE_CREATION_UNKNOWN", when: "作成要求の後にタスクIDを確認できなかった", action: "自動で再作成しない。receipt_pathとDesktop上のタスクを確かめる。unknownは未作成の証拠ではない。" },
400
+ { code: "INITIAL_TURN_UNCONFIRMED", when: "タスクは作られたが初回ターンの受付を確認できない", action: "再送しない。thread_idのタスクをreadで確かめる。" },
401
+ { code: "CREATION_VERIFICATION_FAILED", when: "作成後またはverifyで、所属・フォルダ・タイトル・初回指示の照合に通らない", action: "再作成・再送しない。verification_checksを見て、時間をおいてthread verify <ATTEMPT-ID>で照合し直す。" },
402
+ { code: "CREATION_RECEIPT_UNVERIFIED", when: "thread verifyの対象がcreated・accepted以外(unknown・未受付・dry-run)のreceipt", action: "verifyは使えない。既存のタスクを確かめる。このコマンドは作成も再送もしない。" },
403
+ { code: "REPAIR_REQUIRES_OFFLINE", when: "--apply時にCodex/ChatGPT・Codex CLI/app-serverのプロセスが動いている", action: "ユーザーにすべて終了してもらい、外部ターミナルで実行し直す。codexteerはプロセスを止めない。" },
404
+ { code: "REPAIR_RUNTIME_UNVERIFIED", when: "同梱Codex CLIの版が修復の検証済み版でない", action: "修復できない。履歴は変更されていない。" },
405
+ { code: "REPAIR_LATEST_UNFINISHED", when: "--apply時に最新のターンにも終了記録がない", action: "最新ターンを通常の方法で止めてから実行し直す。" },
406
+ remoteContextError,
407
+ supervisorForbiddenError,
408
+ desktopReadOnlyError,
409
+ OPTIONS_INVALID,
410
+ ],
411
+ examples: [
412
+ "codexteer thread create --project 'サンプル' '関連リポジトリを読み、調査結果を報告してください' --json",
413
+ "codexteer thread create --project 'サンプル' --dry-run '調査してください' --json",
414
+ "codexteer thread verify <ATTEMPT-ID> --json",
415
+ "codexteer projects list --json",
416
+ "codexteer thread resolve codex://threads/<UUID> --json",
417
+ "codexteer thread repair <THREAD> --json",
418
+ "codexteer thread repair <THREAD> --apply --json",
419
+ ],
420
+ notes: [
421
+ "以下はローカルDesktopとpairedの説明。Web Cloudの作成はhelp cloud、Desktop Cloudの環境指定・作成・所属割当はhelp desktop-cloud。",
422
+ "standalone作成(--context-threadなし)はプロジェクトと初回指示だけで作れる。既存チャット・CODEX_THREAD_ID・中継AIは使わない。ローカル専用。",
423
+ "standaloneはApp Serverで全フォルダ付きのタスクを作り、Desktop購読を確立して初回指示を送り、その新タスク自身のthread/turn IDでDesktopの所属登録をする。",
424
+ "--context-thread指定時は、保存済みターンのある実在ローカルチャットを呼出し元にnative create_threadを使う。そのチャットへの送信や追加のAIターンはない。",
425
+ "pairedのリモート作成は、実在ローカルcaller(--context-threadかCODEX_THREAD_ID)でDesktop公式createを使い、接続先で照合する。docs/remote-operations.md。",
426
+ "モデル・権限・承認設定はプロジェクトのApp Server設定に従う。cwd・権限・承認の上書きと旧--via-threadは非対応。",
427
+ "CLI終了後の承認はDesktopが扱い、codexteerは自動回答しない。",
428
+ "タイトル用のAIは起動しない。standaloneの既定タイトルもJSONとreceiptに入る(title_source)。",
429
+ "作成後、Desktop native一覧のID・local host・所属、canonical projectId、全フォルダ、保存された初回指示とタイトルを照合する。旧状態ファイルの所属mapだけでは判定しない。",
430
+ "履歴への反映待ちは読み取りだけで行う。手順と検証範囲はdocs/thread-create.md。",
431
+ "作成・初回配送は自動で再試行しない。creation_status・thread_id・receipt_path・native_call_idを確かめ、createdなら既存IDを使う。",
432
+ "unknown・dispatchingは未作成の証拠ではない。Desktop・DB・保存履歴を直接編集しない。",
433
+ "receiptはCODEX_HOME/codex-steer/creations/<ATTEMPT-ID>.jsonに保存する。",
434
+ "thread verifyはcreated・accepted済みのreceiptだけを照合し、更新するのはcodexteerのreceiptだけ。Desktopは読み取りのみで、作成・移動・再送・AIターンは起きない。",
435
+ "verifyは初回本文のSHA256・文字数とstandaloneの初回turn IDも照合する。native一覧の最新50件と全pinnedに対象がなければ、成功と推測せず失敗にする。",
436
+ "Cloudのthread receiptは作成結果のローカル記録を返すだけ。タスクIDが不明でも試行IDで確かめられ、再作成・外部照会はしない。",
437
+ "Desktop Cloudのthread receipt・thread assignは受付不明の割当試行をDesktopの状態で確かめ直す。ユーザーだけが--resolve-unknownで解除できる(help desktop-cloud)。",
438
+ "resolveはID書式だけを検査してthread_idとdeep_linkを返す。タスクの存在確認はstatusを使う。",
439
+ "repairはローカル保存履歴の検査。後続の独立したターン開始があり、終了記録がない古いターンだけを候補にする。最新の未完了ターンは修復しない。",
440
+ "--applyは稼働中・検査不能なら拒否し、プロセスを終了させない。完了するまでCodexを起動しない。macOS専用。",
441
+ "--applyは検証済みのCodex CLI 0.162.0-alpha.17.2 / 0.164.0-alpha.11.1と、ordinalが連続した履歴に限る。",
442
+ "原本をCODEX_HOME/codex-steer/turn-repairs/へバックアップし、候補IDのturn_abortedだけを末尾へ追記する。既存の会話・ordinal・DBは書き換えない。",
443
+ "実際の停止時刻や所要時間は推定しない。履歴のバックアップ分の空き容量を確保しておく。",
444
+ "中断・検証失敗ではbackup_pathとreceipt_pathを残す。原本への上書き復元や再実行を盲目的にせず、記録を確かめる。",
445
+ "成功は追記とSHA256照合の成功。Codexは次のロード時に反映する。再起動後の表示と次ターンは別に確かめ、read/watchの古いcursorは更新する。",
446
+ "リモートではrepairできない(REMOTE_REPAIR_UNSUPPORTED)。paired以外のリモートで使えるのはresolveだけで、他はREMOTE_READ_ONLY。",
447
+ ],
448
+ see: ["projects", "threads", "status", "read", "cloud", "desktop-cloud", "remote"],
449
+ },
450
+
451
+ open: {
452
+ title: "タスクを画面(DesktopまたはWebブラウザ)で開く",
453
+ when: "ユーザーが画面でタスクを見たいとき。観測や送信には不要(read・sendは画面を使わない)。",
454
+ usage: [
455
+ "open <THREAD>",
456
+ "--host HOST-ID --remote-transport paired --context-thread LOCAL-UUID open <THREAD>",
457
+ ],
458
+ returns: "thread_idとdeep_link。ローカル・pairedのテキストは「Opened <deep_link>」。Desktop Cloudはdeep_linkだけを返す。",
459
+ errors: [
460
+ desktopReadOnlyError,
461
+ { code: "CLOUD_CAPABILITY_UNSUPPORTED", when: "macOS以外でCloudタスクを開こうとした", action: "thread resolveでURLを取得し、ユーザーにブラウザで開いてもらう。" },
462
+ { code: "CLOUD_OPEN_FAILED", when: "Cloudタスクのブラウザ起動に失敗した", action: "thread resolveでURLを取得し、ユーザーにブラウザで開いてもらう。" },
463
+ { code: "REMOTE_MANAGEMENT_TRANSPORT_REQUIRED", when: "リモートのタスクを既定nativeまたはcontrolで開こうとした", action: "--remote-transport pairedを明示する。" },
464
+ remoteContextError,
465
+ { code: "HOST_MISMATCH", when: "リンクのhostIdと--hostが違う、またはDesktopが選んだホストのタスクを一意に特定できない", action: "正しいホストのリンクを使う。タスクは開かれていない。" },
466
+ { ...desktopUiFailedError, when: "ローカルのタスクをDesktopで開くopenコマンドが失敗した" },
467
+ ],
468
+ examples: [
469
+ "codexteer open <THREAD>",
470
+ "codexteer open task_example --json",
471
+ ],
472
+ notes: [
473
+ "ローカルはcodex://threads/<UUID>をDesktopで開き、Desktopが前面に出る。",
474
+ "Cloudは公式タスクURL(https://chatgpt.com/codex/tasks/<ID>)を既定ブラウザで開く。macOSのみ。",
475
+ "Desktop Cloud(durable_)はhostId=durableのdeep_linkを返すだけで、アプリもブラウザも開かない。",
476
+ "pairedのリモートは、制御側Desktopのnative操作で対象チャットへ移動して表示する。",
477
+ "画面を開くための明示的なコマンドで、送信や承認回答はしない。",
478
+ ],
479
+ see: ["thread", "debug-ui", "cloud", "remote"],
480
+ },
481
+
482
+ "debug-ui": {
483
+ title: "UI送信(--backend ui)のためにDesktopの画面構造を調べる",
484
+ when: "明示的なUI送信方式(send --backend ui)の不具合を診断するとき。通常のバックグラウンド送信(app-server)には不要。",
485
+ usage: ["debug-ui <THREAD> [--wait-ms N]"],
486
+ options: [
487
+ { name: "--wait-ms N", default: "1500", text: "Desktopを前面に出してから調べるまでの待ち時間(ms)。0〜30000の整数。" },
488
+ ],
489
+ returns: "thread_id・backend:desktop-ui・accessibility_mode(manual/enhanced/unchanged)・diagnostic(ウィンドウ名、フォーカス要素のrole等、テキスト領域・入力欄・Webエリアの数)。テキストはdiagnosticだけ。",
490
+ errors: [
491
+ { code: "DESKTOP_UI_NOT_READY", when: "UI操作の前提(macOS・ChatGPT.app・同梱AppleScript・端末のAccessibility権限)が欠けている。画面は操作していない", action: "doctor --backend ui --jsonで欠けている項目を確かめ、ユーザーに対応を依頼する。" },
492
+ desktopUiFailedError,
493
+ desktopReadOnlyError,
494
+ remoteHostUnsupportedError,
495
+ OPTIONS_INVALID,
496
+ ],
497
+ examples: [
498
+ "codexteer debug-ui <THREAD> --wait-ms 1500",
499
+ "codexteer doctor --backend ui --json",
500
+ ],
501
+ notes: [
502
+ "画面を操作する: 対象チャットの入力欄を開くリンクでDesktopを前面に出し、フォーカス中の要素を読む。送信はしない。",
503
+ "調べる間だけDesktopのAccessibility属性を有効にし、終了時に元へ戻す。",
504
+ "先にdoctor --backend uiと同じ前提(macOS・ChatGPT.app・同梱AppleScript・端末のAccessibility権限)を確かめ、欠けていればDESKTOP_UI_NOT_READYで止まる。",
505
+ ],
506
+ see: ["doctor", "send", "open"],
507
+ },
508
+ };