diff --git a/codex/SKILL.md b/codex/SKILL.md index 9628d1513..b71d1ed40 100644 --- a/codex/SKILL.md +++ b/codex/SKILL.md @@ -1235,7 +1235,7 @@ If no project-scoped match, fall back to `ls -t "$PLAN_ROOT"/*.md 2>/dev/null | but warn: "Note: this plan may be from a different project — verify before sending to Codex." **IMPORTANT — embed content, don't reference path:** Codex runs sandboxed to the repo -root (`-C`) and cannot access `~/.claude/plans/` or any files outside the repo. You MUST +root and cannot access `~/.claude/plans/` or any files outside the repo. You MUST read the plan file yourself and embed its FULL CONTENT in the prompt below. Do NOT tell Codex the file path or ask it to read the plan file — it will waste 10+ tool calls searching and fail. @@ -1324,8 +1324,9 @@ if [ -z "$PYTHON_CMD" ]; then echo "ERROR: Python 3 is required to parse Codex JSON output. Install python3 or python and retry." >&2 exit 1 fi +cd "$_REPO_ROOT" || exit 1 # Fix 1: wrap with timeout (gtimeout/timeout fallback chain via probe helper) -_gstack_codex_timeout_wrapper 600 codex exec resume "" -C "$_REPO_ROOT" -s read-only -c 'model_reasoning_effort="medium"' --enable web_search_cached --json < /dev/null 2>"$TMPERR" | PYTHONUNBUFFERED=1 "$PYTHON_CMD" -u -c " +_gstack_codex_timeout_wrapper 600 codex exec resume "" -c 'sandbox_mode="read-only"' -c 'model_reasoning_effort="medium"' --enable web_search_cached --json < /dev/null 2>"$TMPERR" | PYTHONUNBUFFERED=1 "$PYTHON_CMD" -u -c " " # Fix 1: same hang detection pattern as new-session block diff --git a/codex/SKILL.md.tmpl b/codex/SKILL.md.tmpl index 53d4aa756..90dd1119c 100644 --- a/codex/SKILL.md.tmpl +++ b/codex/SKILL.md.tmpl @@ -398,7 +398,7 @@ If no project-scoped match, fall back to `ls -t "$PLAN_ROOT"/*.md 2>/dev/null | but warn: "Note: this plan may be from a different project — verify before sending to Codex." **IMPORTANT — embed content, don't reference path:** Codex runs sandboxed to the repo -root (`-C`) and cannot access `~/.claude/plans/` or any files outside the repo. You MUST +root and cannot access `~/.claude/plans/` or any files outside the repo. You MUST read the plan file yourself and embed its FULL CONTENT in the prompt below. Do NOT tell Codex the file path or ask it to read the plan file — it will waste 10+ tool calls searching and fail. @@ -487,8 +487,9 @@ if [ -z "$PYTHON_CMD" ]; then echo "ERROR: Python 3 is required to parse Codex JSON output. Install python3 or python and retry." >&2 exit 1 fi +cd "$_REPO_ROOT" || exit 1 # Fix 1: wrap with timeout (gtimeout/timeout fallback chain via probe helper) -_gstack_codex_timeout_wrapper 600 codex exec resume "" -C "$_REPO_ROOT" -s read-only -c 'model_reasoning_effort="medium"' --enable web_search_cached --json < /dev/null 2>"$TMPERR" | PYTHONUNBUFFERED=1 "$PYTHON_CMD" -u -c " +_gstack_codex_timeout_wrapper 600 codex exec resume "" -c 'sandbox_mode="read-only"' -c 'model_reasoning_effort="medium"' --enable web_search_cached --json < /dev/null 2>"$TMPERR" | PYTHONUNBUFFERED=1 "$PYTHON_CMD" -u -c " " # Fix 1: same hang detection pattern as new-session block diff --git a/test/skill-validation.test.ts b/test/skill-validation.test.ts index 701cf8fd4..53c7c33aa 100644 --- a/test/skill-validation.test.ts +++ b/test/skill-validation.test.ts @@ -1297,6 +1297,16 @@ describe('Codex skill', () => { expect(content).toContain('codex exec resume'); }); + test('codex/SKILL.md resume command only uses resume-supported flags', () => { + const content = fs.readFileSync(path.join(ROOT, 'codex', 'SKILL.md'), 'utf-8'); + const match = content.match(/codex exec resume[^\n]+/); + expect(match).not.toBeNull(); + const resumeCommand = match![0]; + expect(resumeCommand).not.toContain(' -C '); + expect(resumeCommand).not.toContain(' -s read-only'); + expect(resumeCommand).toContain("-c 'sandbox_mode=\"read-only\"'"); + }); + test('codex/SKILL.md contains cost tracking', () => { const content = fs.readFileSync(path.join(ROOT, 'codex', 'SKILL.md'), 'utf-8'); expect(content).toContain('tokens used');