


























@@ -6,9 +6,13 @@ usage() {
66Usage: codex-review [options]
7788Options:
9- --mode auto|local|branch Target selection. Default: auto.
9+ --mode auto|local|branch|commit
10+ Target selection. Default: auto.
1011 --base REF Base ref for branch review. Default: PR base or origin/main.
12+ --commit REF Commit ref for commit review. Default: HEAD.
1113 --codex-bin PATH Codex binary. Default: codex.
14+ --full-access Keep yolo/full-access mode enabled. Default.
15+ --no-yolo Run nested Codex review with normal sandbox/approval prompts.
1216 --output FILE Also save output to file.
1317 --parallel-tests CMD Run review and test command concurrently.
1418 --dry-run Print selected commands, do not run.
@@ -17,13 +21,17 @@ Options:
1721Modes:
1822 local codex review --uncommitted
1923 branch codex review --base <base>
24+ commit codex review --commit <commit>
2025 auto dirty tree -> local, else PR/current branch -> branch
2126EOF
2227}
23282429mode=auto
2530base_ref=
31+commit_ref=HEAD
2632codex_bin=${CODEX_BIN:-codex}
33+codex_args=()
34+yolo=${CODEX_REVIEW_YOLO:-1}
2735output=${CODEX_REVIEW_OUTPUT:-}
2836parallel_tests=
2937dry_run=false
@@ -38,10 +46,22 @@ while [[ $# -gt 0 ]]; do
3846 base_ref=${2:-}
3947shift 2
4048 ;;
49+ --commit)
50+ commit_ref=${2:-}
51+shift 2
52+ ;;
4153 --codex-bin)
4254 codex_bin=${2:-}
4355shift 2
4456 ;;
57+ --full-access)
58+ yolo=1
59+shift
60+ ;;
61+ --no-yolo)
62+ yolo=0
63+shift
64+ ;;
4565 --output)
4666 output=${2:-}
4767shift 2
@@ -65,8 +85,13 @@ while [[ $# -gt 0 ]]; do
6585esac
6686done
678788+case "$yolo" in
89+ 0|false|False|FALSE|no|No|NO|off|Off|OFF) ;;
90+*) codex_args+=(--dangerously-bypass-approvals-and-sandbox) ;;
91+esac
92+6893case "$mode" in
69- auto|local|branch) ;;
94+ auto|local|branch|commit) ;;
7095*)
7196echo "invalid --mode: $mode" >&2
7297exit 2
@@ -99,6 +124,8 @@ fi
99124review_kind=
100125if [[ "$mode" == local || ( "$mode" == auto && "$dirty" == true ) ]]; then
101126 review_kind=local
127+elif [[ "$mode" == commit ]]; then
128+ review_kind=commit
102129elif [[ "$mode" == branch || ( "$mode" == auto && -n "$current_branch" && "$current_branch" != "main" ) ]]; then
103130 review_kind=branch
104131else
@@ -107,9 +134,11 @@ else
107134fi
108135109136if [[ "$review_kind" == local ]]; then
110- review_cmd=("$codex_bin" review --uncommitted)
137+ review_cmd=("$codex_bin" "${codex_args[@]}" review --uncommitted)
138+elif [[ "$review_kind" == commit ]]; then
139+ review_cmd=("$codex_bin" "${codex_args[@]}" review --commit "$commit_ref")
111140else
112- review_cmd=("$codex_bin" review --base "$base_ref")
141+ review_cmd=("$codex_bin" "${codex_args[@]}" review --base "$base_ref")
113142fi
114143115144printf 'codex-review target: %s\n' "$review_kind"
@@ -140,28 +169,92 @@ if [[ "$review_kind" == branch ]]; then
140169 }
141170fi
142171172+review_output=$output
173+review_output_is_temp=false
174+if [[ -z "$review_output" ]]; then
175+ review_output=$(mktemp)
176+ review_output_is_temp=true
177+fi
178+179+cleanup() {
180+if [[ "${review_output_is_temp:-false}" == true && -n "${review_output:-}" ]]; then
181+ rm -f "$review_output"
182+fi
183+}
184+trap cleanup EXIT
185+143186run_review() {
144-if [[ -n "$output" ]]; then
145- mkdir -p "$(dirname "$output")"
146-"${review_cmd[@]}" 2>&1 | tee "$output"
187+ mkdir -p "$(dirname "$review_output")"
188+"${review_cmd[@]}" 2>&1 | tee "$review_output"
189+}
190+191+elapsed_since() {
192+local started_at=$1
193+local finished_at
194+ finished_at=$(date +%s)
195+printf '%s\n' "$((finished_at - started_at))"
196+}
197+198+format_elapsed() {
199+local seconds=$1
200+if (( seconds < 60 )); then
201+printf '%ss\n' "$seconds"
147202else
148-"${review_cmd[@]}"
203+printf '%sm%ss\n' "$((seconds / 60))" "$((seconds % 60))"
204+fi
205+}
206+207+review_output_empty() {
208+ [[ ! -s "$review_output" ]] || ! grep -q '[^[:space:]]' "$review_output"
209+}
210+211+review_output_has_findings() {
212+ grep -Eq '\[P[0-3]\]' "$review_output"
213+}
214+215+report_clean_review_or_fail() {
216+local elapsed_text
217+ elapsed_text=$(format_elapsed "${review_elapsed_seconds:-0}")
218+219+if review_output_has_findings; then
220+printf 'codex-review complete after %s\n' "$elapsed_text"
221+printf 'codex-review findings: accepted/actionable findings reported\n'
222+return 1
223+fi
224+if review_output_empty; then
225+printf 'codex-review complete after %s; no output\n' "$elapsed_text"
226+return 1
149227fi
228+printf 'codex-review complete after %s\n' "$elapsed_text"
229+printf 'codex-review clean: no accepted/actionable findings reported\n'
150230}
151231152232if [[ -z "$parallel_tests" ]]; then
233+ review_started_at=$(date +%s)
234+set +e
153235 run_review
154-exit $?
236+ review_status=$?
237+ review_elapsed_seconds=$(elapsed_since "$review_started_at")
238+set -e
239+if [[ "$review_status" == 0 ]]; then
240+ report_clean_review_or_fail
241+exit $?
242+fi
243+exit "$review_status"
155244fi
156245157246review_status_file=$(mktemp)
247+review_elapsed_file=$(mktemp)
158248tests_status_file=$(mktemp)
159249160250(
161251set +e
252+ review_started_at=$(date +%s)
162253 run_review
163254 status=$?
255+ elapsed=$(elapsed_since "$review_started_at")
164256printf '%s\n' "$status" > "$review_status_file"
257+printf '%s\n' "$elapsed" > "$review_elapsed_file"
165258) &
166259review_pid=$!
167260@@ -177,12 +270,15 @@ wait "$review_pid" || true
177270wait "$tests_pid" || true
178271179272review_status=$(cat "$review_status_file")
273+review_elapsed_seconds=$(cat "$review_elapsed_file")
180274tests_status=$(cat "$tests_status_file")
181-rm -f "$review_status_file" "$tests_status_file"
275+rm -f "$review_status_file" "$review_elapsed_file" "$tests_status_file"
182276183277printf 'codex-review exit: %s\n' "$review_status"
184278printf 'tests exit: %s\n' "$tests_status"
185279186280if [[ "$review_status" != 0 || "$tests_status" != 0 ]]; then
187281exit 1
188282fi
283+284+report_clean_review_or_fail
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。