fix: correct skill-only .skill packaging structure in Step 6
This commit is contained in:
@@ -174,10 +174,11 @@ Both destinations are required. Confirm both are written before proceeding.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Step 6 — Package the .plugin File (skip for skill-only with no MCP server)
|
## Step 6 — Package the .skill / .plugin File
|
||||||
|
|
||||||
If the plugin has an MCP server component (has `.mcp.json` and a `server/` directory),
|
### For plugins with an MCP server (has `.mcp.json` and `server/` directory)
|
||||||
build a fresh `.plugin` package from the downloaded repo archive:
|
|
||||||
|
Build a `.plugin` package from the repo. No structural constraints on top-level folders:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd /tmp/plugin-repo/[repo-folder-name]
|
cd /tmp/plugin-repo/[repo-folder-name]
|
||||||
@@ -189,24 +190,53 @@ zip -r /tmp/[plugin-name]-v[version].plugin \
|
|||||||
# Add any additional skills/ subdirectories if multiple skills exist
|
# Add any additional skills/ subdirectories if multiple skills exist
|
||||||
```
|
```
|
||||||
|
|
||||||
For skill-only plugins (no `server/` directory, no `.mcp.json`), package only the skill files:
|
### For skill-only packages (no `server/` directory, no `.mcp.json`)
|
||||||
|
|
||||||
|
**Critical structure requirement:** The zip must contain **exactly one top-level folder**
|
||||||
|
with `SKILL.md` directly inside it. Do NOT zip `.claude-plugin/` and `skills/` as separate
|
||||||
|
top-level entries — the upload validator will reject it with "Zip must contain exactly one
|
||||||
|
top-level folder" and "SKILL.md must be in the top-level folder, not nested deeper."
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd /tmp/plugin-repo/[repo-folder-name]
|
# Stage into a clean directory with one top-level folder named after the skill
|
||||||
zip -r /tmp/[plugin-name]-v[version].plugin \
|
mkdir -p /tmp/[skill-name]-pkg/[skill-name]/
|
||||||
.claude-plugin/plugin.json \
|
cp skills/[skill-name]/SKILL.md /tmp/[skill-name]-pkg/[skill-name]/SKILL.md
|
||||||
|
# Copy any subdirectories (references/, assets/, etc.) if present
|
||||||
|
cp -r skills/[skill-name]/references/ /tmp/[skill-name]-pkg/[skill-name]/references/
|
||||||
|
|
||||||
|
# Zip from the staging dir — SKILL.md ends up at root of the single top-level folder
|
||||||
|
cd /tmp/[skill-name]-pkg
|
||||||
|
zip -r /tmp/[skill-name]-v[version].skill [skill-name]/
|
||||||
|
```
|
||||||
|
|
||||||
|
**Verify before uploading** — contents must look like this:
|
||||||
|
```
|
||||||
|
[skill-name]/
|
||||||
|
SKILL.md ← directly here, NOT nested
|
||||||
|
references/ ← optional
|
||||||
|
*.md
|
||||||
|
```
|
||||||
|
|
||||||
|
NOT like this (will be rejected by the upload validator):
|
||||||
|
```
|
||||||
|
.claude-plugin/
|
||||||
|
plugin.json
|
||||||
skills/
|
skills/
|
||||||
# Include all files under skills/ recursively
|
[skill-name]/
|
||||||
|
SKILL.md
|
||||||
```
|
```
|
||||||
|
|
||||||
**Upload to Drive:**
|
**Upload to Drive:**
|
||||||
Use `create_drive_file` with:
|
Use `create_drive_file` with:
|
||||||
- `file_name`: `[plugin-name]-v[version].plugin`
|
- `file_name`: `[skill-name]-v[version].skill`
|
||||||
- `folder_id`: the CW-XXX folder ID from Step 4
|
- `folder_id`: the CW-XXX folder ID from Step 4
|
||||||
- `mime_type`: `application/zip`
|
- `mime_type`: `application/zip`
|
||||||
- `fileUrl`: `file:///[outputs-path]/[plugin-name]-v[version].plugin`
|
- `fileUrl`: `file:///[outputs-path]/[skill-name]-v[version].skill`
|
||||||
|
|
||||||
If an older `.plugin` file exists in the folder, trash it first:
|
Note: The Drive API server runs on the host, not the sandbox. Copy the file from `/tmp`
|
||||||
|
to the outputs directory first, then reference it via the host path (not the VM `/tmp` path).
|
||||||
|
|
||||||
|
If an older `.skill` or `.plugin` file exists in the folder, trash it first:
|
||||||
- Use `search_drive_files` to find it by name pattern in the folder
|
- Use `search_drive_files` to find it by name pattern in the folder
|
||||||
- Use `update_drive_file` with `trashed: true`
|
- Use `update_drive_file` with `trashed: true`
|
||||||
|
|
||||||
@@ -277,7 +307,7 @@ Before writing the registry row, confirm:
|
|||||||
|
|
||||||
- [ ] README.md is in the Drive folder (check via `search_drive_files` or confirm upload ID)
|
- [ ] README.md is in the Drive folder (check via `search_drive_files` or confirm upload ID)
|
||||||
- [ ] Wiki doc is in the Drive folder (confirm parent folder ID matches)
|
- [ ] Wiki doc is in the Drive folder (confirm parent folder ID matches)
|
||||||
- [ ] .plugin file is in the Drive folder (or note "skill-only, no .plugin" explicitly)
|
- [ ] .skill/.plugin file is in the Drive folder (or note "skill-only, no .skill" explicitly)
|
||||||
|
|
||||||
If any artifact failed to land in the folder, resolve it before proceeding.
|
If any artifact failed to land in the folder, resolve it before proceeding.
|
||||||
|
|
||||||
@@ -303,7 +333,7 @@ Adjust if the user specifies otherwise.
|
|||||||
|
|
||||||
Report every artifact with its link:
|
Report every artifact with its link:
|
||||||
- README location: Drive link + Git link (if pushed)
|
- README location: Drive link + Git link (if pushed)
|
||||||
- .plugin file: Drive link and version (or "skill-only, not applicable")
|
- .skill/.plugin file: Drive link and version (or "skill-only, not applicable")
|
||||||
- Wiki Doc: Google Doc link
|
- Wiki Doc: Google Doc link
|
||||||
- Registry: link to sheet
|
- Registry: link to sheet
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user