@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 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
+ [![npm](https://img.shields.io/npm/v/@ssheleg/make-skill)](https://www.npmjs.com/package/@ssheleg/make-skill)
4
+ [![validate](https://github.com/ssheleg/make-skill/actions/workflows/validate.yml/badge.svg)](https://github.com/ssheleg/make-skill/actions/workflows/validate.yml)
5
+ [![license](https://img.shields.io/badge/license-MIT-blue)](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
+ `[![npm](https://img.shields.io/npm/v/<name>)](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.