Skip to content

Commit c1f858d

Browse files
committed
feat(cli): 对齐最新 Codex CLI 命令面——补 queue/delete/agents/migrate-rollouts 与 login 认证形态
依据官方 developer-commands 文档 + openai/codex main@818f1cca 源码逐项对账: - 新增 CodexCli/CodexClient 方法:queue(thread,message)、 delete(session)、deleteForce(uuid)、agents(args...)、 migrateRollouts(args...) - login 补齐全部认证形态:--with-api-key / --with-access-token (stdin 管道)、--device-auth、login status - CodexCliExecutor 新增 executeWithStdin(commons-exec 输入管道), 支撑 stdin 型认证命令;独立命名避免与 execute(String...) 歧义 - ExecOptions 新增 --ignore-rules / --ignore-user-config; GlobalOptions 新增 --remote / --remote-auth-token-env - 修复:sandbox(profile) 旗标旧拼写 --permissions-profile 改为 当前 CLI 的 --permission-profile(旧拼写会被新版 CLI 拒绝) - 废弃 mcpServer():上游已移除 codex mcp-server,指引改用 appServer() - 测试 222 个全绿(+16);双语 README 同步
1 parent e34e68d commit c1f858d

8 files changed

Lines changed: 474 additions & 8 deletions

File tree

‎README.md‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,16 @@ Typical scenarios:
7676
| Interactive sessions | Active development | `startSession()`, `startSession(prompt)`, `startSession(GlobalOptions, prompt)` |
7777
| Session lifecycle | Active development | `resumeSession`, `resumeLastSession`, `forkSession`, `forkLastSession`, `archiveSession`, `unarchiveSession`, `execResume` |
7878
| Doctor & review | Active development | `doctor`, `doctorJson`, `doctorSummary`, `review`, `reviewCommit`, `reviewBase` |
79-
| Auth / MCP / misc | Active development | `login`, `logout`, `mcpList` / `mcpAdd` / `mcpGet` / `mcpRemove`, `update`, `features`, `completion`, `app` |
79+
| Auth / MCP / misc | Active development | `login`, `loginWithApiKey`, `loginWithAccessToken`, `loginDeviceAuth`, `loginStatus`, `logout`, `mcpList` / `mcpAdd` / `mcpGet` / `mcpRemove` / `mcpLogin` / `mcpLogout`, `update`, `features`, `completion`, `app` |
80+
| Session admin | Active development | `archiveSession`, `unarchiveSession`, `queue`, `deleteSession`, `deleteSessionForce`, `agents`, `migrateRollouts` |
8081
| App-server WebSocket route | Active development | `CodexAppServerClient.runTurn` / `runTurnAsync`, `thread/start` / `thread/resume`, agent-message deltas, `sessionKey → threadId` LRU (1000) |
8182
| Config model | Active development | `CodexClientConfig` POJO (plain, Spring-bindable), `CodexAppServerConfig` POJO |
8283

84+
> **Note**: `codex mcp-server` was removed upstream — `CodexClient.mcpServer()`
85+
> is deprecated in favour of `appServer(...)`. `ExecOptions` additionally
86+
> supports `--ignore-rules` / `--ignore-user-config`, and `GlobalOptions`
87+
> supports `--remote` / `--remote-auth-token-env` for daemon-backed TUI runs.
88+
8389
> **Assumption**: the capability statuses above reflect the current state of
8490
> the active branch; the module is under active development.
8591

‎README.zh-CN.md‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,16 @@ SDK 覆盖:
7373
| 交互式会话 | 活跃开发 | `startSession()`、`startSession(prompt)`、`startSession(GlobalOptions, prompt)` |
7474
| 会话生命周期 | 活跃开发 | `resumeSession`、`resumeLastSession`、`forkSession`、`forkLastSession`、`archiveSession`、`unarchiveSession`、`execResume` |
7575
| Doctor 与 review | 活跃开发 | `doctor`、`doctorJson`、`doctorSummary`、`review`、`reviewCommit`、`reviewBase` |
76-
| 认证 / MCP / 其他 | 活跃开发 | `login`、`logout`、`mcpList` / `mcpAdd` / `mcpGet` / `mcpRemove`、`update`、`features`、`completion`、`app` |
76+
| 认证 / MCP / 其他 | 活跃开发 | `login`、`loginWithApiKey`、`loginWithAccessToken`、`loginDeviceAuth`、`loginStatus`、`logout`、`mcpList` / `mcpAdd` / `mcpGet` / `mcpRemove` / `mcpLogin` / `mcpLogout`、`update`、`features`、`completion`、`app` |
77+
| 会话管理 | 活跃开发 | `archiveSession`、`unarchiveSession`、`queue`、`deleteSession`、`deleteSessionForce`、`agents`、`migrateRollouts` |
7778
| App-server WebSocket 路线 | 活跃开发 | `CodexAppServerClient.runTurn` / `runTurnAsync`、`thread/start` / `thread/resume`、agent 消息 delta、`sessionKey → threadId` LRU(1000) |
7879
| 配置模型 | 活跃开发 | `CodexClientConfig` POJO(纯对象,可绑定 Spring 配置)、`CodexAppServerConfig` POJO |
7980

81+
> **注意**:上游已移除 `codex mcp-server` 子命令——`CodexClient.mcpServer()`
82+
> 已标记废弃,请改用 `appServer(...)`。`ExecOptions` 额外支持
83+
> `--ignore-rules` / `--ignore-user-config`;`GlobalOptions` 支持
84+
> `--remote` / `--remote-auth-token-env`(连接远程 app-server 的 TUI 运行)。
85+
8086
> **假设**:以上能力状态反映当前活跃分支的情况;该模块处于活跃开发中。
8187
8288
## 3. 环境要求与兼容性

‎src/main/java/io/github/easy4j/codex/CodexClient.java‎

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,62 @@ public CodexCliResult apply(String taskId) {
572572
return cli.apply(taskId);
573573
}
574574

575+
// ============================================================
576+
// queue / delete / agents / migrate-rollouts
577+
// ============================================================
578+
579+
/**
580+
* Queues {@code message} for an existing session via
581+
* {@code codex queue --thread <thread> --message <message>}.
582+
*
583+
* @param thread the session UUID or exact session name.
584+
* @param message the message text to queue.
585+
* @return the raw CLI invocation result; never {@code null}.
586+
* @since 3.0.0
587+
*/
588+
public CodexCliResult queue(String thread, String message) { return cli.queue(thread, message); }
589+
590+
/**
591+
* Permanently deletes a saved session via {@code codex delete <session>}.
592+
* The CLI prompts for confirmation on a TTY; prefer
593+
* {@link #deleteSessionForce(String)} for non-interactive use.
594+
*
595+
* @param session the session UUID or session name.
596+
* @return the raw CLI invocation result; never {@code null}.
597+
* @since 3.0.0
598+
*/
599+
public CodexCliResult deleteSession(String session) { return cli.delete(session); }
600+
601+
/**
602+
* Permanently deletes a session without prompting via
603+
* {@code codex delete --force <session>}. Requires a session UUID.
604+
*
605+
* @param sessionUuid the session UUID.
606+
* @return the raw CLI invocation result; never {@code null}.
607+
* @since 3.0.0
608+
*/
609+
public CodexCliResult deleteSessionForce(String sessionUuid) { return cli.deleteForce(sessionUuid); }
610+
611+
/**
612+
* Browses agent sessions on the shared local app-server daemon via
613+
* {@code codex agents <args...>}.
614+
*
615+
* @param args optional extra arguments.
616+
* @return the raw CLI invocation result; never {@code null}.
617+
* @since 3.0.0
618+
*/
619+
public CodexCliResult agents(String... args) { return cli.agents(args); }
620+
621+
/**
622+
* Inspects or migrates legacy local sessions via
623+
* {@code codex migrate-rollouts <args...>}.
624+
*
625+
* @param args optional extra arguments.
626+
* @return the raw CLI invocation result; never {@code null}.
627+
* @since 3.0.0
628+
*/
629+
public CodexCliResult migrateRollouts(String... args) { return cli.migrateRollouts(args); }
630+
575631
// ============================================================
576632
// auth
577633
// ============================================================
@@ -583,6 +639,45 @@ public CodexCliResult apply(String taskId) {
583639
*/
584640
public CodexCliResult login() { return cli.login(); }
585641

642+
/**
643+
* Logs in headlessly with an API key via
644+
* {@code codex login --with-api-key} (key piped to stdin).
645+
*
646+
* @param apiKey the API key.
647+
* @return the raw CLI invocation result; never {@code null}.
648+
* @since 3.0.0
649+
*/
650+
public CodexCliResult loginWithApiKey(String apiKey) { return cli.loginWithApiKey(apiKey); }
651+
652+
/**
653+
* Logs in with an access token via
654+
* {@code codex login --with-access-token} (token piped to stdin).
655+
*
656+
* @param accessToken the access token.
657+
* @return the raw CLI invocation result; never {@code null}.
658+
* @since 3.0.0
659+
*/
660+
public CodexCliResult loginWithAccessToken(String accessToken) { return cli.loginWithAccessToken(accessToken); }
661+
662+
/**
663+
* Starts the OAuth device-code login flow via
664+
* {@code codex login --device-auth}; the verification URL and device code
665+
* are printed on stdout.
666+
*
667+
* @return the raw CLI invocation result; never {@code null}.
668+
* @since 3.0.0
669+
*/
670+
public CodexCliResult loginDeviceAuth() { return cli.loginDeviceAuth(); }
671+
672+
/**
673+
* Prints the current auth mode via {@code codex login status}; the CLI
674+
* exits {@code 0} when logged in.
675+
*
676+
* @return the raw CLI invocation result; never {@code null}.
677+
* @since 3.0.0
678+
*/
679+
public CodexCliResult loginStatus() { return cli.loginStatus(); }
680+
586681
/**
587682
* Runs {@code codex logout}.
588683
*
@@ -697,8 +792,14 @@ public CodexCliResult apply(String taskId) {
697792
/**
698793
* Runs {@code codex mcp-server}.
699794
*
795+
* <p><strong>Deprecated:</strong> the subcommand has been removed from
796+
* recent Codex CLI releases &mdash; use {@link #appServer(String...)}.
797+
* Kept for callers pinned to older CLI builds.</p>
798+
*
700799
* @return the raw CLI invocation result; never {@code null}.
800+
* @deprecated upstream removed {@code codex mcp-server}; use {@link #appServer(String...)}.
701801
*/
802+
@Deprecated
702803
public CodexCliResult mcpServer() { return cli.mcpServer(); }
703804

704805
/**
@@ -717,7 +818,7 @@ public CodexCliResult apply(String taskId) {
717818
public CodexCliResult sandbox(String... command) { return cli.sandbox(command); }
718819

719820
/**
720-
* Runs {@code codex sandbox --permissions-profile <profile> <command...>}.
821+
* Runs {@code codex sandbox --permission-profile <profile> <command...>}.
721822
*
722823
* @param profile the permissions profile name.
723824
* @param command the shell command to execute inside the sandbox.

0 commit comments

Comments
 (0)