fix(claude-ops): resolve default marketplace across version skew; generalize CRLF gotcha; correct install_new render doc (F1-F3) - #1177
Conversation
…eralize CRLF gotcha; correct install_new render doc (F1-F3)
Consumer-audit fixes for the `plugins` sync skill (handoff-inbox item
20260723-155027), all re-verified against current source (0.19.0). 0.19.0→0.19.1.
- F1 (bug): fleet-state.sh resolve_default_marketplace exact-matched the running
plugin root against the version-pinned installPath, so any session-loaded vs
installed version skew (autoUpdate, or sync's own Step-3 self-update) broke the
primary no---marketplace path with "could not resolve the default marketplace".
Added a version-agnostic fallback matching the version-stripped
.../cache/<marketplace>/<plugin> prefix (exact match still preferred; the
marketplace stays distinguishable via the path), and a clearer error that prints
the searched root and names the skew cause. New version-skew case in
fleet-state.test.sh (28 cases pass; shellcheck -S warning clean).
- F2a (doc): generalized context/gotchas.md's CRLF entry from "this host's jq
build" to any captured Windows value (python/PowerShell/git/CRLF file read); a
trailing \r on a constructed `claude plugin` id yields "Plugin not found" with
the full id passed, colliding with the bare-name symptom — documented and
cross-referenced both ways.
- F3a (doc): plugins/SKILL.md now reads an unset ${user_config.install_new} (which
renders the literal placeholder, since the manifest default is not substituted
for an unset key — verified vs CC 2.1.218) as the expected unset state → default
ask, not an invalid value; only an explicitly-set unsupported value is flagged.
Deferred (noted on #1176): F2b (ship sync-sweep.sh), F3b (upstream default-
substitution docs check).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 2m 17s —— View job Security Review — PR #1177
|
|
Claude finished @kyle-sexton's task in 3m 37s —— View job PR Review — fix(claude-ops): resolve default marketplace across version skew; generalize CRLF gotcha; correct install_new render doc (F1-F3)
OverviewSolid, well-scoped patch. All three fixes are correct, the refactor is clean, and the new test case exercises the exact failure path being fixed. A few minor observations below. F1 —
|

Closes #1176.
Consumer-audit fixes for the claude-ops
pluginssync skill (handoff-inbox item20260723-155027), re-verified against current source (0.19.0). Version0.19.0→0.19.1.Changes
fleet-state.sh'sresolve_default_marketplaceexact-matched the running plugin root against the version-pinnedinstallPath, so any skew between the session's loaded version and the installed one — a marketplaceautoUpdateafter session start, orsync's own Step-3 self-update of claude-ops — broke the primary no---marketplacepath with "could not resolve the default marketplace". Added a version-agnostic fallback matching the version-stripped…/cache/<marketplace>/<plugin>prefix (exact match still tried first; the marketplace stays distinguishable via the path), plus a clearer error that prints the searched root and names the skew cause.context/gotchas.md's CRLF entry from "this host'sjqbuild" to any captured Windows value (pythonprint, PowerShell interop,git config, CRLF file read): a trailing\ron a constructedclaude pluginid makes the CLI reportPlugin "<name>" not foundwith the full id passed (marketplace suffix corrupted), colliding with the bare-name symptom — documented and cross-referenced both ways.plugins/SKILL.mdnow reads an unset${user_config.install_new}— which renders the literal placeholder, since the manifestdefaultis not substituted for an unset key (verified vs CC 2.1.218) — as the expected unset state → defaultask, not an invalid value; only an explicitly-set unsupported value is flagged.Verification
bash plugins/claude-ops/skills/plugins/scripts/fleet-state.test.sh→ 28 cases, 0 failed (new version-skew case green).shellcheck -x -S warning fleet-state.sh→ clean.scripts/check-changed-skills.sh origin/main→ PASS for thepluginsskill (runs the fleet-state test).Deferred (noted on #1176, not in this PR)
sync-sweep.shsibling owning the Step 2+3 update loop (CR-stripping, fail-loud, structured per-id JSON) sosync.mdshrinks to "run this, report from its output". Bigger net-new surface with its own test.userConfigdefault is intended to substitute for an unset key; file a CC docs issue if docs and behavior disagree. F3a is correct regardless.Related
20260723-155027-claude-ops-plugins-sync-audit(producer: KyleSexton workstation, CC 2.1.218).🤖 Generated with Claude Code