sshlg-skills 0.5.4
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 +167 -0
- package/LICENSE +21 -0
- package/README.md +99 -0
- package/bin/sshlg-skills.js +204 -0
- package/package.json +33 -0
- package/skills.json +80 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## v0.5.4 — 2026-07-28
|
|
4
|
+
|
|
5
|
+
- **seo-aeo-audit bumped to v0.4.0** in the registry and the submodule pin (was
|
|
6
|
+
0.3.1). That release ran ten per-track extraction passes over the full source
|
|
7
|
+
corpus and one reconciliation pass over all 19 contracts: +1,725 lines, sixteen
|
|
8
|
+
contradictions resolved by naming both studies and demoting contested
|
|
9
|
+
directions, duplication removed with a single owner per fact, and the coverage
|
|
10
|
+
gaps filled (hreflang and international duplication, fabricated information
|
|
11
|
+
gain, licensing posture, rank-tracker vendor continuity, EU DMA exposure).
|
|
12
|
+
- Registry `desc` updated to match.
|
|
13
|
+
|
|
14
|
+
## v0.5.3 — 2026-07-28
|
|
15
|
+
|
|
16
|
+
- **seo-aeo-audit bumped to v0.3.1** in the registry and the submodule pin
|
|
17
|
+
(was 0.2.0). Two releases landed: v0.3.0 added the ranking model, the on-page
|
|
18
|
+
completeness sweep, the tooling/evidence ladder and the post-click track
|
|
19
|
+
(conversion elements, call and offline attribution, paid × organic alignment);
|
|
20
|
+
v0.3.1 ran a consistency pass over the whole flow — one evidence ladder, one
|
|
21
|
+
stance on structured data, reconciled page-experience and keyword framing,
|
|
22
|
+
tier discipline in every new contract — and rewrote the README around install,
|
|
23
|
+
update, the audit flow, what knowledge ships inside and how fresh it is.
|
|
24
|
+
- Registry `desc` updated to match.
|
|
25
|
+
|
|
26
|
+
## v0.5.2 — 2026-07-28
|
|
27
|
+
|
|
28
|
+
- **seo-aeo-audit bumped to v0.2.0** in the registry and the submodule pin. That
|
|
29
|
+
release adds a dated Google update timeline (every core, spam and Discover
|
|
30
|
+
update from March 2025 to June 2026, plus the platform changes that retired old
|
|
31
|
+
tactics), an update-response protocol wired into the audit flow, a refresh
|
|
32
|
+
routine with named sources, and SEJ's *SEO Trends 2026* distilled into the
|
|
33
|
+
existing contracts.
|
|
34
|
+
- Registry `desc` updated to match.
|
|
35
|
+
|
|
36
|
+
## v0.5.1 — 2026-07-28
|
|
37
|
+
|
|
38
|
+
- **seo-aeo-audit bumped to v0.1.0 → v0.1.1** in the registry and the submodule
|
|
39
|
+
pin. That release fixes the make-skill gotcha the first cut tripped over — the
|
|
40
|
+
deliverable skeletons lived only at the repo root, which the skills CLI does not
|
|
41
|
+
ship, so non-Claude agents received a SKILL.md pointing at files they could not
|
|
42
|
+
read — plus a broken cross-reference anchor, mixed British/American spelling
|
|
43
|
+
across the contracts, and two auditor defects (navigation labels inflating the
|
|
44
|
+
word count, robots directives matched as substrings).
|
|
45
|
+
|
|
46
|
+
## v0.5.0 — 2026-07-28
|
|
47
|
+
|
|
48
|
+
- **New family member: `seo-aeo-audit` v0.1.0** ([ssheleg/seo-aeo-audit](https://github.com/ssheleg/seo-aeo-audit)) —
|
|
49
|
+
evidence-first website audit for search **and** answer engines that ends in a
|
|
50
|
+
prioritized change plan. Ten tracks (access & indexation economics,
|
|
51
|
+
canonicalization, architecture & link equity, intent & SERP fit, content value,
|
|
52
|
+
extractability/AEO-GEO, entity & brand consensus, experience signals, risk &
|
|
53
|
+
threats, measurement), an evidence-tier triage model
|
|
54
|
+
(`priority = (impact × confidence) / effort`), an explicit myth guard, and a
|
|
55
|
+
stdlib-only page auditor that measures the answer-engine read budget.
|
|
56
|
+
- Registered in `skills.json`, added as a submodule at `skills/seo-aeo-audit`,
|
|
57
|
+
README family table and RU section updated.
|
|
58
|
+
|
|
59
|
+
## v0.4.1 — 2026-07-27
|
|
60
|
+
|
|
61
|
+
- **task-pipeline bumped to v0.12.0** in the registry and the submodule pin
|
|
62
|
+
(was 0.10.0). That release makes the intake grill mandatory and **built in** —
|
|
63
|
+
the `grill-me` / `grilling` dependency is gone, the doctrine is ported in-house
|
|
64
|
+
with domain awareness (CONTEXT.md glossary challenges, ADR discipline) and an
|
|
65
|
+
autonomy sweep that pre-resolves every stage-1→9 blocker — and replaces
|
|
66
|
+
per-stage model tiering with one provider-agnostic model confirmed up front.
|
|
67
|
+
- Registry `desc` and the README family table updated to match.
|
|
68
|
+
|
|
69
|
+
## v0.4.0 — 2026-07-25
|
|
70
|
+
|
|
71
|
+
- **Enforce "one channel per agent" automatically.** The skills CLI auto-detects
|
|
72
|
+
Claude Code and writes `~/.claude/skills/<id>` even when it is never named as a
|
|
73
|
+
target, so every `install`/`update` silently recreated plain copies that shadow
|
|
74
|
+
the Claude plugin. The launcher now prunes those copies after any skills-CLI
|
|
75
|
+
step while the plugin channel is active (skipped under `--no-claude`, where the
|
|
76
|
+
plain copies are the intended channel). Verified live: 7 shadows → 0.
|
|
77
|
+
|
|
78
|
+
## v0.3.1 — 2026-07-25
|
|
79
|
+
|
|
80
|
+
- Pin bump: sheleg-design **0.7.0** (style-agnostic build recipe, release
|
|
81
|
+
workflow, RU README). Family now pinned at super-ux 0.19.0, task-pipeline
|
|
82
|
+
0.10.0, make-skill 0.3.0, sheleg-design 0.7.0.
|
|
83
|
+
|
|
84
|
+
## v0.3.0 — 2026-07-25
|
|
85
|
+
|
|
86
|
+
Launcher hardening — four defects an adversarial audit proved by execution.
|
|
87
|
+
|
|
88
|
+
- **FIX: `update` silently moved the pins, even with `--claude-only`.** The
|
|
89
|
+
submodule step ran before any flag branch and used `--remote --merge`, so a
|
|
90
|
+
"Claude-only" run fast-forwarded a submodule to its upstream tip and left the
|
|
91
|
+
superproject dirty — destroying the pinned-snapshot contract. It now runs only
|
|
92
|
+
when not `--claude-only`, uses `--init --recursive` (materialise, don't move),
|
|
93
|
+
and moves pins **only** behind the new explicit `--bump-pins`.
|
|
94
|
+
- **FIX: every `claude plugin` failure was swallowed.** Those `run()` results were
|
|
95
|
+
discarded, so a completely failing `claude` still exited 0 (worst with
|
|
96
|
+
`--claude-only`, where nothing else could set the flag). All four calls now feed
|
|
97
|
+
the exit status — verified with a failing stub on PATH: exit 1.
|
|
98
|
+
- **FIX: the CI could not catch a bad `skillNames`.** Both workflows checked out
|
|
99
|
+
`submodules: false`, and the cross-check was guarded by `if isdir(...)` — so it
|
|
100
|
+
skipped silently and a bogus id passed green. Workflows now check out
|
|
101
|
+
`submodules: recursive`, and the validator **fails loudly** when a submodule
|
|
102
|
+
isn't materialised instead of skipping.
|
|
103
|
+
- **`skills update` now runs one call per skill id** so a single bad id can't fail
|
|
104
|
+
the batch; contradictory `--claude-only --no-claude` and a valueless `--agent`
|
|
105
|
+
now exit 2; `spawnSync` uses `shell` on Windows (npx/claude are `.cmd` shims);
|
|
106
|
+
`list` falls back to versions recorded in `skills.json` when run from an npx
|
|
107
|
+
tarball (it printed `v?` for everything, including the release smoke test).
|
|
108
|
+
- README's `update` section now matches the launcher (no `--agent`, adds
|
|
109
|
+
`--bump-pins`).
|
|
110
|
+
|
|
111
|
+
## v0.2.1 — 2026-07-25
|
|
112
|
+
|
|
113
|
+
- Pins bumped to the review-pass releases: super-ux **0.19.0** (contracts now ship
|
|
114
|
+
with every skill), task-pipeline **0.10.0** (brief template reachable on every
|
|
115
|
+
channel, current super-ux chain), make-skill **0.3.0** (stopped shipping a
|
|
116
|
+
placeholder skill; validator enforces the canon), sheleg-design 0.6.0.
|
|
117
|
+
|
|
118
|
+
## v0.2.0 — 2026-07-24
|
|
119
|
+
|
|
120
|
+
- **Fix: `update` never updated super-ux.** A repo can ship several skills under
|
|
121
|
+
different ids — super-ux ships `ux-foundation`/`ux-flows`/`ux-scenarios`/
|
|
122
|
+
`ux-audit` and there is no skill called `super-ux` — but the launcher passed the
|
|
123
|
+
repo names to `skills update`, which matches INSTALLED SKILL ids. super-ux was
|
|
124
|
+
silently skipped on every update. `skills.json` entries now carry `skillNames[]`
|
|
125
|
+
(the ids actually shipped) and the launcher updates those; the validator
|
|
126
|
+
enforces the field and cross-checks it against the skills each submodule ships,
|
|
127
|
+
so the regression cannot come back.
|
|
128
|
+
|
|
129
|
+
## v0.1.3 — 2026-07-24
|
|
130
|
+
|
|
131
|
+
- **Tolerate stray non-flag arguments.** zsh does not treat `#` as a comment by
|
|
132
|
+
default, so `... install # note` passed `#` into the launcher and it hard-failed
|
|
133
|
+
with "unknown option: #". Now only `-`/`--`-prefixed unknowns error; bare stray
|
|
134
|
+
tokens are ignored with a notice, so the intended command still runs.
|
|
135
|
+
|
|
136
|
+
## v0.1.2 — 2026-07-24
|
|
137
|
+
|
|
138
|
+
- Bumped submodule pins to the current release of each skill: super-ux 0.18.0,
|
|
139
|
+
task-pipeline 0.9.0, **make-skill 0.2.0** (correct multi-agent + cross-platform
|
|
140
|
+
distribution guidance), sheleg-design 0.6.0.
|
|
141
|
+
|
|
142
|
+
## v0.1.1 — 2026-07-24
|
|
143
|
+
|
|
144
|
+
- **Fix multi-agent install.** The vercel `skills` CLI does not split a
|
|
145
|
+
comma/space-joined `--agent` value (it read `cursor,opencode,…` as one invalid
|
|
146
|
+
agent). The launcher now passes one repeated `--agent <name>` flag per agent, so
|
|
147
|
+
`install` reaches the whole default agent set (and `--all`/`--agent a,b`) in one
|
|
148
|
+
`skills add` call per skill.
|
|
149
|
+
|
|
150
|
+
## v0.1.0 — 2026-07-24
|
|
151
|
+
|
|
152
|
+
Initial release — the ssheleg skill-family umbrella.
|
|
153
|
+
|
|
154
|
+
- **Submodules** (`skills/`): super-ux, task-pipeline, make-skill, sheleg-design
|
|
155
|
+
(→ `ssheleg/sheleg-design-skill`), wired via `.gitmodules` (https urls, clonable
|
|
156
|
+
without SSH).
|
|
157
|
+
- **Launcher/updater** `bin/sshlg-skills.js` (zero-dep): `install` / `update` /
|
|
158
|
+
`list` / `agents`. A thin orchestrator over the vercel `skills` CLI (70+ agents),
|
|
159
|
+
`claude plugin` (Claude Code), and `git submodule` (pinned snapshots). Non-Claude
|
|
160
|
+
agents via the skills CLI; Claude Code via its plugin to avoid a shadow duplicate.
|
|
161
|
+
Flags: `--agent`, `--all`, `--no-claude`, `--claude-only`.
|
|
162
|
+
- **`skills.json`** — source of truth (repos, plugin ids, default agent set).
|
|
163
|
+
- **Validator** (`test/validate.py`, stdlib): package/version, bin resolves, files
|
|
164
|
+
whitelist, CHANGELOG version match, and `.gitmodules` ↔ `skills.json` ↔ on-disk
|
|
165
|
+
submodule agreement. CI runs it plus a negative self-test and `node --check`.
|
|
166
|
+
- **Distribution:** `npx github:ssheleg/sshlg-skills` (no publish needed),
|
|
167
|
+
`git clone --recursive` + `install.sh`, and (optional) npm `sshlg-skills`.
|
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,99 @@
|
|
|
1
|
+
# sshlg-skills
|
|
2
|
+
|
|
3
|
+
[](https://github.com/ssheleg/sshlg-skills/actions/workflows/validate.yml)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
|
|
6
|
+
One umbrella for the **ssheleg skill family** — the five skills live in their own
|
|
7
|
+
repos, aggregated here as git **submodules**, with a single **launcher/updater**
|
|
8
|
+
that installs and updates them across **every agent**: Claude Code, Cursor,
|
|
9
|
+
OpenCode, Kilo, Kimi, Hermes, OpenClaw, Codex, Gemini CLI, Windsurf, Zed, and more.
|
|
10
|
+
|
|
11
|
+
## The family
|
|
12
|
+
|
|
13
|
+
| Skill | Repo | What |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| **super-ux** | [ssheleg/super-ux](https://github.com/ssheleg/super-ux) | Scenario-driven UX: foundation → flows → screens → scenarios → audits, one `/ux` entry, a doc-drift linter |
|
|
16
|
+
| **task-pipeline** | [ssheleg/task-pipeline](https://github.com/ssheleg/task-pipeline) | Mandatory built-in intake grill (domain-aware, ADR discipline) + 9 gated delivery stages on the superpowers skills |
|
|
17
|
+
| **make-skill** | [ssheleg/make-skill](https://github.com/ssheleg/make-skill) | Create, retrofit, and ship skills & plugins the proven way |
|
|
18
|
+
| **sheleg-design** | [ssheleg/sheleg-design-skill](https://github.com/ssheleg/sheleg-design-skill) | Cinematic scroll-driven landing/hero design + product-UI style packs |
|
|
19
|
+
| **seo-aeo-audit** | [ssheleg/seo-aeo-audit](https://github.com/ssheleg/seo-aeo-audit) | Evidence-first SEO + AEO/GEO site audit: ten tracks, evidence tiers, a prioritized change plan |
|
|
20
|
+
|
|
21
|
+
Each is independently installable; this repo is the one-command hub.
|
|
22
|
+
|
|
23
|
+
## Install everything
|
|
24
|
+
|
|
25
|
+
**No clone needed** (runs straight from GitHub):
|
|
26
|
+
```
|
|
27
|
+
npx github:ssheleg/sshlg-skills install
|
|
28
|
+
```
|
|
29
|
+
After npm publish, the short form also works:
|
|
30
|
+
```
|
|
31
|
+
npx sshlg-skills install
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Or clone with submodules** (pinned snapshots + offline reference):
|
|
35
|
+
```
|
|
36
|
+
git clone --recursive https://github.com/ssheleg/sshlg-skills
|
|
37
|
+
cd sshlg-skills && ./install.sh
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### What `install` does
|
|
41
|
+
|
|
42
|
+
- **Non-Claude agents** (`cursor, opencode, kilo, kimi-code-cli, hermes-agent,
|
|
43
|
+
openclaw, codex, gemini-cli, windsurf, zed`) via the vercel `skills` CLI, global.
|
|
44
|
+
- **Claude Code** via its **plugin** (not a plain copy) — so it never shadows a
|
|
45
|
+
plugin you already run.
|
|
46
|
+
|
|
47
|
+
Flags: `--agent a,b` (pick agents), `--all` (every agent the skills CLI supports),
|
|
48
|
+
`--no-claude` (skip the Claude plugin step), `--claude-only`.
|
|
49
|
+
|
|
50
|
+
## Update everything
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
npx github:ssheleg/sshlg-skills update
|
|
54
|
+
```
|
|
55
|
+
Updates every skills-CLI install (one call per skill id) and the Claude Code
|
|
56
|
+
plugins, and materialises the pinned submodules inside a checkout **without moving
|
|
57
|
+
the pins**. Restart Claude Code to apply.
|
|
58
|
+
|
|
59
|
+
Flags: `--no-claude`, `--claude-only`, and `--bump-pins` (fast-forward the pins to
|
|
60
|
+
their upstream tips — off by default so a checkout stays reproducible). `update`
|
|
61
|
+
targets whatever is already installed, so it takes no `--agent`.
|
|
62
|
+
|
|
63
|
+
## Other commands
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
npx github:ssheleg/sshlg-skills list # the family + versions
|
|
67
|
+
npx github:ssheleg/sshlg-skills agents # supported agents
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## How it works
|
|
71
|
+
|
|
72
|
+
A thin, zero-dependency launcher over the tools that already reach each agent: the
|
|
73
|
+
vercel [`skills`](https://github.com/vercel-labs/skills) CLI (70+ agents),
|
|
74
|
+
`claude plugin` (Claude Code), and `git submodule` (pinned snapshots). It adds no
|
|
75
|
+
new install mechanism — it curates the family and drives those. `skills.json` is
|
|
76
|
+
the source of truth (repos, plugin ids, default agents); the validator keeps it in
|
|
77
|
+
sync with `.gitmodules`.
|
|
78
|
+
|
|
79
|
+
## По-русски
|
|
80
|
+
|
|
81
|
+
**sshlg-skills** — единый зонтичный репозиторий для семейства скилов ssheleg
|
|
82
|
+
(super-ux, task-pipeline, make-skill, sheleg-design, seo-aeo-audit). Сами скилы живут в своих
|
|
83
|
+
репах и подключены сюда git-**сабмодулями**, а один **лончер/апдейтер** ставит и
|
|
84
|
+
обновляет их сразу для **всех агентов**: Claude Code, Cursor, OpenCode, Kilo, Kimi,
|
|
85
|
+
Hermes, OpenClaw, Codex, Gemini CLI, Windsurf, Zed и др.
|
|
86
|
+
|
|
87
|
+
Установить всё: `npx github:ssheleg/sshlg-skills install`. Обновить всё:
|
|
88
|
+
`npx github:ssheleg/sshlg-skills update`. Не-Claude агенты идут через `skills` CLI,
|
|
89
|
+
Claude Code — через **плагин** (чтобы не дублировать plain-копией). Флаги:
|
|
90
|
+
`--agent a,b`, `--all`, `--no-claude`, `--claude-only`. Список семейства и версий —
|
|
91
|
+
`… list`, поддерживаемые агенты — `… agents`.
|
|
92
|
+
|
|
93
|
+
Лончер ничего не изобретает — он тонкая обёртка над тем, что уже умеет достучаться
|
|
94
|
+
до каждого агента (`skills` CLI, `claude plugin`, `git submodule`). Источник правды
|
|
95
|
+
— `skills.json`, валидатор держит его в синхроне с `.gitmodules`.
|
|
96
|
+
|
|
97
|
+
## License
|
|
98
|
+
|
|
99
|
+
MIT © 2026 ssheleg.
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/*
|
|
3
|
+
* sshlg-skills — one launcher/updater for the ssheleg skill family
|
|
4
|
+
* (super-ux, task-pipeline, make-skill, sheleg-design) across every agent.
|
|
5
|
+
*
|
|
6
|
+
* It is a thin orchestrator over the tools that already know how to reach each
|
|
7
|
+
* agent: the vercel `skills` CLI (70+ agents), `claude plugin` (Claude Code),
|
|
8
|
+
* and `git submodule` (pinned snapshots). Zero npm dependencies.
|
|
9
|
+
*
|
|
10
|
+
* npx sshlg-skills install [--agent a,b | --all] [--no-claude] [--claude-only]
|
|
11
|
+
* npx sshlg-skills update [--agent a,b | --all] [--no-claude] [--claude-only] [--bump-pins]
|
|
12
|
+
* npx sshlg-skills list
|
|
13
|
+
* npx sshlg-skills agents
|
|
14
|
+
*/
|
|
15
|
+
'use strict';
|
|
16
|
+
|
|
17
|
+
const fs = require('fs');
|
|
18
|
+
const path = require('path');
|
|
19
|
+
const os = require('os');
|
|
20
|
+
const { spawnSync } = require('child_process');
|
|
21
|
+
|
|
22
|
+
const ROOT = path.resolve(__dirname, '..');
|
|
23
|
+
const manifest = JSON.parse(fs.readFileSync(path.join(ROOT, 'skills.json'), 'utf8'));
|
|
24
|
+
const SKILLS = manifest.skills;
|
|
25
|
+
|
|
26
|
+
function log(m) { process.stdout.write(m + '\n'); }
|
|
27
|
+
function run(cmd, args, opts) {
|
|
28
|
+
log(' » ' + cmd + ' ' + args.join(' '));
|
|
29
|
+
const r = spawnSync(cmd, args, Object.assign(
|
|
30
|
+
{ stdio: 'inherit', shell: process.platform === 'win32' }, opts || {}));
|
|
31
|
+
return r.status === 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function parseFlags(argv) {
|
|
35
|
+
const f = { agents: null, all: false, claude: true, claudeOnly: false, bumpPins: false };
|
|
36
|
+
for (let i = 0; i < argv.length; i++) {
|
|
37
|
+
const a = argv[i];
|
|
38
|
+
if (a === '--all') f.all = true;
|
|
39
|
+
else if (a === '--no-claude') f.claude = false;
|
|
40
|
+
else if (a === '--claude-only') f.claudeOnly = true;
|
|
41
|
+
else if (a === '--bump-pins') f.bumpPins = true;
|
|
42
|
+
else if (a === '--agent' || a === '-a') {
|
|
43
|
+
const v = argv[++i];
|
|
44
|
+
if (!v || v.startsWith('-')) { log('--agent needs a value, e.g. --agent cursor,zed'); process.exit(2); }
|
|
45
|
+
f.agents = v.split(',').map(s => s.trim()).filter(Boolean);
|
|
46
|
+
if (!f.agents.length) { log('--agent got an empty list'); process.exit(2); }
|
|
47
|
+
}
|
|
48
|
+
else if (a.startsWith('-')) { log(`unknown option: ${a}`); process.exit(2); }
|
|
49
|
+
// ignore stray non-flag tokens (e.g. a trailing shell comment zsh doesn't strip)
|
|
50
|
+
else log(` (ignoring stray argument: ${a})`);
|
|
51
|
+
}
|
|
52
|
+
if (f.claudeOnly && !f.claude) { log('--claude-only and --no-claude contradict each other'); process.exit(2); }
|
|
53
|
+
return f;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function agentList(f) {
|
|
57
|
+
if (f.all) return ['*'];
|
|
58
|
+
if (f.agents && f.agents.length) return f.agents;
|
|
59
|
+
return manifest.defaultAgents.slice();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// The skills CLI auto-detects Claude Code and writes ~/.claude/skills/<id> even when
|
|
63
|
+
// we never ask for that agent. While the Claude PLUGIN channel is active those plain
|
|
64
|
+
// copies shadow the plugin, so prune them — "one channel per agent", enforced.
|
|
65
|
+
function pruneClaudeShadows(skillIds) {
|
|
66
|
+
const base = path.join(os.homedir(), '.claude', 'skills');
|
|
67
|
+
const pruned = [];
|
|
68
|
+
for (const id of skillIds) {
|
|
69
|
+
const d = path.join(base, id);
|
|
70
|
+
try {
|
|
71
|
+
if (fs.existsSync(d)) { fs.rmSync(d, { recursive: true, force: true }); pruned.push(id); }
|
|
72
|
+
} catch (_) { /* leave it; not fatal */ }
|
|
73
|
+
}
|
|
74
|
+
if (pruned.length) {
|
|
75
|
+
log(` pruned Claude plain copies that would shadow the plugin: ${pruned.join(', ')}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function usage() {
|
|
80
|
+
log(`sshlg-skills — install/update the ssheleg skill family everywhere
|
|
81
|
+
|
|
82
|
+
Skills: ${SKILLS.map(s => s.name).join(', ')}
|
|
83
|
+
|
|
84
|
+
Usage:
|
|
85
|
+
npx sshlg-skills install [--agent a,b | --all] [--no-claude] [--claude-only]
|
|
86
|
+
npx sshlg-skills update [--agent a,b | --all] [--no-claude] [--claude-only] [--bump-pins]
|
|
87
|
+
npx sshlg-skills list
|
|
88
|
+
npx sshlg-skills agents
|
|
89
|
+
|
|
90
|
+
Defaults:
|
|
91
|
+
- Non-Claude agents (${manifest.defaultAgents.join(', ')}) via the skills CLI.
|
|
92
|
+
- Claude Code via its PLUGIN (not a plain copy) to avoid a shadow duplicate.
|
|
93
|
+
- --all every agent the skills CLI supports ('*'); with Claude plugins on,
|
|
94
|
+
this also drops a plain Claude copy — prefer the default.
|
|
95
|
+
- --no-claude skip the Claude plugin step.
|
|
96
|
+
- --claude-only install/update only the Claude plugins.
|
|
97
|
+
- --bump-pins (update only) also fast-forward the pinned submodules to their
|
|
98
|
+
upstream tips — off by default so pins stay reproducible.`);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function skillsCliAgents(f) {
|
|
102
|
+
// Never let the skills CLI drop a plain Claude copy while we manage Claude via plugin.
|
|
103
|
+
let agents = agentList(f);
|
|
104
|
+
if (f.claude && !f.all) agents = agents.filter(a => a !== 'claude-code');
|
|
105
|
+
if (f.all && f.claude) log(' ! --all includes claude-code: a plain Claude copy will be added alongside the plugin (duplicate). Use the default agent set to avoid this.');
|
|
106
|
+
return agents;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function cmdInstall(f) {
|
|
110
|
+
let ok = true;
|
|
111
|
+
if (!f.claudeOnly) {
|
|
112
|
+
const agents = skillsCliAgents(f);
|
|
113
|
+
// the skills CLI wants ONE `--agent` flag per agent (it does not split a
|
|
114
|
+
// comma/space-joined value) — flatten to repeated flags.
|
|
115
|
+
const agentFlags = agents.reduce((acc, a) => acc.concat('--agent', a), []);
|
|
116
|
+
log(`\n== Installing to agents via skills CLI: ${agents.join(', ')} ==`);
|
|
117
|
+
for (const s of SKILLS) {
|
|
118
|
+
log(`\n- ${s.name} (${s.repo})`);
|
|
119
|
+
ok = run('npx', ['--yes', 'skills', 'add', s.repo, ...agentFlags, '--global', '--yes']) && ok;
|
|
120
|
+
}
|
|
121
|
+
if (f.claude) pruneClaudeShadows(SKILLS.flatMap(s => s.skillNames || [s.name]));
|
|
122
|
+
}
|
|
123
|
+
if (f.claude || f.claudeOnly) {
|
|
124
|
+
log(`\n== Installing Claude Code plugins ==`);
|
|
125
|
+
for (const s of SKILLS) {
|
|
126
|
+
log(`\n- ${s.name}`);
|
|
127
|
+
ok = run('claude', ['plugin', 'marketplace', 'add', s.pluginMarketplace]) && ok;
|
|
128
|
+
ok = run('claude', ['plugin', 'install', s.pluginInstall]) && ok;
|
|
129
|
+
}
|
|
130
|
+
log('\n(restart Claude Code to apply the plugins)');
|
|
131
|
+
}
|
|
132
|
+
return ok;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function cmdUpdate(f) {
|
|
136
|
+
let ok = true;
|
|
137
|
+
// 1. Submodules are PINNED snapshots. Only materialise them (--init), never
|
|
138
|
+
// move the pins — unless the operator explicitly asks with --bump-pins.
|
|
139
|
+
// Skipped entirely for --claude-only: that flag must not touch the checkout.
|
|
140
|
+
if (!f.claudeOnly && fs.existsSync(path.join(ROOT, '.gitmodules'))) {
|
|
141
|
+
if (f.bumpPins) {
|
|
142
|
+
log('\n== Bumping submodule pins to upstream tips (--bump-pins) ==');
|
|
143
|
+
ok = run('git', ['-C', ROOT, 'submodule', 'update', '--init', '--remote', '--merge']) && ok;
|
|
144
|
+
log(' ! pins moved — commit the gitlinks to make this reproducible');
|
|
145
|
+
} else {
|
|
146
|
+
log('\n== Materialising pinned submodules (pins unchanged) ==');
|
|
147
|
+
ok = run('git', ['-C', ROOT, 'submodule', 'update', '--init', '--recursive']) && ok;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (!f.claudeOnly) {
|
|
151
|
+
// A repo can ship several skills under different ids (super-ux ships
|
|
152
|
+
// ux-foundation/ux-flows/ux-scenarios/ux-audit — there is no "super-ux"
|
|
153
|
+
// skill), and `skills update` matches INSTALLED SKILL names, not repo names.
|
|
154
|
+
const names = SKILLS.flatMap(s => (s.skillNames && s.skillNames.length ? s.skillNames : [s.name]));
|
|
155
|
+
log(`\n== Updating skills-CLI installs (global): ${names.join(', ')} ==`);
|
|
156
|
+
// One invocation per skill: a single bad id must not fail the whole batch.
|
|
157
|
+
for (const n of names) {
|
|
158
|
+
ok = run('npx', ['--yes', 'skills', 'update', n, '--global', '--yes']) && ok;
|
|
159
|
+
}
|
|
160
|
+
if (f.claude) pruneClaudeShadows(names);
|
|
161
|
+
}
|
|
162
|
+
if (f.claude || f.claudeOnly) {
|
|
163
|
+
log(`\n== Updating Claude Code plugins ==`);
|
|
164
|
+
for (const s of SKILLS) {
|
|
165
|
+
ok = run('claude', ['plugin', 'marketplace', 'update', s.pluginInstall.split('@')[1]]) && ok;
|
|
166
|
+
ok = run('claude', ['plugin', 'update', s.pluginInstall]) && ok;
|
|
167
|
+
}
|
|
168
|
+
log('\n(restart Claude Code to apply)');
|
|
169
|
+
}
|
|
170
|
+
return ok;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function cmdList() {
|
|
174
|
+
log('ssheleg skill family:\n');
|
|
175
|
+
for (const s of SKILLS) {
|
|
176
|
+
let ver = s.version || '?';
|
|
177
|
+
const pj = path.join(ROOT, s.dir, 'plugins', s.name, '.claude-plugin', 'plugin.json');
|
|
178
|
+
try { ver = JSON.parse(fs.readFileSync(pj, 'utf8')).version; } catch (_) {}
|
|
179
|
+
log(` ${s.name.padEnd(16)} v${ver.padEnd(8)} ${s.repo}`);
|
|
180
|
+
log(` ${' '.repeat(16)} ${s.desc}`);
|
|
181
|
+
}
|
|
182
|
+
log(`\nInstall: npx sshlg-skills install Update: npx sshlg-skills update`);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function cmdAgents() {
|
|
186
|
+
log('Agents are handled by the vercel `skills` CLI (70+). The named ones:\n');
|
|
187
|
+
log(' claude-code (via plugin), cursor, opencode, kilo, kimi-code-cli,');
|
|
188
|
+
log(' hermes-agent, openclaw, codex, gemini-cli, windsurf, zed, and more.\n');
|
|
189
|
+
log("Full list / exact ids: npx skills add <any-repo> --agent __x__ (prints valid agents)");
|
|
190
|
+
log(`Default set: ${manifest.defaultAgents.join(', ')} (Claude via plugin)`);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function main(argv) {
|
|
194
|
+
const [cmd, ...rest] = argv.slice(2);
|
|
195
|
+
if (!cmd || cmd === 'help' || cmd === '--help' || cmd === '-h') { usage(); return 0; }
|
|
196
|
+
if (cmd === 'list' || cmd === 'ls') { cmdList(); return 0; }
|
|
197
|
+
if (cmd === 'agents') { cmdAgents(); return 0; }
|
|
198
|
+
const f = parseFlags(rest);
|
|
199
|
+
if (cmd === 'install' || cmd === 'i') return cmdInstall(f) ? 0 : 1;
|
|
200
|
+
if (cmd === 'update' || cmd === 'up') return cmdUpdate(f) ? 0 : 1;
|
|
201
|
+
log(`unknown command: ${cmd}`); usage(); return 2;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
process.exit(main(process.argv));
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sshlg-skills",
|
|
3
|
+
"version": "0.5.4",
|
|
4
|
+
"description": "One launcher/updater for the ssheleg skill family (super-ux, task-pipeline, make-skill, sheleg-design, seo-aeo-audit) across every agent — Claude Code, Cursor, OpenCode, Kilo, Kimi, Hermes, OpenClaw, Codex, and more.",
|
|
5
|
+
"bin": {
|
|
6
|
+
"sshlg-skills": "bin/sshlg-skills.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin",
|
|
10
|
+
"skills.json",
|
|
11
|
+
"README.md",
|
|
12
|
+
"LICENSE",
|
|
13
|
+
"CHANGELOG.md"
|
|
14
|
+
],
|
|
15
|
+
"repository": "github:ssheleg/sshlg-skills",
|
|
16
|
+
"homepage": "https://github.com/ssheleg/sshlg-skills",
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"author": "ssheleg",
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=16"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"skills",
|
|
24
|
+
"launcher",
|
|
25
|
+
"installer",
|
|
26
|
+
"updater",
|
|
27
|
+
"monorepo",
|
|
28
|
+
"submodules",
|
|
29
|
+
"claude-code",
|
|
30
|
+
"cursor",
|
|
31
|
+
"agents"
|
|
32
|
+
]
|
|
33
|
+
}
|
package/skills.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"owner": "ssheleg",
|
|
3
|
+
"defaultAgents": [
|
|
4
|
+
"cursor",
|
|
5
|
+
"opencode",
|
|
6
|
+
"kilo",
|
|
7
|
+
"kimi-code-cli",
|
|
8
|
+
"hermes-agent",
|
|
9
|
+
"openclaw",
|
|
10
|
+
"codex",
|
|
11
|
+
"gemini-cli",
|
|
12
|
+
"windsurf",
|
|
13
|
+
"zed"
|
|
14
|
+
],
|
|
15
|
+
"skills": [
|
|
16
|
+
{
|
|
17
|
+
"name": "super-ux",
|
|
18
|
+
"repo": "ssheleg/super-ux",
|
|
19
|
+
"dir": "skills/super-ux",
|
|
20
|
+
"skillNames": [
|
|
21
|
+
"ux-foundation",
|
|
22
|
+
"ux-flows",
|
|
23
|
+
"ux-scenarios",
|
|
24
|
+
"ux-audit"
|
|
25
|
+
],
|
|
26
|
+
"pluginMarketplace": "ssheleg/super-ux",
|
|
27
|
+
"pluginInstall": "super-ux@super-ux",
|
|
28
|
+
"desc": "Scenario-driven UX: foundation -> flows -> screens -> scenarios -> audits, one /ux entry, a doc-drift linter.",
|
|
29
|
+
"version": "0.19.0"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"name": "task-pipeline",
|
|
33
|
+
"repo": "ssheleg/task-pipeline",
|
|
34
|
+
"dir": "skills/task-pipeline",
|
|
35
|
+
"pluginMarketplace": "ssheleg/task-pipeline",
|
|
36
|
+
"pluginInstall": "task-pipeline@task-pipeline",
|
|
37
|
+
"desc": "Mandatory built-in intake grill (domain-aware, ADR discipline) + 9 gated delivery stages on the superpowers skills; typed gates, super-ux UX track, toggleable release.",
|
|
38
|
+
"skillNames": [
|
|
39
|
+
"task-pipeline"
|
|
40
|
+
],
|
|
41
|
+
"version": "0.12.0"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"name": "make-skill",
|
|
45
|
+
"repo": "ssheleg/make-skill",
|
|
46
|
+
"dir": "skills/make-skill",
|
|
47
|
+
"pluginMarketplace": "ssheleg/make-skill",
|
|
48
|
+
"pluginInstall": "make-skill@make-skill",
|
|
49
|
+
"desc": "Create, retrofit, and ship agent skills & plugins the proven ssheleg way.",
|
|
50
|
+
"skillNames": [
|
|
51
|
+
"make-skill"
|
|
52
|
+
],
|
|
53
|
+
"version": "0.3.0"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "sheleg-design",
|
|
57
|
+
"repo": "ssheleg/sheleg-design-skill",
|
|
58
|
+
"dir": "skills/sheleg-design",
|
|
59
|
+
"pluginMarketplace": "ssheleg/sheleg-design-skill",
|
|
60
|
+
"pluginInstall": "sheleg-design@sheleg-design-skill",
|
|
61
|
+
"desc": "Cinematic scroll-driven landing/hero design methodology + product-UI style packs.",
|
|
62
|
+
"skillNames": [
|
|
63
|
+
"sheleg-design"
|
|
64
|
+
],
|
|
65
|
+
"version": "0.7.0"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"name": "seo-aeo-audit",
|
|
69
|
+
"repo": "ssheleg/seo-aeo-audit",
|
|
70
|
+
"dir": "skills/seo-aeo-audit",
|
|
71
|
+
"pluginMarketplace": "ssheleg/seo-aeo-audit",
|
|
72
|
+
"pluginInstall": "seo-aeo-audit@seo-aeo-audit",
|
|
73
|
+
"desc": "Evidence-first SEO + AEO/GEO website audit: ten tracks with mechanical sweeps, evidence tiers, a dated Google update timeline, 59 tiered growth plays, and a prioritized change plan with verification steps.",
|
|
74
|
+
"skillNames": [
|
|
75
|
+
"seo-aeo-audit"
|
|
76
|
+
],
|
|
77
|
+
"version": "0.4.0"
|
|
78
|
+
}
|
|
79
|
+
]
|
|
80
|
+
}
|