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 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
+ [![validate](https://github.com/ssheleg/sshlg-skills/actions/workflows/validate.yml/badge.svg)](https://github.com/ssheleg/sshlg-skills/actions/workflows/validate.yml)
4
+ [![license](https://img.shields.io/badge/license-MIT-blue)](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
+ }