$npx -y skills add ReScienceLab/opc-skills --skill add-new-opc-skillChecklist and automation guide for adding a new skill to the OPC Skills project. Ensures all required files, metadata, logos, and listings are created before release. Use when adding a new skill, publishing a skill, or preparing a skill for release.
| 1 | # Add New OPC Skill |
| 2 | |
| 3 | Use this skill when adding a new skill to the OPC Skills project. Follow every step below to ensure the skill meets all publishing requirements. |
| 4 | |
| 5 | ## Pre-flight |
| 6 | |
| 7 | Before starting, confirm: |
| 8 | - You are on a feature branch: `feature/skill/<skill-name>` (branched from `develop`) |
| 9 | - The skill name is kebab-case (e.g., `my-new-skill`) |
| 10 | |
| 11 | ## Checklist |
| 12 | |
| 13 | ### 1. Skill Directory Structure |
| 14 | |
| 15 | Create the skill directory with required files: |
| 16 | |
| 17 | ``` |
| 18 | skills/<skill-name>/ |
| 19 | ├── SKILL.md (required) Main skill documentation |
| 20 | ├── scripts/ (if skill has scripts) |
| 21 | │ └── *.py / *.sh |
| 22 | ├── examples/ (recommended) Usage examples |
| 23 | │ └── *.md |
| 24 | └── references/ (optional) API docs, templates |
| 25 | └── *.md |
| 26 | ``` |
| 27 | |
| 28 | **SKILL.md** must include YAML frontmatter: |
| 29 | |
| 30 | ```yaml |
| 31 | --- |
| 32 | name: <skill-name> |
| 33 | description: Clear description. Include trigger keywords and "Use when..." contexts. |
| 34 | --- |
| 35 | ``` |
| 36 | |
| 37 | Use `template/SKILL.md` as a starting point: |
| 38 | |
| 39 | ```bash |
| 40 | cp -r template skills/<skill-name> |
| 41 | ``` |
| 42 | |
| 43 | ### 2. Skill Logo |
| 44 | |
| 45 | Generate a pixel-art style SVG logo matching existing skill logos: |
| 46 | |
| 47 | ```bash |
| 48 | # Use the logo-creator skill |
| 49 | python3 skills/nanobanana/scripts/batch_generate.py \ |
| 50 | "Pixel art <subject> logo, 8-bit retro style, black pixels on white background, minimalist icon, clean crisp edges, no text, centered" \ |
| 51 | -n 20 --ratio 1:1 \ |
| 52 | -d .skill-archive/logo-creator/<date>-<skill-name> \ |
| 53 | -p logo |
| 54 | |
| 55 | # Open preview to pick a logo |
| 56 | cp skills/logo-creator/templates/preview.html .skill-archive/logo-creator/<date>-<skill-name>/ |
| 57 | open .skill-archive/logo-creator/<date>-<skill-name>/preview.html |
| 58 | |
| 59 | # After picking (e.g., #5): |
| 60 | python3 skills/logo-creator/scripts/crop_logo.py <input>.png <output>-cropped.png |
| 61 | python3 skills/logo-creator/scripts/vectorize.py <output>-cropped.png skill-logos/<skill-name>.svg |
| 62 | ``` |
| 63 | |
| 64 | Verify: `skill-logos/<skill-name>.svg` exists and matches the pixel-art style of other logos. |
| 65 | |
| 66 | ### 3. skills.json Entry |
| 67 | |
| 68 | Add a complete entry to the `skills` array in `skills.json`. All fields are required unless noted: |
| 69 | |
| 70 | ```json |
| 71 | { |
| 72 | "name": "<skill-name>", |
| 73 | "version": "1.0.0", |
| 74 | "description": "Full description of the skill.", |
| 75 | "logo": "https://raw.githubusercontent.com/ReScienceLab/opc-skills/main/skill-logos/<skill-name>.svg", |
| 76 | "icon": "<simpleicons-name>", |
| 77 | "color": "<hex-without-hash>", |
| 78 | "triggers": ["trigger1", "trigger2"], |
| 79 | "dependencies": {}, |
| 80 | "auth": { |
| 81 | "required": false, |
| 82 | "type": null, |
| 83 | "keys": [] |
| 84 | }, |
| 85 | "install": { |
| 86 | "user": { |
| 87 | "claude": "npx skills add ReScienceLab/opc-skills --skill <skill-name> -a claude", |
| 88 | "droid": "npx skills add ReScienceLab/opc-skills --skill <skill-name> -a droid", |
| 89 | "opencode": "npx skills add ReScienceLab/opc-skills --skill <skill-name> -a opencode", |
| 90 | "codex": "npx skills add ReScienceLab/opc-skills --skill <skill-name> -a codex" |
| 91 | }, |
| 92 | "project": { |
| 93 | "claude": "npx skills add ReScienceLab/opc-skills --skill <skill-name>", |
| 94 | "droid": "npx skills add ReScienceLab/opc-skills --skill <skill-name>", |
| 95 | "cursor": "npx skills add ReScienceLab/opc-skills --skill <skill-name>", |
| 96 | "opencode": "npx skills add ReScienceLab/opc-skills --skill <skill-name>", |
| 97 | "codex": "npx skills add ReScienceLab/opc-skills --skill <skill-name>" |
| 98 | } |
| 99 | }, |
| 100 | "commands": [ |
| 101 | "python3 scripts/example.py \"{input}\"" |
| 102 | ], |
| 103 | "links": { |
| 104 | "github": "https://github.com/ReScienceLab/opc-skills/tree/main/skills/<skill-name>" |
| 105 | } |
| 106 | } |
| 107 | ``` |
| 108 | |
| 109 | **Field notes:** |
| 110 | - `icon`: Use a [Simple Icons](https://simpleicons.org/) name, or generic like `"globe"`, `"archive"`, `"image"` |
| 111 | - `color`: 6-char hex without `#` (e.g., `"6B7280"`) |
| 112 | - `dependencies`: Object with skill names as keys and version ranges as values (e.g., `{"twitter": ">=1.0.0"}`) |
| 113 | - `auth.keys`: Array of `{"env": "VAR_NAME", "url": "https://...", "optional": true/false}` |
| 114 | - `commands`: List of CLI commands the skill exposes (empty array `[]` if instructions-only) |
| 115 | |
| 116 | Validate after editing: |
| 117 | |
| 118 | ```bash |
| 119 | python3 -c "import json; json.load(open('skills.json')); print('valid')" |
| 120 | ``` |
| 121 | |
| 122 | ### 4. README.md |
| 123 | |
| 124 | Add the skill to the "Included Skills" table in `README.md`: |
| 125 | |
| 126 | ```markdown |
| 127 | | <img src="./skill-logos/<skill-name>.svg" width="24"> | [<skill-name>](./skills/<skill-name>) | Short description | |
| 128 | ``` |
| 129 | |
| 130 | Insert in the appropriate position within the existing table. |
| 131 | |
| 132 | ### 5. Website (worker.js) |
| 133 | |
| 134 | Add the skill to the hardcoded skills array in `website/worker.js` inside the `fetchCompareData()` function. Find the `],\n };\n}` closing of the skills array and add before it: |
| 135 | |
| 136 | ```javascript |
| 137 | { |
| 138 | name: "<skill-name>", |
| 139 | version: "1.0.0", |
| 140 | description: "<description>", |
| 141 | icon: "<icon>", |
| 142 | color: "<color>", |
| 143 | triggers: ["trigger1", "trigger2"], |
| 144 | dependenc |