@ssheleg/make-skill 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/LICENSE +21 -0
- package/README.md +113 -0
- package/bin/make-skill.js +97 -0
- package/cursor/rules/make-skill.mdc +55 -0
- package/package.json +38 -0
- package/plugins/make-skill/.claude-plugin/plugin.json +10 -0
- package/plugins/make-skill/commands/make-skill.md +16 -0
- package/plugins/make-skill/skills/make-skill/SKILL.md +237 -0
- package/templates/README.md +12 -0
- package/templates/SKILL.md +31 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## v0.1.0 — 2026-07-24
|
|
4
|
+
|
|
5
|
+
Initial release — the `make-skill` meta-skill promoted from a personal skill into
|
|
6
|
+
a full distributable plugin, built to its own canon.
|
|
7
|
+
|
|
8
|
+
- **Skill** (`plugins/make-skill/skills/make-skill/SKILL.md`): the proven pipeline
|
|
9
|
+
— authoring rules, the distributable repo layout, Create / Retrofit / Promote
|
|
10
|
+
workflows, end-to-end first publish, the distribution matrix, and the gotchas
|
|
11
|
+
catalog. Reference impls: super-ux (structure) + task-pipeline (config-contract
|
|
12
|
+
+ release automation).
|
|
13
|
+
- **Command** `/make-skill`: routes a task to the right workflow.
|
|
14
|
+
- **Distribution (5 channels):** Claude Code plugin/marketplace, vercel skills CLI
|
|
15
|
+
(`npx skills add`), npm (**`@ssheleg/make-skill`** — scoped, because npm blocks
|
|
16
|
+
the bare `make-skill` as too similar to an existing package) + `npx github:`,
|
|
17
|
+
plain `install.sh` (idempotent, `--force`), and a self-contained Cursor rule
|
|
18
|
+
(`cursor/rules/make-skill.mdc`). Plugin, command, and `bin` names stay
|
|
19
|
+
`make-skill`; only the npm package is scoped.
|
|
20
|
+
- **templates/SKILL.md**: canon skeleton seeded when scaffolding a new skill.
|
|
21
|
+
- **Validator** (`test/validate.py`, stdlib-only): name sync, four-way version
|
|
22
|
+
sync (marketplace / plugin.json / package.json / CHANGELOG top), command +
|
|
23
|
+
Cursor `.mdc` frontmatter, npm `bin`/`files` shape, template presence, relative
|
|
24
|
+
link resolution. CI runs it plus negative self-tests (corrupt version, missing
|
|
25
|
+
template) and a functional installer test.
|
|
26
|
+
- **Toggleable release automation** (`.github/workflows/release.yml`): off unless
|
|
27
|
+
the repo `RELEASE_ENABLED` variable is set; on a `v*` tag it validates the tag ↔
|
|
28
|
+
manifest version, cuts a GitHub release from this CHANGELOG, and npx-smoke-tests
|
|
29
|
+
from a clean checkout.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ssheleg
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# make-skill
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@ssheleg/make-skill)
|
|
4
|
+
[](https://github.com/ssheleg/make-skill/actions/workflows/validate.yml)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
Create, retrofit, and ship agent **skills** and **Claude Code plugins** the proven
|
|
8
|
+
ssheleg way — marketplace repo layout, four-way version sync, a structural
|
|
9
|
+
validator + CI, multi-channel distribution, and end-to-end first publish, encoded
|
|
10
|
+
as a skill so every new skill follows the same standard.
|
|
11
|
+
|
|
12
|
+
## What it does
|
|
13
|
+
|
|
14
|
+
`make-skill` is a meta-skill: point it at a task and it routes to the right workflow.
|
|
15
|
+
|
|
16
|
+
| Workflow | When |
|
|
17
|
+
|---|---|
|
|
18
|
+
| **Create (personal)** | a skill only for your own agents (`~/.claude/skills/<name>/`) |
|
|
19
|
+
| **Create (distributable)** | a skill others install → full marketplace repo + first publish |
|
|
20
|
+
| **Retrofit** | an existing skill/repo below the standard → audit → fix → release |
|
|
21
|
+
| **Promote** | a personal skill that should become installable |
|
|
22
|
+
|
|
23
|
+
It encodes: the repo layout, the version-sync hard rule, the validator (with a
|
|
24
|
+
negative self-test), the distribution matrix (Claude Code plugin, vercel skills
|
|
25
|
+
CLI, npx, Cursor), the npm gotchas, and a release checklist.
|
|
26
|
+
|
|
27
|
+
Reference implementations it mirrors: [super-ux](https://github.com/ssheleg/super-ux)
|
|
28
|
+
(structure) and [task-pipeline](https://github.com/ssheleg/task-pipeline)
|
|
29
|
+
(config-contract + toggleable release automation). make-skill is itself built to
|
|
30
|
+
this canon.
|
|
31
|
+
|
|
32
|
+
## Install
|
|
33
|
+
|
|
34
|
+
**Plugin (recommended):**
|
|
35
|
+
```
|
|
36
|
+
/plugin marketplace add ssheleg/make-skill
|
|
37
|
+
/plugin install make-skill@make-skill
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Any agent via the skills CLI (Claude Code, Cursor, Codex, 70+):**
|
|
41
|
+
```
|
|
42
|
+
npx skills add ssheleg/make-skill
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**npm / npx (no clone):**
|
|
46
|
+
```
|
|
47
|
+
npx github:ssheleg/make-skill # straight from GitHub
|
|
48
|
+
npx @ssheleg/make-skill # from the npm registry (scoped — npm blocks the bare name)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Cursor:**
|
|
52
|
+
```
|
|
53
|
+
npx skills add ssheleg/make-skill --agent cursor --global
|
|
54
|
+
```
|
|
55
|
+
…or copy `cursor/rules/make-skill.mdc` into a project's `.cursor/rules/`.
|
|
56
|
+
|
|
57
|
+
**Plain skill:**
|
|
58
|
+
```
|
|
59
|
+
git clone https://github.com/ssheleg/make-skill
|
|
60
|
+
cd make-skill && ./install.sh # idempotent; --force to overwrite
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Updating everywhere
|
|
64
|
+
|
|
65
|
+
One channel per agent (a plugin plus a plain `~/.claude/skills` copy on the same
|
|
66
|
+
Claude Code install shadow each other).
|
|
67
|
+
|
|
68
|
+
| Channel | Update |
|
|
69
|
+
|---|---|
|
|
70
|
+
| Claude Code (plugin) | `claude plugin marketplace update make-skill` → `claude plugin update make-skill@make-skill` → restart |
|
|
71
|
+
| Any agent (skills CLI) | `npx skills update make-skill --global --yes` |
|
|
72
|
+
| npm | `npx @ssheleg/make-skill@latest` / `npx github:ssheleg/make-skill` |
|
|
73
|
+
| Plain skill | `git pull && ./install.sh --force` |
|
|
74
|
+
|
|
75
|
+
## Use
|
|
76
|
+
|
|
77
|
+
Say *"make a skill"* / *"сделай скилл"* / *"приведи скилл к стандарту"*, or
|
|
78
|
+
`/make-skill <what to build or retrofit>`.
|
|
79
|
+
|
|
80
|
+
## Repo layout
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
.claude-plugin/marketplace.json
|
|
84
|
+
plugins/make-skill/{.claude-plugin/plugin.json, commands/make-skill.md, skills/make-skill/SKILL.md}
|
|
85
|
+
cursor/rules/make-skill.mdc # self-contained Cursor rule
|
|
86
|
+
templates/SKILL.md # skeleton seeded into new skills
|
|
87
|
+
bin/make-skill.js + package.json # npx installer
|
|
88
|
+
test/validate.py # structural validator (+ negative self-test in CI)
|
|
89
|
+
.github/workflows/{validate,release}.yml
|
|
90
|
+
install.sh README.md CHANGELOG.md LICENSE
|
|
91
|
+
docs/superpowers/{specs,plans}/
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## По-русски
|
|
95
|
+
|
|
96
|
+
**make-skill** — мета-скилл: создаёт, дотягивает до стандарта и публикует агентские
|
|
97
|
+
**скиллы** и **плагины Claude Code** проверенным способом ssheleg. Кодирует канон:
|
|
98
|
+
раскладку marketplace-репозитория, синхрон версий по четырём точкам, структурный
|
|
99
|
+
валидатор с негативным self-test'ом в CI, матрицу дистрибуции (плагин Claude Code,
|
|
100
|
+
vercel skills CLI, npx, Cursor), npm-грабли и end-to-end первый релиз.
|
|
101
|
+
|
|
102
|
+
Маршрутизация по задаче: **Create (personal)** — скилл только для своих агентов;
|
|
103
|
+
**Create (distributable)** — устанавливаемый другими, полный репо + публикация;
|
|
104
|
+
**Retrofit** — довести существующий скилл/репо до стандарта (аудит → фиксы →
|
|
105
|
+
релиз); **Promote** — превратить персональный скилл в устанавливаемый.
|
|
106
|
+
|
|
107
|
+
Эталоны структуры: [super-ux](https://github.com/ssheleg/super-ux) и
|
|
108
|
+
[task-pipeline](https://github.com/ssheleg/task-pipeline). Запуск — `/make-skill
|
|
109
|
+
<что создать/дотянуть>` или «сделай скилл». Установка — см. раздел Install выше.
|
|
110
|
+
|
|
111
|
+
## License
|
|
112
|
+
|
|
113
|
+
MIT © 2026 ssheleg.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/*
|
|
3
|
+
* make-skill installer CLI.
|
|
4
|
+
*
|
|
5
|
+
* Installs the make-skill skill into ~/.claude/skills/make-skill and the
|
|
6
|
+
* /make-skill slash command into ~/.claude/commands/ (same layout as install.sh).
|
|
7
|
+
* Idempotent: existing installs are skipped unless --force. Zero dependencies.
|
|
8
|
+
*
|
|
9
|
+
* For other agents (Cursor, Codex, 70+) use: npx skills add ssheleg/make-skill
|
|
10
|
+
*/
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
const fs = require('fs');
|
|
14
|
+
const path = require('path');
|
|
15
|
+
const os = require('os');
|
|
16
|
+
|
|
17
|
+
const ROOT = path.resolve(__dirname, '..');
|
|
18
|
+
const REPO = 'ssheleg/make-skill';
|
|
19
|
+
|
|
20
|
+
function usage() {
|
|
21
|
+
console.log(`make-skill installer
|
|
22
|
+
|
|
23
|
+
Usage:
|
|
24
|
+
npx @ssheleg/make-skill [--force] install skill + /make-skill command into
|
|
25
|
+
~/.claude (skip existing unless --force)
|
|
26
|
+
npx @ssheleg/make-skill --help
|
|
27
|
+
|
|
28
|
+
Other install paths:
|
|
29
|
+
Claude Code plugin: /plugin marketplace add ${REPO}
|
|
30
|
+
/plugin install make-skill@make-skill
|
|
31
|
+
Any agent (70+): npx skills add ${REPO}`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function copyDir(src, dest) {
|
|
35
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
36
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
37
|
+
const s = path.join(src, entry.name);
|
|
38
|
+
const d = path.join(dest, entry.name);
|
|
39
|
+
if (entry.isDirectory()) copyDir(s, d);
|
|
40
|
+
else fs.copyFileSync(s, d);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function installOne(label, src, dest, isDir, force) {
|
|
45
|
+
if (fs.existsSync(dest) && !force) {
|
|
46
|
+
console.log(`skip: ${label} already installed at ${dest} (rerun with --force to overwrite)`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
fs.rmSync(dest, { recursive: true, force: true });
|
|
50
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
51
|
+
if (isDir) copyDir(src, dest);
|
|
52
|
+
else fs.copyFileSync(src, dest);
|
|
53
|
+
console.log(`Installed ${label} -> ${dest}`);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function main(argv) {
|
|
57
|
+
const args = argv.slice(2);
|
|
58
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
59
|
+
usage();
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
const force = args.includes('--force');
|
|
63
|
+
const unknown = args.filter((a) => a !== '--force');
|
|
64
|
+
if (unknown.length) {
|
|
65
|
+
console.error(`unknown argument(s): ${unknown.join(' ')}`);
|
|
66
|
+
usage();
|
|
67
|
+
return 2;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const skillSrc = path.join(ROOT, 'plugins/make-skill/skills/make-skill');
|
|
71
|
+
const cmdSrc = path.join(ROOT, 'plugins/make-skill/commands/make-skill.md');
|
|
72
|
+
for (const [p, what] of [[skillSrc, 'skill sources'], [cmdSrc, 'command source']]) {
|
|
73
|
+
if (!fs.existsSync(p)) {
|
|
74
|
+
console.error(`error: ${what} missing at ${p} — corrupted package?`);
|
|
75
|
+
return 1;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const home = os.homedir();
|
|
80
|
+
installOne(
|
|
81
|
+
'make-skill skill ',
|
|
82
|
+
skillSrc,
|
|
83
|
+
path.join(home, '.claude', 'skills', 'make-skill'),
|
|
84
|
+
true,
|
|
85
|
+
force
|
|
86
|
+
);
|
|
87
|
+
installOne(
|
|
88
|
+
'/make-skill command',
|
|
89
|
+
cmdSrc,
|
|
90
|
+
path.join(home, '.claude', 'commands', 'make-skill.md'),
|
|
91
|
+
false,
|
|
92
|
+
force
|
|
93
|
+
);
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
process.exit(main(process.argv));
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "make-skill: create, retrofit, or publish an agent skill / plugin the proven ssheleg way — marketplace repo layout, four-way version sync, validator + CI, multi-channel distribution (Claude Code plugin, skills CLI, npx, Cursor), npm gotchas. Apply when creating a new skill, upgrading one to standard, or wrapping one into a plugin."
|
|
3
|
+
alwaysApply: false
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# make-skill — ship skills the proven way (Cursor)
|
|
7
|
+
|
|
8
|
+
Self-contained rule (Cursor copies this into projects — no external links).
|
|
9
|
+
|
|
10
|
+
## Authoring rules (every skill)
|
|
11
|
+
|
|
12
|
+
- Front-matter: `name` == directory name; `description` starts "Use when …" with
|
|
13
|
+
concrete trigger phrases in English AND Russian. A skill nobody triggers is dead
|
|
14
|
+
weight.
|
|
15
|
+
- One skill = one job. Multiple concerns → multiple skills + a shared contract file.
|
|
16
|
+
- Body: imperative, procedural, checklists over prose. State non-negotiables as such.
|
|
17
|
+
- Commands are thin wrappers: front-matter `description` (+ `argument-hint`), body =
|
|
18
|
+
"invoke skill X in mode Y", pass `$ARGUMENTS`.
|
|
19
|
+
- Never overwrite user data: seed only when absent; overwrite only behind `--force`.
|
|
20
|
+
|
|
21
|
+
## Distributable repo layout
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
.claude-plugin/marketplace.json # plugins[0].source: ./plugins/<name>
|
|
25
|
+
plugins/<name>/.claude-plugin/plugin.json
|
|
26
|
+
plugins/<name>/commands/*.md
|
|
27
|
+
plugins/<name>/skills/<skill>/SKILL.md (+ references/*.md)
|
|
28
|
+
cursor/rules/*.mdc # self-contained, NO relative links
|
|
29
|
+
templates/*.md # skeletons seeded into projects
|
|
30
|
+
bin/<name>.js + package.json # zero-dep npx installer
|
|
31
|
+
test/validate.py # stdlib-only consistency validator
|
|
32
|
+
.github/workflows/validate.yml (+ release.yml, off by default)
|
|
33
|
+
install.sh, README.md (EN+RU), CHANGELOG.md, LICENSE (MIT)
|
|
34
|
+
docs/superpowers/{specs,plans}/
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Hard rules
|
|
38
|
+
|
|
39
|
+
- **Version sync:** marketplace.json, plugin.json, package.json (if npm), and the
|
|
40
|
+
top CHANGELOG entry carry the SAME semver, bumped together; the validator enforces.
|
|
41
|
+
- **Validator must be able to fail:** CI runs a negative self-test (corrupt a copy →
|
|
42
|
+
expect FAIL). A validator that can't fail is decoration.
|
|
43
|
+
- **One channel per agent:** don't run a plugin AND a plain `~/.claude/skills` copy
|
|
44
|
+
on the same install — the stale plain copy shadows the plugin.
|
|
45
|
+
- **npm name first:** `npm view <name>` (E404 = free). **npm publish = human 2FA.**
|
|
46
|
+
- **Cursor .mdc:** embed contracts inline (files get copied into foreign projects).
|
|
47
|
+
- **e2e npx from a NON-repo cwd** (inside the repo it resolves the local package →
|
|
48
|
+
false "command not found").
|
|
49
|
+
|
|
50
|
+
## Distribution
|
|
51
|
+
|
|
52
|
+
Claude Code plugin (`claude plugin marketplace add` → `install <name>@<name>`),
|
|
53
|
+
vercel skills CLI (`npx skills add <owner>/<repo>`, discovers via marketplace.json),
|
|
54
|
+
npx (`npx github:<owner>/<repo>`, or the registry after publish), Cursor (global via
|
|
55
|
+
`npx skills add … --agent cursor --global`, or per-project `.cursor/rules/*.mdc`).
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ssheleg/make-skill",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Create, retrofit, and ship agent skills & Claude Code plugins the proven ssheleg way — marketplace repo layout, four-way version sync, validator + CI, multi-channel distribution (plugin, vercel skills CLI, npx, Cursor), npm gotchas, end-to-end first publish. This package is the installer CLI.",
|
|
5
|
+
"bin": {
|
|
6
|
+
"make-skill": "bin/make-skill.js"
|
|
7
|
+
},
|
|
8
|
+
"publishConfig": {
|
|
9
|
+
"access": "public"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"bin",
|
|
13
|
+
"plugins",
|
|
14
|
+
"cursor",
|
|
15
|
+
"templates",
|
|
16
|
+
"README.md",
|
|
17
|
+
"LICENSE",
|
|
18
|
+
"CHANGELOG.md"
|
|
19
|
+
],
|
|
20
|
+
"repository": "github:ssheleg/make-skill",
|
|
21
|
+
"homepage": "https://github.com/ssheleg/make-skill",
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"author": "ssheleg",
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=16"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"skill",
|
|
29
|
+
"plugin",
|
|
30
|
+
"scaffold",
|
|
31
|
+
"marketplace",
|
|
32
|
+
"validator",
|
|
33
|
+
"distribution",
|
|
34
|
+
"claude-code",
|
|
35
|
+
"cursor",
|
|
36
|
+
"npm"
|
|
37
|
+
]
|
|
38
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "make-skill",
|
|
3
|
+
"description": "Create, retrofit, and ship agent skills & Claude Code plugins the proven ssheleg way: marketplace repo layout, four-way version sync, validator + CI, multi-channel distribution (plugin, vercel skills CLI, npx, Cursor), npm gotchas, end-to-end first publish. Reference impls: super-ux (structure) + task-pipeline (config-contract + release automation).",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"author": { "name": "ssheleg" },
|
|
6
|
+
"homepage": "https://github.com/ssheleg/make-skill",
|
|
7
|
+
"repository": "https://github.com/ssheleg/make-skill",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"keywords": ["skill", "plugin", "scaffold", "marketplace", "validator", "distribution", "claude-code", "cursor", "npm"]
|
|
10
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Create, retrofit, or publish an agent skill / Claude Code plugin the proven ssheleg way — marketplace layout, four-way version sync, validator + CI, multi-channel distribution.
|
|
3
|
+
argument-hint: <what to build/retrofit, or a skill path>
|
|
4
|
+
---
|
|
5
|
+
Use the `make-skill` skill for the task below. First **detect the workflow** from
|
|
6
|
+
the task and any path in `$ARGUMENTS`, announce it, then follow the skill exactly:
|
|
7
|
+
|
|
8
|
+
- new skill only for this user's agents → **Create (personal)**
|
|
9
|
+
- new skill others install → **Create (distributable)** → First publish end-to-end
|
|
10
|
+
- existing skill/repo below the standard → **Retrofit** (audit → fix → release)
|
|
11
|
+
- a personal skill that should become installable → **Promote**
|
|
12
|
+
|
|
13
|
+
Task: $ARGUMENTS
|
|
14
|
+
|
|
15
|
+
If `$ARGUMENTS` is empty, ask in one line what to create / retrofit / publish
|
|
16
|
+
before starting.
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: make-skill
|
|
3
|
+
description: Use when creating, upgrading, or publishing agent skills and Claude Code plugins - "ssheleg skill", "ssheleg скилл", "сделай скилл", "новый скилл", "make a skill", "заверни в плагин", "опубликуй скилл", "догони скилл до стандарта", "retrofit/upgrade a skill", "приведи скилл к стандарту". Encodes the proven ssheleg pipeline - marketplace repo layout, version sync x4, validator+CI, multi-agent distribution (Claude Code plugin, vercel skills CLI, npx, Cursor), npm gotchas, end-to-end first publish. References - github.com/ssheleg/super-ux (structure) + github.com/ssheleg/task-pipeline (config-contract + release automation).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# make-skill — Create, Retrofit, and Ship Skills the Proven Way
|
|
7
|
+
|
|
8
|
+
Reference implementations (local checkouts usually at `~/DATA/<name>`):
|
|
9
|
+
- **`ssheleg/super-ux`** — the canonical structure; copy it verbatim when in
|
|
10
|
+
doubt. Multi-skill suite, Cursor rules, templates seeded into projects.
|
|
11
|
+
- **`ssheleg/task-pipeline`** — the reference for the newer patterns: a
|
|
12
|
+
single-skill orchestrator with a generic JSON **config-contract**
|
|
13
|
+
(`pipeline.schema.json` + a copy-and-rewrite `pipeline.example.json`),
|
|
14
|
+
four-way version sync with jsonschema conformance in the validator, and
|
|
15
|
+
**toggleable release automation**.
|
|
16
|
+
|
|
17
|
+
Both work end-to-end; match whichever is closer to the skill at hand.
|
|
18
|
+
**make-skill itself** (`ssheleg/make-skill`) is built to this exact canon — the
|
|
19
|
+
single-skill-plus-templates shape, distributed on all channels.
|
|
20
|
+
|
|
21
|
+
## Choosing a workflow
|
|
22
|
+
|
|
23
|
+
| Situation | Workflow |
|
|
24
|
+
|---|---|
|
|
25
|
+
| New skill, only for this user's agents | Create (personal) |
|
|
26
|
+
| New skill, installable by others/other agents | Create (distributable) |
|
|
27
|
+
| Existing skill or repo below this standard | Retrofit |
|
|
28
|
+
| Personal skill should become installable | Promote |
|
|
29
|
+
|
|
30
|
+
Announce the workflow. Distributable work is a real project: brainstorm →
|
|
31
|
+
spec (`docs/superpowers/specs/`) → plan → build → validate → publish. The
|
|
32
|
+
spec locks target-project file contracts (paths, formats, statuses) FIRST —
|
|
33
|
+
skills and rules are written against that contract, never ad hoc.
|
|
34
|
+
|
|
35
|
+
## Authoring rules (every workflow)
|
|
36
|
+
|
|
37
|
+
- Front-matter: `name` MUST equal the directory name; `description` starts
|
|
38
|
+
"Use when …" and lists concrete trigger phrases — English AND Russian
|
|
39
|
+
(user works in both). A skill nobody triggers is dead weight.
|
|
40
|
+
- One skill = one job. Multiple concerns → multiple skills + shared contract
|
|
41
|
+
in `skills/references/<contract>.md`, linked relatively (`../references/…`).
|
|
42
|
+
- Body: imperative, procedural, checklists over prose. Non-negotiables
|
|
43
|
+
stated as such (model: super-ux "Evidence discipline").
|
|
44
|
+
- Commands (`commands/*.md`) are thin wrappers: front-matter `description`
|
|
45
|
+
(+ `argument-hint`), body = "invoke skill X in mode Y", pass `$ARGUMENTS`.
|
|
46
|
+
- Ship a one-command entry point `/<name>`: idempotent — inspect state →
|
|
47
|
+
repair missing pieces → status report → suggest exactly ONE next action.
|
|
48
|
+
Detect mode, never ask. (Pattern: super-ux `/ux`.)
|
|
49
|
+
- Never overwrite user data: seed only when absent; overwrite only behind
|
|
50
|
+
`--force`.
|
|
51
|
+
|
|
52
|
+
## Create (personal)
|
|
53
|
+
|
|
54
|
+
`~/.claude/skills/<name>/SKILL.md` following the authoring rules — done.
|
|
55
|
+
No repo, no versioning. Loads next session. Mention Promote as the upgrade
|
|
56
|
+
path if it proves useful.
|
|
57
|
+
|
|
58
|
+
## Create (distributable)
|
|
59
|
+
|
|
60
|
+
### Layout (copy from super-ux)
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
<repo>/
|
|
64
|
+
├── .claude-plugin/marketplace.json # root manifest, plugins[0].source: ./plugins/<name>
|
|
65
|
+
├── plugins/<name>/
|
|
66
|
+
│ ├── .claude-plugin/plugin.json
|
|
67
|
+
│ ├── commands/*.md
|
|
68
|
+
│ └── skills/<skill>/SKILL.md + skills/references/*.md
|
|
69
|
+
├── cursor/rules/*.mdc # if agent-rules make sense for Cursor
|
|
70
|
+
├── templates/*.md # skeletons the skills seed into projects
|
|
71
|
+
├── bin/<name>.js + package.json # npx installer (zero-dep Node)
|
|
72
|
+
├── test/validate.py # consistency validator (stdlib only)
|
|
73
|
+
├── .github/workflows/validate.yml # validator on push+PR
|
|
74
|
+
├── install.sh # POSIX fallback
|
|
75
|
+
├── README.md (EN + closing RU section), CHANGELOG.md, LICENSE (MIT)
|
|
76
|
+
└── docs/superpowers/{specs,plans}/
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Version sync (hard rule):** marketplace.json, plugin.json, package.json,
|
|
80
|
+
top CHANGELOG entry — SAME semver, bumped together, validator enforces.
|
|
81
|
+
|
|
82
|
+
**Validator** (adapt super-ux `test/validate.py`): manifests parse+fields;
|
|
83
|
+
SKILL.md front-matter (name==dir, description); command front-matter; `.mdc`
|
|
84
|
+
front-matter; templates exist; relative md links resolve; version sync.
|
|
85
|
+
Plus a negative self-test (corrupt a copy → expect FAIL) — a validator that
|
|
86
|
+
can't fail is decoration.
|
|
87
|
+
|
|
88
|
+
### First publish — end-to-end, same session
|
|
89
|
+
|
|
90
|
+
Take it ALL the way: GitHub + CI green + npm published + verified installs.
|
|
91
|
+
No half-done handoffs — the ONLY human step is npm 2FA.
|
|
92
|
+
|
|
93
|
+
1. **Preflight before code:** `npm view <name>` (E404 = free);
|
|
94
|
+
`gh auth status` (may lie — just try repo create later); `npm whoami`
|
|
95
|
+
(401 → plan the 2FA human step, keep building).
|
|
96
|
+
2. Build per layout; `git init -b main`; conventional commits; set local git
|
|
97
|
+
identity if `git config user.email` empty.
|
|
98
|
+
3. Validator + functional tests green BEFORE publishing.
|
|
99
|
+
4. **GitHub:** `gh repo create <owner>/<name> --public --source . --push`;
|
|
100
|
+
then `gh repo edit <owner>/<name> --homepage
|
|
101
|
+
"https://www.npmjs.com/package/<name>"`.
|
|
102
|
+
5. **Badges day one:**
|
|
103
|
+
`[](https://www.npmjs.com/package/<name>)`,
|
|
104
|
+
CI badge (`actions/workflows/validate.yml/badge.svg`), license badge.
|
|
105
|
+
6. **CI:** poll `gh run list --repo <owner>/<name> --limit 1` until
|
|
106
|
+
`completed success`. Red = fix now.
|
|
107
|
+
7. **npm:** `npm publish --dry-run` (eye the tarball) → `npm publish`.
|
|
108
|
+
EOTP/2FA → give the user exactly one command (`cd <repo> && npm publish`),
|
|
109
|
+
wait, then verify `npm view <name> version` + e2e
|
|
110
|
+
`npx <name>@<ver> --help` FROM A NON-REPO CWD.
|
|
111
|
+
8. **Install for the user:** `claude plugin marketplace add <owner>/<name>` +
|
|
112
|
+
`claude plugin install <name>@<name>`; verify
|
|
113
|
+
`npx --yes skills add <owner>/<name> --list` finds the skills.
|
|
114
|
+
9. Done = four verified facts: GitHub repo + CI green; npm resolvable via
|
|
115
|
+
npx; plugin installed; skills-CLI discovery works.
|
|
116
|
+
|
|
117
|
+
## Retrofit (bring an existing skill/repo up to standard)
|
|
118
|
+
|
|
119
|
+
Audit first, fix second, in the same session. Verdict per item: PASS / GAP
|
|
120
|
+
with evidence (`file:line` or command output) — never "looks fine".
|
|
121
|
+
|
|
122
|
+
**Audit checklist:**
|
|
123
|
+
|
|
124
|
+
1. Front-matter: name==dir; description "Use when…" + EN and RU triggers.
|
|
125
|
+
2. One-job check; shared contracts extracted to `references/`, linked
|
|
126
|
+
relatively; no format duplication drift between skills.
|
|
127
|
+
3. Entry-point command exists, idempotent (inspect → repair → status → one
|
|
128
|
+
next action).
|
|
129
|
+
4. Layout matches the standard tree; manifests complete; version sync ×4.
|
|
130
|
+
5. Validator present AND green AND able to fail (run the negative test);
|
|
131
|
+
CI workflow present, last run `success`.
|
|
132
|
+
6. README: badges (npm/CI/license), install matrix documented, RU section.
|
|
133
|
+
7. Distribution live-checks: `npx --yes skills add <repo> --list` finds
|
|
134
|
+
skills; `npx <name>` works from a non-repo cwd (if npm published);
|
|
135
|
+
`.mdc` rules have no relative links and valid front-matter.
|
|
136
|
+
8. Repo meta: homepage → npm page; LICENSE; CHANGELOG current.
|
|
137
|
+
9. Gotcha compliance (see below): `from __future__ import annotations` in
|
|
138
|
+
validate.py; `\x1b` literals not raw ESC; single prompter for piped
|
|
139
|
+
stdin; raw-mode only behind isTTY guards.
|
|
140
|
+
|
|
141
|
+
**Then:** report the gap table, fix everything fixable now, bump a
|
|
142
|
+
minor/patch version, run the release checklist. For a PERSONAL skill,
|
|
143
|
+
retrofit = items 1–3 only.
|
|
144
|
+
|
|
145
|
+
## Promote (personal → distributable)
|
|
146
|
+
|
|
147
|
+
Create the repo per layout, move the skill into
|
|
148
|
+
`plugins/<name>/skills/<skill>/`, extract contracts to `references/`, add
|
|
149
|
+
entry-point command, then run First publish end-to-end. Delete the old
|
|
150
|
+
`~/.claude/skills/<skill>` copy only AFTER the plugin install is verified —
|
|
151
|
+
duplicate skill listings confuse agents.
|
|
152
|
+
|
|
153
|
+
## Distribution matrix
|
|
154
|
+
|
|
155
|
+
1. **Claude Code plugin:** `/plugin marketplace add <owner>/<repo>` →
|
|
156
|
+
`/plugin install <name>@<name>`; non-interactive via `claude plugin …`
|
|
157
|
+
CLI — use it, don't tell the user to click.
|
|
158
|
+
2. **vercel-labs skills CLI (70+ agents):** `npx skills add <owner>/<repo>`
|
|
159
|
+
— discovers skills through `.claude-plugin/marketplace.json`
|
|
160
|
+
automatically; correct manifest = free compatibility. Non-interactive
|
|
161
|
+
flags: `--agent <name>|'*'`, `--global`, `--yes`, `--all` (= `--skill '*'
|
|
162
|
+
--agent '*' -y`); update with `npx skills update <name> --global --yes`.
|
|
163
|
+
Copies land in `~/.agents/skills/<name>`. **Do NOT `--agent '*'` when the
|
|
164
|
+
skill is also a Claude Code plugin** — it re-creates a `~/.claude/skills`
|
|
165
|
+
copy that shadows the plugin (see Gotchas).
|
|
166
|
+
3. **npx installer:** package.json (`bin`, `files` whitelist) + zero-dep
|
|
167
|
+
CLI; works WITHOUT registry publish via `npx github:<owner>/<repo>`;
|
|
168
|
+
registry publish only buys the short `npx <name>`.
|
|
169
|
+
4. **Cursor:** two routes. **Global** — `npx skills add <owner>/<repo>
|
|
170
|
+
--agent cursor --global` lands the skill in `~/.agents/skills/<name>`
|
|
171
|
+
(the shared agents dir Cursor reads). **Per-project** —
|
|
172
|
+
`.cursor/rules/*.mdc` (front-matter `description`, `alwaysApply`, opt.
|
|
173
|
+
`globs`); NO relative links inside .mdc (copied into foreign projects —
|
|
174
|
+
embed contracts inline). Cursor has no native *global rules* dir, so global
|
|
175
|
+
= skills CLI, per-project = `.mdc`, or paste into Cursor Settings → Rules.
|
|
176
|
+
|
|
177
|
+
## Gotchas (each cost a debugging round)
|
|
178
|
+
|
|
179
|
+
- **npm 2FA:** publish throws EOTP; non-interactive impossible without a
|
|
180
|
+
granular automation token. Plan as the one human step; verify after.
|
|
181
|
+
- **Check npm name FIRST:** `npm view <name>` → E404 means free. But E404 on
|
|
182
|
+
`view` ≠ publishable: npm's **name-similarity** policy only fires on PUT, so
|
|
183
|
+
`npm publish` can still 403 "too similar to existing package <x>" (e.g.
|
|
184
|
+
`make-skill` vs `makeskill`). Fix: a **scoped** name `@<user>/<name>` (scoped
|
|
185
|
+
names are exempt) + `"publishConfig": {"access": "public"}` so `npm publish`
|
|
186
|
+
needs no flag; or pick a clearly dissimilar unscoped name. The `bin` command
|
|
187
|
+
name is independent of the package name — keep it short even when scoped.
|
|
188
|
+
- **npx inside the package's own repo** resolves to the local package →
|
|
189
|
+
false `command not found`. Always e2e-test from another cwd.
|
|
190
|
+
- **Piped stdin + readline:** sequential `rl.question()` drops buffered
|
|
191
|
+
lines; use ONE persistent-listener prompter for the whole flow (super-ux
|
|
192
|
+
`makePrompter`). Non-TTY fallback for every prompt (`1,3`/`all`/`q`).
|
|
193
|
+
- **Interactive pickers:** raw-mode multiselect only when
|
|
194
|
+
`stdin.isTTY && stdout.isTTY`; restore `setRawMode(false)` on every exit
|
|
195
|
+
path; delegate agent-matrix pickers to `npx skills add`.
|
|
196
|
+
- **ANSI escapes:** `\x1b[…` literals in source, never raw ESC bytes.
|
|
197
|
+
- **Python drift:** system python3 may be 3.9 — validate.py needs
|
|
198
|
+
`from __future__ import annotations` for `str | None` annotations; CI's
|
|
199
|
+
`3.x` won't catch it, local run will.
|
|
200
|
+
- **gh auth status may lie** (invalid-token report while git+ssh path
|
|
201
|
+
works): attempt the operation before declaring it blocked.
|
|
202
|
+
- **Duplicate-shadow: one channel per agent.** A plugin install AND a plain
|
|
203
|
+
`~/.claude/skills/<name>` copy (from `install.sh` or `npx skills add
|
|
204
|
+
--agent '*'`) on the SAME Claude Code install = two listings; the plain copy
|
|
205
|
+
can be STALE and shadow the fresh plugin. Keep exactly one channel per
|
|
206
|
+
agent; `rm -rf ~/.claude/skills/<name>` if a stray plain copy appears.
|
|
207
|
+
- **Plugin commands need the full `<name>@<name>`:** `claude plugin update
|
|
208
|
+
<name>` → "Plugin not found"; it must be `claude plugin update
|
|
209
|
+
<name>@<name>`. Same for install.
|
|
210
|
+
|
|
211
|
+
## Release checklist (every version)
|
|
212
|
+
|
|
213
|
+
1. Bump the four versions together (`package.json` only if npm-distributed —
|
|
214
|
+
else it's a 3-way sync); CHANGELOG entry.
|
|
215
|
+
2. `python3 test/validate.py` → `OK (<n> checks)`.
|
|
216
|
+
3. Functional tests: installer against scratch dir (fresh / rerun-skip /
|
|
217
|
+
`--force`), `node --check` on CLI, pipe-driven menu tests.
|
|
218
|
+
4. Conventional commit; push; confirm CI `success`; tag `v<ver>` + push tag;
|
|
219
|
+
`gh release create` from the CHANGELOG section (or let the release workflow
|
|
220
|
+
below do it).
|
|
221
|
+
5. npm publish if applicable (human 2FA); e2e `npx <name>@<ver>` from
|
|
222
|
+
non-repo cwd.
|
|
223
|
+
6. **Refresh THIS machine's global installs — always, as DoD** (per global
|
|
224
|
+
`~/.claude/CLAUDE.md`): `claude plugin marketplace update <name>` →
|
|
225
|
+
`claude plugin update <name>@<name>` → `npx skills update <name> --global
|
|
226
|
+
--yes`; remind about the Claude Code restart. Don't leave the user on a
|
|
227
|
+
stale local copy after shipping a new version.
|
|
228
|
+
7. Global `~/.claude/CLAUDE.md` — only for rules that must fire even without
|
|
229
|
+
the skill installed.
|
|
230
|
+
|
|
231
|
+
**Optional — toggleable release automation** (reference impl:
|
|
232
|
+
`ssheleg/task-pipeline` `.github/workflows/release.yml`). A `v*`-tag workflow,
|
|
233
|
+
**off by default** and armed per repo via a `RELEASE_ENABLED` repo variable
|
|
234
|
+
(so forks decide for themselves), that validates the tag ↔ manifest version,
|
|
235
|
+
cuts the GitHub release from the matching CHANGELOG section, and smoke-tests
|
|
236
|
+
`npx github:<owner>/<repo>#<tag>` from a clean cwd. npm publish stays the human
|
|
237
|
+
2FA step. Turns steps 2/4 into CI; keep step 6 manual (it touches this machine).
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# templates
|
|
2
|
+
|
|
3
|
+
Skeletons make-skill seeds when scaffolding a new skill. Copy only when the target
|
|
4
|
+
is absent; never overwrite existing files.
|
|
5
|
+
|
|
6
|
+
| Template | Seeds | Used by |
|
|
7
|
+
|---|---|---|
|
|
8
|
+
| `SKILL.md` | a new `skills/<name>/SKILL.md` with canon frontmatter + section stubs | Create / Promote |
|
|
9
|
+
|
|
10
|
+
Distributable repos also get the full tree (manifests, `bin/`, `test/validate.py`,
|
|
11
|
+
workflows, `install.sh`, README/CHANGELOG/LICENSE) — copy those from a reference
|
|
12
|
+
impl (`ssheleg/task-pipeline` or `ssheleg/super-ux`) per the SKILL.md layout.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: <skill-name>
|
|
3
|
+
description: Use when <concrete triggering conditions and symptoms>. Add trigger phrases in English AND Russian. Describe WHEN to use, not what the skill does.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# <Skill Name>
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
What is this? Core principle in 1–2 sentences.
|
|
11
|
+
|
|
12
|
+
## When to use
|
|
13
|
+
|
|
14
|
+
- Symptom / situation 1
|
|
15
|
+
- Symptom / situation 2
|
|
16
|
+
- When NOT to use
|
|
17
|
+
|
|
18
|
+
## Core pattern / workflow
|
|
19
|
+
|
|
20
|
+
Imperative, procedural steps or a before/after example. Checklists over prose.
|
|
21
|
+
State non-negotiables as such.
|
|
22
|
+
|
|
23
|
+
## Quick reference
|
|
24
|
+
|
|
25
|
+
| Operation | How |
|
|
26
|
+
|---|---|
|
|
27
|
+
| … | … |
|
|
28
|
+
|
|
29
|
+
## Common mistakes
|
|
30
|
+
|
|
31
|
+
- What goes wrong → the fix.
|