Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,12 @@
"description": "Build applications with the GitHub Copilot SDK across multiple programming languages. Includes comprehensive instructions for C#, Go, Node.js/TypeScript, and Python to help you create AI-powered applications.",
"version": "1.0.0"
},
{
"name": "cowork-converter",
"source": "cowork-converter",
"description": "Convert a GitHub Copilot CLI / Claude Code plugin to a Microsoft 365 Copilot Cowork package (.zip). Handles skill discovery, shared-reference resolution, manifest generation, icon placeholders, validation, and zip packaging.",
"version": "1.0.0"
},
{
"name": "csharp-dotnet-development",
"source": "csharp-dotnet-development",
Expand Down
1 change: 1 addition & 0 deletions docs/README.plugins.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ See [CONTRIBUTING.md](../CONTRIBUTING.md#adding-plugins) for guidelines on how t
| [context-engineering](../plugins/context-engineering/README.md) | Tools and techniques for maximizing GitHub Copilot effectiveness through better context management. Includes guidelines for structuring code, an agent for planning multi-file changes, and prompts for context-aware development. | 4 items | context, productivity, refactoring, best-practices, architecture |
| [context-matic](../plugins/context-matic/README.md) | Coding agents hallucinate APIs. ContextMatic gives them curated, versioned API and SDK docs. Ask your agent to "integrate the payments API" and it guesses — falling back on outdated training data and generic patterns that don't match your actual SDK. ContextMatic solves this by giving the agent deterministic, version-aware, SDK-native context at the exact moment it's needed. | 2 items | api-context, api-integration, mcp, sdk, apimatic, third-party-apis, sdks |
| [copilot-sdk](../plugins/copilot-sdk/README.md) | Build applications with the GitHub Copilot SDK across multiple programming languages. Includes comprehensive instructions for C#, Go, Node.js/TypeScript, and Python to help you create AI-powered applications. | 1 items | copilot-sdk, sdk, csharp, go, nodejs, typescript, python, ai, github-copilot |
| [cowork-converter](../plugins/cowork-converter/README.md) | Convert a GitHub Copilot CLI / Claude Code plugin to a Microsoft 365 Copilot Cowork package (.zip). Handles skill discovery, shared-reference resolution, manifest generation, icon placeholders, validation, and zip packaging. | 1 items | cowork, microsoft-365, m365, plugin-converter, agent-skills, copilot |
| [csharp-dotnet-development](../plugins/csharp-dotnet-development/README.md) | Essential prompts, instructions, and chat modes for C# and .NET development including testing, documentation, and best practices. | 9 items | csharp, dotnet, aspnet, testing |
| [database-data-management](../plugins/database-data-management/README.md) | Database administration, SQL optimization, and data management tools for PostgreSQL, SQL Server, and general database development best practices. | 6 items | database, sql, postgresql, sql-server, dba, optimization, queries, data-management |
| [dataverse-sdk-for-python](../plugins/dataverse-sdk-for-python/README.md) | Comprehensive collection for building production-ready Python integrations with Microsoft Dataverse. Includes official documentation, best practices, advanced features, file operations, and code generation prompts. | 4 items | dataverse, python, integration, sdk |
Expand Down
1 change: 1 addition & 0 deletions docs/README.skills.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ See [CONTRIBUTING.md](../CONTRIBUTING.md#adding-skills) for guidelines on how to
| [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` |
| [create-agentsmd](../skills/create-agentsmd/SKILL.md)<br />`gh skills install github/awesome-copilot create-agentsmd` | Prompt for generating an AGENTS.md file for a repository | None |
| [create-architectural-decision-record](../skills/create-architectural-decision-record/SKILL.md)<br />`gh skills install github/awesome-copilot create-architectural-decision-record` | Create an Architectural Decision Record (ADR) document for AI-optimized decision documentation. | None |
| [create-github-action-workflow-specification](../skills/create-github-action-workflow-specification/SKILL.md)<br />`gh skills install github/awesome-copilot create-github-action-workflow-specification` | Create a formal specification for an existing GitHub Actions CI/CD workflow, optimized for AI consumption and workflow maintenance. | None |
Expand Down
22 changes: 22 additions & 0 deletions plugins/cowork-converter/.github/plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"name": "cowork-converter",
"version": "1.0.0",
"description": "Convert a GitHub Copilot CLI / Claude Code plugin to a Microsoft 365 Copilot Cowork package (.zip). Handles skill discovery, shared-reference resolution, manifest generation, icon placeholders, validation, and zip packaging.",
"keywords": [
"cowork",
"microsoft-365",
"m365",
"plugin-converter",
"agent-skills",
"copilot"
],
"author": {
"name": "sebastian-sieber",
"url": "https://github.com/sebastian-sieber"
},
"repository": "https://github.com/github/awesome-copilot",
"license": "MIT",
"skills": [
"./skills/cowork-converter/"
]
}
61 changes: 61 additions & 0 deletions plugins/cowork-converter/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# cowork-converter

Convert 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

Transforms an existing plugin into the M365 Unified App Manifest v1.28 format required by Copilot Cowork:

- 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
- Generates `manifest.json` with `agentSkills[]` entries
- Creates solid-color placeholder icons if none exist (pure stdlib PNG, no dependencies)
- Packages a compliant `.zip` rooted at `manifest.json`
- Prints a per-skill validation report

## Usage

After installing the plugin, ask Copilot:

> *"Convert my plugin at ~/my-plugin to a Cowork package"*
> *"Package these skills as a Cowork zip"*
> *"Build a cowork.zip from this Claude plugin"*

Or run the script directly:

```bash
python skills/cowork-converter/scripts/convert.py \
--source ./my-plugin \
--output ./dist \
--name-short "My Plugin" \
--name-full "My Plugin for Copilot Cowork" \
--description-short "One-line description" \
--description-full "Full description." \
--developer-name "Your Name" \
--website "https://example.com" \
--privacy-url "https://example.com/privacy" \
--terms-url "https://example.com/terms"
```

## Requirements

- Python 3.8+ (standard library only, no third-party packages)

## Output

```
<plugin-name>-cowork/
├── manifest.json
├── color.png # 192×192
├── outline.png # 32×32
└── skills/
└── <skill-name>/
├── SKILL.md
└── references/
<plugin-name>-cowork.zip
```

## Source

Plugin maintained at [sebastian-sieber/cowork-converter](https://github.com/sebastian-sieber/cowork-converter).
165 changes: 165 additions & 0 deletions skills/cowork-converter/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
---
name: cowork-converter
description: "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."
---

# Cowork Plugin Converter

Convert any Copilot CLI / Claude Code plugin into a distributable Microsoft 365 Copilot Cowork package.

## What this skill produces

```
<plugin-name>-cowork/
├── manifest.json # M365 Unified App Manifest v1.28 with agentSkills
├── color.png # 192×192 color icon
├── outline.png # 32×32 outline icon
└── skills/
└── <skill-name>/
├── SKILL.md
└── references/ # Per-skill copy of shared reference files
<plugin-name>-cowork.zip # Ready-to-sideload package
```

## Inputs to gather

Before running the conversion script, confirm:

1. **Source plugin directory** — the folder containing the existing skills. If not provided, ask the user.
2. **Output directory** — where to write the cowork package. Default: parent of source dir.
3. **Plugin name** — short (≤30 chars) and full display name. Infer from source directory name if `plugin.json` / `manifest.json` is absent, then confirm with user.
4. **Description** — short (≤80 chars) and full (≤4000 chars). Infer from existing metadata if available.
5. **Developer info** — name, website, privacy URL, terms URL. Use reasonable defaults (e.g., from existing plugin.json), but confirm if absent.
6. **Accent color** — hex code. Default `#0078D4`.
7. **Icons** — check whether `color.png` and `outline.png` already exist at the source root. If absent, generate solid-color placeholders using the script.

## Source formats recognised

| Source format | Skill detection | Shared refs detection |
|---|---|---|
| Copilot CLI plugin (`skills/*/skill.md` or `SKILL.md`) | Walk `skills/` sub-dirs | `references/` at plugin root |
| Claude Code plugin (`.claude-plugin/plugin.json` + `skills/`) | Walk `skills/` sub-dirs | Top-level `.md` files listed in `plugin.json` |
| Bare skills directory (`*/SKILL.md` at root) | Walk root sub-dirs | Any `references/` or `*.md` at root |

## Conversion workflow

Run `scripts/convert.py` (shown below). If it fails, follow the manual steps.

### Step 1 — Run the converter script

```bash
python ~/.copilot/skills/cowork-converter/scripts/convert.py \
--source <source-plugin-dir> \
--output <output-dir> \
--name-short "My Plugin" \
--name-full "My Plugin for Copilot Cowork" \
--description-short "One-line description" \
--description-full "Full description up to 4000 chars." \
--developer-name "Your Name" \
--website "https://example.com" \
--privacy-url "https://example.com/privacy" \
--terms-url "https://example.com/terms" \
--accent-color "#0078D4"
```

The script:
- Discovers all skills in the source directory
- Validates each skill's `name` frontmatter matches its folder name
- Copies skills to `skills/<name>/SKILL.md`
- Copies companion files (references, scripts, etc.) into each skill's folder
- Resolves shared top-level references: copies them into every skill's `references/` folder that links to them
- Generates `manifest.json` with all `agentSkills` entries
- Creates placeholder icons if none exist (solid `#0078D4` squares)
- Packages everything into `<plugin-name>-cowork.zip`
- Prints a validation report

### Step 2 — Review the validation report

The script outputs a table like:

```
Skill Folder/name match Companion files Size
audit ✓ 5/20 42 KB
design-qa ✓ 5/20 38 KB
...
TOTAL: 11 skills, all valid
```

Fix any `✗` entries before distributing.

### Step 3 — Replace placeholder icons (if needed)

If placeholder icons were generated, the script warns you. Replace them:
- `color.png`: 192×192 px, full-color PNG
- `outline.png`: 32×32 px, single-color outline PNG

### Step 4 — Sideload for testing

```bash
npm install -g @microsoft/m365agentstoolkit-cli
atk auth login
atk install --file-path <plugin-name>-cowork.zip --scope Personal
```

### Step 5 — Publish to tenant

Upload via **M365 Admin Center → Manage Apps → Upload custom app**, then enable in **Cowork → Sources & Skills**.

## Validation rules (enforce these)

- Skill folder name must exactly match the `name` field in `SKILL.md` frontmatter (kebab-case)
- `name` field: 1–64 chars, kebab-case only (lowercase, hyphens, no underscores, no consecutive hyphens)
- `description` field: 1–1024 chars
- Max 20 companion files per skill
- Max 5 MB per companion file, max 10 MB total per skill
- No path traversal (`..`) in companion file paths
- No hidden files (`.` prefix) as companion files
- Icons must be PNG; `color.png` must be 192×192, `outline.png` must be 32×32

## What is NOT converted (inform the user)

| Source feature | Status |
|---|---|
| `commands/` (slash commands) | Not supported in Cowork |
| `agents/` sub-agents or `agents/openai.yaml` | Not supported in Cowork |
| `hooks/` event handlers | Not supported in Cowork |
| `settings.json` | Not applicable |
| `bin/` executables | Not applicable |
| `.mcp.json` MCP servers | Converted to `agentConnectors[]` if URL is present |

## MCP connector conversion (optional)

If the source has a `.mcp.json` with remote HTTPS server entries, add them to `manifest.json`:

```json
"agentConnectors": [
{
"id": "<server-id>",
"displayName": "<display name>",
"description": "<description>",
"toolSource": {
"remoteMcpServer": {
"mcpServerUrl": "<https url>",
"authorization": {
"type": "OAuthPluginVault",
"referenceId": "<oauth-registration-id>"
}
}
}
}
]
```

Local (`stdio`) MCP servers cannot be converted — inform the user.

## Final response

After a successful conversion, report:

- Output directory path
- Zip file path
- Number of skills converted
- List of skills with companion file counts
- Any features skipped (not supported in Cowork)
- Icon status (original vs generated placeholder)
- Next step: sideload command
Loading
Loading