@@ -82,17 +82,43 @@ while IFS= read -r dir; do
8282 " $ROOT " /noir/noir-repo/* ) continue ;;
8383 esac
8484 codex=" $( dirname " $dir " ) /.codex"
85- if [[ ! -L " $codex " ]]; then
86- fail " ${codex# $ROOT / } is missing or is not a symlink to .claude"
85+ rel=${codex# $ROOT / }
86+ # A .codex may either be a symlink to its sibling .claude (the repo root keeps this form), or a
87+ # real directory whose immediate children symlink into .claude (the per-package form, required
88+ # because a sandbox cannot bind-mount a path that is itself a symlink). Either way Codex must see
89+ # exactly the same contents as .claude.
90+ if [[ -L " $codex " ]]; then
91+ resolved=$( cd " $( dirname " $codex " ) " && cd " $( readlink " $codex " ) " 2> /dev/null && pwd -P) || resolved=" "
92+ claude_resolved=$( cd " $dir " && pwd -P)
93+ if [[ " $resolved " != " $claude_resolved " ]]; then
94+ fail " $rel is a symlink to ${resolved:- ?} , expected its sibling .claude ($claude_resolved )"
95+ else
96+ pass " $rel -> .claude"
97+ fi
8798 continue
8899 fi
89- resolved=$( cd " $( dirname " $codex " ) " && cd " $( readlink " $codex " ) " 2> /dev/null && pwd -P) || resolved=" "
90- claude_resolved=$( cd " $dir " && pwd -P)
91- if [[ " $resolved " != " $claude_resolved " ]]; then
92- fail " ${codex# $ROOT / } resolves to $resolved , expected $claude_resolved "
100+ if [[ ! -d " $codex " ]]; then
101+ fail " $rel is missing (expected a directory mirroring .claude via child symlinks)"
93102 continue
94103 fi
95- pass " ${codex# $ROOT / } "
104+ codex_ok=1
105+ # Forward: every entry in .claude must have a matching symlink in .codex.
106+ while IFS= read -r child; do
107+ name=$( basename " $child " )
108+ if [[ ! -L " $codex /$name " || ! " $codex /$name " -ef " $child " ]]; then
109+ fail " $rel /$name should be a symlink to ../.claude/$name "
110+ codex_ok=0
111+ fi
112+ done < <( find " $dir " -mindepth 1 -maxdepth 1)
113+ # Reverse: every entry in .codex must correspond to a .claude entry (no stale or dangling links).
114+ while IFS= read -r entry; do
115+ name=$( basename " $entry " )
116+ if [[ ! -e " $dir /$name " && ! -L " $dir /$name " ]]; then
117+ fail " $rel /$name is stale; no matching .claude/$name "
118+ codex_ok=0
119+ fi
120+ done < <( find " $codex " -mindepth 1 -maxdepth 1)
121+ (( codex_ok )) && pass " $rel "
96122done < <( find " $ROOT " -type d -name .claude -not -path " $ROOT /noir/*" -not -path " $ROOT /**/node_modules/*" )
97123
98124echo
0 commit comments