Skills share
Skill idan-yaron/claude-cowork-skills-toolkit/skills/skills-share
Fetch, share, and sync Claude skills between GitHub and your Cowork sessions
npx -y skills add idan-yaron/claude-cowork-skills-toolkit --skill skills-shareAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Package skills already installed in your Cowork session as a downloadable .zip file you can save to disk and share. Use when user says "share my skills", "export installed skills", "download my skills", "send these skills to a colleague", "package skills for sharing", or runs /skills-share. This is for exporting skills you ALREADY have — to get skills from a GitHub repo, use /skills-load instead.
SKILL.md
9.1 KB, as published. Nobody here has run it
Share Installed Skills
Export one or more already-installed skills as a downloadable .zip file.
The user downloads it via the Cowork preview and saves it wherever they want —
Desktop, Documents, a project folder, Slack, email attachment.
This skill does NOT install the exported plugin back into Cowork. The
skills are already installed. The .zip format deliberately avoids the
"Save plugin"/"Save skill" install prompts that .plugin/.skill extensions
trigger — the user gets a standard file download instead.
This skill is for exporting what you already have. To get new skills from
a GitHub repo, use /skills-load.
VM constraints (why we use the session outputs folder and .zip)
The Cowork VM has a fixed set of mount points. None of them is the user's
Desktop or an arbitrary host path — the Write tool cannot reach
~/Desktop/anything unless the user has explicitly mounted that folder.
What DOES work: /sessions/<session>/mnt/outputs/ is a VM→host bridge mount.
Files written there are surfaced in the Cowork UI by mcp__cowork__present_files.
A .zip file presented this way gives the user a download button — they save
it wherever they want via their OS file picker.
- Bash runs in the VM — use it to enumerate installed skills AND build the ZIP entirely inside the VM.
- Read tool can read from VM-mounted skill directories (not used in the new flow — Bash+Python reads files directly).
- Write tool bridges to the host but only where mounts exist — NOT used in this skill.
mcp__cowork__present_filessurfaces the built ZIP for download.
When to use this vs /skills-load
| Situation | Use |
|---|---|
| "I found a repo with skills I want" | /skills-load <url> |
| "I want to send skills from my session to a colleague" | /skills-share |
| "I want to archive the skills I use" | /skills-share |
| "I want to hand off skills whose GitHub source is gone" | /skills-share |
Step 1: Enumerate installed skills
bash "${CLAUDE_PLUGIN_ROOT}/skills/skills-share/scripts/list-installed-skills.sh"
Returns JSON array of {name, description, path, source} objects where
source is one of skills-plugin, domain-plugin, or remote-plugin.
If the array is empty:
No skills installed in this session.
Use
/skills-load <github-url>to install skills from a repo first.
Then stop.
Step 2: Show the catalog
Display a numbered table:
Installed skills in this session ({N} total):
# Skill Description Source 1 PDF processing toolkit skills-plugin 2 xlsx Excel spreadsheet handling skills-plugin 3 roadmap-planning Build quarterly roadmaps... domain-plugin 4 discovery-process Run product discovery... domain-plugin Which to include? Pick by number (
1, 3), name, keyword search ("roadmap"), or--all.
If $ARGUMENTS contains skill names or --all, use those directly. Otherwise
wait for the user to choose.
Also ask for a package name:
Package name? (default:
shared-skills)
Don't ask where to save — the user will choose that when they download the
.zip from the preview.
Step 3: Confirm selection (with dependency warning)
Before building, show what will be packaged:
Will package:
Skill Source roadmap-planning domain-plugin discovery-process domain-plugin
Warn about missing cross-references (do not auto-include): Read each selected SKILL.md and scan for references to OTHER installed skills not in the selection. If found:
Note:
roadmap-planningreferencescompetitive-analysis(installed but not selected). The shared plugin may point to a skill the recipient doesn't have. Include it? (y/n)
User stays in control. Skills-share is a packaging tool, not a curator.
Step 4: Build the .zip inside the VM
Sanitize the package name: kebab-case, [a-z0-9-] only. Reject and re-ask if
sanitizing produces an empty string.
Build the ZIP entirely in Bash+Python. All file reading happens inside the VM — no content passes through Claude's context.
python3 << 'PYEOF'
import zipfile, json, os, re, glob
# ── Substitute these values from the /skills-share context ──
pkg_name = "<PKG_NAME>" # e.g., "my-shared-skills"
skill_paths = [<SKILL_PATHS>] # e.g., ["/path/to/skill-a", "/path/to/skill-b"]
# Cowork outputs dir lives at /sessions/<session>/mnt/outputs/ — discover it.
out_dirs = glob.glob('/sessions/*/mnt/outputs')
if not out_dirs:
raise RuntimeError("Cowork outputs dir not found - is this a Cowork VM session?")
out_dir = out_dirs[0]
out_path = os.path.join(out_dir, pkg_name + '.zip')
with zipfile.ZipFile(out_path, 'w', zipfile.ZIP_DEFLATED) as zf:
# Plugin manifest
manifest = json.dumps({
"name": pkg_name,
"description": "Skills exported from Cowork session",
"version": "1.0.0",
"author": {"name": "Exported by skills-toolkit"},
"keywords": ["skills", "shared", pkg_name]
}, indent=2)
zf.writestr(".claude-plugin/plugin.json", manifest)
# Copy each skill's full directory tree
for skill_path in skill_paths:
if not os.path.isdir(skill_path):
continue
skill_name = os.path.basename(skill_path)
skill_name = re.sub(r'[^a-zA-Z0-9_-]', '-', skill_name).strip('-')
for root, dirs, files in os.walk(skill_path):
for f in files:
fp = os.path.join(root, f)
rel = os.path.relpath(fp, skill_path)
arc = "skills/" + skill_name + "/" + rel.replace('\\', '/')
zf.write(fp, arc)
print(out_path)
PYEOF
Substitute actual values into the <PLACEHOLDER> slots above. skill_paths
is a Python list of quoted path strings. Capture the output path printed by
the script.
Why .zip not .plugin: presenting a .plugin file via present_files
triggers Cowork's "Save plugin" install button, which is wrong here — the user
already has these skills installed. .zip surfaces as a plain download, and
it's still directly accepted by Customize > Personal Plugin on the receiving end.
Why the session outputs folder, not /tmp/: /sessions/<session>/mnt/outputs/
is a VM→host bridge mount that present_files surfaces in the Cowork UI.
/tmp/ is VM-only.
Step 5: Present the .zip for download
Load mcp__cowork__present_files via ToolSearch, then call it with this exact
shape — files is a list of objects, each with a single file_path key:
mcp__cowork__present_files(files=[{"file_path": "<zip-path-from-python>"}])
The path MUST be the Linux path printed by the Python script in step 4 (under
/sessions/<session>/mnt/outputs/). Windows-style paths and /outputs/ paths
are rejected.
The Cowork UI shows a download action. The user clicks it, picks a location with their OS file picker (Desktop, Documents, anywhere), and the file lands on their host. No mount configuration needed, no manual zipping.
Step 6: Report
{pkg-name}.zipready to download — {N} skills packaged:
Skill Source roadmap-planning domain-plugin discovery-process domain-plugin Download the
.zipfrom the preview above. Save it wherever you want.To use/share it:
- Send to a colleague: Email, Slack, or attach the
.zipdirectly.- Install in Cowork: Customize > Personal Plugin (+) > Create plugin > Upload plugin (accepts
.zipdirectly — no renaming needed).- Use with Claude Code CLI: Extract the
.zip, thenclaude --plugin-dir ./{pkg-name}/
Edge cases
- No skills installed: Exit with a suggestion to run
/skills-loadfirst. - Skill with only SKILL.md (no supporting files): Works fine — the ZIP just contains the manifest and one SKILL.md.
- User picks skills from multiple sources: Fine, all get bundled together. Note mixed sources in the report.
- Sanitized name empty: If the package name sanitizes to nothing, ask for a new name.
- Binary supporting files (fonts, images, etc.): Bash+Python copies them correctly into the ZIP — no content passes through Claude. This is an advantage of the VM-build approach.
present_filesunavailable: Tell the user the file is at/sessions/<session>/mnt/outputs/{pkg-name}.zipin the VM. The session outputs folder maps to Cowork's app data on the host — on Windows that's%APPDATA%\Claude\local-agent-mode-sessions\..., on macOS it's~/Library/Application Support/Claude/local-agent-mode-sessions/....