* review: add jj evolog diff mode to code review UI Adds a new "Evolution diff" diff type for jj repos that shows what changed between two evolutions (amendments) of the current change — i.e. what was amended since a prior state of `@`. Changes: - Add `JjEvoLogEntry` type to `review-core.ts` and export from `shared/types.ts` - Add `getJjEvoLogEntries()` to `jj-core.ts` — runs `jj evolog` with a tab-delimited template to collect commit ID, description, and age for each historical state of `@` - Add `jj-evolog` to the `DiffType` union in `review-core.ts` and to the `JJ_DIFF_TYPES` set in `vcs-core.ts` - Wire evolog mode into `runJjDiff()` and `getJjDiffArgs()` — defaults to the second evolog entry (the most recent prior state) when no explicit base is given; propagates `error` when there's no history - Expose `jjEvologs` on `GitContext` and include the "Evolution diff" option in `diffOptions` only when two or more entries exist - Add `EvoLogPicker.tsx`: a Radix Popover component that lists evolog entries and lets the user pick which prior state to compare against; shows commit ID, description, and age with a "default" badge on the auto-selected entry - Update `FileTree.tsx` to render `EvoLogPicker` instead of `BaseBranchPicker` when `jj-evolog` is the active diff type - Update `App.tsx` to thread `jjEvologs` and `detectedEvoBase` through to the file tree, auto-set the base to the second evolog entry on mode switch, and show an appropriate empty-state message - Update `agent-review-message.ts` with an inspect hint for the evolog diff type - Add unit tests covering: diff args, evolog output parsing, error cases, and the auto-base-selection fallback path * review: fix evolog picker overflow and add evolog test sandbox Fix the EvoLogPicker trigger and popover rows to handle narrow sidebar widths — age strings now truncate instead of bleeding out of the container. Add --with-evolog flag to the JJ manual test sandbox that amends the working-copy change four times to create realistic evolution history. Also writes a create-evolog.sh helper script into the sandbox for on-demand evolog creation without the flag. * fix: restore compare target when switching away from jj-evolog When leaving Evolution diff mode, the evolog commit ID was left in selectedBase and leaked into the next diff request. For jj-line this caused jjLineBaseRevset() to treat the commit ID as a bookmark name, producing a "didn't resolve to any revisions" error. Now explicitly passes the restored default branch as baseOverride to fetchDiffSwitch when leaving evolog, avoiding the React state batching race that made the previous setSelectedBase-only approach insufficient. --------- Co-authored-by: Michael Ramos <mdramos8@gmail.com>
Tests
This directory contains manual testing scripts for Plannotator.
UI Tests (manual/local/)
These scripts test the UI components and require a browser.
Plan review UI:
./tests/manual/local/test-hook.sh # Claude Code simulation
./tests/manual/local/test-hook-2.sh # OpenCode origin badge test
./tests/manual/local/test-codex-plan-review-e2e.sh # Real Codex Stop-hook flow in disposable HOME
Code review UI:
./tests/manual/local/test-opencode-review.sh # Code review UI test
./tests/manual/local/test-worktree-review.sh # Worktree support test (creates sandbox with 4 worktrees)
See UI-TESTING.md for detailed UI testing documentation.
Integration & Utility Tests (manual/local/)
These scripts test integrations, releases, and provide utilities.
Binary release testing:
./tests/manual/local/test-binary.sh # Test installed binary from ~/.local/bin/
Tests the installed plannotator binary to verify releases work correctly.
Bulk plan testing (Obsidian integration):
./tests/manual/local/test-bulk-plans.sh # Iterate through ~/.claude/plans/
Opens each .md file from ~/.claude/plans/ in Plannotator. Great for testing Obsidian integration with multiple
plans.
OpenCode integration sandbox:
./tests/manual/local/sandbox-opencode.sh [--disable-sharing] [--keep] [--no-git]
Creates a temporary sandbox with a sample React/TypeScript project, initializes git with uncommitted changes, sets up the local OpenCode plugin, and launches OpenCode for full integration testing.
Options:
--disable-sharing: Createsopencode.jsonwith sharing disabled--keep: Don't clean up sandbox on exit--no-git: Skip git initialization (tests non-git fallback)
Codex Stop-hook end-to-end harness:
./tests/manual/local/test-codex-plan-review-e2e.sh [--keep] [--skip-build]
Builds the hook and review apps, creates a disposable HOME plus sample git repo, copies your Codex auth.json,
enables hooks, and runs a real codex exec against the sample project. The script writes logs, rollout paths,
history indices, and session URLs into an artifact directory under the temp root.
Tips:
- Set
PLANNOTATOR_BROWSER=/usr/bin/truewhen you want to drive the opened plan-review session with Playwright instead of auto-opening a browser. - The validated workflow is: run the script in one terminal, then point Playwright at the printed session URL from a second terminal.
Obsidian utility:
./tests/manual/local/fix-vault-links.sh /path/to/vault/plannotator
Adds Obsidian backlinks ([[Plannotator Plans]]) to existing plan files in your vault.
SSH Remote Testing (manual/ssh/)
Tests SSH session detection and port forwarding for remote development scenarios.
cd tests/manual/ssh/
docker-compose up -d
./test-ssh.sh
See manual/ssh/DOCKER_SSH_TEST.md for detailed setup instructions.