From b98f1dd0716d33f9d9c45498c60a6337d4fb92bf Mon Sep 17 00:00:00 2001 From: Kyle Tse Date: Sat, 8 Aug 2026 00:27:26 +0000 Subject: [PATCH 1/2] fix!: retire Iris dual-publish; add transitional deprecate workflow Brand-sole @sylphx/iris is already live. Dual-publish brand-alias fails closed; optional workflow deprecates @sylphx/image-reader-mcp CTA. --- .../workflows/deprecate-transitional-npm.yml | 38 ++++++++ .github/workflows/publish-brand-alias.yml | 86 ++----------------- 2 files changed, 47 insertions(+), 77 deletions(-) create mode 100644 .github/workflows/deprecate-transitional-npm.yml diff --git a/.github/workflows/deprecate-transitional-npm.yml b/.github/workflows/deprecate-transitional-npm.yml new file mode 100644 index 0000000..d590335 --- /dev/null +++ b/.github/workflows/deprecate-transitional-npm.yml @@ -0,0 +1,38 @@ +name: Deprecate transitional npm id + +on: + workflow_dispatch: + inputs: + confirm: + description: Type DEPRECATE_IMAGE_READER_MCP + required: true + type: string + +permissions: + contents: read + +jobs: + deprecate: + if: ${{ inputs.confirm == 'DEPRECATE_IMAGE_READER_MCP' }} + runs-on: sylphx-linux-standard + steps: + - uses: actions/setup-node@v4 + with: + node-version: '22' + registry-url: 'https://registry.npmjs.org' + always-auth: true + - name: npm deprecate transitional package + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + set -euo pipefail + TOKEN="${NODE_AUTH_TOKEN:-$NPM_TOKEN}" + test -n "$TOKEN" + printf '//registry.npmjs.org/:_authToken=%s\nalways-auth=true\n' "$TOKEN" > "$HOME/.npmrc" + export NPM_CONFIG_USERCONFIG="$HOME/.npmrc" + npm whoami + MSG='Retired install CTA. Use brand-sole @sylphx/iris (bin: iris).' + npm deprecate "@sylphx/image-reader-mcp" "$MSG" + npm view @sylphx/image-reader-mcp version deprecated || true + npm view @sylphx/iris version bin diff --git a/.github/workflows/publish-brand-alias.yml b/.github/workflows/publish-brand-alias.yml index 7c77495..f282e65 100644 --- a/.github/workflows/publish-brand-alias.yml +++ b/.github/workflows/publish-brand-alias.yml @@ -1,94 +1,26 @@ name: Publish brand alias +# RETIRED (brand-sole hard cut): @sylphx/iris is the sole public MCP package id. +# Dual-publish from @sylphx/image-reader-mcp is no longer valid. + on: workflow_dispatch: inputs: confirm: - description: 'Type PUBLISH' + description: 'Type RETIRED (workflow intentionally fails closed)' required: true type: string - version: - description: 'Version to dual-publish (default: read from npm latest of transitional)' - required: false - type: string permissions: contents: read jobs: - publish-brand: - if: ${{ inputs.confirm == 'PUBLISH' }} + retired: runs-on: sylphx-linux-standard steps: - - uses: actions/setup-node@v4 - with: - node-version: '22' - registry-url: 'https://registry.npmjs.org' - always-auth: true - - name: Dual-publish @sylphx/iris from @sylphx/image-reader-mcp - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - BRAND: '@sylphx/iris' - TRANSITIONAL: '@sylphx/image-reader-mcp' - VERSION_INPUT: ${{ inputs.version }} + - name: Brand-sole — dual alias path retired run: | set -euo pipefail - TOKEN="${NODE_AUTH_TOKEN:-$NPM_TOKEN}" - test -n "$TOKEN" - printf '//registry.npmjs.org/:_authToken=%s\nalways-auth=true\n' "$TOKEN" > "$HOME/.npmrc" - export NPM_CONFIG_USERCONFIG="$HOME/.npmrc" - npm whoami - VER="${VERSION_INPUT:-}" - if [ -z "$VER" ]; then - VER=$(npm view "$TRANSITIONAL" version) - fi - echo "Alias $BRAND@$VER <= $TRANSITIONAL@$VER" - if npm view "$BRAND@$VER" version >/dev/null 2>&1; then - echo already "$BRAND@$VER" - npm view "$BRAND" version dist-tags - exit 0 - fi - if ! npm view "$TRANSITIONAL@$VER" version >/dev/null 2>&1; then - echo "Transitional $TRANSITIONAL@$VER missing on registry" >&2 - exit 1 - fi - WORK=$(mktemp -d) - cd "$WORK" - npm pack "$TRANSITIONAL@$VER" - TGZ=$(ls -1 *.tgz | head -1) - tar -xzf "$TGZ" - cd package - node -e ' - const fs=require("fs"); - const pkg=JSON.parse(fs.readFileSync("package.json","utf8")); - pkg.name=process.env.BRAND; - pkg.private=false; - pkg.publishConfig=Object.assign({}, pkg.publishConfig||{}, {access:"public"}); - // annotate alias provenance - pkg.description=(pkg.description||"") + " (brand alias of " + process.env.TRANSITIONAL + ")"; - if (pkg.scripts) { - delete pkg.scripts.prepublishOnly; - delete pkg.scripts.prepare; - delete pkg.scripts.prepack; - delete pkg.scripts.postinstall; - } - fs.writeFileSync("package.json", JSON.stringify(pkg,null,2)); - console.log("publishing", pkg.name, pkg.version, "unpacked from", process.env.TRANSITIONAL); - ' - npm publish --access public --ignore-scripts - for i in $(seq 1 12); do - if OUT=$(npm view "$BRAND@$VER" version 2>/dev/null); then - echo "readback $OUT" - npm view "$BRAND" version dist-tags - # size sanity: brand should roughly match transitional package - exit 0 - fi - sleep 5 - done - # treat publish log success + delayed CDN as ok if npm publish exited 0 - echo "view delayed; verifying via registry API" - code=$(curl -s -o /tmp/b.json -w '%{http_code}' "https://registry.npmjs.org/$(node -p 'encodeURIComponent(process.env.BRAND)')") - echo "http $code" - head -c 200 /tmp/b.json; echo - test "$code" = "200" + echo "::error::publish-brand-alias is retired. Canonical package is @sylphx/iris." + echo "Transitional @sylphx/image-reader-mcp is not a publish source." + exit 1 From 226a56b767dd3a1830aceeb3cf2f56ab9e05f291 Mon Sep 17 00:00:00 2001 From: Kyle Tse Date: Sat, 8 Aug 2026 00:34:10 +0000 Subject: [PATCH 2/2] chore: refresh bun.lock for frozen CI install --- bun.lock | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/bun.lock b/bun.lock index 38f81d1..0a9c110 100644 --- a/bun.lock +++ b/bun.lock @@ -17,10 +17,10 @@ "typescript": "^7.0.2", }, "optionalDependencies": { - "@sylphx/image-reader-mcp-darwin-arm64": "0.1.9", - "@sylphx/image-reader-mcp-darwin-x64": "0.1.9", - "@sylphx/image-reader-mcp-linux-arm64-gnu": "0.1.9", - "@sylphx/image-reader-mcp-linux-x64-gnu": "0.1.9", + "@sylphx/iris-darwin-arm64": "0.2.0", + "@sylphx/iris-darwin-x64": "0.2.0", + "@sylphx/iris-linux-arm64-gnu": "0.2.0", + "@sylphx/iris-linux-x64-gnu": "0.2.0", "exifr": "^7.1.3", "sharp": "^0.35.0", }, @@ -273,6 +273,14 @@ "@oxc-transform/binding-win32-x64-msvc": ["@oxc-transform/binding-win32-x64-msvc@0.93.0", "", { "os": "win32", "cpu": "x64" }, "sha512-6QN3DEaEw3eWioWEFRgNsTvYq8czYSnpkjB2za+/WdLN0g5FzOl2ZEfNiPrBWIPnSmjUmDWtWVWcSjwY7fX5/Q=="], + "@sylphx/iris-darwin-arm64": ["@sylphx/iris-darwin-arm64@0.2.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zImO5y08RGkKrBMmTrNqY7h+4eeH9bobJVE1fSrnb0RM/4ufCmLZkgczfTdvyzYcB98rtTYN32up0xdu0fYveg=="], + + "@sylphx/iris-darwin-x64": ["@sylphx/iris-darwin-x64@0.2.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-pr5ZZNr7Jt3HhteGhrwo/jtADCoq//I5N18wOAfqOKvMtR2zR8hRXNL6gHLfymYJa0QeqzErCKpHO7x+RAfYKQ=="], + + "@sylphx/iris-linux-arm64-gnu": ["@sylphx/iris-linux-arm64-gnu@0.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-phdxN9xsgV+71nJWwnRSzM0rNwFk7iuVKSFEilhwlsgewdHuLpA8h6wTR+mS/A6WOa64/LSQ8Q5Wq3hCGsgM+g=="], + + "@sylphx/iris-linux-x64-gnu": ["@sylphx/iris-linux-x64-gnu@0.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-7gEVUf8mtAfggV7MRljaEThbsVKzA01deH2bZ2myrbPJL9L3XD+3In1fqjSyjJvHfDV77R0lhwgRjg0hwJiEMA=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], "@types/node": ["@types/node@25.9.5", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg=="],