diff --git a/skills/cowork-project/references/mode-document.md b/skills/cowork-project/references/mode-document.md index 96a4915..4894620 100644 --- a/skills/cowork-project/references/mode-document.md +++ b/skills/cowork-project/references/mode-document.md @@ -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), -build a fresh `.plugin` package from the downloaded repo archive: +### For plugins with an MCP server (has `.mcp.json` and `server/` directory) + +Build a `.plugin` package from the repo. No structural constraints on top-level folders: ```bash 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 ``` -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 -cd /tmp/plugin-repo/[repo-folder-name] -zip -r /tmp/[plugin-name]-v[version].plugin \ - .claude-plugin/plugin.json \ - skills/ -# Include all files under skills/ recursively +# Stage into a clean directory with one top-level folder named after the skill +mkdir -p /tmp/[skill-name]-pkg/[skill-name]/ +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/ + [skill-name]/ + SKILL.md ``` **Upload to Drive:** 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 - `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 `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) - [ ] 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. @@ -303,7 +333,7 @@ Adjust if the user specifies otherwise. Report every artifact with its link: - 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 - Registry: link to sheet