mirror of
https://github.com/cexll/myclaude.git
synced 2026-02-11 03:23:50 +08:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9dc3e8f43d | ||
|
|
e9faa0bc2d | ||
|
|
70caa8d7fc | ||
|
|
4f74d5afa1 |
@@ -46,8 +46,8 @@ uv run ~/.claude/skills/codex/scripts/codex.py resume <session_id> "<task>" [mod
|
|||||||
### Parameters
|
### Parameters
|
||||||
|
|
||||||
- `task` (required): Task description, supports `@file` references
|
- `task` (required): Task description, supports `@file` references
|
||||||
- `model` (optional): Model to use (default: gpt-5-codex)
|
- `model` (optional): Model to use (default: gpt-5.1-codex)
|
||||||
- `gpt-5-codex`: Default, optimized for code
|
- `gpt-5.1-codex`: Default, optimized for code
|
||||||
- `gpt-5`: Fast general purpose
|
- `gpt-5`: Fast general purpose
|
||||||
- `working_dir` (optional): Working directory (default: current)
|
- `working_dir` (optional): Working directory (default: current)
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
# ///
|
# ///
|
||||||
"""
|
"""
|
||||||
Codex CLI wrapper with cross-platform support and session management.
|
Codex CLI wrapper with cross-platform support and session management.
|
||||||
|
**FIXED**: Auto-detect long inputs and use stdin mode to avoid shell argument issues.
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
New session: uv run codex.py "task" [model] [workdir]
|
New session: uv run codex.py "task" [model] [workdir]
|
||||||
@@ -18,10 +19,11 @@ import sys
|
|||||||
import os
|
import os
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
DEFAULT_MODEL = 'gpt-5-codex'
|
DEFAULT_MODEL = 'gpt-5.1-codex'
|
||||||
DEFAULT_WORKDIR = '.'
|
DEFAULT_WORKDIR = '.'
|
||||||
DEFAULT_TIMEOUT = 7200 # 2 hours in seconds
|
DEFAULT_TIMEOUT = 7200 # 2 hours in seconds
|
||||||
FORCE_KILL_DELAY = 5
|
FORCE_KILL_DELAY = 5
|
||||||
|
STDIN_THRESHOLD = 800 # Auto-switch to stdin for prompts longer than 800 chars
|
||||||
|
|
||||||
|
|
||||||
def log_error(message: str):
|
def log_error(message: str):
|
||||||
@@ -88,34 +90,64 @@ def parse_args():
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def build_codex_args(params: dict) -> list:
|
def build_codex_args(params: dict, use_stdin: bool) -> list:
|
||||||
"""构建 codex CLI 参数"""
|
"""
|
||||||
|
构建 codex CLI 参数
|
||||||
|
|
||||||
|
Args:
|
||||||
|
params: 参数字典
|
||||||
|
use_stdin: 是否使用 stdin 模式(不在命令行参数中传递 task)
|
||||||
|
"""
|
||||||
if params['mode'] == 'resume':
|
if params['mode'] == 'resume':
|
||||||
return [
|
if use_stdin:
|
||||||
'codex', 'e',
|
return [
|
||||||
'--skip-git-repo-check',
|
'codex', 'e',
|
||||||
'--json',
|
'--skip-git-repo-check',
|
||||||
'resume',
|
'--json',
|
||||||
params['session_id'],
|
'resume',
|
||||||
params['task']
|
params['session_id'],
|
||||||
]
|
'-' # 从 stdin 读取
|
||||||
|
]
|
||||||
|
else:
|
||||||
|
return [
|
||||||
|
'codex', 'e',
|
||||||
|
'--skip-git-repo-check',
|
||||||
|
'--json',
|
||||||
|
'resume',
|
||||||
|
params['session_id'],
|
||||||
|
params['task']
|
||||||
|
]
|
||||||
else:
|
else:
|
||||||
return [
|
base_args = [
|
||||||
'codex', 'e',
|
'codex', 'e',
|
||||||
'-m', params['model'],
|
'-m', params['model'],
|
||||||
'--dangerously-bypass-approvals-and-sandbox',
|
'--dangerously-bypass-approvals-and-sandbox',
|
||||||
'--skip-git-repo-check',
|
'--skip-git-repo-check',
|
||||||
'-C', params['workdir'],
|
'-C', params['workdir'],
|
||||||
'--json',
|
'--json'
|
||||||
params['task']
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if use_stdin:
|
||||||
|
base_args.append('-') # 从 stdin 读取
|
||||||
|
else:
|
||||||
|
base_args.append(params['task'])
|
||||||
|
|
||||||
|
return base_args
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
params = parse_args()
|
params = parse_args()
|
||||||
codex_args = build_codex_args(params)
|
|
||||||
timeout_sec = resolve_timeout()
|
timeout_sec = resolve_timeout()
|
||||||
|
|
||||||
|
# **FIX: Auto-detect long inputs and enable stdin mode**
|
||||||
|
task_length = len(params['task'])
|
||||||
|
use_stdin = task_length > STDIN_THRESHOLD
|
||||||
|
|
||||||
|
if use_stdin:
|
||||||
|
log_warn(f"Task length ({task_length} chars) exceeds threshold, using stdin mode to avoid shell escaping issues")
|
||||||
|
|
||||||
|
codex_args = build_codex_args(params, use_stdin)
|
||||||
|
|
||||||
thread_id: Optional[str] = None
|
thread_id: Optional[str] = None
|
||||||
last_agent_message: Optional[str] = None
|
last_agent_message: Optional[str] = None
|
||||||
|
|
||||||
@@ -123,12 +155,18 @@ def main():
|
|||||||
# 启动 codex 子进程
|
# 启动 codex 子进程
|
||||||
process = subprocess.Popen(
|
process = subprocess.Popen(
|
||||||
codex_args,
|
codex_args,
|
||||||
|
stdin=subprocess.PIPE if use_stdin else None, # **FIX: Enable stdin**
|
||||||
stdout=subprocess.PIPE,
|
stdout=subprocess.PIPE,
|
||||||
stderr=sys.stderr, # 错误直接透传到 stderr
|
stderr=sys.stderr, # 错误直接透传到 stderr
|
||||||
text=True,
|
text=True,
|
||||||
bufsize=1 # 行缓冲
|
bufsize=1 # 行缓冲
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# **FIX: 如果使用 stdin 模式,写入任务到 stdin**
|
||||||
|
if use_stdin:
|
||||||
|
process.stdin.write(params['task'])
|
||||||
|
process.stdin.close()
|
||||||
|
|
||||||
# 逐行解析 JSON 输出
|
# 逐行解析 JSON 输出
|
||||||
for line in process.stdout:
|
for line in process.stdout:
|
||||||
line = line.strip()
|
line = line.strip()
|
||||||
@@ -155,24 +193,22 @@ def main():
|
|||||||
# 等待进程结束
|
# 等待进程结束
|
||||||
returncode = process.wait(timeout=timeout_sec)
|
returncode = process.wait(timeout=timeout_sec)
|
||||||
|
|
||||||
# 优先检查是否有有效输出,而非退出码
|
if returncode == 0:
|
||||||
if last_agent_message:
|
if last_agent_message:
|
||||||
# 输出 agent_message
|
# 输出 agent_message
|
||||||
sys.stdout.write(f"{last_agent_message}\n")
|
sys.stdout.write(f"{last_agent_message}\n")
|
||||||
|
|
||||||
# 输出 session_id(如果存在)
|
# 输出 session_id(如果存在)
|
||||||
if thread_id:
|
if thread_id:
|
||||||
sys.stdout.write(f"\n---\nSESSION_ID: {thread_id}\n")
|
sys.stdout.write(f"\n---\nSESSION_ID: {thread_id}\n")
|
||||||
|
|
||||||
# 有输出但退出码非零,输出警告而非失败
|
sys.exit(0)
|
||||||
if returncode != 0:
|
else:
|
||||||
log_warn(f'Codex completed with non-zero status {returncode} but produced valid output')
|
log_error('Codex completed without agent_message output')
|
||||||
|
sys.exit(1)
|
||||||
sys.exit(0)
|
|
||||||
else:
|
else:
|
||||||
# 没有输出才算真正失败
|
log_error(f'Codex exited with status {returncode}')
|
||||||
log_error(f'Codex exited with status {returncode} without agent_message output')
|
sys.exit(returncode)
|
||||||
sys.exit(returncode if returncode != 0 else 1)
|
|
||||||
|
|
||||||
except subprocess.TimeoutExpired:
|
except subprocess.TimeoutExpired:
|
||||||
log_error('Codex execution timeout')
|
log_error('Codex execution timeout')
|
||||||
|
|||||||
Reference in New Issue
Block a user