Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
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
11 changes: 10 additions & 1 deletion .github/workflows/pull-request-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,16 @@ jobs:
with:
node-version: "20"
- run: npm ci --ignore-scripts || npm install --ignore-scripts
- name: Run unit tests
- name: Run tests under hostile git-hook env
env:
CODEX_PLUGIN_SKIP_SMOKE: "1"
GIT_DIR: /tmp/hostile/.git
GIT_WORK_TREE: /tmp/hostile
GIT_INDEX_FILE: /tmp/hostile/index
run: |
printf '[init]\n\tdefaultBranch = injected-master\n' > "$RUNNER_TEMP/hostile-gitconfig"
GIT_CONFIG_GLOBAL="$RUNNER_TEMP/hostile-gitconfig" node scripts/ci/run-tests.mjs
- name: Run unit tests (full)
env:
CODEX_PLUGIN_SKIP_SMOKE: "1"
CODEX_PLUGIN_FULL_TESTS: "1"
Expand Down
2 changes: 1 addition & 1 deletion .sonarcloud.properties
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@ sonar.exclusions=tests/**
# Claude/Gemini plugin files deliberately mirror each other in several places;
# local invariants enforce byte-identical copies where required, so CPD should
# not gate those intentional mirrors.
sonar.cpd.exclusions=tests/**,plugins/claude/scripts/claude-companion.mjs,plugins/gemini/scripts/gemini-companion.mjs,plugins/claude/scripts/lib/cancel-marker.mjs,plugins/gemini/scripts/lib/cancel-marker.mjs,plugins/claude/scripts/lib/identity.mjs,plugins/gemini/scripts/lib/identity.mjs,plugins/claude/scripts/lib/job-record.mjs,plugins/gemini/scripts/lib/job-record.mjs,plugins/claude/scripts/lib/state.mjs,plugins/gemini/scripts/lib/state.mjs
sonar.cpd.exclusions=tests/**,plugins/claude/scripts/claude-companion.mjs,plugins/gemini/scripts/gemini-companion.mjs,plugins/claude/scripts/lib/args.mjs,plugins/gemini/scripts/lib/args.mjs,plugins/claude/scripts/lib/cancel-marker.mjs,plugins/gemini/scripts/lib/cancel-marker.mjs,plugins/claude/scripts/lib/git-env.mjs,plugins/gemini/scripts/lib/git-env.mjs,plugins/claude/scripts/lib/git.mjs,plugins/gemini/scripts/lib/git.mjs,plugins/claude/scripts/lib/identity.mjs,plugins/gemini/scripts/lib/identity.mjs,plugins/claude/scripts/lib/job-record.mjs,plugins/gemini/scripts/lib/job-record.mjs,plugins/claude/scripts/lib/process.mjs,plugins/gemini/scripts/lib/process.mjs,plugins/claude/scripts/lib/reconcile.mjs,plugins/gemini/scripts/lib/reconcile.mjs,plugins/claude/scripts/lib/scope.mjs,plugins/gemini/scripts/lib/scope.mjs,plugins/claude/scripts/lib/state.mjs,plugins/gemini/scripts/lib/state.mjs,plugins/claude/scripts/lib/workspace.mjs,plugins/gemini/scripts/lib/workspace.mjs
15 changes: 12 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,22 @@
- Implemented Claude review/rescue lifecycle with foreground and background job
records, prompt sidecars, status/result lookup, continuation, and background
cancellation.
- Implemented Gemini foreground review/rescue plus background rescue and
`continue --job` lifecycle parity.
- Implemented Gemini foreground review/rescue plus background rescue, status,
result, continue, and cancellation lifecycle parity.
- Added object-pure git scope population for working-tree, staged, HEAD,
branch-diff, and custom scopes.
- Added mock smoke tests, unit coverage enforcement, per-target smoke CI jobs,
manifest/frontmatter linting, and opt-in live E2E harnesses.
- Added the plugin `skills` manifest pointer for both targets and hardened
setup ping so the default probe uses the target CLI's native model selection;
ping JSON keeps a `model` key and returns `null` when no explicit `--model`
override was supplied.
- Hardened post-review setup/status edge cases: ping auth classification now
recognizes common `authentication` / `credentials` variants without matching
unrelated `author*` text; Gemini generic ping errors now include `exit_code`
like Claude; orphan reconciliation batches active-job CAS updates under one
state lock and can reclaim full state-only active records when `meta.json`
is missing.

### Known limitations

Expand All @@ -29,7 +39,6 @@
- Diagnostic ping command docs are deferred until upstream Codex exposes plugin
command files through the TUI. Tracked in
https://github.com/seungpyoson/codex-plugin-multi/issues/13.
- Gemini `cancel` is still deferred and returns `not_implemented`.
- Live Claude/Gemini E2E tests require local OAuth state and are opt-in, not CI
defaults.
- Scope tests include intentionally broad object-pure safety coverage and remain
Expand Down
21 changes: 21 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# codex-plugin-multi — Claude Code project notes

## Test

`npm test`

`npm test` defaults to a fast subset (~40s including smoke + reconciliation
tests) so it fits the 60s pre-commit gate. The slow path — `tests/unit/scope.test.mjs` (155
real-git tests, ~140s on its own) — is opted into via
`CODEX_PLUGIN_FULL_TESTS=1` (or `npm run test:full`). CI sets the env var
explicitly so the full unit matrix runs in PRs.

Run `npm run test:full` locally before opening a PR.

## Notes

- All work happens on branch `fix/<issue>-<short-desc>` cut from
`origin/main`, never directly on local `main`.
- Push WIP branches early so the work is durable across sessions.
- safe_git.py wraps `git commit` / `git merge` / `gh pr` — use it instead of
raw git for those operations.
Loading
Loading