From b1ea14df3e14a852fa661cbdc756a8353b18f27d Mon Sep 17 00:00:00 2001 From: Defame1297 Date: Mon, 17 Aug 2026 12:27:56 +0000 Subject: [PATCH] fix(scripts): make the mirror DRIFT fix line safe to copy-paste MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Why: bd2bf66 restored the `apm pack` guard-rail by appending it to the `Fix:` command after `--`, which made the printed line stop being runnable. Pasting it ran the script with ~24 stray argv entries: `${1:-}` became `--`, so CHECK stayed 0, no shift occurred, and `[[ $# -eq 0 ]] || usage` printed usage and exited 1. The user got a usage error from the tool meant to fix their problem, and the mirror stayed stale. The unquoted backticks around `apm pack` were a second hazard in the same line: the paste command-substituted a real `apm pack` run before this script was ever reached, so the first error a user saw came from apm, not from here. Implementation notes: - The runnable command now stands alone on its own line, and the rationale follows as a separate `Note:` echo. - Backticks downgraded to single quotes; a line printed next to a copy-pasteable command must not contain shell metacharacters. - The guard-rail text is otherwise preserved verbatim. It exists because apm ships no output profile targeting this path, so `apm pack` does not refresh it, and expecting it to is the drift this hook prevents. Impact: reproduced the break on a scratch copy, then verified the fix by pasting the printed command verbatim — exit 0, mirror synced, re-check clean. tests/test-sync-marketplace-mirror.sh asserts only exit codes and file contents, so nothing pins this message and it could regress silently; tracked separately. Refs: #105 Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01TmFqzpuExLJv3m114XVE9w --- scripts/sync-marketplace-mirror.sh | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/scripts/sync-marketplace-mirror.sh b/scripts/sync-marketplace-mirror.sh index ffdb066..6c7fd17 100755 --- a/scripts/sync-marketplace-mirror.sh +++ b/scripts/sync-marketplace-mirror.sh @@ -60,7 +60,19 @@ fi if [[ "$CHECK" -eq 1 ]]; then if [[ ! -f "$DST" ]] || ! diff -q "$SRC" "$DST" >/dev/null 2>&1; then echo "DRIFT $DST: out of sync with .claude-plugin/marketplace.json" >&2 - echo "Fix: bash scripts/sync-marketplace-mirror.sh -- apm ships no output profile targeting this path, so \`apm pack\` does not refresh it. Expecting it to is exactly the drift this script and its pre-push hook exist to prevent." >&2 + # The runnable command gets a line to ITSELF, and the rationale gets its own + # echo. It was one line -- `Fix: bash scripts/sync-marketplace-mirror.sh -- + # apm ships no output profile...` -- which put the prose after `--`, the + # POSIX end-of-options marker, so copy-pasting the Fix line ran this script + # with ~24 stray argv entries: `${1:-}` was `--` (so CHECK stayed 0 and no + # shift happened), `[[ $# -eq 0 ]]` failed, and the tool meant to fix the + # drift answered with its own usage error and exit 1. The backticks around + # `apm pack` made it worse: the paste also command-substituted a real + # `apm pack` run before the script was even reached. Hence plain quotes + # below too. Keep the command alone on its line. + echo "Fix: run, from the repository root:" >&2 + echo " bash scripts/sync-marketplace-mirror.sh" >&2 + echo "Note: apm ships no output profile targeting this path, so 'apm pack' does not refresh it. Expecting it to is exactly the drift this script and its pre-push hook exist to prevent." >&2 exit 1 fi exit 0