Skip to content

feat(plugin): add cowork-converter#2091

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

feat(plugin): add cowork-converter#2091
sebastian-sieber wants to merge 2 commits into
github:mainfrom
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.

@aaronpowell aaronpowell changed the base branch from staged to main June 25, 2026 04:41
@github-actions github-actions Bot added the targets-main PR targets main instead of staged label Jun 25, 2026
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