Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 18 additions & 10 deletions scripts/codex/check-codex-global-state.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,14 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"

# Use rg if available, otherwise fall back to grep -E.
# All patterns in this script must be POSIX ERE compatible.
if command -v rg >/dev/null 2>&1; then
search_file() { rg -n "$1" "$2" >/dev/null 2>&1; }
else
search_file() { grep -En "$1" "$2" >/dev/null 2>&1; }
fi

CONFIG_FILE="$CODEX_HOME/config.toml"
AGENTS_FILE="$CODEX_HOME/AGENTS.md"
PROMPTS_DIR="$CODEX_HOME/prompts"
Expand Down Expand Up @@ -48,7 +56,7 @@ require_file() {
check_config_pattern() {
local pattern="$1"
local label="$2"
if rg -n "$pattern" "$CONFIG_FILE" >/dev/null 2>&1; then
if search_file "$pattern" "$CONFIG_FILE"; then
ok "$label"
else
fail "$label"
Expand All @@ -58,7 +66,7 @@ check_config_pattern() {
check_config_absent() {
local pattern="$1"
local label="$2"
if rg -n "$pattern" "$CONFIG_FILE" >/dev/null 2>&1; then
if search_file "$pattern" "$CONFIG_FILE"; then
fail "$label"
else
ok "$label"
Expand All @@ -73,25 +81,25 @@ require_file "$CONFIG_FILE" "Global config.toml"
require_file "$AGENTS_FILE" "Global AGENTS.md"

if [[ -f "$AGENTS_FILE" ]]; then
if rg -n '^# Everything Claude Code \(ECC\) — Agent Instructions' "$AGENTS_FILE" >/dev/null 2>&1; then
if search_file '^# Everything Claude Code \(ECC\)' "$AGENTS_FILE"; then
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Require exact ECC root heading in sanity check

The new regex ^# Everything Claude Code \(ECC\) is now prefix-only, so a truncated or altered AGENTS heading can still pass this validation. In this script’s post-sync regression role, that creates a false positive where AGENTS contains ECC root instructions is reported even when the canonical root instructions header is incomplete, which can hide a broken merge/state. Use a full-match pattern (or another strict invariant) so corrupted AGENTS content is detected reliably.

Useful? React with 👍 / 👎.

ok "AGENTS contains ECC root instructions"
else
fail "AGENTS missing ECC root instructions"
fi

if rg -n '^# Codex Supplement \(From ECC \.codex/AGENTS\.md\)' "$AGENTS_FILE" >/dev/null 2>&1; then
if search_file '^# Codex Supplement \(From ECC \.codex/AGENTS\.md\)' "$AGENTS_FILE"; then
ok "AGENTS contains ECC Codex supplement"
else
fail "AGENTS missing ECC Codex supplement"
fi
fi

if [[ -f "$CONFIG_FILE" ]]; then
check_config_pattern '^multi_agent\s*=\s*true' "multi_agent is enabled"
check_config_absent '^\s*collab\s*=' "deprecated collab flag is absent"
check_config_pattern '^multi_agent[[:space:]]*=[[:space:]]*true' "multi_agent is enabled"
check_config_absent '^[[:space:]]*collab[[:space:]]*=' "deprecated collab flag is absent"
# persistent_instructions is recommended but optional; warn instead of fail
# so users who rely on AGENTS.md alone are not blocked (#967).
if rg -n '^[[:space:]]*persistent_instructions\s*=' "$CONFIG_FILE" >/dev/null 2>&1; then
if search_file '^[[:space:]]*persistent_instructions[[:space:]]*=' "$CONFIG_FILE"; then
ok "persistent_instructions is configured"
else
warn "persistent_instructions is not set (recommended but optional)"
Expand All @@ -105,7 +113,7 @@ if [[ -f "$CONFIG_FILE" ]]; then
'mcp_servers.sequential-thinking' \
'mcp_servers.context7'
do
if rg -n "^\[$section\]" "$CONFIG_FILE" >/dev/null 2>&1; then
if search_file "^\[$section\]" "$CONFIG_FILE"; then
ok "MCP section [$section] exists"
else
fail "MCP section [$section] missing"
Expand All @@ -115,11 +123,11 @@ if [[ -f "$CONFIG_FILE" ]]; then
has_context7_legacy=0
has_context7_current=0

if rg -n '^\[mcp_servers\.context7\]' "$CONFIG_FILE" >/dev/null 2>&1; then
if search_file '^\[mcp_servers\.context7\]' "$CONFIG_FILE"; then
has_context7_legacy=1
fi

if rg -n '^\[mcp_servers\.context7-mcp\]' "$CONFIG_FILE" >/dev/null 2>&1; then
if search_file '^\[mcp_servers\.context7-mcp\]' "$CONFIG_FILE"; then
has_context7_current=1
fi

Expand Down
2 changes: 1 addition & 1 deletion tests/scripts/check-unicode-safety.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ if (

const result = runCheck(root, ['--write']);
assert.notStrictEqual(result.status, 0, result.stdout + result.stderr);
assert.match(result.stderr, /scripts\/sample\.js:1:23 emoji U\+1F680/);
assert.match(result.stderr, /scripts[/\\]sample\.js:1:23 emoji U\+1F680/);
assert.strictEqual(fs.readFileSync(scriptFile, 'utf8'), original);
})
)
Expand Down
6 changes: 5 additions & 1 deletion tests/scripts/codex-hooks.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,11 @@ function makeHermeticCodexEnv(homeDir, codexDir, extraEnv = {}) {
let passed = 0;
let failed = 0;

if (
// Windows NTFS does not allow double-quote characters in file paths,
// so the quoted-path shell-injection test is only meaningful on Unix.
if (os.platform() === 'win32') {
console.log(' - install-global-git-hooks.sh quoted paths (skipped on Windows)');
} else if (
test('install-global-git-hooks.sh handles quoted hook paths without shell injection', () => {
const homeDir = createTempDir('codex-hooks-home-');
const weirdHooksDir = path.join(homeDir, 'git-hooks "quoted"');
Expand Down
1 change: 1 addition & 0 deletions tests/scripts/openclaw-persona-forge-gacha.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ function runGacha(pythonBin, arg) {
return spawnSync(pythonBin, [SCRIPT, arg], {
encoding: 'utf8',
maxBuffer: 10 * 1024 * 1024,
env: { ...process.env, PYTHONUTF8: '1' },
});
}

Expand Down
Loading