v0.4.0
Release Notes Draft - v0.4.0
Status: draft for the next external release steps.
Release date target: 2026-04-22 or later, when tag / push / GitHub release / npm publish are executed.
Highlights
- Added and hardened provider runtimes for
claude,copilot,opencode,pi,gemini,kimi,qwen, andminimax. - Tightened streamed parser correctness around visible-text extraction, terminal error handling, session id capture, and timing boundaries.
- Locked
/reviewinto provider-specific no-tools hard constraints instead of prompt-only guidance. - Eliminated the background-job cancel/completion race with one lock-protected compare-and-swap path.
- Hardened local durability with atomic file fsync + parent-directory fsync and PID-aware lockfile ownership.
- Added real saved-stdout replay fixtures for all eight providers so parser regressions are tested against actual CLI output shapes.
User-Facing Changes
setup,ask,review,rescue,result, andtimingflows now work through the shared runtime surface for all eight providers.- Background review workers now preserve provider-specific runtime options and surface auto-scope warnings when git fallback resolution fails.
- Host preview text no longer splits emoji mid-surrogate pair, and repeated streamed preview blocks no longer trigger O(n^2) log rereads.
- Review executions now apply hard no-tools constraints for
claude,gemini,copilot,opencode,pi, andminimax.
Fixes Since v0.3.0
claudestream-jsoninvocations now add--verbose.- sync and streaming paths both treat subtype-only terminal errors as failures.
- session id resolution respects stdout / stderr / file priority consistently.
copilot- parser accepts the real
assistant.message_deltaandassistant.messageschemas. - standalone
type:"error"terminal events now fail correctly. - non-zero exits no longer leak stdout as fallback error text.
- parser accepts the real
opencode- parser accepts real
type:"text"andmessage.deltaoutput shapes. - standalone
type:"error"terminal events now fail correctly. /reviewno longer relies on--dangerously-skip-permissions; it injects a deny-all config and uses a non-writing agent mode.
- parser accepts real
pi- parser captures top-level session envelopes and no longer falls back to generic
event.text. - auth probing treats transient failures as inconclusive instead of logged-out.
- parser captures top-level session envelopes and no longer falls back to generic
gemini- no longer falls back to arbitrary
event.text. - empty-output runs now fail with
gemini produced no visible text. - terminal summary events are excluded from timing extension.
- no longer falls back to arbitrary
kimi- supports string assistant content.
- no-text clean exits now fail explicitly.
- auth probing now matches the transient-probe pattern used by other CLIs.
qwen- auth probing no longer depends on
qwen auth status. - result-only success/error flows are handled correctly in both foreground and streaming paths.
- auth probing no longer depends on
minimax- replay coverage now includes real stdout plus real log-body parsing fixtures.
Reliability / Data Integrity
state.jsoncorruption is now preserved asstate.json.corrupt-<timestamp>before recovery.- Timed-out detached children escalate from
SIGTERMtoSIGKILLat the process-group level when supported. - Timing aggregation keeps
measured,zero,missing, andunsupporteddistinct. - Atomic writes now fsync the temp file before rename and fsync the parent directory after rename.
- Lockfiles now use owner-PID liveness instead of mtime-based stale detection.
Test Coverage
- Added host-plugin hygiene regressions for preview dedupe, emoji-safe preview slicing, and auto-scope warnings.
- Added real-fixture replay cases for every provider while keeping the synthetic parser-shape tests.
- Current local verification at release-prep time:
npm test->184passed,0failed.
Packaging Notes
- Release-facing host artifacts are bumped to
0.4.0:plugins/polycli/.claude-plugin/plugin.jsonplugins/polycli-codex/.codex-plugin/plugin.jsonplugins/polycli-copilot/plugin.jsonplugins/polycli-opencode/package.json
- Internal workspace packages remain at
1.0.0.- Reason: they were already at
1.0.0; downgrading them to0.4.0would be a semver regression, and they are not the externally published release line for this tag.
- Reason: they were already at