Skip to content

feat(plugin): add cowork-converter#2091

Open
sebastian-sieber wants to merge 2 commits into
github:stagedfrom
sebastian-sieber:add-cowork-converter
Open

feat(plugin): add cowork-converter#2091
sebastian-sieber wants to merge 2 commits into
github:stagedfrom
sebastian-sieber:add-cowork-converter

Conversation

@sebastian-sieber

Copy link
Copy Markdown

Summary

Adds the cowork-converter plugin — a skill that converts a GitHub Copilot CLI plugin, Claude Code plugin, or any agent-skills directory into a distributable Microsoft 365 Copilot Cowork package (zip).

What it does

  • Discovers all skills (SKILL.md files) from Copilot CLI, Claude Code, or bare-skills layouts
  • Validates name/folder match and companion file limits per the Cowork spec
  • Resolves shared top-level references into per-skill references/ folders (Cowork requires per-skill locality)
  • Generates manifest.json v1.28 with agentSkills[] entries
  • Creates solid-color placeholder icons if none exist (pure Python stdlib, no third-party deps)
  • Packages a compliant .zip rooted at manifest.json
  • Prints a per-skill validation report

Trigger phrases

"Convert my plugin to Cowork"
"Package these skills as a Cowork zip"
"Build a cowork.zip from this Claude plugin"

Files added

File Purpose
skills/cowork-converter/skill.md Skill definition with full workflow, validation rules, and sideload instructions
skills/cowork-converter/scripts/convert.py Standalone Python 3 converter (stdlib only)
plugins/cowork-converter/.github/plugin/plugin.json Plugin metadata
plugins/cowork-converter/README.md Usage documentation

Checklist

  • Branch created from staged
  • npm install && npm start run — docs/README.skills.md, docs/README.plugins.md, and marketplace.json updated
  • Skill name matches folder name (cowork-converter)
  • No third-party dependencies required
  • License: MIT

Converts a GitHub Copilot CLI / Claude Code plugin to a Microsoft 365
Copilot Cowork package (.zip).

- skills/cowork-converter/skill.md — skill definition with source
  format detection, validation rules, and sideload instructions
- skills/cowork-converter/scripts/convert.py — Python 3 converter
  (stdlib only, no third-party deps): discovers skills, validates
  name/folder match and companion file limits, resolves shared
  references per-skill, generates manifest.json v1.28, creates
  placeholder icons, packages a compliant zip
- plugins/cowork-converter/.github/plugin/plugin.json — plugin metadata
- plugins/cowork-converter/README.md — usage documentation

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 22, 2026 16:15
@github-actions github-actions Bot added new-submission PR adds at least one new contribution plugin PR touches plugins skills PR touches skills labels Jun 22, 2026
@github-actions

github-actions Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

🔒 PR Risk Scan Results

Scanned 7 changed file(s).

Severity Count
🔴 High 0
🟠 Medium 4
ℹ️ Info 1
Severity Rule File Line Match
🟠 package-exec-command docs/README.skills.md 31 | [acreadiness-assess](../skills/acreadiness-assess/SKILL.md)&lt;br /&gt;`gh skills install github/awesome-copilot acreadiness-assess` | Run the AgentRC readiness assessment on the curre
ℹ️ skill-script-touched skills/cowork-converter/scripts/convert.py 1 skills/cowork-converter/scripts/convert.py
🟠 unpinned-version-indicator skills/cowork-converter/scripts/convert.py 221 if size &gt; 5 * 1024 * 1024:
🟠 unpinned-version-indicator skills/cowork-converter/scripts/convert.py 235 if companion_count &gt; 20:
🟠 unpinned-version-indicator skills/cowork-converter/scripts/convert.py 237 if companion_total_size &gt; 10 * 1024 * 1024:

This is an automated soft-gate report. Findings indicate review targets and do not block merge by themselves.

@github-actions github-actions Bot added the skill-check-error Skill validator reported errors label Jun 22, 2026
@github-actions

github-actions Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

🔍 Skill Validator Results

✅ All checks passed

Scope Checked
Skills 1
Agents 0
Total 1
Severity Count
❌ Errors 0
⚠️ Warnings 0
ℹ️ Advisories 0

Summary

Level Finding
ℹ️ Found 1 skill(s)
ℹ️ [cowork-converter] 📊 cowork-converter: 1,594 BPE tokens [chars/4: 1,573] (detailed ✓), 14 sections, 5 code blocks
ℹ️ ✅ All checks passed (1 skill(s))
Full validator output
Found 1 skill(s)
[cowork-converter] 📊 cowork-converter: 1,594 BPE tokens [chars/4: 1,573] (detailed ✓), 14 sections, 5 code blocks
✅ All checks passed (1 skill(s))

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions github-actions Bot removed the skill-check-error Skill validator reported errors label Jun 22, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new cowork-converter plugin/skill to the Awesome Copilot collection, intended to convert existing Copilot/Claude skills layouts into a Microsoft 365 Copilot Cowork zip package (manifest + per-skill folders + icons), using a standalone Python (stdlib-only) conversion script.

Changes:

  • Introduces a new skill definition and a Python converter script for packaging skills into a Cowork-compliant .zip.
  • Adds a new plugin (plugins/cowork-converter) that ships the skill.
  • Updates generated documentation indexes and marketplace metadata to include the new skill/plugin.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
skills/cowork-converter/skill.md Adds the skill documentation/workflow (but currently not in the expected SKILL.md location/name).
skills/cowork-converter/scripts/convert.py Implements the conversion/validation/packaging logic in Python.
plugins/cowork-converter/README.md Plugin-level usage documentation and examples.
plugins/cowork-converter/.github/plugin/plugin.json Plugin metadata and skill inclusion.
docs/README.skills.md Adds the skill to the generated skills index (currently links to a non-existent SKILL.md).
docs/README.plugins.md Adds the plugin to the generated plugins index.
.github/plugin/marketplace.json Adds the plugin entry to the generated marketplace list.

Comment thread docs/README.skills.md
| [copilot-spaces](../skills/copilot-spaces/SKILL.md)<br />`gh skills install github/awesome-copilot copilot-spaces` | Use Copilot Spaces to provide project-specific context to conversations. Use this skill when users mention a "Copilot space", want to load context from a shared knowledge base, discover available spaces, or ask questions grounded in curated project documentation, code, and instructions. | None |
| [copilot-usage-metrics](../skills/copilot-usage-metrics/SKILL.md)<br />`gh skills install github/awesome-copilot copilot-usage-metrics` | Retrieve and display GitHub Copilot usage metrics for organizations and enterprises using the GitHub CLI and REST API. | `get-enterprise-metrics.sh`<br />`get-enterprise-user-metrics.sh`<br />`get-org-metrics.sh`<br />`get-org-user-metrics.sh` |
| [cosmosdb-datamodeling](../skills/cosmosdb-datamodeling/SKILL.md)<br />`gh skills install github/awesome-copilot cosmosdb-datamodeling` | Step-by-step guide for capturing key application requirements for NoSQL use-case and produce Azure Cosmos DB Data NoSQL Model design using best practices and common patterns, artifacts_produced: "cosmosdb_requirements.md" file and "cosmosdb_data_model.md" file | None |
| [cowork-converter](../skills/cowork-converter/SKILL.md)<br />`gh skills install github/awesome-copilot cowork-converter` | Convert a GitHub Copilot CLI plugin, Claude Code plugin, or any agent-skills directory into a Microsoft 365 Copilot Cowork package (.zip). Use when the user asks to convert, package, or publish a plugin to Cowork, mentions 'Cowork plugin', 'M365 Cowork', or asks to create a cowork.zip. Also triggers if the user asks to transform skills for Microsoft 365 Copilot distribution. | `scripts/convert.py`<br />`skill.md` |
Comment on lines +64 to +72
def companion_file_ok(path: Path) -> tuple[bool, str]:
name = path.name
if name.startswith("."):
return False, f"hidden file: {name}"
if name.upper() in UNSAFE_NAMES:
return False, f"Windows reserved name: {name}"
if ".." in path.parts:
return False, f"path traversal: {path}"
return True, ""
Comment on lines +7 to +17
import argparse
import json
import os
import re
import shutil
import struct
import sys
import uuid
import zipfile
import zlib
from pathlib import Path
Comment on lines +153 to +156
plugin_slug = re.sub(r"[^a-z0-9-]", "-", args.name_short.lower()).strip("-")
output_root = Path(args.output).expanduser().resolve() if args.output else source.parent
out = output_root / f"{plugin_slug}-cowork"

Comment on lines +162 to +170
out.mkdir(parents=True)
skills_out = out / "skills"
skills_out.mkdir()

# ── Discover skills ───────────────────────────────────────────────────────
skill_folders = discover_skills(source)
if not skill_folders:
print("ERROR: No skills found (looking for SKILL.md in sub-directories).", file=sys.stderr)
return 1
Comment on lines +75 to +80
def generate_placeholder_icon(size: int, color_hex: str = "#0078D4") -> bytes:
"""Generate a minimal solid-color PNG."""
r = int(color_hex[1:3], 16)
g = int(color_hex[3:5], 16)
b = int(color_hex[5:7], 16)

Comment on lines +295 to +300
zip_path = output_root / f"{plugin_slug}-cowork.zip"
with zipfile.ZipFile(zip_path, "w", compression=zipfile.ZIP_DEFLATED) as zf:
for file in sorted(out.rglob("*")):
if file.is_file() and not file.name.startswith("."):
zf.write(file, file.relative_to(out))

@aaronpowell aaronpowell left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this skill is overly complicated. There is a docs page (https://learn.microsoft.com/en-us/microsoft-365/copilot/cowork/cowork-plugin-development) that covers how to create them, and it provides a PowerShell script that will generate the package, which would be better to use than a bespoke Python script as you'd be using the official one.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new-submission PR adds at least one new contribution plugin PR touches plugins skills PR touches skills

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants