codexteer 0.16.0 → 0.18.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 +37 -2
- package/README.md +154 -16
- package/assets/remote-device-key.swift +94 -0
- package/bin/codexteer-update.mjs +3 -0
- package/bin/codexteer.mjs +6 -2
- package/docs/cloud.md +113 -0
- package/docs/desktop-cloud.md +36 -0
- package/docs/distribution.md +21 -9
- package/docs/orchestration.md +120 -0
- package/docs/remote-cli-validation.json +139 -0
- package/docs/remote-control.md +65 -0
- package/docs/remote-device-enrollment.md +91 -0
- package/docs/remote-observation.md +57 -0
- package/docs/remote-operations.md +89 -0
- package/docs/thread-create.md +90 -0
- package/package.json +13 -2
- package/scripts/update-desktop.applescript +51 -0
- package/src/agent-launch.mjs +27 -0
- package/src/app-server.mjs +34 -10
- package/src/checkpoint.mjs +52 -16
- package/src/cli.mjs +233 -19
- package/src/cloud-api.mjs +118 -0
- package/src/cloud-cli.mjs +319 -0
- package/src/cloud-connection.mjs +64 -0
- package/src/cloud-id.mjs +16 -0
- package/src/cloud-observe.mjs +178 -0
- package/src/cloud-send.mjs +33 -0
- package/src/cloud.mjs +172 -0
- package/src/connection.mjs +23 -5
- package/src/creation-verification.mjs +36 -0
- package/src/desktop-cloud-api.mjs +119 -0
- package/src/desktop-cloud-id.mjs +18 -0
- package/src/desktop-cloud-project.mjs +148 -0
- package/src/desktop-cloud.mjs +98 -0
- package/src/desktop.mjs +3 -1
- package/src/directive.mjs +5 -2
- package/src/distribution.mjs +6 -6
- package/src/evidence.mjs +3 -0
- package/src/findings.mjs +7 -7
- package/src/help.mjs +155 -26
- package/src/journal.mjs +37 -9
- package/src/launcher.mjs +16 -9
- package/src/monitor.mjs +18 -6
- package/src/native-command.mjs +100 -0
- package/src/native-rpc.mjs +116 -0
- package/src/native-worker.mjs +25 -0
- package/src/observe.mjs +21 -7
- package/src/orchestrate-prompt.mjs +96 -0
- package/src/orchestrate.mjs +29 -0
- package/src/paged-read.mjs +7 -1
- package/src/projects.mjs +104 -0
- package/src/prompt-command.mjs +25 -0
- package/src/prompt.mjs +35 -11
- package/src/remote-client-info.mjs +16 -0
- package/src/remote-control-auth.mjs +109 -0
- package/src/remote-control-socket.mjs +137 -0
- package/src/remote-control.mjs +134 -0
- package/src/remote-device-key.mjs +41 -0
- package/src/remote-device-login.mjs +76 -0
- package/src/remote-device-protocol.mjs +72 -0
- package/src/remote-device-store.mjs +71 -0
- package/src/remote-device-worker.mjs +48 -0
- package/src/remote-device.mjs +202 -0
- package/src/remote-io.mjs +163 -0
- package/src/remote-key-access.mjs +76 -0
- package/src/remote-key-worker.mjs +38 -0
- package/src/remote-keychain.mjs +72 -0
- package/src/remote-management.mjs +234 -0
- package/src/remote.mjs +132 -0
- package/src/resource.mjs +8 -6
- package/src/runner.mjs +6 -1
- package/src/runtime.mjs +4 -2
- package/src/socket-endpoint.mjs +40 -0
- package/src/standalone-create.mjs +135 -0
- package/src/store.mjs +6 -3
- package/src/supervise.mjs +32 -55
- package/src/supervision.mjs +41 -19
- package/src/target.mjs +25 -0
- package/src/task-id.mjs +23 -0
- package/src/thread-create.mjs +128 -0
- package/src/thread-id.mjs +21 -6
- package/src/thread-verify.mjs +108 -0
- package/src/turn-repair.mjs +228 -0
- package/src/update.mjs +158 -0
- package/src/wrapper.mjs +68 -5
package/src/help.mjs
CHANGED
|
@@ -6,22 +6,58 @@ export { VERSION } from "./version.mjs";
|
|
|
6
6
|
import { VERSION } from "./version.mjs";
|
|
7
7
|
|
|
8
8
|
const supervisionExecutionNotes = [
|
|
9
|
+
"--remote-transport controlを明示すると、Remote Control v3で既存activeターンへexpectedTurnId付きの介入を行う監督を生成できます。全コマンドに同じ--hostとtransportを保持します。new-turn・UIへの切替・自動再送は未対応です。既存の端末鍵を利用できない環境では接続前に停止します。認証の前提と制約はhelp remote-control。",
|
|
10
|
+
"hostId付きリンクまたは--host HOST-IDでリモートを指定できます。既定nativeのリモート監督は観測専用です。nativeでは--context-threadかCODEX_THREAD_IDによる実在ローカル呼出し元が必要です。専用鍵の公式登録・ペアリングはhelp remote-device、接続は--remote-transport pairedです。全コマンドで選択したhost・transportを保持します。",
|
|
11
|
+
"--use-path-cliを付けると、本文はPATH上のcodexteerを案内します。CLIの保存・Nodeの固定・CODEX_HOMEの埋め込みを行わず、実行環境のPATHとCODEX_HOMEを使います。CLIの更新は次の実行から反映されます。--supervisor・--connectionと監督の制御は維持します。直接起動ではエージェント引数の区切り -- より前に指定してください。",
|
|
9
12
|
"各生成に新しい--supervisor IDと--connectionを埋め込みます。直接起動はagent起動前にregisterし、終了時にstopします。本文だけの生成は未登録で、貼り付け先が本文のregisterを実行して開始します。同じ本文の再登録は一時停止を解除せず、停止済みIDは復活しません。",
|
|
10
|
-
"--connectionの既定はshared(既存wrapper)。desktop
|
|
13
|
+
"--connectionの既定はshared(既存wrapper)。desktopは既存の共有制御ソケットを使う観測専用です。送信の実行例を含めず、方針に送信指示があっても送信を許可しません。CloudタスクIDはcloudへ自動選択し、共通の監督・送信・観測を使えます。詳細はhelp connectionとhelp cloudを参照してください。",
|
|
11
14
|
"本文は必須の共通テンプレートと監督方針で構成します。MESSAGEを省略すると標準方針(目的・制約の範囲で必要最小限の介入と結果確認、簡潔な報告)を使い、指定すると標準方針全体をその文に置き換えます。対象ID、実行コマンド、help/read/watch、送信時の確認、停止手順はどちらにも含めます。",
|
|
12
15
|
"MESSAGEは引用して一つの引数として渡してください。空文字・空白だけはINVALID_SUPERVISION_POLICYで拒否します。改行等はそのまま本文に含め、プレースホルダー展開やシェル実行はしません。指定は今回の生成・起動だけに適用し、既定設定や保存したCLIは変更しません。",
|
|
13
|
-
"CLI本体と依存をCODEX_HOME/codex-steer/runtimes/<version>-<sha256>へ検証して保存し、そのコピーへの実行コマンドを本文に埋め込みます。supervise promptもこの保存処理を行います。同じ内容は検証して再利用し、既存のコピーは上書き・自動削除しません。保存・検証に失敗した場合は本文を出力せず、監督エージェントも起動しません。",
|
|
14
|
-
"
|
|
15
|
-
"Node本体はコピーせず、開始時の実体への絶対パスと--require-node-versionを各コマンドに埋め込みます。Nodeの版が変われば操作前にNODE_VERSION_MISMATCHで停止します。同じ版のNodeの改変や共有ライブラリまで固定するものではないため、元のNodeは保持してください。保存先やNodeが使えなければ介入を止めて報告し、意図した環境から生成し直すよう指示します。",
|
|
16
|
+
"既定ではCLI本体と依存をCODEX_HOME/codex-steer/runtimes/<version>-<sha256>へ検証して保存し、そのコピーへの実行コマンドを本文に埋め込みます。supervise promptもこの保存処理を行います。同じ内容は検証して再利用し、既存のコピーは上書き・自動削除しません。保存・検証に失敗した場合は本文を出力せず、監督エージェントも起動しません。",
|
|
17
|
+
"保存済みCLIを使う既定モードでは、同じPCで使い、監督中は保存したコピーを保持してください。全コマンドの先頭に生成時に検証したCODEX_HOMEの実体パスを指定するため、監督役のCODEX_HOMEが未設定・別設定でも生成元の接続先と履歴を使います。元のnpxキャッシュやチェックアウトを更新・削除しても、監督は保存した内容を使います。ヘルプ中のcodexteer表記も、先頭のCODEX_HOME指定・引用・オプションを含む指定の実行コマンドに置き換えてください。",
|
|
18
|
+
"既定ではNode本体はコピーせず、開始時の実体への絶対パスと--require-node-versionを各コマンドに埋め込みます。Nodeの版が変われば操作前にNODE_VERSION_MISMATCHで停止します。同じ版のNodeの改変や共有ライブラリまで固定するものではないため、元のNodeは保持してください。保存先やNodeが使えなければ介入を止めて報告し、意図した環境から生成し直すよう指示します。",
|
|
16
19
|
];
|
|
17
20
|
|
|
18
21
|
export const topics = {
|
|
22
|
+
orchestrate: {
|
|
23
|
+
title: "プロジェクトと目標からオーケストレーターを起動する",
|
|
24
|
+
when: "既存スレッドを指定せず、オーケストレーターにCodexの担当編成・監督・検収・統合を任せるとき。promptを付けると本文だけ生成します。",
|
|
25
|
+
usage: ["orchestrate --project ID|NAME <GOAL> [--agent claude|codex] [--use-path-cli] [-- <AGENT-ARGS...>]", "orchestrate prompt --project ID|NAME <GOAL> [--agent claude|codex] [--use-path-cli]"],
|
|
26
|
+
returns: "直接起動ではエージェントの標準入力・標準出力・標準エラーと終了コードを引き継ぎ、codexteerの出力を混ぜません。promptではプロジェクト全体の進行を委任する本文だけを生成します。",
|
|
27
|
+
examples: ["codexteer orchestrate --project 'My Project' '達成したい目標' --use-path-cli", "codexteer orchestrate --project 'My Project' '達成したい目標' --agent codex -- --model <MODEL>", "codexteer orchestrate prompt --project 'My Project' '利用者が動作を確認し、変更を指示できる状態にする'", "codexteer help orchestrate prompt"],
|
|
28
|
+
notes: [
|
|
29
|
+
"promptなしはsuperviseと同じ対話CLI起動です。--agentの既定はclaude、codexも指定できます。PATHの実行ファイルへ、現在のcwd・環境・入出力を引き継ぎます。役割の本文はモデル非依存です。",
|
|
30
|
+
"--use-path-cliは生成本文内のcodexteerコマンドをPATH方式にします。省略時は保存済みCLI・Node版・canonical CODEX_HOMEを固定します。起動するエージェント自体はどちらもPATHから選びます。PATH方式の直接起動でもCODEX_HOMEの所有者と権限を検証します。",
|
|
31
|
+
"GOALは一つの引用した引数か、標準入力を読む -。直接起動の最初の -- 以降は全てエージェント引数で、順序・空文字・改行・--help/--json等を保持し、shellで再展開しません。最後にエージェント側の -- と生成本文を一つの引数として追加します。--で始まる目標は標準入力の - で渡してください。stdinで目標を読む場合、起動前にstdinを消費します。",
|
|
32
|
+
"SIGINT/SIGTERM/SIGHUPを起動したCLIへ転送し、シグナル終了は128+シグナル番号です。未導入・実行不可では起動エラー、無効な入力では保存・起動前に停止します。直接起動の--jsonは非対応。JSON本文はorchestrate prompt ... --jsonを使います。",
|
|
33
|
+
"起動側はDesktopへ接続せず、プロジェクト照合と担当作成は起動したオーケストレーターが本文に従って行います。プロジェクト用の監督IDを捏造せず、各子の登録と監視は本文の手順で行います。個別pause/stopや代理承認の制約は維持します。",
|
|
34
|
+
"orchestrate promptは既存どおり生成専用で、エージェントを起動しません。単一スレッドのsuperviseもそのまま使えます。詳細はhelp orchestrate promptとdocs/orchestration.md。",
|
|
35
|
+
],
|
|
36
|
+
},
|
|
37
|
+
"orchestrate prompt": {
|
|
38
|
+
title: "プロジェクト・目標・技術判断の分担を含む初期プロンプトを取得する",
|
|
39
|
+
when: "必要なCodexスレッドの作成から目的達成までを委任し、高度・深さ・範囲を具体的な調査・検証へ結び付けるとき。オーケストレーターの役割はモデルに依存せず、Codex自身も担当できます。",
|
|
40
|
+
usage: ["orchestrate prompt --project ID|NAME <GOAL> [--agent claude|codex] [--use-path-cli]"],
|
|
41
|
+
returns: "通常は末尾改行付き本文のみ。--jsonはcommand: orchestrate.prompt、data.project_selector、goal、agent、prompt、connection、cli_mode、deployment、nodeを返します。プロジェクトは開始時に照合する指定文字列で、生成時の所属確認ではありません。agentは省略時nullです。",
|
|
42
|
+
examples: ["codexteer orchestrate prompt --project 'My Project' '利用者が動作を確認し、変更を指示できる状態にする'", "codexteer orchestrate prompt --project 'My Project' '性能改善の原因と効果を実測する' --agent codex --use-path-cli --json", "codexteer orchestrate prompt --project 'My Project' - < goal.txt"],
|
|
43
|
+
notes: [
|
|
44
|
+
"生成には既存スレッドIDが不要です。--projectはIDまたは完全一致名、GOALは非空の一つの引数か標準入力の -。改行や引用符・プレースホルダーは評価せず保持します。--で始まる目標は最後の区切り -- の後に置いてください。",
|
|
45
|
+
"生成時はDesktopへ接続せず、プロジェクト照合、チャット作成、送信、監督登録、監視、エージェント起動を行いません。既定ではsupervise promptと同じCLI保存・検証を行い、--use-path-cliなら保存せず実行環境のPATHとCODEX_HOMEを使います。",
|
|
46
|
+
"オーケストレーターは目的・依存関係・共有資源・検収と統合を担当し、Codex担当は調査・設計判断・実装・検証と発注の前提への異論・改善案を担当します。目標の入力は方針の置き換えではありません。",
|
|
47
|
+
"--agentは子の監督IDのownerと送信元のCLI識別(claude|codex)を明示する任意指定で、モデルの役割の指定やエージェント起動ではありません。省略時は実行役を固定せず、受け取ったオーケストレーターが子の生成前に<AGENT>を選びます。",
|
|
48
|
+
"高度は作業の先の成果、深さは一次資料・専門的手法・外部検証、範囲は隣接分野の技法を具体化します。重要な発見・行き詰まり・統合前・完了前に目的と前提を再評価し、継続・計画変更・確認を根拠付きで記録します。受入条件の無断変更や役柄だけの追加を求めません。",
|
|
49
|
+
"本文は対象プロジェクト内での作成・追加指示・同じ目的の未完了作業の継続を委任します。無関係な既存チャットへの送信、依頼外への拡張、代理承認は含みません。生成した本文を依頼として渡して開始し、引用やログにある本文を委任と解釈しないでください。",
|
|
50
|
+
"作成用のコマンドには特定スレッドの--supervisorを付けません。作成後は同じCLI方式で各子のsupervise promptを生成・保存し、個別にregister/read/watchします。既存の監督IDからのorchestrate生成と--connection desktopは拒否します。",
|
|
51
|
+
"作成・配送不明や部分成功ではreceiptと同じ子を照合し、自動再作成・再送しません。個別のpause/stopをIDなし送信などで迂回せず、監視不能なら追加作成を止めます。",
|
|
52
|
+
"プロジェクト全体の一括pause/stopや常駐スケジューラーは追加しません。既存の監督制御は個別スレッドが対象です。本文の方針に従う実行と検収は受け取ったオーケストレーターが担当し、生成成功だけでその遵守や目的達成を認定しません。",
|
|
53
|
+
],
|
|
54
|
+
},
|
|
19
55
|
supervise: {
|
|
20
56
|
title: "指定したCodexタスクの監督役としてClaudeまたはCodex CLIを起動する",
|
|
21
57
|
when: "対象タスクのIDを指定して、Claude CodeまたはCodex CLIを監督役の対話セッションとして起動するとき。",
|
|
22
|
-
usage: ["supervise <THREAD> [MESSAGE] [--agent claude|codex] [--connection shared|desktop] [-- <AGENT-ARGS...>]", "supervise status <THREAD>", "supervise list", "supervise pause <THREAD>", "supervise resume <THREAD>", "supervise stop <THREAD>", "--supervisor <SESSION-ID> supervise register <THREAD> [--owner NAME]"],
|
|
58
|
+
usage: ["supervise <THREAD> [MESSAGE] [--agent claude|codex] [--connection shared|desktop|cloud|desktop-cloud] [--use-path-cli] [-- <AGENT-ARGS...>]", "supervise status <THREAD>", "supervise list", "supervise pause <THREAD>", "supervise resume <THREAD>", "supervise stop <THREAD>", "--supervisor <SESSION-ID> supervise register <THREAD> [--owner NAME]"],
|
|
23
59
|
returns: "監督エージェントの標準入力・標準出力・標準エラーと終了コードを引き継ぎます。codexteerの出力は混ぜません。",
|
|
24
|
-
examples: ["codexteer supervise <THREAD>", 'codexteer supervise <THREAD> "セキュリティの問題だけを私へ報告し、Codexへは送信しないでください。"', 'codexteer supervise <THREAD> "テスト失敗を優先して監督してください。" --agent claude -- --model <MODEL> --effort <LEVEL>'],
|
|
60
|
+
examples: ["codexteer supervise <THREAD>", "codexteer supervise <THREAD> --use-path-cli", 'codexteer supervise <THREAD> "セキュリティの問題だけを私へ報告し、Codexへは送信しないでください。"', 'codexteer supervise <THREAD> "テスト失敗を優先して監督してください。" --agent claude -- --model <MODEL> --effort <LEVEL>'],
|
|
25
61
|
notes: [...supervisionExecutionNotes,
|
|
26
62
|
"status/listは登録状態active/paused/stopped、owner、launcherの生存確認、最後のCLI観測とその経過時間、接続状態、最後の配送を返します。statusは未解決の指摘も要約します。activeは登録状態であり、AIの読了や継続監視の証明ではありません。コピーした本文のlauncher_aliveはnullです。",
|
|
27
63
|
"pauseは登録済み監督の送信を拒否し、read/watchは続行できます。resumeで介入を再開、stopでその監督の以後の観測・送信を拒否します。Codexタスクやagentプロセス自体は終了しません。必要ならagentへ終了を指示してください。",
|
|
@@ -50,7 +86,7 @@ export const topics = {
|
|
|
50
86
|
connection: {
|
|
51
87
|
title: "共有wrapperまたは通常起動Desktopの観測接続を選ぶ",
|
|
52
88
|
when: "通常起動したDesktopを再起動せずに観測したいとき。",
|
|
53
|
-
usage: ["--connection shared|desktop doctor --thread <THREAD>", "--connection desktop read <THREAD>", "--connection desktop watch <THREAD> --stream [--notify all|digest] [--settle-ms N] [--max-hold-ms N] [--since CURSOR]", "supervise <THREAD> [MESSAGE] --connection desktop [--agent claude|codex]", "supervise prompt <THREAD> [MESSAGE] --connection desktop [--agent claude|codex]"],
|
|
89
|
+
usage: ["--connection shared|desktop|cloud|desktop-cloud doctor --thread <THREAD>", "--connection desktop read <THREAD>", "--connection desktop watch <THREAD> --stream [--notify all|digest] [--settle-ms N] [--max-hold-ms N] [--since CURSOR]", "supervise <THREAD> [MESSAGE] --connection desktop [--agent claude|codex]", "supervise prompt <THREAD> [MESSAGE] --connection desktop [--agent claude|codex]"],
|
|
54
90
|
returns: "desktopでは既存ソケットを検証して読み取りだけを行います。doctorのconnection.observation_onlyはtrue、送信操作はunsupportedです。",
|
|
55
91
|
examples: ["codexteer --connection desktop doctor --thread <THREAD> --json", "codexteer --connection desktop read <THREAD> --include-output --json", "codexteer supervise <THREAD> --agent codex --connection desktop"],
|
|
56
92
|
notes: ["既定sharedは従来のdesktop startで用意するwrapperです。desktopはCODEX_HOME/app-server-control/app-server-control.sockを使います。Desktopが共有ローカルdaemonを使っている環境だけで利用でき、通常起動なら必ず存在するわけではありません。ソケットがなければDESKTOP_CONNECTION_UNAVAILABLEです。",
|
|
@@ -61,11 +97,11 @@ export const topics = {
|
|
|
61
97
|
"supervise prompt": {
|
|
62
98
|
title: "監督役(オーケストレーター)向けのプロンプトを出力する",
|
|
63
99
|
when: "Claude Codeなどの監督役へ渡す、対象タスク入りの初期プロンプト本文を取得・確認するとき。",
|
|
64
|
-
usage: ["supervise prompt <THREAD> [MESSAGE] [--agent claude|codex] [--connection shared|desktop]"],
|
|
65
|
-
returns: "通常はプロンプト本文だけを標準出力へ返します。--jsonではdata.thread_id、data.prompt、元のホーム(codex_home)・保存先・版・ハッシュ・再利用の有無を示すdata.deployment、Nodeのパスと版を示すdata.node、セッションID・owner・connectionを示すdata.supervisor
|
|
66
|
-
examples: ["codexteer supervise prompt <THREAD>", 'codexteer supervise prompt <THREAD> "進捗を観測し、完了時だけ私へ報告してください。Codexへの送信は不要です。"', "codexteer supervise prompt codex://threads/<UUID> --json", "codexteer supervise <THREAD>"],
|
|
100
|
+
usage: ["supervise prompt <THREAD> [MESSAGE] [--agent claude|codex] [--connection shared|desktop|cloud|desktop-cloud] [--use-path-cli]"],
|
|
101
|
+
returns: "通常はプロンプト本文だけを標準出力へ返します。--jsonではdata.thread_id、data.prompt、元のホーム(codex_home)・保存先・版・ハッシュ・再利用の有無を示すdata.deployment、Nodeのパスと版を示すdata.node、セッションID・owner・connectionを示すdata.supervisor、実行方式を示すdata.cli_mode(savedまたはpath)を返します。--use-path-cliではdeploymentとnodeはnullです。",
|
|
102
|
+
examples: ["codexteer supervise prompt <THREAD>", "codexteer supervise prompt <THREAD> --use-path-cli", 'codexteer supervise prompt <THREAD> "進捗を観測し、完了時だけ私へ報告してください。Codexへの送信は不要です。"', "codexteer supervise prompt codex://threads/<UUID> --json", "codexteer supervise <THREAD>"],
|
|
67
103
|
notes: [...supervisionExecutionNotes,
|
|
68
|
-
"出力は監督役(オーケストレーター)へ渡す初期指示です。THREADはUUID
|
|
104
|
+
"出力は監督役(オーケストレーター)へ渡す初期指示です。THREADはDesktopのUUID/codex://threads/...またはCloudのtask_ID/公式タスクURL。IDの書式を確認して正規化し、本文へ埋め込みます。Desktopへの接続・履歴取得・送信・Claudeの起動・設定変更は行いません。タスクの存在と接続は監督開始時に確認します。", "Claudeを起動する場合はsupervise <THREAD> [MESSAGE]を使います。追加の起動引数は -- の後ろへ渡してください。", "共通の操作手順はhelp monitorと同じです。観測の観点・介入の判断基準・報告方法は選択した監督方針に従います。Monitorが使えない場合は短いwatchで観測します。", "生成した本文を既存のエージェントへ貼り付けても使えます。本文のregisterで開始し、監督停止は端末のsupervise stopかそのセッションへの指示を使います。プロンプトはCLIやOSの権限設定を変更しません。"],
|
|
69
105
|
},
|
|
70
106
|
monitor: {
|
|
71
107
|
title: "Codexタスクを観測・介入・結果確認の順で監督する",
|
|
@@ -81,14 +117,14 @@ export const topics = {
|
|
|
81
117
|
usage: ["resource acquire <NAME> --owner NAME [--ttl-ms N] [--thread THREAD] [--reason TEXT] [--condition TEXT]", "resource status <NAME>", "resource list", "resource renew <NAME> --token TOKEN [--ttl-ms N]", "resource release <NAME> --token TOKEN", "resource run <NAME> --owner NAME [--ttl-ms N] [--timeout-ms N] [--include-output] [--condition TEXT] -- <COMMAND> [ARGS...]"],
|
|
82
118
|
returns: "所有者、期限、利用条件のメモ、tokenを返します。競合時は送信やコマンド実行を始めず失敗します。",
|
|
83
119
|
examples: ["codexteer resource acquire screen --owner claude-code --ttl-ms 120000 --condition 'ユーザーが今回の2分間の画面利用を許可済み' --json", "codexteer resource run unity-project-a --owner codex --ttl-ms 600000 -- npm test", "codexteer resource release screen --token <TOKEN> --json"],
|
|
84
|
-
notes: ["同じCODEX_HOMEと同じリソース名を使う参加者間だけの協調用リースです。OSの画面やUnity自体を強制ロックしません。", "ttlの既定は10分、指定範囲は1000〜86400000ms。手動取得はプロセス終了後も期限まで残り、tokenで更新・解放します。古いtokenで新しい所有者の予約は消せません。", "runはコマンド実行中に自動更新し、終了時に解放します。更新に失敗したら自分が起動したコマンド群を終了します。コマンドは -- の後へ置き、シェル展開しません。", "--conditionは許可済み条件の記録です。入力アイドルや取得成功だけで画面利用の許可を生成しません。", "実行時間を制限する場合は--timeout-ms(最大86400000
|
|
120
|
+
notes: ["同じCODEX_HOMEと同じリソース名を使う参加者間だけの協調用リースです。OSの画面やUnity自体を強制ロックしません。", "ttlの既定は10分、指定範囲は1000〜86400000ms。手動取得はプロセス終了後も期限まで残り、tokenで更新・解放します。古いtokenで新しい所有者の予約は消せません。", "runはコマンド実行中に自動更新し、終了時に解放します。更新に失敗したら自分が起動したコマンド群を終了します。コマンドは -- の後へ置き、シェル展開しません。", "--conditionは許可済み条件の記録です。入力アイドルや取得成功だけで画面利用の許可を生成しません。", "実行時間を制限する場合は--timeout-ms(最大86400000、ローカル既定0=制限なし)。runが異常終了した場合はリース期限後に再取得できます。", "pairedのrunは接続先で実行します。--cwdは接続先のパス。--exec-backend thread-shell --shell powershell|posix --thread UUIDを明示すると、idleの対象チャットでfull accessのホストシェルを使います。timeout 0は1時間。command/exec拒否から自動切替しません。完了不明はleaseを期限まで保持し、別コマンドを競合実行しません。docs/remote-operations.md。"] },
|
|
85
121
|
checkpoint: {
|
|
86
122
|
title: "検証したソースと結果・成果物を結び付ける",
|
|
87
123
|
when: "テスト結果が最終ソースのものか確認するとき、またはビルド前に検証の有効性を確認するとき。",
|
|
88
|
-
usage: ["checkpoint capture <THREAD> <NAME> --path PATH [--path PATH ...] [--exclude PATH ...]", "checkpoint run <THREAD> <ID> [--timeout-ms N] [--include-output] -- <COMMAND> [ARGS...]", "checkpoint attach <THREAD> <ID> --artifact FILE [--artifact FILE ...]", "checkpoint verify <THREAD> <ID>", "checkpoint list <THREAD>", "checkpoint show <THREAD> <ID> [--include-output]"],
|
|
124
|
+
usage: ["checkpoint capture <THREAD> <NAME> --path PATH [--path PATH ...] [--exclude PATH ...]", "checkpoint run <THREAD> <ID> [--exec-backend app-server|thread-shell] [--shell powershell|posix] [--timeout-ms N] [--include-output] -- <COMMAND> [ARGS...]", "checkpoint attach <THREAD> <ID> --artifact FILE [--artifact FILE ...]", "checkpoint verify <THREAD> <ID>", "checkpoint list <THREAD>", "checkpoint show <THREAD> <ID> [--include-output]"],
|
|
89
125
|
returns: "captureはIDと入力ハッシュ、runは終了コードと入力変更、verifyは入力・最新実行・成果物の一致を返します。valid=falseならrun/verifyの終了コードは1です。",
|
|
90
126
|
examples: ["codexteer checkpoint capture <THREAD> tests --path src --path test --path package.json --path package-lock.json --json", "codexteer checkpoint run <THREAD> <ID> -- npm test", "codexteer checkpoint attach <THREAD> <ID> --artifact test-results.xml --json", "codexteer send <THREAD> 'この検証結果で次へ進んでください' --checkpoint <ID> --json"],
|
|
91
|
-
notes: ["--pathはファイルかディレクトリ。配下の追加・削除も検知します。.gitは除外。--excludeは実パスで、globではありません。出力先・キャッシュは入力から除外してください。ディレクトリのシンボリックリンクは実体を明示してください。", "コマンドはcaptureした作業場所で、シェル展開せず引数どおりに実行します。timeoutの既定0は制限なし、最大86400000ms。割り込み・timeoutは自分が起動したプロセス群を終了します。", "実行前後のハッシュと実行中のファイル監視を記録します。途中編集・監視エラーは有効な検証にしません。厳密な固定には隔離した入力を使ってください。", "成果物は最新の成功実行後に明示的にattachします。自動で生成元を証明するものではありません。URL・ディレクトリは成果物にできません(アプリはZIP等のファイルで指定)。", "validは選択した入力とコマンドの結果の整合性です。テスト範囲の十分性や配布許可は認定しません。ログ末尾32K文字はローカル保存し、--include-outputで表示します。", "--checkpointをsendに付けると送信直前にも照合し、無効なら送信を止めます。"] },
|
|
127
|
+
notes: ["--pathはファイルかディレクトリ。配下の追加・削除も検知します。.gitは除外。--excludeは実パスで、globではありません。出力先・キャッシュは入力から除外してください。ディレクトリのシンボリックリンクは実体を明示してください。", "コマンドはcaptureした作業場所で、シェル展開せず引数どおりに実行します。timeoutの既定0は制限なし、最大86400000ms。割り込み・timeoutは自分が起動したプロセス群を終了します。", "実行前後のハッシュと実行中のファイル監視を記録します。途中編集・監視エラーは有効な検証にしません。厳密な固定には隔離した入力を使ってください。", "成果物は最新の成功実行後に明示的にattachします。自動で生成元を証明するものではありません。URL・ディレクトリは成果物にできません(アプリはZIP等のファイルで指定)。", "validは選択した入力とコマンドの結果の整合性です。テスト範囲の十分性や配布許可は認定しません。ログ末尾32K文字はローカル保存し、--include-outputで表示します。", "--checkpointをsendに付けると送信直前にも照合し、無効なら送信を止めます。", "pairedでは接続先fs APIで入力・成果物・監視を扱います。汎用command/exec拒否時に自動切替しません。明示--exec-backend thread-shell --shell powershell|posixは対象idleチャットでfull accessのホストシェルを使い、保存実行項目・marker・終了コードを照合します。timeout 0は1時間、観測中断はunknownで自動再送しません。docs/remote-operations.md。"] },
|
|
92
128
|
instructions: {
|
|
93
129
|
title: "現在有効な指示を確認し、古い指示を訂正する",
|
|
94
130
|
when: "診断を撤回するとき、方針が変わったとき、長い会話で今の決定を確認するとき。",
|
|
@@ -100,23 +136,26 @@ export const topics = {
|
|
|
100
136
|
history: {
|
|
101
137
|
title: "送った指示の配送と対応状況を追う",
|
|
102
138
|
when: "受付不明の送信を確認するとき、または未対応の指摘を洗い出すとき。",
|
|
103
|
-
usage: ["history list <THREAD> [--pending] [--include-text]", "history show <THREAD> <MESSAGE-ID> [--include-text]", "history check <THREAD> [MESSAGE-ID] [--include-text]", "history mark <THREAD> <MESSAGE-ID> --status acknowledged|applied|dismissed --note TEXT [--evidence REF ...] [--by NAME]"],
|
|
139
|
+
usage: ["history list <THREAD> [--pending] [--include-text]", "history show <THREAD> <MESSAGE-ID> [--include-text]", "history check <THREAD> [MESSAGE-ID] [--include-text]", "history show|check <CLOUD_TASK_ID|URL> --attempt <ATTEMPT_ID>", "history mark <THREAD> <MESSAGE-ID> --status acknowledged|applied|dismissed --note TEXT [--evidence REF ...] [--by NAME]"],
|
|
104
140
|
returns: "delivery_statusは受付、verification.status=storedは受信履歴との一致、responseは記録者が申告した対応状況です。これらを別々に返します。",
|
|
105
141
|
examples: ["codexteer history list <THREAD> --pending --json", "codexteer history check <THREAD> <MESSAGE-ID> --json", "codexteer history mark <THREAD> <MESSAGE-ID> --status applied --note '対象の回帰テストが通過' --evidence test-results.xml --by reviewer --json"],
|
|
106
|
-
notes: ["この版以降のapp-server送信をCODEX_HOME/codex-steerに保存します。本文はローカルの0600ファイルに保存し、表示は --include-text 指定時のみ。", "IDは送信結果のmessage_id/client_message_idです。unknownでもIDを保存します。checkは照合だけで再送しません。", "not_observedは未配送の証明ではありません。storedもモデルの理解や反映を証明しません。", "appliedの申告には根拠参照が必須です。根拠の妥当性を自動認定する機能ではありません。UI方式は追跡対象外です。"],
|
|
142
|
+
notes: ["この版以降のapp-server送信をCODEX_HOME/codex-steerに保存します。本文はローカルの0600ファイルに保存し、表示は --include-text 指定時のみ。", "IDは送信結果のmessage_id/client_message_idです。unknownでもIDを保存します。checkは照合だけで再送しません。", "Cloudの--attemptは送信結果のattempt_id/cloud_attempt_idを指定します。重複拒否のexisting_attempt_idは前回の回復用で、今回の配送IDではありません。showはローカル試行記録、checkは親ターンと本文ダイジェストの照合です。MESSAGE-IDと併用しません。POST前の明示的な未送信証拠がある場合だけ配送予約を修復します。", "Cloudのcheckは今回の本文ダイジェスト・親ターンと試行記録も照合し、不一致はconflictです。not_sentを前回の配送からacceptedへ更新しません。not_observedは未配送の証明ではありません。storedもモデルの理解や反映を証明しません。", "appliedの申告には根拠参照が必須です。根拠の妥当性を自動認定する機能ではありません。UI方式は追跡対象外です。"],
|
|
107
143
|
},
|
|
108
144
|
overview: {
|
|
109
145
|
title: "別のAIと、Codexタスクの進行を共有する",
|
|
110
146
|
when: "タスクを探す → 現状を読む → 指示を送る → 変化を確認する、という順で使います。",
|
|
111
|
-
usage: ["supervise <THREAD> [MESSAGE] [--agent claude|codex] [--connection shared|desktop] [-- <AGENT-ARGS...>]", "supervise prompt <THREAD> [MESSAGE] [--agent claude|codex] [--connection shared|desktop]", "supervise status|pause|resume|stop <THREAD>", "supervise list", "threads list [--desktop-only] [--limit N]", "status <THREAD>", "read <THREAD> [--since CURSOR] [--limit N]", "watch <THREAD> [--since CURSOR] [--until change|idle|attention]", "send <THREAD> <MESSAGE...> [--new-turn] [--dry-run] [--no-sound]", "doctor [--backend app-server|ui]", "desktop start [--dry-run]", "thread resolve <THREAD>", "open <THREAD>", "debug-ui <THREAD> [--wait-ms N]", "help <COMMAND>"],
|
|
147
|
+
usage: ["orchestrate --project ID|NAME <GOAL> [--agent claude|codex] [--use-path-cli] [-- <AGENT-ARGS...>]", "orchestrate prompt --project ID|NAME <GOAL> [--agent claude|codex] [--use-path-cli]", "supervise <THREAD> [MESSAGE] [--agent claude|codex] [--connection shared|desktop|cloud|desktop-cloud] [--use-path-cli] [-- <AGENT-ARGS...>]", "supervise prompt <THREAD> [MESSAGE] [--agent claude|codex] [--connection shared|desktop|cloud|desktop-cloud] [--use-path-cli]", "supervise status|pause|resume|stop <THREAD>", "supervise list", "projects list", "thread create --project ID|NAME [--context-thread THREAD-ID] <MESSAGE>", "thread verify <ATTEMPT-ID>", "threads list [--desktop-only] [--limit N]", "status <THREAD>", "read <THREAD> [--since CURSOR] [--limit N]", "watch <THREAD> [--since CURSOR] [--until change|idle|attention]", "send <THREAD> <MESSAGE...> [--new-turn] [--dry-run] [--no-sound]", "doctor [--backend app-server|ui]", "desktop start [--dry-run]", "desktop update [--dry-run] [--timeout-ms N]", "desktop update-status", "thread resolve <THREAD>", "diff <CLOUD_TASK_ID|URL> [--attempt N]", "open <THREAD>", "debug-ui <THREAD> [--wait-ms N]", "help <COMMAND>"],
|
|
112
148
|
returns: "対話起動のsupervise <THREAD> [MESSAGE]を除き、各コマンドに --json を付けると、AIやスクリプトが扱えるJSONを返します。supervise promptもJSONに対応します。",
|
|
113
|
-
examples: ["codexteer supervise <THREAD>", "codexteer threads list --desktop-only --json", "codexteer read <THREAD> --json", "codexteer help send"],
|
|
149
|
+
examples: ["codexteer supervise <THREAD>", "codexteer supervise <THREAD> --use-path-cli", "codexteer threads list --desktop-only --json", "codexteer read <THREAD> --json", "codexteer help send"],
|
|
114
150
|
use_cases: [
|
|
151
|
+
{ need: "プロジェクトと目標から担当を編成して進める", command: "help orchestrate prompt" },
|
|
115
152
|
{ need: "ClaudeまたはCodex CLIを監督役にする", command: "help supervise / help monitor" },
|
|
116
153
|
{ need: "監督役(オーケストレーター)向けのプロンプトを取得", command: "help supervise prompt" },
|
|
117
154
|
{ need: "監督状態・一時停止・再開を確認", command: "help supervise" },
|
|
118
155
|
{ need: "指摘と解決条件・評価を追跡", command: "help findings" },
|
|
119
156
|
{ need: "通常起動Desktopの観測接続", command: "help connection" },
|
|
157
|
+
{ need: "プロジェクトへ初回指示付きチャットを作成", command: "help projects / help thread" },
|
|
158
|
+
{ need: "クラウド環境で新規タスクを作成・確認", command: "help cloud" },
|
|
120
159
|
{ need: "今の状態・前回からの変化を確認", command: "help read / help status" },
|
|
121
160
|
{ need: "Claude CodeのMonitorから使う", command: "help monitor" },
|
|
122
161
|
{ need: "根拠や仮説を付けて指示する", command: "help send" },
|
|
@@ -125,7 +164,7 @@ export const topics = {
|
|
|
125
164
|
{ need: "テストしたソースと成果物を照合", command: "help checkpoint" },
|
|
126
165
|
{ need: "画面・Unityなどの利用を調整", command: "help resource" },
|
|
127
166
|
],
|
|
128
|
-
notes: ["THREADにはUUID
|
|
167
|
+
notes: ["THREADにはDesktopのUUID、Web Cloudのtask_ID/公式タスクURL、Desktop Cloudのdurable_UUID/hostId=durable付きリンクを指定します。", "監督役の対話起動: codexteer supervise <THREAD> [MESSAGE] [--agent claude|codex] [--connection shared|desktop|cloud|desktop-cloud] [--use-path-cli] [-- <AGENT-ARGS...>]。superviseの標準入出力と終了コードは監督エージェントのものです。", "コマンド別のhelpには、使い所・出力・例・制約を載せています。help自体も --json に対応します。"],
|
|
129
168
|
},
|
|
130
169
|
read: {
|
|
131
170
|
title: "直近の発言・コマンド・変更ファイルを読む",
|
|
@@ -157,7 +196,7 @@ export const topics = {
|
|
|
157
196
|
usage: ["watch <THREAD> [--since CURSOR] [--until change|idle|attention] [--timeout-ms N] [--poll-ms N] [--limit N] [--max-chars N] [--include-output] [--full-history]", "watch <THREAD> --stream [--notify all|digest] [--settle-ms N] [--max-hold-ms N] [--since CURSOR] [--poll-ms N] [--limit N] [--max-chars N] [--include-output] [--full-history]"],
|
|
158
197
|
returns: "通常は条件成立または時間切れで1回返します(reason、timed_out、events、cursor)。--streamはdata.type=observationの差分とdata.type=connectionの接続状態をJSON Linesで返します。",
|
|
159
198
|
examples: ["codexteer watch <THREAD> --stream --notify digest --since <CURSOR> --include-output --json", "codexteer watch <THREAD> --since <CURSOR> --json", "codexteer watch <THREAD> --until idle --timeout-ms 60000 --json"],
|
|
160
|
-
notes: [notificationHelp, DIGEST_GUIDANCE, "既定はchange、30
|
|
199
|
+
notes: [notificationHelp, DIGEST_GUIDANCE, "既定はchange、30秒待ち。照会間隔はDesktopが1秒、Cloudが5秒。timeoutは0〜60000ms、pollは250〜10000ms。", "readと同じ差分取得を使います。--full-history は毎回の全取得になるため、通常の監視は既定の方式を使ってください。旧cursorの移行と確認範囲は help read へ。", "--sinceなしのchangeは現在を基準に次の変化を待ちます。idle/attentionは既に成立していればすぐ返します。", "--streamの接続状態はwatching/reconnecting/recovered/needs_review/failedです。観測成功後の一時切断だけ、最大10秒間隔・合計60秒まで同じタスクへ再接続します。通常のwatchと初回接続失敗は再試行しません。", "接続行のresume_cursorはCLIの出力完了位置または初回の基準です。AIの読了確認ではありません。再起動時は監督側が読了済みcursorを指定してください。復帰後もhas_moreなら差分を読み切ります。", "--streamは--until/--timeout-msと併用不可。平常時の定期通知はなく、SIGINT/SIGTERMで接続中・復帰待ちでも停止します。詳細はhelp monitorへ。", "読み取り専用のポーリングです。自動送信・タスク再開・承認回答・常駐登録は行いません。"],
|
|
161
200
|
},
|
|
162
201
|
send: {
|
|
163
202
|
title: "実行中タスクに方針やレビューを伝える",
|
|
@@ -165,20 +204,110 @@ export const topics = {
|
|
|
165
204
|
usage: ["send <THREAD> <MESSAGE...> [--new-turn] [--dry-run] [--no-sound] [--backend app-server|ui]", "send <THREAD> <MESSAGE...> [--source NAME] [--kind decision|review|hypothesis|suggestion] [--evidence FILE-OR-URL ...] [--based-on CURSOR] [--supersedes MESSAGE-ID] [--expires-at ISO-TIMESTAMP] [--checkpoint ID] [--finding ID]", "<THREAD> <MESSAGE...> [sendと同じオプション]"],
|
|
166
205
|
returns: "acceptedはサーバーの受付です。処理完了や画面への表示を保証するものではありません。",
|
|
167
206
|
examples: ["codexteer send <THREAD> '失敗したテストの原因を先に確認してください' --dry-run --json", "codexteer send <THREAD> '競合が原因か確認してください' --source claude --kind hypothesis --evidence results.xml --based-on <CURSOR> --json", "codexteer send <THREAD> '続けてください' --new-turn --no-sound --json", "printf '%s\\n' '理由' '変更方針' | codexteer send <THREAD> -"],
|
|
168
|
-
notes: ["--findingは指摘IDとrevisionを配送履歴へ結び付け、同一revisionの重複介入を拒否します。監督ID付きでは--findingと--based-onが必須です。help findingsとhelp superviseを参照してください。", "MESSAGEに - を指定すると標準入力を読みます。本文中のオプション名は -- の後に置いてください。", "--kindはdecision=ユーザー決定の伝達、review=レビュー、hypothesis=未確定の仮説、suggestion=任意提案です。指定時は送信者・種類・根拠を本文の前に表示します。無指定なら従来の本文をそのまま送ります。", "decisionは送信者の分類で、新しいユーザー承認を作りません。元のユーザー指示を根拠として示してください。", "--based-onはread/statusのcursor。has_more:trueなら読み終えてから指定します。観測位置以降の新しいユーザー入力やターン変更があれば送信を止めます。通常の進捗報告だけでは止めません。根拠ファイルも送信直前にハッシュ照合します。URLは参照のみです。", "dry-runではファイル根拠を読めますが、接続・鮮度確認・保存・送信は行いません。鮮度確認と送信の間の変更を原子的には防げません。", "既定はapp-server。UI操作は --backend ui を明示した場合だけです。--keep-focusと--wait-msはUI専用です。", "送信音は既定でオンです。受付成功時に同梱の短い3音「プルッ」(約0.30秒)を再生します。--no-soundで今回だけ消音します。互換用の--soundはapp-server専用で、--no-soundと併用不可。dry-run・受付失敗・unknown・UI方式では鳴りません。通知設定は変更せず、音量・ミュートはMacの出力設定に従います。再生失敗でも送信成功を維持し、JSONのsound.played/reasonまたは警告で知らせます。", "unknownは受付未確認です。history checkで確認し、自動再送しないでください。"],
|
|
207
|
+
notes: ["ページ履歴の古いターンが実行中のまま残っていても、最新ターンが進行中なら通常のsendを使えます。現在のターンIDとの一致はサーバーで確認し、不一致時に別IDへ再送しません。Codexの終了や履歴修復は不要ですが、本体の表示・保存状態を修復する機能ではありません。", "--findingは指摘IDとrevisionを配送履歴へ結び付け、同一revisionの重複介入を拒否します。監督ID付きでは--findingと--based-onが必須です。help findingsとhelp superviseを参照してください。", "MESSAGEに - を指定すると標準入力を読みます。本文中のオプション名は -- の後に置いてください。", "--kindはdecision=ユーザー決定の伝達、review=レビュー、hypothesis=未確定の仮説、suggestion=任意提案です。指定時は送信者・種類・根拠を本文の前に表示します。無指定なら従来の本文をそのまま送ります。", "decisionは送信者の分類で、新しいユーザー承認を作りません。元のユーザー指示を根拠として示してください。", "--based-onはread/statusのcursor。has_more:trueなら読み終えてから指定します。観測位置以降の新しいユーザー入力やターン変更があれば送信を止めます。通常の進捗報告だけでは止めません。根拠ファイルも送信直前にハッシュ照合します。URLは参照のみです。", "dry-runではファイル根拠を読めますが、接続・鮮度確認・保存・送信は行いません。鮮度確認と送信の間の変更を原子的には防げません。", "既定はapp-server。UI操作は --backend ui を明示した場合だけです。--keep-focusと--wait-msはUI専用です。", "送信音は既定でオンです。受付成功時に同梱の短い3音「プルッ」(約0.30秒)を再生します。--no-soundで今回だけ消音します。互換用の--soundはapp-server専用で、--no-soundと併用不可。dry-run・受付失敗・unknown・UI方式では鳴りません。通知設定は変更せず、音量・ミュートはMacの出力設定に従います。再生失敗でも送信成功を維持し、JSONのsound.played/reasonまたは警告で知らせます。", "unknownは受付未確認です。history checkで確認し、自動再送しないでください。"],
|
|
169
208
|
},
|
|
170
209
|
doctor: { title: "接続・実行環境・観測APIを診断する", when: "接続できないとき、監督の開始時、またはDesktop更新後。", usage: ["doctor [--backend app-server|ui]", "doctor --thread <THREAD> [--backend app-server]"], returns: "ready、製品バージョン、connection、runtime_compatibility、desktop_subscription、compatibility.api_checks、failureと復旧案内。", examples: ["codexteer doctor --json", "codexteer doctor --thread <THREAD> --json"], notes: ["codex_steer_compatibilityは製品名・版の比較で、違いだけでは停止しません。runtime_compatibilityで通信仕様・機能・操作ごとのsupported/unsupported/unverifiedを返します。新規ターンだけ未対応でも観測と通常送信は継続できます。", "宣言なしの旧環境は読み取りで検証し、未知の送信仕様は試験送信せず停止します。CAPABILITY_UNSUPPORTED/UNVERIFIEDは該当機能、RUNTIME_PROTOCOL_UNSUPPORTED/UNVERIFIEDは共通仕様を確認してください。対象未指定では接続を診断し、観測の互換性はunverifiedです。--threadで指定した対象の読み取り経路を検証します。readyは接続条件と指定された検証の結果です。", "compatibility.statusはverified/unverified/unsupported/failed。verifiedは対象の初回観測に成功したことを表し、履歴全体・送信・画面表示・承認往復の保証ではありません。呼び出していないAPIもunverifiedです。", "--threadはapp-server専用。本文を診断出力に含めず、タスクの再開・送信・承認回答・Desktop再起動・設定変更は行いません。failureにはコードと失敗したメソッドを返します。"] },
|
|
171
|
-
desktop: { title: "
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
210
|
+
desktop: { title: "Desktopの起動・更新とwrapperの維持", when: "startはDesktop終了後、updateは起動中のDesktopの作業を終えてから実行します。", usage: ["desktop start [--dry-run]", "desktop update [--dry-run] [--timeout-ms N]", "desktop update-status"], returns: "startは起動結果とdeployment、updateはworkerの起動受付、update-statusは進捗・完了・失敗理由。", examples: ["codexteer desktop start --dry-run --json", "codexteer desktop start"], notes: ["updateは公式更新UI(英語・日本語)を操作し、更新後の正常終了とwrapper付き再起動を外部Nodeの独立プロセスで実行します。Accessibility/Automation権限が必要です。作業を終えてから実行してください。最大待機時間は既定10分、--timeout-msで10秒〜1時間です。起動受付は完了を意味しません。update-statusでcompleteとwrapper_verifiedを確認してください。Codex内の既知の更新ラベルを照合しますが、更新ウィンドウ固有の識別は保証しません。更新以外のダイアログは閉じてください。ラベル不一致やOS権限では自動操作を進めず、タイムアウト時に停止します。--supervisor付きのupdateは拒否します。", "呼び出した配布物をCODEX_HOME/codex-steer/runtimes/<version>-<sha256>へ検証して配置し、そのwrapperで起動します。保存先の所有者・権限・リンク・内容を検証し、既存の配置は上書きしません。npxの取得元はcodexteerです。通常はバージョン指定なしで使えます。特定の版で開始したい場合は、任意でパッケージ名に@バージョンを付けてください。起動と操作の製品版が異なっても、必要な通信・機能仕様が対応していれば使用できます。", "dry-runは接続・配置・起動を行いません。配置ロックが残っている場合は自動で奪わずDEPLOYMENT_BUSYで停止します。", "startは起動中のDesktopを終了させません。通常起動への復旧は、終了後にDock等から開き直します。"] },
|
|
211
|
+
projects: { title: "Desktopのローカル・リモート登録プロジェクトを探す", when: "チャットの所属・ソースフォルダ・ホストを確認するとき。", usage: ["projects list [--remote | --all] [--host HOST-ID]", "--connection cloud projects list"], returns: "ローカルはApp Serverのcanonical IDと全roots。リモートはDesktopの登録ID・名前・remotePath・host_id・source・availability。", examples: ["codexteer projects list --json", "codexteer projects list --remote --json", "codexteer projects list --all --json", "codexteer projects list --host remote-control:env_example --json"], notes: ["Cloudは--connection cloudで環境ID・名前・リポジトリ・既定ブランチを取得します。詳細はhelp cloud。", "引数なしは従来のローカル一覧です。--remoteはCODEX_HOMEのDesktop remote-projects登録だけを読み、--allはローカルと併合します。リモートの--hostはその登録を絞ります。状態ファイルは変更しません。", "native/--remote登録一覧のsourceはdesktop-registration、availabilityはunverifiedです。pairedの--host指定では接続先のproject/listを読み、source:remote-app-server・availability:verifiedを返します。登録はホストの接続・現存確認を意味しません。Windows/UNCパスをローカルパスへ変換しません。Desktopのnative一覧はremote Gitメタデータ取得失敗で項目を省略するため、完全な登録一覧とは扱いません。", "ローカルの同名プロジェクトはproject_idで選びます。pairedではlive正式IDとdesktop_project_idsを取得し、thread createに対応します。詳細はdocs/remote-operations.md。"] },
|
|
212
|
+
"remote-control": {
|
|
213
|
+
title: "Remote Controlへ厳密な指定ターン送信を行う",
|
|
214
|
+
when: "既存のactiveターンへリモート指示を送る監督を、明示した直接接続で行うとき。",
|
|
215
|
+
usage: ["--remote-transport control doctor --thread <HOST-LINK>", "--remote-transport control supervise <HOST-LINK> [--agent claude|codex]", "--remote-transport control supervise prompt <HOST-LINK> [--use-path-cli]", "--remote-transport control read <HOST-LINK>", "--remote-transport control send <HOST-LINK> <MESSAGE> [--based-on CURSOR] [--finding ID]"],
|
|
216
|
+
returns: "host_id・remote_transport、App Serverの同じturn IDで確認した受付状態。監督本文のobservation_onlyはfalse。鍵の事前照合失敗はREMOTE_DEVICE_KEY_UNAVAILABLE、doctor.remote_control_authで詳細を返し、WebSocket接続前に停止します。control認証完了・読取・実配送は未検証。",
|
|
217
|
+
examples: ["codexteer --remote-transport control supervise prompt '<hostId付きリンク>' --use-path-cli", "codexteer --remote-transport control doctor --thread '<hostId付きリンク>' --json"],
|
|
218
|
+
notes: ["現在のChatGPTログイントークンをwss://chatgpt.com/backend-api/codex/remote/control/clientの認証に使い、既存のOS非抽出キーで接続チャレンジへ署名します。新規登録・キー作成・トークンのディスク保存はしません。公式宛先以外やリダイレクトは拒否します。", "socket-refresh-v1とprotocol v3、既存Desktop enrollmentが必要です。未対応・認証拒否なら停止し、別経路へのfallbackはしません。context-threadは不要、remote-control:env_...のhostIdは必須です。", "expectedTurnIdをサーバーで照合し、一度だけturn/steerします。ターン交代は拒否、応答不明はunknownとしてhistory checkで照合します。再接続時のmutation replayを行いません。new-turn・resume・UI送信・代理承認は未対応です。", "既存のfreshness、pause/stop、findingの重複防止、client message ID照合を維持します。nativeとcontrolのカーソル・監督IDは交換できません。全コマンドで--hostと--remote-transport controlを保持してください。", "追加テストと一時プロファイルの実同梱App Serverで検証済みです。公式ゲートウェイの認証チャレンジ受信まで確認しましたが、既存端末鍵へのアクセスで停止しています。control認証完了・リモート読取・実配送は未検証です。調査根拠・実装と検証範囲はdocs/remote-control.md。"],
|
|
219
|
+
},
|
|
220
|
+
"remote-device": {
|
|
221
|
+
title: "codexteer専用端末鍵を公式に登録・ペアリングする",
|
|
222
|
+
when: "既存Desktop鍵と分けて専用鍵を登録し、許可したホストへpaired経路で接続するとき。",
|
|
223
|
+
usage: ["remote prepare --key-provider keychain|openai-native", "remote enroll", "remote status", "remote identity", "remote recover-key", "remote verify", "--host HOST remote pair --code-stdin", "--remote-transport paired doctor --thread <HOST-LINK>", "--remote-transport paired read <HOST-LINK>"],
|
|
224
|
+
returns: "専用登録のphase、OS鍵保護方式、ペアリング先。verifyはdevice-key認証と公式の許可ホスト一覧だけを確認し、チャットRPCを送りません。",
|
|
225
|
+
examples: ["codexteer remote prepare --key-provider keychain --json", "codexteer remote enroll --json", "codexteer --host remote-control:env_example remote pair --code-stdin --json", "codexteer --remote-transport paired doctor --thread '<hostId付きリンク>' --json"],
|
|
226
|
+
notes: ["enrollは公式ブラウザでfreshな本人認証を要求し、PKCE・state・アカウントとcodex.remote_control.enroll scopeを照合します。パスワード・トークン・pairing codeをチャットや引数に渡さないでください。",
|
|
227
|
+
"keychain方式はXcode command-line toolsでcodexteer自身のhelperをビルド・アドホック署名し、OSが非抽出と報告するP-256鍵だけを使います。Secure Enclaveとは表示しません。Desktopの署名やentitlementは変更しません。",
|
|
228
|
+
"openai-native方式は公式addonで新しい専用鍵を作ります。ハードウェアとOS権限に依存し、利用できない場合は停止します。鍵方式は自動切替せず、準備済みの鍵を別方式で置換しません。",
|
|
229
|
+
"対象ホストのDesktop設定 → Connections → Control this PC → Addから手動コードを取得し、Mac側remote pair --code-stdinへ入力します。CLIの追加インストールは不要です。公式CLIがある環境はcodex remote-control pairも使えます。TTY入力は非表示です。応答host不一致は停止します。",
|
|
230
|
+
"専用登録はCODEX_HOME/codex-steer/remote-deviceへ保存し、Desktop登録を更新しません。秘密鍵・OAuth/bearer/remote-control token・code・proofはJSONへ保存しません。",
|
|
231
|
+
"unknown時は同じ鍵・clientを保持し、作り直しやfinish/pairの自動再送をしません。key-only中断はrecover-key、登録完了やpair応答不明はverifyで照合します。",
|
|
232
|
+
"pairedは専用登録と対象hostのpairingを必須とし、Desktop鍵へfallbackしません。native/control/pairedのカーソルと監督IDは交換できません。pairedの作成・一覧・new-turn・検証実行はhelp remoteとdocs/remote-operations.md。UI送信・代理承認は未対応です。登録・ペアリングだけでは実チャットへの指示送信を許可しません。",
|
|
233
|
+
"remote statusのcontroller_nameはcodexteer_<OS>_<CPU>です。remote identityは同じ専用clientのサーバー表示名だけを照合します。User-Agentに実OS/CPUを付けますが、Desktop側の任意名変更APIは未確認で、controller_nameを画面上の名前とは扱いません。",
|
|
234
|
+
"登録・ペアリングはチャットの作成・送信許可とは別です。利用者が指定したホストとチャットだけを対象にしてください。手順はdocs/remote-device-enrollment.md。"],
|
|
235
|
+
},
|
|
236
|
+
remote: {
|
|
237
|
+
title: "接続先のプロジェクト・チャットをCLIで操作する",
|
|
238
|
+
when: "pairedでリモートの作成・タスク一覧・送信・監督・検証を行うとき。既定nativeは観測専用。",
|
|
239
|
+
usage: ["projects list --remote", "projects list --all", "--host HOST-ID projects list", "--host HOST-ID --remote-transport paired projects list", "--host HOST-ID --remote-transport paired threads list [--project ID] [--search TEXT] [--cursor CURSOR]", "--host HOST-ID --remote-transport paired --context-thread LOCAL-UUID thread create --project ID|NAME <MESSAGE>", "--host HOST-ID --remote-transport paired --context-thread LOCAL-UUID send <THREAD> <MESSAGE> --new-turn", "read 'codex://threads/<UUID>?hostId=<ENCODED-HOST-ID>'", "--host HOST-ID --context-thread LOCAL-UUID read <THREAD>", "supervise 'codex://threads/<UUID>?hostId=<ENCODED-HOST-ID>' [--agent claude|codex]", "supervise prompt 'codex://threads/<UUID>?hostId=<ENCODED-HOST-ID>' [--use-path-cli]"],
|
|
240
|
+
returns: "リモート登録一覧、選択ホストの公開履歴差分、ホスト別カーソル・監督記録。既定nativeのobservation_onlyはtrue。明示したcontrol経路は指定ターン送信に対応し、既存端末鍵が利用できなければ接続前に停止するため、利用環境で互換性の確認が必要。",
|
|
241
|
+
examples: ["codexteer projects list --remote --json", "codexteer --host remote-control:env_example --context-thread <LOCAL-UUID> read <UUID> --json", "codexteer supervise prompt 'codex://threads/<UUID>?hostId=remote-control%3Aenv_example' --use-path-cli --json"],
|
|
242
|
+
notes: ["裸のUUIDはローカル。リンクと--hostが矛盾するとHOST_MISMATCH、別ホストの応答も採用しません。--connection desktopは併用不可です。既定nativeの読取りは既存shared wrapperの署名付きhelperとnative read_threadを使います。", "既定nativeには実在ローカル呼出し元の保存済みturnが必要です。Codex内はCODEX_THREAD_ID、端末は--context-threadで指定します。モデルの中継ターンや呼出し元への送信は発生しません。", "公開履歴を10ターンずつ全ページ読み、最大100ページを超えたら停止します。出力・diffは項目ごと最大20000文字で、Desktop側の省略を明示します。", "native監督本文は観測専用です。指定ターン送信は--remote-transport controlで明示する別経路に実装しています。controlは既存端末鍵へのアクセスが必要です。利用できない場合は停止します。new-turn/UI送信/作成/修復はnative/controlでは未対応です。pairedでは作成・一覧・new-turn・checkpoint/resource・orchestrateに対応します。作成/new-turn/openは実在ローカルcallerとDesktop公式APIが必要で、new-turnは対象チャットを制御側Desktopに表示します。thread-shellはfull accessの明示backendで、自動fallbackしません。Mac固有desktop/debug-uiとoffline repairはリモートへ適用しません。docs/remote-operations.md。", "生成された--host・--context-thread・--supervisor・--connectionを保持します。記録とロックはhosts/<host-idのSHA256>/以下に分離し、カーソルのhost_idも照合します。supervise listは--hostで選んだホストの記録を返します。", "失敗時の別ホスト・UI・SSHへの自動切替や再起動は行いません。詳細と実機確認はdocs/remote-observation.md。"],
|
|
243
|
+
},
|
|
244
|
+
threads: { title: "送信先のタスクを探す", when: "宛先の正確なIDを確認するとき。", usage: ["threads list [--desktop-only] [--limit N]", "--host HOST --remote-transport paired threads list [--cursor CURSOR] [--project ID] [--search TEXT]", "--connection cloud threads list [--limit N] [--cursor CURSOR] [--env ENV_ID]"], returns: "選択ホストのタスクID、作業場所、更新日時、hostId付きリンク。pairedはnext_cursor/has_moreも返します。", examples: ["codexteer threads list --desktop-only --limit 20 --json"], notes: ["Cloudは--connection cloudでID・URL・名前・状態とページcursorを取得します。limitは1〜500、既定20。本文は読みません。", "CODEX_HOMEに従います。本文は読みません。"] },
|
|
245
|
+
thread: {
|
|
246
|
+
title: "プロジェクトへタスクを作成・照合し、IDの解決・残留ターン修復を行う",
|
|
247
|
+
when: "新規チャットへ初回指示を渡すとき、作成済みreceiptを再照合するとき、URLをIDへ変換するとき、古いターンが残留したとき。",
|
|
248
|
+
usage: ["thread create --project ID|NAME [--context-thread THREAD-ID] [--timeout-ms N] [--title TEXT] [--model MODEL] [--thinking EFFORT] [--dry-run] <MESSAGE...>|-", "thread verify <ATTEMPT-ID> [--timeout-ms N]", "thread resolve <THREAD>", "thread repair <THREAD> [--dry-run | --apply]", "--connection cloud thread create --project ENV_ID_OR_NAME [--branch BRANCH] [--dry-run] <MESSAGE...>|-", "--connection cloud thread receipt <ATTEMPT_ID>", "--connection desktop-cloud thread create --environment ID|NAME [--title TEXT] [--dry-run] <MESSAGE...>|-", "--connection desktop-cloud thread assign TARGET --project ID|NAME", "--connection desktop-cloud thread receipt <ATTEMPT_ID>"],
|
|
249
|
+
returns: "createは作成ID・所属ID・全フォルダ・初回指示の照合状態・配送状態・receipt_path。verifyは既存created/accepted receiptの再照合結果と照合履歴。repairは残留候補とSHA256、--apply成功時はバックアップ・修復記録。",
|
|
250
|
+
examples: ["codexteer thread create --project 'サンプル' '関連リポジトリを読み、調査結果を報告してください' --json", "codexteer thread create --project 'サンプル' --dry-run '調査してください' --json", "codexteer projects list --json", "codexteer thread resolve codex://threads/<UUID> --json", "codexteer thread repair <THREAD> --json", "codexteer thread repair <THREAD> --apply --json"],
|
|
251
|
+
notes: ["Web Cloudの作成はhelp cloud、Desktop Cloudの環境指定・作成・所属診断はhelp desktop-cloudを参照してください。以下のApp Server・native作成の説明はローカルDesktopに適用します。", "Cloudのthread receiptは作成結果のローカル記録です。タスクID不明でも試行IDで確認でき、再作成・外部照会を行いません。監督ID付きでは拒否します。", "プロジェクト名と初回指示だけで作成できます。既存チャット・CODEX_THREAD_ID・中継AIは不要です。App Serverで全フォルダ付きチャットを作り、Desktop購読を確立して初回指示を送信後、その新規チャット自身の実在thread/turn IDでnative所属登録を行います。このstandalone方式はローカルのみ。pairedのリモート作成は実在ローカルcallerを使うDesktop公式createと接続先での照合です。--context-threadまたはCODEX_THREAD_IDが必要で、中継AIは起動しません。docs/remote-operations.md。",
|
|
252
|
+
"--context-threadは任意の明示的な関連付けです。ローカルで指定時だけ保存済みターンのある実在チャットを呼出し元にnative create_threadを使います。pairedではこのcaller方式を使います。そのチャットへの送信や追加AIターンはありません。ローカルで省略時はstandalone作成となり、CODEX_THREAD_IDも参照しません。",
|
|
253
|
+
"モデル・権限・承認設定はプロジェクトのApp Server設定に従います。--model/--thinking/--titleは明示指定可能。cwd・権限・承認設定の上書きと旧--via-threadは非対応。--timeout-msは各RPCの待機期限で既定120000、1000〜600000。CLI終了後も承認はDesktopが担当し、自動回答しません。",
|
|
254
|
+
"standaloneで--titleを省略すると、初回指示の空白をまとめた先頭80文字を名前として保存します。タイトル用AIは起動しません。この名前はJSON/receiptにも含まれます。",
|
|
255
|
+
"作成後にDesktop native一覧のthread ID・local host・project ID、canonical projectId、全フォルダ、保存初回指示とタイトルを照合します。旧状態ファイルの所属mapだけでは判定しません。履歴の反映待ちは読取りだけで行います。手順と検証範囲はdocs/thread-create.md。",
|
|
256
|
+
"thread verify <ATTEMPT-ID>は作成済み・初回受付済みreceiptを再照合し、codexteerのreceiptだけを更新します。Desktopでは読取りのみ。作成・移動・再送やAIターンは発生しません。初回本文のSHA256・文字数・standaloneの初回turn IDも照合します。native一覧の最新50件と全pinnedに対象がなければ成功と推測せず失敗を返します。unknown/未受付receiptは対象外です。",
|
|
257
|
+
"--dry-runは既存接続・プロジェクト・native schemaを読取り確認し、チャット・指示・保存記録は作りません。",
|
|
258
|
+
"作成・初回配送を自動再試行しません。creation_status、thread_id、receipt_path、native_call_idを確認してください。createdなら既存IDを使い、unknown/dispatchingは未作成の証拠ではありません。Desktop/DB/保存履歴を直接編集しません。--connection desktopと--supervisorでのcreateは拒否します。",
|
|
259
|
+
"repairはローカル保存履歴の検査です。後続の独立したターン開始があり、終了記録がない古いターンだけを候補にします。最新の未完了ターンは修復しません。",
|
|
260
|
+
"--applyは全Codex/ChatGPT・Codex CLI/app-serverを終了した後、外部ターミナルで実行します。稼働中・検査不能なら拒否し、プロセスを終了する操作は行いません。実行完了までCodexを起動しないでください。",
|
|
261
|
+
"検証済みCodex CLI 0.162.0-alpha.17.2 / 0.164.0-alpha.11.1と連続ordinalのpaginated履歴に限定。原本をバックアップし、古いIDのturn_abortedだけを末尾へ追記します。既存の会話・ordinal・DBを直接書き換えません。実際の停止時刻や所要時間は推定しません。",
|
|
262
|
+
"端末の空き容量は履歴のバックアップ分を確保してください。中断・検証失敗ではbackup_path/receipt_pathを残します。原本への上書き復元や再実行を盲目的に行わず、記録を確認してください。",
|
|
263
|
+
"成功は保存履歴の追記とSHA256照合です。次回ロード時にCodexが状態へ反映します。再起動後の表示・次ターンは別途確認し、read/watchの古いcursorは更新してください。",
|
|
264
|
+
"--connection desktopと--supervisorでのrepairは拒否します。resolveはID書式だけを検査し、タスク存在確認はstatusを使います。"],
|
|
265
|
+
},
|
|
266
|
+
open: { title: "タスクを開く", when: "ユーザーが画面でタスクを見たいとき。", usage: ["open <THREAD>"], returns: "開いたタスクのURL。", examples: ["codexteer open <THREAD>"], notes: ["Desktopはアプリ、Cloudは公式タスクURLを既定ブラウザで開きます。画面を開く明示的なコマンドです。"] },
|
|
175
267
|
"debug-ui": { title: "UI送信のために画面構造を調べる", when: "明示的なUI方式を診断するとき。", usage: ["debug-ui <THREAD> [--wait-ms N]"], returns: "Accessibilityの診断情報。", examples: ["codexteer debug-ui <THREAD> --wait-ms 1500"], notes: ["画面を操作します。通常のバックグラウンド送信には不要です。"] },
|
|
268
|
+
diff: {
|
|
269
|
+
title: "Cloudタスクの記録済み差分を確認する",
|
|
270
|
+
when: "Cloudの成果を確認するとき。",
|
|
271
|
+
usage: ["diff <CLOUD_TASK_ID|URL> [--attempt 1..4] [--timeout-ms N]"],
|
|
272
|
+
returns: "JSONはdiff・diff_available・attempt、テキストは公式CLIの差分そのものです。ローカルへ適用しません。",
|
|
273
|
+
examples: ["codexteer diff task_example --attempt 1 --json"],
|
|
274
|
+
notes: ["記録済みパッチがない場合はdiff_available:false・local_changes:unknownです。変更ゼロとは解釈しません。", "--timeout-msは1000〜600000ms、既定120000ms。特定試行の失敗時に他の試行へ切り替えません。"],
|
|
275
|
+
},
|
|
276
|
+
"desktop-cloud": {
|
|
277
|
+
title: "Desktop Cloud",
|
|
278
|
+
summary: "DesktopのCloud環境構成にCLI単体で接続します。",
|
|
279
|
+
usage: ["--connection desktop-cloud projects list", "--connection desktop-cloud doctor --thread TARGET [--project ID_OR_EXACT_NAME]", "--connection desktop-cloud thread assign TARGET --project ID_OR_EXACT_NAME", "--connection desktop-cloud environments list", "--connection desktop-cloud threads list [--limit 1..100] [--cursor CURSOR]", "--connection desktop-cloud thread create --environment ID_OR_EXACT_NAME [--title TEXT] [--dry-run] <MESSAGE...>|-", "read|status|watch <DURABLE_ID|HOST_LINK> ...", "send <DURABLE_ID|HOST_LINK> <MESSAGE...>|- [--new-turn]", "supervise [prompt] <DURABLE_ID|HOST_LINK> [POLICY]", "--connection desktop-cloud thread receipt <ATTEMPT_ID>"],
|
|
280
|
+
examples: ["codexteer --connection desktop-cloud environments list --json", "codexteer --connection desktop-cloud thread create --environment example-config '接続を確認してください' --json", "codexteer read 'codex://threads/aaaaaaaa-aaaa-4aaa-8aaa-000000000001?hostId=durable' --json"],
|
|
281
|
+
notes: ["Web側Cloudのtask ID・環境一覧とは別のサービスです。durable_付きIDまたはhostId=durable付きリンクで接続先を保持します。裸のUUIDからCloud宛先は推測しません。",
|
|
282
|
+
"初回・継続送信は選択済み環境と遅延起動指定を保持します。既存のCLIログインをメモリ内で認証に利用し、Desktopの起動・UI操作は不要です。",
|
|
283
|
+
"環境とDesktopプロジェクト所属は別です。projects listはDesktopの正規プロジェクト一覧、environments listはCloud環境構成です。doctor --thread --projectは登録済み所属と登録APIの可否を区別します。新規割当Cloud環境の--project作成は現在も事前拒否し、所属未指定を成功扱いしません。",
|
|
284
|
+
"thread assignは公式の署名付き所属APIを使い、対象の実環境・nonce・署名・プロジェクトを照合し、保存結果まで確認します。そのDesktopの実行環境を使うチャットだけが対象です。通常のCloud実行環境で事前照合が拒否された場合、環境IDの差替えやローカル実行先の追加は行いません。受付不明はthread receiptで確認し、自動再送しません。",
|
|
285
|
+
"共通の監督登録・pause/resume/stop・指摘・履歴・カーソル監視を使います。履歴は上限付きで全ターンページを取得します。履歴量によって遅くなる場合があります。",
|
|
286
|
+
"受付不明は保存して同じチャットへの次の送信を拒否します。サーバーがclientIdを記録しない場合、既知の受付ターンと本文の照合だけが可能です。履歴に見えないことは未送信の証明ではありません。",
|
|
287
|
+
"承認の往復・差分専用API・通常のCloud実行環境へのプロジェクト登録は未検証または未対応です。help cloudとdocs/desktop-cloud.mdを参照してください。"],
|
|
288
|
+
},
|
|
289
|
+
environments: { title: "Cloud environments", summary: "Desktop Cloudの実行環境構成を一覧します。", usage: ["--connection desktop-cloud environments list"], examples: [], notes: ["Desktopプロジェクト一覧とは別です。help desktop-cloudを参照してください。"] },
|
|
290
|
+
cloud: {
|
|
291
|
+
title: "共通の操作体系でCodex Cloudを使う",
|
|
292
|
+
when: "Cloudの環境・タスクを選び、既存と同じ監督・観測・介入・指摘管理を使うとき。",
|
|
293
|
+
usage: ["--connection cloud projects list", "--connection cloud threads list [--limit N] [--cursor CURSOR] [--env ENV_ID]", "--connection cloud thread create --project ENV_ID_OR_NAME [--branch BRANCH] [--dry-run] <MESSAGE...>|-", "supervise <CLOUD_TASK_ID|URL> [POLICY] [--agent claude|codex] [--use-path-cli] [-- <AGENT_ARGS...>]", "read <CLOUD_TASK_ID|URL> [--since CURSOR] [--include-output]", "watch <CLOUD_TASK_ID|URL> [--stream --notify digest|all] [--since CURSOR]", "send <CLOUD_TASK_ID|URL> <MESSAGE...>|- [--new-turn] [--based-on CURSOR] [--finding ID]", "supervise status|pause|resume|stop <CLOUD_TASK_ID|URL>", "history list|show|check|mark <CLOUD_TASK_ID|URL> ...", "instructions list|retract <CLOUD_TASK_ID|URL> ...", "findings create|list|show|resolve|dismiss|reopen|evaluate|stats <CLOUD_TASK_ID|URL> ...", "--connection cloud thread receipt <ATTEMPT_ID>", "history show|check <CLOUD_TASK_ID|URL> --attempt <ATTEMPT_ID>", "diff <CLOUD_TASK_ID|URL> [--attempt N]"],
|
|
294
|
+
returns: "共通のthread_id・status・events・cursor・has_more・配送履歴・監督状態。Cloudの実IDを保持し、Desktopへ接続しません。",
|
|
295
|
+
examples: ["codexteer --connection cloud projects list --json", "codexteer --connection cloud thread create --project env_example --branch main 'テストを追加してください' --json", "codexteer supervise task_example --agent claude", "codexteer read task_example --include-output --json", "codexteer supervise pause task_example --json", "codexteer history check task_example <MESSAGE_ID> --json"],
|
|
296
|
+
notes: ["Cloud ID/公式リンクから接続先を自動判定します。宛先未指定の一覧・作成は--connection cloudを使います。--host/--remote-transport/--context-threadやDesktop UIへの自動フォールバックは拒否します。",
|
|
297
|
+
"公式CLI 0.157.1+とChatGPTログインが必要です。認証は公式App Serverからメモリ内で取得し、認証ファイルの直接解析・トークンの保存/表示は行いません。",
|
|
298
|
+
"通常sendは実行中の親ターンを指定し、中断して同じタスクの後続ターンを開始します。停止中の再開はユーザーが許可した場合だけ--new-turnを使います。親IDとユーザー入力の鮮度を再確認しますが、サーバー側の原子的な固定は保証しません。",
|
|
299
|
+
"監督登録・pause/resume/stop・指摘の重複介入防止・history check・指示の置換/撤回は共通です。全監督コマンドに生成された--supervisorと--connection cloudを保持します。pauseは送信を、stopは観測と送信を拒否し、Cloud作業自体は取り消しません。",
|
|
300
|
+
"共通watch --streamは終了まで動き、既存Monitorのdigest・接続通知・復帰待ちを使います。単発watchは既定30秒、Cloud照会の既定間隔は5000msです。応答は16 MiBで上限超過を切り詰めず拒否します。",
|
|
301
|
+
"共通sendはローカルと同じ私有ジャーナルに本文を保存します。受付・保存・要求達成は別です。unknown/not_observedから自動再送せず、未解決のCloud配送は先に照合します。",
|
|
302
|
+
"checkpoint/resourceは明示したローカル入力・成果物・コマンドを扱い、Cloudファイルがマウントされたとは仮定しません。Cloud作成の未確認のモデル・タイトル・ローカル権限上書きは無視せず拒否します。",
|
|
303
|
+
"作成結果はthread receipt、配送試行はhistory show/check --attemptで確認・照合します。照合は再送せず、対象タスクと監督状態を確認します。記録済み差分がない場合はdiff_available:falseであり、変更ゼロの証明ではありません。docs/cloud.mdを参照してください。"],
|
|
304
|
+
},
|
|
176
305
|
};
|
|
177
306
|
|
|
178
307
|
export function helpData(topic = "overview") {
|
|
179
308
|
const data = topics[topic];
|
|
180
309
|
if (!data) throw new Error(`Unknown help topic: ${topic}. Run codexteer help.`);
|
|
181
|
-
return { version: VERSION, topic, ...data, ...(topic === "overview" ? { usage: [...data.usage, "history list|show|check|mark <THREAD> ...", "instructions list|retract <THREAD> ...", "checkpoint capture|run|attach|verify|list|show <THREAD> ...", "resource acquire|status|list|renew|release|run ...", "findings create|list|show|resolve|dismiss|reopen|evaluate|stats <THREAD> ...", "--connection shared|desktop <COMMAND> ..."] } : {}) };
|
|
310
|
+
return { version: VERSION, topic, ...data, ...(topic === "overview" ? { usage: [...data.usage, "history list|show|check|mark <THREAD> ...", "instructions list|retract <THREAD> ...", "checkpoint capture|run|attach|verify|list|show <THREAD> ...", "resource acquire|status|list|renew|release|run ...", "findings create|list|show|resolve|dismiss|reopen|evaluate|stats <THREAD> ...", "--connection shared|desktop|cloud|desktop-cloud <COMMAND> ..."] } : {}) };
|
|
182
311
|
}
|
|
183
312
|
|
|
184
313
|
export function renderHelp(data) {
|
package/src/journal.mjs
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isDesktopCloudTask } from "./desktop-cloud-id.mjs";
|
|
2
|
+
import { confirmDesktopCloudDelivery } from "./desktop-cloud.mjs";
|
|
3
|
+
import { desktopCloudConnection } from "./desktop-cloud-api.mjs";
|
|
4
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
5
|
import { sendAppServerMessage } from "./app-server.mjs";
|
|
3
|
-
import {
|
|
6
|
+
import { normalizeTaskId, isCloudTask } from "./task-id.mjs";
|
|
7
|
+
import { reconcileCloudSend } from "./cloud-observe.mjs";
|
|
4
8
|
import { digest, fetchThread } from "./observe.mjs";
|
|
5
9
|
import { readRecord, writeRecord, listRecords, withStoreLock } from "./store.mjs";
|
|
6
10
|
import { discoverRuntime } from "./runtime.mjs";
|
|
@@ -10,7 +14,7 @@ import { prepareDirective } from "./directive.mjs";
|
|
|
10
14
|
import { assertSupervisor, withSupervisedSend } from "./supervision.mjs";
|
|
11
15
|
|
|
12
16
|
export async function getMessage(threadInput, id, options = {}) {
|
|
13
|
-
const threadId =
|
|
17
|
+
const threadId = normalizeTaskId(threadInput);
|
|
14
18
|
const entry = await readRecord("messages", id, options);
|
|
15
19
|
if (!entry || entry.thread_id !== threadId || entry.id !== id || entry.schema !== 1) throw new Error("Message record not found for this task.");
|
|
16
20
|
return entry;
|
|
@@ -22,7 +26,7 @@ export function messageSummary(entry, includeText = false) {
|
|
|
22
26
|
}
|
|
23
27
|
|
|
24
28
|
export async function listMessages(threadInput, { includeText = false, pending = false, ...options } = {}) {
|
|
25
|
-
const threadId =
|
|
29
|
+
const threadId = normalizeTaskId(threadInput);
|
|
26
30
|
return (await listRecords("messages", options)).filter(e => e?.thread_id === threadId && (!pending || !["applied", "dismissed"].includes(e.response?.status)))
|
|
27
31
|
.sort((a, b) => a.created_at.localeCompare(b.created_at)).map(e => messageSummary(e, includeText));
|
|
28
32
|
}
|
|
@@ -39,7 +43,7 @@ export function instructionStates(entries, now = Date.now()) {
|
|
|
39
43
|
}
|
|
40
44
|
|
|
41
45
|
export async function listInstructions(threadInput, { all = false, ...options } = {}) {
|
|
42
|
-
const threadId =
|
|
46
|
+
const threadId = normalizeTaskId(threadInput), entries = instructionStates(await listMessages(threadId, { ...options, includeText: true }));
|
|
43
47
|
return { thread_id: threadId, instructions: entries.filter(e => all || e.instruction_status === "active"), pending_changes: entries.filter(e => e.instruction_status === "pending_delivery") };
|
|
44
48
|
}
|
|
45
49
|
|
|
@@ -53,7 +57,7 @@ async function validateReplacement(threadId, options, storage) {
|
|
|
53
57
|
}
|
|
54
58
|
|
|
55
59
|
export async function sendTrackedMessage(threadInput, body, options = {}, { send = sendAppServerMessage, ...storage } = {}) {
|
|
56
|
-
const threadId =
|
|
60
|
+
const threadId = normalizeTaskId(threadInput);
|
|
57
61
|
if (options.supervisor && !options.basedOn) throw Object.assign(new Error("Supervised sends require --based-on from a completed read."), { code: "SUPERVISOR_OBSERVATION_REQUIRED" });
|
|
58
62
|
if (options.supervisor && !options.finding && !options.retracts) throw Object.assign(new Error("Supervised sends require --finding so pending interventions can be tracked and deduplicated."), { code: "SUPERVISOR_FINDING_REQUIRED" });
|
|
59
63
|
if (options.dryRun) {
|
|
@@ -80,6 +84,7 @@ export async function sendTrackedMessage(threadInput, body, options = {}, { send
|
|
|
80
84
|
return { ...receipt, message_id: id };
|
|
81
85
|
} catch (error) {
|
|
82
86
|
entry = { ...entry, sent: Object.hasOwn(error, "sent") ? error.sent : error.uncertain ? null : false, delivery_status: error.delivery_status ?? (error.uncertain ? "unknown" : "not_sent"), attempt_state: "finished", updated_at: new Date().toISOString(), error_code: error.code ?? "NOT_SENT" };
|
|
87
|
+
if (isCloudTask(threadId)) Object.assign(entry, { cloud_attempt_id: error.cloud_attempt_id, cloud_parent_turn_id: error.cloud_parent_turn_id, existing_attempt_id: error.existing_attempt_id, existing_receipt_path: error.existing_receipt_path });
|
|
83
88
|
try { await writeRecord("messages", id, entry, storage); } catch { error.journal_update_required = true; }
|
|
84
89
|
error.client_message_id = id; error.message_id = id;
|
|
85
90
|
error.delivery_status = entry.delivery_status; error.sent = entry.sent;
|
|
@@ -89,7 +94,29 @@ export async function sendTrackedMessage(threadInput, body, options = {}, { send
|
|
|
89
94
|
}
|
|
90
95
|
|
|
91
96
|
export async function reconcileMessages(threadInput, id, options = {}, { discover = discoverRuntime, connect = RpcClient.connect } = {}) {
|
|
92
|
-
const threadId =
|
|
97
|
+
const threadId = normalizeTaskId(threadInput);
|
|
98
|
+
if (isCloudTask(threadId)) {
|
|
99
|
+
const entries = id ? [await getMessage(threadId, id, options)] : await listMessages(threadId, { ...options, includeText: true });
|
|
100
|
+
const result = [];
|
|
101
|
+
for (const entry of entries) {
|
|
102
|
+
const receipt = entry.cloud_attempt_id && entry.delivery_status !== "not_sent" ? await reconcileCloudSend(entry.cloud_attempt_id, {
|
|
103
|
+
taskId: threadId, expectedPromptSha256: createHash("sha256").update(entry.wire_text).digest("hex"), expectedParentTurnId: entry.cloud_parent_turn_id,
|
|
104
|
+
}) : null;
|
|
105
|
+
const verification = { status: receipt?.delivery_verification === "stored" ? "stored" : receipt?.delivery_verification === "conflict" ? "conflict" : "not_observed", checked_at: new Date().toISOString(),
|
|
106
|
+
matching_items: receipt?.delivery_verification === "stored" ? 1 : 0, turn_id: receipt?.user_turn_id ?? null, basis: "cloud-parent-and-prompt-digest" };
|
|
107
|
+
result.push(await withStoreLock(`message-${threadId}`, async () => {
|
|
108
|
+
const current = await getMessage(threadId, entry.id, options);
|
|
109
|
+
const updated = { ...current, verification, updated_at: verification.checked_at, ...(verification.status === "stored" ? { delivery_status: "accepted", sent: true, turn_id: verification.turn_id } : {}) };
|
|
110
|
+
await writeRecord("messages", entry.id, updated, options); return messageSummary(updated, options.includeText);
|
|
111
|
+
}, options));
|
|
112
|
+
}
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
if (isDesktopCloudTask(threadId)) {
|
|
116
|
+
const cloud = desktopCloudConnection();
|
|
117
|
+
if (discover === discoverRuntime) discover = cloud.discover;
|
|
118
|
+
if (connect === RpcClient.connect) connect = cloud.connect;
|
|
119
|
+
}
|
|
93
120
|
// Validate the local target before connecting.
|
|
94
121
|
if (id) await getMessage(threadId, id, options);
|
|
95
122
|
const { paths, state } = await discover();
|
|
@@ -102,10 +129,11 @@ export async function reconcileMessages(threadInput, id, options = {}, { discove
|
|
|
102
129
|
const items = thread.turns.flatMap(t => t.items.map(i => ({ ...i, turn_id: t.id })));
|
|
103
130
|
const result = [];
|
|
104
131
|
for (const entry of entries) {
|
|
105
|
-
const matches = items.filter(i => i.type === "userMessage" && i.clientId === entry.client_message_id);
|
|
132
|
+
const matches = items.filter(i => i.type === "userMessage" && (i.clientId === entry.client_message_id || (isDesktopCloudTask(threadId) && entry.delivery_status === "accepted" && entry.turn_id && i.turn_id === entry.turn_id && digest(i.content.filter(c => c.type === "text").map(c => c.text).join("\n")) === entry.message_sha256)));
|
|
106
133
|
const matchingText = matches.length === 1 && digest(matches[0].content.filter(c => c.type === "text").map(c => c.text).join("\n")) === entry.message_sha256;
|
|
107
134
|
const verification = { status: matchingText ? "stored" : matches.length ? "conflict" : "not_observed", checked_at: new Date().toISOString(), matching_items: matches.length };
|
|
108
135
|
if (matchingText) Object.assign(verification, { item_id: matches[0].id, turn_id: matches[0].turn_id });
|
|
136
|
+
if (isDesktopCloudTask(threadId) && verification.status === "stored" && entry.delivery_status !== "not_sent") await confirmDesktopCloudDelivery(entry, verification, options);
|
|
109
137
|
const updated = { ...entry, verification, updated_at: verification.checked_at, ...(matchingText ? { delivery_status: "accepted", sent: true, turn_id: matches[0].turn_id } : {}) };
|
|
110
138
|
await writeRecord("messages", entry.id, updated, options);
|
|
111
139
|
result.push(messageSummary(updated, options.includeText));
|
|
@@ -116,7 +144,7 @@ export async function reconcileMessages(threadInput, id, options = {}, { discove
|
|
|
116
144
|
}
|
|
117
145
|
|
|
118
146
|
export async function markMessage(threadInput, id, { status, note, evidence = [], by = "local", ...options }) {
|
|
119
|
-
const threadId =
|
|
147
|
+
const threadId = normalizeTaskId(threadInput);
|
|
120
148
|
if (!["acknowledged", "applied", "dismissed"].includes(status) || !note?.trim() || !by?.trim()) throw new Error("mark requires --status acknowledged|applied|dismissed and a non-empty --note.");
|
|
121
149
|
if (status === "applied" && !evidence.length) throw new Error("applied requires --evidence (a test result, diff or artifact reference).");
|
|
122
150
|
return withStoreLock(`message-${threadId}`, async () => {
|
package/src/launcher.mjs
CHANGED
|
@@ -38,6 +38,7 @@ export async function appServerDoctor({ threadId: threadInput, versions = instal
|
|
|
38
38
|
let wrapperNodeVersion = null;
|
|
39
39
|
let connectionStatus = "unavailable", failure = null, method = null;
|
|
40
40
|
let steerCompatibility = versionCompatibility();
|
|
41
|
+
let remoteControlAuth;
|
|
41
42
|
let runtimeState, runtimePaths;
|
|
42
43
|
try {
|
|
43
44
|
const { paths, state } = await discover();
|
|
@@ -53,12 +54,14 @@ export async function appServerDoctor({ threadId: threadInput, versions = instal
|
|
|
53
54
|
client = compatibleClient(await connect(paths.socket), state);
|
|
54
55
|
connectionStatus = "connected";
|
|
55
56
|
compatibility.api_checks.initialize = "verified";
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
if (!state.remote_host_id) {
|
|
58
|
+
method = "thread/loaded/list";
|
|
59
|
+
const loaded = await client.request(method);
|
|
60
|
+
if (!Array.isArray(loaded?.data) || !loaded.data.every(id => typeof id === "string")) {
|
|
61
|
+
throw Object.assign(new Error("App Server returned an invalid loaded-task list."), { code: "PROTOCOL_ERROR" });
|
|
62
|
+
}
|
|
63
|
+
compatibility.api_checks[method] = "verified";
|
|
60
64
|
}
|
|
61
|
-
compatibility.api_checks[method] = "verified";
|
|
62
65
|
checks.initialized = true;
|
|
63
66
|
method = null;
|
|
64
67
|
if (!state.native_observation_only && !checks.bundled_wrapper_node) throw Object.assign(new Error("The running wrapper does not confirm Desktop's bundled Node runtime. App tools may fail code-signing authorization. Finish current tasks, quit Desktop, then run: codexteer desktop start"), { code: "WRAPPER_NODE_UNVERIFIED" });
|
|
@@ -71,9 +74,10 @@ export async function appServerDoctor({ threadId: threadInput, versions = instal
|
|
|
71
74
|
}
|
|
72
75
|
} catch (error) {
|
|
73
76
|
remediation = error.message;
|
|
74
|
-
|
|
77
|
+
remoteControlAuth = error.remote_control_auth;
|
|
78
|
+
failure = { code: error.code ?? "DIAGNOSTIC_FAILED", rpc_code: error.rpcCode ?? null, method: remoteControlAuth ? "remote-control-auth" : method, ...(error.capability ? { capability: error.capability } : {}) };
|
|
75
79
|
const unavailable = ["CONNECTION_FAILED", "TIMEOUT", "RUNTIME_UNAVAILABLE", "RUNTIME_NOT_READY"].includes(error.code);
|
|
76
|
-
if (method && !unavailable) {
|
|
80
|
+
if (method && !unavailable && !remoteControlAuth) {
|
|
77
81
|
if (["CAPABILITY_UNVERIFIED", "RUNTIME_PROTOCOL_UNVERIFIED"].includes(error.code)) {
|
|
78
82
|
// The client stopped before calling the runtime, so there is no API result to classify.
|
|
79
83
|
compatibility.status = "unverified";
|
|
@@ -90,7 +94,9 @@ export async function appServerDoctor({ threadId: threadInput, versions = instal
|
|
|
90
94
|
unsupportedMethods: apiChecks.filter(([, status]) => status === "unsupported").map(([name]) => name),
|
|
91
95
|
});
|
|
92
96
|
let desktopSubscription = { status: "unverified" };
|
|
93
|
-
if (
|
|
97
|
+
if (runtimeState?.remote_transport === "paired") {
|
|
98
|
+
desktopSubscription = { status: "unverified", source: "desktop-native-navigation", caller_required: true, opens_remote_chat: true };
|
|
99
|
+
} else if (runtimePaths && contracts.operations.send_new_turn.status === "supported") {
|
|
94
100
|
try { await inspectControl(runtimePaths); desktopSubscription = { status: "available" }; }
|
|
95
101
|
catch (error) {
|
|
96
102
|
desktopSubscription = { status: error.code === "DESKTOP_SUBSCRIPTION_UNAVAILABLE" ? "unavailable" : "failed", code: error.code ?? "DIAGNOSTIC_FAILED" };
|
|
@@ -103,7 +109,8 @@ export async function appServerDoctor({ threadId: threadInput, versions = instal
|
|
|
103
109
|
codex_steer_compatibility: steerCompatibility,
|
|
104
110
|
runtime_compatibility: contracts, desktop_subscription: desktopSubscription,
|
|
105
111
|
cli_version_status: !serverVersion || !versions.cli_version ? "unverified" : serverVersion === versions.cli_version ? "matched" : "mismatch",
|
|
106
|
-
connection: { status: connectionStatus, mode: runtimeState?.native_observation_only ? "desktop" : "shared", observation_only: !!runtimeState?.native_observation_only }, compatibility, failure, checks, remediation
|
|
112
|
+
connection: { status: connectionStatus, mode: runtimeState?.native_observation_only ? "desktop" : "shared", observation_only: !!runtimeState?.native_observation_only }, compatibility, failure, checks, remediation,
|
|
113
|
+
...(remoteControlAuth ? { remote_control_auth: remoteControlAuth } : {}) };
|
|
107
114
|
}
|
|
108
115
|
|
|
109
116
|
export function desktopLaunchArgs(home, wrapper) {
|