Skip to content

one unknown platform name in the Skillfile breaks install --update, info, and status - while plain install correctly skips it #204

Description

@eljulians

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:

  1. Unit (crates/deploy/src/paths.rs): manifest with one known + one unknown target → installed_paths returns the known target's path, no Err.
  2. Integration (crates/deploy/tests/install_deploy_all.rs): the existing unknown-adapter fixture, extended to update: true → assert success.
  3. Functional (tests/cli.rs): the repro above; status shows no [not installed], info exits 0.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingcomponent: installInstall orchestration, update, dry-run, overwrite, rollback, and user-file safetyhelp wantedExtra attention is neededseverity: highHigh severity bug

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions