0
Fork 0
mirror of https://github.com/blader/humanizer.git synced 2026-09-27 18:19:51 +00:00

GUI zip upload fails: "Zip file contains a symbolic link" #224

Closed
opened 2026-08-17 20:25:35 +00:00 by serso-pt · 0 comments
serso-pt commented 2026-08-17 20:25:35 +00:00 (Migrated from github.com)

Summary

Hi @blader, I'm a big fan of your humanizer skill!

Updating Humanizer through the Claude Desktop GUI ("Replace" on the installed skill) no longer works with the zip from Code → Download ZIP. It worked before. Now the upload is rejected with Zip file contains a symbolic link.

Steps to reproduce

  1. Download the repo zip from GitHub (Code → Download ZIP).
  2. In Claude Desktop, open the Humanizer skill and choose "Replace".
  3. Select the downloaded .zip.

What happens

The upload fails with:

Image
Zip file contains a symbolic link

skills/humanizer/SKILL.md is a symlink to the root SKILL.md, which the README describes as deliberate so Claude Desktop and older plugin loaders find the skill without a second prompt. GitHub's zip keeps it as a real symlink entry, and the uploader now rejects any archive that contains one. This looks like a change on Anthropic's side rather than anything in the repo.

One thing worth flagging

Replacing the symlink with a regular file does not work:

  • scripts/validate-package.py requires the symlink and exits with Link skills/humanizer/SKILL.md to the root SKILL.md, so .github/workflows/validate.yml fails on every PR and push to main.
  • The source zip would then hold two real SKILL.md files, at the root and under skills/humanizer/, and the uploader rejects that with Zip must contain exactly one SKILL.md file.

I ran into both while working around it locally, so the symlink is better left in place.

Suggested fix

The source archive was never meant to be a skill package. A purpose-built zip published as a release asset avoids the symlink, because it copies from the root SKILL.md, which is a regular file.

I tested this structure locally, and it uploads and replaces the skill through the GUI without errors:

humanizer/
└── SKILL.md

The workflow below was generated by Claude Code, so treat it as a starting point rather than something I have run in CI. It assumes you publish GitHub Releases:

- name: Build GUI-ready zip
  run: |
    mkdir -p dist/humanizer
    cp SKILL.md dist/humanizer/SKILL.md
    cd dist && zip -r humanizer-skill.zip humanizer

- name: Attach to release
  env:
    GH_TOKEN: ${{ github.token }}
  run: gh release upload "${{ github.event.release.tag_name }}" dist/humanizer-skill.zip --clobber

If you don't cut releases, a tag trigger or a documented manual step in the README would solve it too. Either way the Skills CLI, the plugin loader, and validate-package.py stay untouched.

Best regards,
Sérgio Sousa

## Summary Hi @blader, I'm a big fan of your _humanizer_ skill! Updating Humanizer through the Claude Desktop GUI ("Replace" on the installed skill) no longer works with the zip from `Code → Download ZIP`. It worked before. Now the upload is rejected with `Zip file contains a symbolic link`. ## Steps to reproduce 1. Download the repo zip from GitHub (`Code → Download ZIP`). 2. In Claude Desktop, open the Humanizer skill and choose "Replace". 3. Select the downloaded `.zip`. ## What happens The upload fails with: <img width="648" height="548" alt="Image" src="https://github.com/user-attachments/assets/9adcfe8e-a7ca-4207-a23d-3a502208b21d" /> ``` Zip file contains a symbolic link ``` `skills/humanizer/SKILL.md` is a symlink to the root `SKILL.md`, which the README describes as deliberate so Claude Desktop and older plugin loaders find the skill without a second prompt. GitHub's zip keeps it as a real symlink entry, and the uploader now rejects any archive that contains one. This looks like a change on Anthropic's side rather than anything in the repo. ## One thing worth flagging Replacing the symlink with a regular file does not work: - `scripts/validate-package.py` requires the symlink and exits with `Link skills/humanizer/SKILL.md to the root SKILL.md`, so `.github/workflows/validate.yml` fails on every PR and push to `main`. - The source zip would then hold two real `SKILL.md` files, at the root and under `skills/humanizer/`, and the uploader rejects that with `Zip must contain exactly one SKILL.md file`. I ran into both while working around it locally, so the symlink is better left in place. ## Suggested fix The source archive was never meant to be a skill package. A purpose-built zip published as a release asset avoids the symlink, because it copies from the root `SKILL.md`, which is a regular file. I tested this structure locally, and it uploads and replaces the skill through the GUI without errors: ``` humanizer/ └── SKILL.md ``` The workflow below was generated by Claude Code, so treat it as a starting point rather than something I have run in CI. It assumes you publish GitHub Releases: ```yaml - name: Build GUI-ready zip run: | mkdir -p dist/humanizer cp SKILL.md dist/humanizer/SKILL.md cd dist && zip -r humanizer-skill.zip humanizer - name: Attach to release env: GH_TOKEN: ${{ github.token }} run: gh release upload "${{ github.event.release.tag_name }}" dist/humanizer-skill.zip --clobber ``` If you don't cut releases, a tag trigger or a documented manual step in the README would solve it too. Either way the Skills CLI, the plugin loader, and `validate-package.py` stay untouched. Best regards, Sérgio Sousa
Sign in to join this conversation.
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
skills/blader-humanizer#224
No description provided.