From e68233cd5d05ba9eeb16ee94fd3686d5a1fd4055 Mon Sep 17 00:00:00 2001 From: Affaan Mustafa Date: Mon, 30 Mar 2026 14:21:40 -0400 Subject: [PATCH] fix(ci): harden codex hook regression test (#1028) --- AGENTS.md | 4 ++-- README.md | 4 ++-- tests/scripts/codex-hooks.test.js | 25 ++++++++++++++++++------- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 7b386ce4..3abed0a8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,6 @@ # Everything Claude Code (ECC) — Agent Instructions -This is a **production-ready AI coding plugin** providing 30 specialized agents, 135 skills, 60 commands, and automated hook workflows for software development. +This is a **production-ready AI coding plugin** providing 30 specialized agents, 136 skills, 60 commands, and automated hook workflows for software development. **Version:** 1.9.0 @@ -142,7 +142,7 @@ Troubleshoot failures: check test isolation → verify mocks → fix implementat ``` agents/ — 30 specialized subagents -skills/ — 135 workflow skills and domain knowledge +skills/ — 136 workflow skills and domain knowledge commands/ — 60 slash commands hooks/ — Trigger-based automations rules/ — Always-follow guidelines (common + per-language) diff --git a/README.md b/README.md index a59efc0e..2417f823 100644 --- a/README.md +++ b/README.md @@ -220,7 +220,7 @@ For manual install instructions see the README in the `rules/` folder. When copy /plugin list everything-claude-code@everything-claude-code ``` -**That's it!** You now have access to 30 agents, 135 skills, and 60 commands. +**That's it!** You now have access to 30 agents, 136 skills, and 60 commands. ### Multi-model commands require additional setup @@ -1111,7 +1111,7 @@ The configuration is automatically detected from `.opencode/opencode.json`. |---------|-------------|----------|--------| | Agents | PASS: 30 agents | PASS: 12 agents | **Claude Code leads** | | Commands | PASS: 60 commands | PASS: 31 commands | **Claude Code leads** | -| Skills | PASS: 135 skills | PASS: 37 skills | **Claude Code leads** | +| Skills | PASS: 136 skills | PASS: 37 skills | **Claude Code leads** | | Hooks | PASS: 8 event types | PASS: 11 events | **OpenCode has more!** | | Rules | PASS: 29 rules | PASS: 13 instructions | **Claude Code leads** | | MCP Servers | PASS: 14 servers | PASS: Full | **Full parity** | diff --git a/tests/scripts/codex-hooks.test.js b/tests/scripts/codex-hooks.test.js index 5e67229a..303b7286 100644 --- a/tests/scripts/codex-hooks.test.js +++ b/tests/scripts/codex-hooks.test.js @@ -11,7 +11,6 @@ const { spawnSync } = require('child_process'); const repoRoot = path.join(__dirname, '..', '..'); const installScript = path.join(repoRoot, 'scripts', 'codex', 'install-global-git-hooks.sh'); const syncScript = path.join(repoRoot, 'scripts', 'sync-ecc-to-codex.sh'); -const checkScript = path.join(repoRoot, 'scripts', 'codex', 'check-codex-global-state.sh'); function test(name, fn) { try { @@ -51,11 +50,15 @@ function makeHermeticCodexEnv(homeDir, codexDir, extraEnv = {}) { return { HOME: homeDir, USERPROFILE: homeDir, + XDG_CONFIG_HOME: path.join(homeDir, '.config'), + GIT_CONFIG_GLOBAL: path.join(homeDir, '.gitconfig'), CODEX_HOME: codexDir, AGENTS_HOME: agentsHome, ECC_GLOBAL_HOOKS_DIR: hooksDir, CLAUDE_PACKAGE_MANAGER: 'npm', CLAUDE_CODE_PACKAGE_MANAGER: 'npm', + LANG: 'C.UTF-8', + LC_ALL: 'C.UTF-8', ...extraEnv, }; } @@ -86,10 +89,11 @@ if ( else failed++; if ( - test('sync and global sanity checks accept the legacy context7 MCP section', () => { + test('sync preserves baseline config and accepts the legacy context7 MCP section', () => { const homeDir = createTempDir('codex-sync-home-'); const codexDir = path.join(homeDir, '.codex'); const configPath = path.join(codexDir, 'config.toml'); + const agentsPath = path.join(codexDir, 'AGENTS.md'); const config = [ 'approval_policy = "on-request"', 'sandbox_mode = "workspace-write"', @@ -133,12 +137,19 @@ if ( const syncResult = runBash(syncScript, ['--update-mcp'], makeHermeticCodexEnv(homeDir, codexDir)); assert.strictEqual(syncResult.status, 0, `${syncResult.stdout}\n${syncResult.stderr}`); - const syncedConfig = fs.readFileSync(configPath, 'utf8'); - assert.match(syncedConfig, /^\[mcp_servers\.context7\]$/m); - const checkResult = runBash(checkScript, [], makeHermeticCodexEnv(homeDir, codexDir)); - assert.strictEqual(checkResult.status, 0, checkResult.stderr || checkResult.stdout); - assert.match(checkResult.stdout, /MCP section \[mcp_servers\.context7\] or \[mcp_servers\.context7-mcp\] exists/); + const syncedAgents = fs.readFileSync(agentsPath, 'utf8'); + assert.match(syncedAgents, /^# Everything Claude Code \(ECC\) — Agent Instructions/m); + assert.match(syncedAgents, /^# Codex Supplement \(From ECC \.codex\/AGENTS\.md\)/m); + + const syncedConfig = fs.readFileSync(configPath, 'utf8'); + assert.match(syncedConfig, /^multi_agent\s*=\s*true$/m); + assert.match(syncedConfig, /^\[profiles\.strict\]$/m); + assert.match(syncedConfig, /^\[profiles\.yolo\]$/m); + assert.match(syncedConfig, /^\[mcp_servers\.github\]$/m); + assert.match(syncedConfig, /^\[mcp_servers\.memory\]$/m); + assert.match(syncedConfig, /^\[mcp_servers\.sequential-thinking\]$/m); + assert.match(syncedConfig, /^\[mcp_servers\.context7\]$/m); } finally { cleanup(homeDir); }