- derive repo imports from each test file via file URLs
- avoid hardcoded paths in the repo
- launch child scripts with the current runtime for consistent local and runner behavior
- isolate tokens and session-tracker tests in child processes
- make child scripts resolve repo modules from the test location
- avoid machine-specific paths in the repo
- skip CLIProxy auto-update checks on runtime bootstrap paths
- fail fast when local startup needs a missing binary instead of attempting installs
- add regression coverage for dashboard limited mode and startup test isolation
Claude Code's marketplace auto-update uses a three-step atomic rename:
clone to <name>.staging → rename old dir to <name>.bak → rename staging
to the final name. On Windows, EPERM errors can interrupt the rename-dance
and leave a <name>.staging directory permanently on disk.
CCS scanned physical directories to discover marketplaces, so a lingering
.staging directory was registered as a bare { installLocation } entry in
known_marketplaces.json. Claude Code's Zod schema requires each entry to
also have `source` and `lastUpdated` fields, so the corrupt entry caused
the /plugin command to throw a validation error.
Fix (two layers of defence):
- discoverMarketplaceEntries: skip any directory whose name starts with
'.' or ends with '.staging'. This filters all hidden dirs including
.staging and .bak left behind by interrupted rename operations.
- buildMarketplaceRegistryContent: invert the loop direction. Instead of
iterating discoveredEntries and adding to the registry (which could
introduce bare entries for disk-only directories with no registry
record), iterate the merged registry and only keep entries that also
exist on disk. Disk-only directories are now silently ignored.
Adds two regression tests: one for .staging pollution, one for orphan
registry entries whose physical directory has been removed.
- fall back to stale CLIProxy version caches instead of surfacing 500s
- remove duplicate dashboard update-check fetches and disable retry/focus refetch
- add backend and UI regressions for the degraded-path behavior
- load a fresh update-command module instance per test via query-string import
- prevent Bun mock.module leakage from command-router tests from masking handleUpdateCommand in CI
- replace the Windows-brittle chmod read-error setup with a directory-based failure case
- force the browser installed-copy regression through the non-global WebSocket path
- fall back across globalThis.WebSocket, undici, and ws for installed runtimes
- normalize socket event handling for both WHATWG and ws implementations
- add an installed-copy regression test for missing ws in Bun global layouts