Component: crates/deploy (paths.rs, install.rs) | Severity: High (forward-compat promise broken) | Status: Reproduced
The project's own test suite documents that unknown adapters must be skipped gracefully ("lets new platform names be added to a Skillfile without breaking existing installs") and plain install does warn-and-skip. But the shared path helpers propagate adapter_for(target)? errors, so with install shiny-new-tool local present alongside install claude-code local:
skillfile install --update exits 1 with "unknown adapter 'shiny-new-tool'" before syncing anything (via the auto-pin pass).
skillfile info <name> exits 1 with the same error.
skillfile status shows installed entries as [not installed] (per-target errors collapse the installed-path set) and silently disables drift detection.
A teammate on a newer skillfile version adding a new platform to the shared manifest thus breaks older clients' core commands.
Where: crates/deploy/src/paths.rs:45 and :80 (let adapter = adapter_for(target)?; inside per-target loops), paths.rs:142-148; crates/deploy/src/install.rs:171-175, :189 (auto-pin path).
Repro:
printf 'install claude-code local\ninstall shiny-new-tool local\nlocal skill s skills/s.md\n' > Skillfile
mkdir skills && printf x > skills/s.md
skillfile install # warns + succeeds (correct)
skillfile status # s ... [not installed] ← false
skillfile info s # error: unknown adapter 'shiny-new-tool', exit 1
skillfile install --update # exit 1 before doing anything
Expected: all commands skip unknown adapters exactly like deploy_all does (warn once).
Actual: hard failure of --update/info, false [not installed] in status.
Fix sketch: in installed_paths/installed_dir_file_sets/auto-pin loops, replace adapter_for(target)? with a match that warns and continues on unknown adapters.
Tests:
- Unit (
crates/deploy/src/paths.rs): manifest with one known + one unknown target → installed_paths returns the known target's path, no Err.
- Integration (
crates/deploy/tests/install_deploy_all.rs): the existing unknown-adapter fixture, extended to update: true → assert success.
- Functional (
tests/cli.rs): the repro above; status shows no [not installed], info exits 0.
Component:
crates/deploy(paths.rs,install.rs) | Severity: High (forward-compat promise broken) | Status: ReproducedThe project's own test suite documents that unknown adapters must be skipped gracefully ("lets new platform names be added to a Skillfile without breaking existing installs") and plain
installdoes warn-and-skip. But the shared path helpers propagateadapter_for(target)?errors, so withinstall shiny-new-tool localpresent alongsideinstall claude-code local:skillfile install --updateexits 1 with "unknown adapter 'shiny-new-tool'" before syncing anything (via the auto-pin pass).skillfile info <name>exits 1 with the same error.skillfile statusshows installed entries as[not installed](per-target errors collapse the installed-path set) and silently disables drift detection.A teammate on a newer skillfile version adding a new platform to the shared manifest thus breaks older clients' core commands.
Where:
crates/deploy/src/paths.rs:45and:80(let adapter = adapter_for(target)?;inside per-target loops),paths.rs:142-148;crates/deploy/src/install.rs:171-175,:189(auto-pin path).Repro:
Expected: all commands skip unknown adapters exactly like
deploy_alldoes (warn once).Actual: hard failure of
--update/info, false[not installed]instatus.Fix sketch: in
installed_paths/installed_dir_file_sets/auto-pin loops, replaceadapter_for(target)?with a match that warns andcontinues on unknown adapters.Tests:
crates/deploy/src/paths.rs): manifest with one known + one unknown target →installed_pathsreturns the known target's path, no Err.crates/deploy/tests/install_deploy_all.rs): the existing unknown-adapter fixture, extended toupdate: true→ assert success.tests/cli.rs): the repro above;statusshows no[not installed],infoexits 0.