Skip to content

Commit 3b3ebb0

Browse files
Rubiczhangclaude
andcommitted
refactor: simplify WORKTREE_ROOT_SAFE guard and remove unused local in loop marker
- loop-codex-stop-hook.sh: merge the two separate `if [[ -n "$WORKTREE_ROOT_SAFE" ]]` blocks into one outer guard with labeled normalize-then-validate stages; the inner guard before validation is retained since normalization can empty the value - scripts/codex-worker.sh: remove unused `loop_dir` local variable from find_active_loop_for_marker() and use LOOP_DIR_ENV directly; no behavior change No functional changes; all 1445 tests pass. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> (cherry picked from commit 07d67bf)
1 parent 8781e4d commit 3b3ebb0

2 files changed

Lines changed: 60 additions & 5 deletions

File tree

hooks/loop-codex-stop-hook.sh

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,64 @@ CODEX_REVIEW_EFFORT="high"
122122
CODEX_TIMEOUT="${STATE_CODEX_TIMEOUT:-${CODEX_TIMEOUT:-$DEFAULT_CODEX_TIMEOUT}}"
123123
ASK_CODEX_QUESTION="${STATE_ASK_CODEX_QUESTION:-false}"
124124
AGENT_TEAMS="${STATE_AGENT_TEAMS:-false}"
125-
125+
WORKTREE_TEAMS="${STATE_WORKTREE_TEAMS:-false}"
126+
WORKTREE_ROOT="${STATE_WORKTREE_ROOT:-}"
127+
WORKTREE_ROOT_SAFE="$WORKTREE_ROOT"
128+
if [[ -n "$WORKTREE_ROOT_SAFE" ]]; then
129+
# Normalize: strip leading ./, collapse duplicate slashes, strip trailing slash
130+
while [[ "$WORKTREE_ROOT_SAFE" == ./* ]]; do
131+
WORKTREE_ROOT_SAFE="${WORKTREE_ROOT_SAFE#./}"
132+
done
133+
while [[ "$WORKTREE_ROOT_SAFE" == *"//"* ]]; do
134+
WORKTREE_ROOT_SAFE="${WORKTREE_ROOT_SAFE//\/\//\/}"
135+
done
136+
WORKTREE_ROOT_SAFE="${WORKTREE_ROOT_SAFE%/}"
137+
# Validate: reject unsafe paths (normalization may have emptied the value)
138+
if [[ -n "$WORKTREE_ROOT_SAFE" ]]; then
139+
if [[ ! "$WORKTREE_ROOT_SAFE" =~ ^[a-zA-Z0-9._/-]+$ ]] || \
140+
[[ "$WORKTREE_ROOT_SAFE" = /* ]] || \
141+
[[ "$WORKTREE_ROOT_SAFE" =~ (^|/)\.\.(/|$) ]] || \
142+
[[ "$WORKTREE_ROOT_SAFE" == "." ]] || \
143+
[[ "$WORKTREE_ROOT_SAFE" == ".git" ]] || \
144+
[[ "$WORKTREE_ROOT_SAFE" == .git/* ]]; then
145+
# Ignore malformed/unsafe state values rather than injecting untrusted content into prompts
146+
WORKTREE_ROOT_SAFE=""
147+
fi
148+
fi
149+
fi
150+
DELEGATION_ENFORCEMENT="${STATE_DELEGATION_ENFORCEMENT:-warn}"
151+
BITLESSON_REQUIRED="false"
152+
if [[ -n "$RAW_BITLESSON_REQUIRED" ]]; then
153+
BITLESSON_REQUIRED=$(echo "$RAW_BITLESSON_REQUIRED" | sed 's/^bitlesson_required:[[:space:]]*//' | tr -d ' "')
154+
fi
155+
BITLESSON_FILE_REL="bitlesson.md"
156+
if [[ -n "$RAW_BITLESSON_FILE" ]]; then
157+
BITLESSON_FILE_REL=$(echo "$RAW_BITLESSON_FILE" | sed 's/^bitlesson_file:[[:space:]]*//' | sed 's/^"//; s/"$//')
158+
fi
159+
if [[ -z "$BITLESSON_FILE_REL" ]] || \
160+
[[ ! "$BITLESSON_FILE_REL" =~ ^[a-zA-Z0-9._/-]+$ ]] || \
161+
[[ "$BITLESSON_FILE_REL" = /* ]] || \
162+
[[ "$BITLESSON_FILE_REL" =~ (^|/)\.\.(/|$) ]]; then
163+
BITLESSON_FILE_REL="bitlesson.md"
164+
fi
165+
BITLESSON_FILE="$PROJECT_ROOT/$BITLESSON_FILE_REL"
166+
if [[ "$BITLESSON_REQUIRED" != "true" && -f "$BITLESSON_FILE" ]]; then
167+
BITLESSON_REQUIRED="true"
168+
fi
169+
BITLESSON_ALLOW_EMPTY_NONE="true"
170+
if [[ -n "$RAW_BITLESSON_ALLOW_EMPTY_NONE" ]]; then
171+
BITLESSON_ALLOW_EMPTY_NONE=$(echo "$RAW_BITLESSON_ALLOW_EMPTY_NONE" | sed 's/^bitlesson_allow_empty_none:[[:space:]]*//' | tr -d ' "')
172+
fi
173+
if [[ "${HUMANIZE_ALLOW_EMPTY_BITLESSON_NONE:-}" == "true" ]]; then
174+
BITLESSON_ALLOW_EMPTY_NONE="true"
175+
fi
176+
if [[ "$BITLESSON_ALLOW_EMPTY_NONE" != "true" && "$BITLESSON_ALLOW_EMPTY_NONE" != "false" ]]; then
177+
BITLESSON_ALLOW_EMPTY_NONE="true"
178+
fi
179+
if [[ "$DELEGATION_ENFORCEMENT" != "warn" && "$DELEGATION_ENFORCEMENT" != "strict" ]]; then
180+
echo "Warning: Invalid delegation_enforcement value '$DELEGATION_ENFORCEMENT' in state file; defaulting to warn" >&2
181+
DELEGATION_ENFORCEMENT="warn"
182+
fi
126183
# Re-validate Codex Model and Effort for YAML safety (in case state.md was manually edited)
127184
# Use same validation patterns as setup-rlcr-loop.sh
128185
if [[ ! "$CODEX_EXEC_MODEL" =~ ^[a-zA-Z0-9._-]+$ ]]; then

scripts/codex-worker.sh

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,13 +211,11 @@ find_humanize_project_root() {
211211
find_active_loop_for_marker() {
212212
local project_root="$1"
213213
local loop_base="$project_root/.humanize/rlcr"
214-
local loop_dir=""
215214
local candidate=""
216215

217216
if [[ -n "${LOOP_DIR_ENV:-}" ]]; then
218-
loop_dir="$LOOP_DIR_ENV"
219-
if [[ -f "$loop_dir/state.md" ]] && [[ ! -f "$loop_dir/cancel-state.md" ]] && [[ ! -f "$loop_dir/finalize-state.md" ]]; then
220-
echo "$loop_dir"
217+
if [[ -f "${LOOP_DIR_ENV}/state.md" ]] && [[ ! -f "${LOOP_DIR_ENV}/cancel-state.md" ]] && [[ ! -f "${LOOP_DIR_ENV}/finalize-state.md" ]]; then
218+
echo "$LOOP_DIR_ENV"
221219
fi
222220
return 0
223221
fi

0 commit comments

Comments
 (0)