@skill-graph/cli 0.5.6 → 0.5.7

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/README.md CHANGED
@@ -1,21 +1,56 @@
1
1
  # Skill Graph
2
2
 
3
- [![Version 0.5.0](https://img.shields.io/badge/version-0.5.0-blue?style=flat-square)](CHANGELOG.md) [![Protocol v1.1.0](https://img.shields.io/badge/protocol-v1.1.0-blueviolet?style=flat-square)](https://github.com/jacob-balslev/skill-metadata-protocol) [![License Apache-2.0 + CC-BY-4.0](https://img.shields.io/badge/license-Apache--2.0%20%2B%20CC--BY--4.0-green?style=flat-square)](LICENSE) [![Exports SKILL.md](https://img.shields.io/badge/exports-SKILL.md-orange?style=flat-square)](https://agentskills.io/specification)
4
-
5
- **The library-level system for structured `SKILL.md` libraries. Lint, manifest compiler, router, drift sentinel, and export pipeline.**
3
+ [![npm version](https://img.shields.io/npm/v/@skill-graph/cli?style=flat-square&logo=npm&color=cb3837)](https://www.npmjs.com/package/@skill-graph/cli) [![Schema v6](https://img.shields.io/badge/schema-v6-blueviolet?style=flat-square)](docs/SKILL_METADATA_PROTOCOL.md) [![License Apache-2.0 + CC-BY-4.0](https://img.shields.io/badge/license-Apache--2.0%20%2B%20CC--BY--4.0-green?style=flat-square)](LICENSE) [![Exports SKILL.md](https://img.shields.io/badge/exports-SKILL.md-orange?style=flat-square)](https://agentskills.io/specification) [![CI](https://img.shields.io/github/actions/workflow/status/jacob-balslev/skill-graph/publish.yml?style=flat-square&label=CI)](https://github.com/jacob-balslev/skill-graph/actions) [![GitHub stars](https://img.shields.io/github/stars/jacob-balslev/skill-graph?style=flat-square&logo=github)](https://github.com/jacob-balslev/skill-graph/stargazers)
4
+
5
+ **The canonical home for structured `SKILL.md` libraries.** Skill spec, JSON schemas, lint, manifest compiler, router, drift sentinel, audit loop, and the export pipeline — all shipped as a single CLI.
6
+
7
+ A plain `SKILL.md` gives an agent a procedure to load. The Skill Metadata Protocol adds the structured frontmatter contract. Skill Graph turns those declarations into a compiled manifest, routing map, drift sentinel, overlap detector, audit loop, and export path back to the plain `SKILL.md` format.
8
+
9
+ ## The ecosystem
10
+
11
+ <p align="center">
12
+ <img src="docs/images/skill-graph-ecosystem.svg" alt="Skill Graph ecosystem — skill-graph is the canonical monolith that exports SKILL.md into the skills library; skill-metadata-protocol and skill-audit-loop are docs-only mirrors." width="640">
13
+ </p>
14
+
15
+ ```mermaid
16
+ %%{init: {'theme':'neutral','flowchart':{'curve':'basis','padding':20}}}%%
17
+ graph TD
18
+ G["<b>skill-graph</b><br/><i>canonical monolith: spec, schemas, tooling, audit</i><br/>@skill-graph/cli — npm install -g"]
19
+ L["<b>skills</b><br/><i>public open-source skill library</i><br/>npx skills add jacob-balslev/skills"]
20
+ P["<b>skill-metadata-protocol</b><br/><i>deprecated · docs-only mirror</i><br/>SKILL_METADATA_PROTOCOL.md preserved"]
21
+ A["<b>skill-audit-loop</b><br/><i>deprecated · docs-only mirror</i><br/>SKILL_AUDIT_LOOP.md preserved"]
22
+ G -->|exports SKILL.md| L
23
+ G -. mirrors protocol spec to .-> P
24
+ G -. mirrors audit procedure to .-> A
25
+ classDef active fill:#dcfce7,stroke:#16a34a,stroke-width:2px,color:#14532d;
26
+ classDef tool fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#78350f;
27
+ classDef mirror fill:#f3f4f6,stroke:#9ca3af,stroke-width:1px,color:#4b5563,stroke-dasharray:4 3;
28
+ class G tool;
29
+ class L active;
30
+ class P,A mirror;
31
+ ```
6
32
 
7
- Skill Graph operates across a library of [Skill Metadata Protocol](https://github.com/jacob-balslev/skill-metadata-protocol) records. A plain `SKILL.md` gives an agent a procedure to load. Skill Metadata Protocol adds the structured frontmatter contract. Skill Graph turns those declarations into a compiled manifest, routing map, drift sentinel, overlap detector, and export path back to the plain `SKILL.md` format.
33
+ | Repo | npm | Status | Purpose |
34
+ |------|-----|--------|---------|
35
+ | **skill-graph** *(this repo)* | [`@skill-graph/cli`](https://www.npmjs.com/package/@skill-graph/cli) | **active** | Canonical home — protocol spec, schemas, CLI, lint, manifest, router, drift, audit loop, export |
36
+ | **[skills](https://github.com/jacob-balslev/skills)** | — | **active** | Public open-source skill library (consumed via `npx skills add jacob-balslev/skills`) |
37
+ | [skill-metadata-protocol](https://github.com/jacob-balslev/skill-metadata-protocol) | _(consolidated)_ | mirror | Historical docs-only mirror of the normative spec — content lives [here](docs/SKILL_METADATA_PROTOCOL.md) |
38
+ | [skill-audit-loop](https://github.com/jacob-balslev/skill-audit-loop) | _(consolidated)_ | mirror | Historical docs-only mirror of the audit procedure — content lives [here](docs/SKILL_AUDIT_LOOP.md) |
8
39
 
9
- ## Ecosystem
40
+ > **Recent consolidation (2026-05-18):** Per [SH-6137](https://linear.app/sales-hub/issue/SH-6137) and [ADR 0009](docs/adr/0009-sibling-repo-deprecation.md), `@skill-graph/protocol` and `@skill-graph/audit` were merged into `@skill-graph/cli@0.5.6`. Schemas, audit scripts, graders, eval fixtures, examples, and the protocol/audit canonical docs now all live in this repo. The sibling repos are preserved as read-only mirrors so existing inbound links remain valid; they are not archived on GitHub.
10
41
 
11
- | Repo | npm | Purpose |
12
- |------|-----|---------|
13
- | **[skill-metadata-protocol](https://github.com/jacob-balslev/skill-metadata-protocol)** | `@skill-graph/protocol` | Normative spec + JSON schemas |
14
- | **skill-graph** *(this repo)* | `@skill-graph/cli` | Library tooling: lint, manifest, router, drift |
15
- | **[skill-audit-loop](https://github.com/jacob-balslev/skill-audit-loop)** | `@skill-graph/audit` | 5-phase audit procedure |
16
- | **[skills](https://github.com/jacob-balslev/skills)** | — | Public open-source skill library |
42
+ ### Pick the right doc
17
43
 
18
- [Skill Graph system](SKILL_GRAPH.md) | [Full template](examples/skill-metadata-template.md) | [Primer](docs/PRIMER.md) | [Field reference](docs/field-reference.md) | [Adoption guide](docs/ADOPTION.md) | [Conformance](docs/CONFORMANCE.md)
44
+ | If you want to… | Start here |
45
+ |---|---|
46
+ | **Install the CLI** | [Quick Start](#quick-start) below — `npm install -g @skill-graph/cli` |
47
+ | **Install the public skill library** | [`jacob-balslev/skills`](https://github.com/jacob-balslev/skills) — `npx skills add jacob-balslev/skills` |
48
+ | **Understand the `SKILL.md` frontmatter contract** | [`docs/SKILL_METADATA_PROTOCOL.md`](docs/SKILL_METADATA_PROTOCOL.md) — the normative spec |
49
+ | **Author a new skill** | [`docs/PRIMER.md`](docs/PRIMER.md) and [`examples/skill-metadata-template.md`](examples/skill-metadata-template.md) |
50
+ | **Audit an existing skill library** | [`docs/SKILL_AUDIT_LOOP.md`](docs/SKILL_AUDIT_LOOP.md) — the audit procedure |
51
+ | **Look up a specific field** | [`docs/field-reference.md`](docs/field-reference.md) |
52
+ | **Plan adoption in a new repo** | [`docs/ADOPTION.md`](docs/ADOPTION.md) and [`docs/CONFORMANCE.md`](docs/CONFORMANCE.md) |
53
+ | **Migrate from an older `schema_version`** | [`docs/migrations/`](docs/migrations/) |
19
54
 
20
55
  > **Surface scope:** The OSS-portable canonical library lives at `skills/skills/` (141 v6-compliant skills). A separate personal/Sales Hub surface at `skills/` (263 pre-v6) is frozen — new skills are curated into the OSS surface only when non-PII, non-Sales-Hub, and generalizable. See [ADR 0008](docs/adr/0008-skill-surface-split-and-curation-policy.md).
21
56
 
@@ -309,7 +344,10 @@ Run `skill-graph --help` to see all commands (including legacy aliases).
309
344
  | Path | Purpose |
310
345
  |---|---|
311
346
  | [`SKILL_GRAPH.md`](SKILL_GRAPH.md) | Library-level system model and authority tiers. |
312
- | [`schemas/`](schemas/) | Skill and manifest JSON Schemas, including pinned v4, v5, and v6 copies; the unversioned mirror tracks v6. |
347
+ | [`docs/SKILL_METADATA_PROTOCOL.md`](docs/SKILL_METADATA_PROTOCOL.md) | **Canonical** normative spec for the `SKILL.md` frontmatter contract. |
348
+ | [`docs/SKILL_AUDIT_LOOP.md`](docs/SKILL_AUDIT_LOOP.md) | **Canonical** audit procedure (4 operations: audit, improve, evaluate, evolve). |
349
+ | [`docs/SKILL_AUDIT_CHECKLIST.md`](docs/SKILL_AUDIT_CHECKLIST.md) | Per-skill audit checklist used during `audit`. |
350
+ | [`schemas/`](schemas/) | Skill and manifest JSON Schemas, including pinned v2 through v6; the unversioned mirror tracks v6. |
313
351
  | [`examples/skill-metadata-template.md`](examples/skill-metadata-template.md) | Copyable authoring template. |
314
352
  | [`examples/projects/markdown-static-site/`](examples/projects/markdown-static-site/) | Specimen project showing codebase-grounded skills. |
315
353
  | [`docs/field-reference.md`](docs/field-reference.md) | Field-by-field reference. |
@@ -317,14 +355,16 @@ Run `skill-graph --help` to see all commands (including legacy aliases).
317
355
  | [`docs/quality-doctrine.md`](docs/quality-doctrine.md) | Quality bar for preserving scope, readable names, organization-over-trimming, compression, and verification. |
318
356
  | [`docs/SKILL-MD-FORMAT-COMPATIBILITY.md`](docs/SKILL-MD-FORMAT-COMPATIBILITY.md) | How export maps protocol-enriched skills back to plain `SKILL.md`. |
319
357
  | [`docs/marketplace-syndication.md`](docs/marketplace-syndication.md) | How to syndicate the full library to public `SKILL.md` marketplaces and mine gaps for new skills. |
358
+ | [`docs/adr/`](docs/adr/) | Architecture Decision Records, including [ADR 0009 — sibling repo deprecation](docs/adr/0009-sibling-repo-deprecation.md). |
359
+ | [`docs/migrations/`](docs/migrations/) | Per-bump author migration procedures (v4→v5, v5→v6). |
320
360
 
321
- **Sibling repos** (post-2026-05-16 monorepo split — content moved out of this tooling repo):
361
+ **Related repos:**
322
362
 
323
- | Repo | Purpose |
324
- |---|---|
325
- | [`jacob-balslev/skill-metadata-protocol`](https://github.com/jacob-balslev/skill-metadata-protocol) | Normative protocol contract (formerly `SKILL_METADATA_PROTOCOL.md` here). |
326
- | [`jacob-balslev/skills`](https://github.com/jacob-balslev/skills) | Canonical 141-skill library (formerly `skills/` here). |
327
- | [`jacob-balslev/skill-audit-loop`](https://github.com/jacob-balslev/skill-audit-loop) | Repeatable audit workflow (formerly `SKILL_AUDIT_LOOP.md` + `SKILL_AUDIT_CHECKLIST.md` here). |
363
+ | Repo | Status | Purpose |
364
+ |---|---|---|
365
+ | [`jacob-balslev/skills`](https://github.com/jacob-balslev/skills) | **active** | Public open-source 141-skill library. Distributed via `npx skills add jacob-balslev/skills`. |
366
+ | [`jacob-balslev/skill-metadata-protocol`](https://github.com/jacob-balslev/skill-metadata-protocol) | mirror | Historical docs-only mirror of the protocol spec (kept for inbound-link stability). Canonical doc now in [`docs/SKILL_METADATA_PROTOCOL.md`](docs/SKILL_METADATA_PROTOCOL.md). |
367
+ | [`jacob-balslev/skill-audit-loop`](https://github.com/jacob-balslev/skill-audit-loop) | mirror | Historical docs-only mirror of the audit workflow. Canonical doc now in [`docs/SKILL_AUDIT_LOOP.md`](docs/SKILL_AUDIT_LOOP.md). |
328
368
 
329
369
  ## Releasing (Maintainers)
330
370
 
@@ -393,6 +433,12 @@ Skill Metadata Protocol is designed to sit next to existing agent-context conven
393
433
 
394
434
  ## Status
395
435
 
396
- Latest release checkpoint: **0.5.0 (2026-05-13)**. The current contract is `schema_version: 6` — see [`skill-metadata-protocol/schemas/skill.v6.schema.json`](https://github.com/jacob-balslev/skill-metadata-protocol/blob/main/schemas/skill.v6.schema.json) for the authoritative shape and [`skill-metadata-protocol/docs/migrations/v5-to-v6.md`](https://github.com/jacob-balslev/skill-metadata-protocol/blob/main/docs/migrations/v5-to-v6.md) for the migration procedure. The local `schemas/` directory pins v4, v5, and v6 copies for tooling that consumes the schemas directly.
436
+ Latest release: **`@skill-graph/cli@0.5.6`** (2026-05-18) — see [`CHANGELOG.md`](CHANGELOG.md). The current contract is `schema_version: 6` — see [`schemas/skill.v6.schema.json`](schemas/skill.v6.schema.json) for the authoritative shape and [`docs/migrations/v5-to-v6.md`](docs/migrations/v5-to-v6.md) for the migration procedure. The `schemas/` directory pins v2 through v6 for tooling that consumes the schemas directly. The unversioned `skill.schema.json` tracks v6.
437
+
438
+ ## Contributing & Trust
397
439
 
398
- Code is licensed under Apache-2.0. Skill content and documentation are licensed under CC-BY-4.0 where noted. See [`LICENSE`](LICENSE) and [`NOTICE`](NOTICE).
440
+ - **Contributing** see [`CONTRIBUTING.md`](CONTRIBUTING.md). Issues and PRs welcome via the structured templates in [`.github/`](.github/).
441
+ - **Security** — report vulnerabilities privately via the [security policy](SECURITY.md), not as public issues.
442
+ - **Code of Conduct** — this project follows the [Contributor Covenant 2.1](CODE_OF_CONDUCT.md).
443
+ - **License** — code is licensed under [Apache-2.0](LICENSE). Skill content and documentation under CC-BY-4.0 where noted in [`NOTICE`](NOTICE).
444
+ - **Discussions** — open-ended questions and ideas welcome in [GitHub Discussions](https://github.com/jacob-balslev/skill-graph/discussions).
@@ -181,14 +181,38 @@ Note: skill-graph evolve is not yet standalone-compatible. It depends on
181
181
  },
182
182
 
183
183
  // ─── Legacy / additional subcommands (backward compat) ───────────────────
184
- manifest: { script: 'scripts/generate-manifest.js' },
185
- overlap: { script: 'scripts/skill-overlap.js' },
186
- 'routing-eval': { script: 'scripts/skill-graph-routing-eval.js' },
187
- 'export-verify': { script: 'scripts/verify-skill-md-export.js' },
188
- 'export:verify-skill-md': { script: 'scripts/verify-skill-md-export.js' },
189
- 'marketplace-export': { script: 'scripts/export-marketplace-skills.js' },
190
- 'marketplace:export': { script: 'scripts/export-marketplace-skills.js' },
191
- 'protocol-check': { script: 'scripts/check-protocol-consistency.js' },
184
+ manifest: {
185
+ script: 'scripts/generate-manifest.js',
186
+ help: `Usage: skill-graph manifest [options]\n\nGenerate or validate a skills.manifest.json from the skill library.\n\nOptions:\n --validate-only Validate only, do not write. Exits non-zero on invalid manifest.\n --output <path> Output path (default: skills.manifest.json).\n\nSee also: skill-graph protocol-check (cross-artifact consistency)\n`,
187
+ },
188
+ overlap: {
189
+ script: 'scripts/skill-overlap.js',
190
+ help: `Usage: skill-graph overlap [options]\n\nDetect duplicate activation signals (keywords, paths, triggers) across skills.\n\nFlags activation collisions where two or more skills would compete for the same routing query.\n`,
191
+ },
192
+ 'routing-eval': {
193
+ script: 'scripts/skill-graph-routing-eval.js',
194
+ help: `Usage: skill-graph routing-eval [options]\n\nRun the routing examples and anti_examples from each skill's frontmatter through the live router.\n\nOptions:\n --manifest <path> Pre-built manifest to use (default: generate one).\n --only-asserted Only run examples with asserted expected skills.\n`,
195
+ },
196
+ 'export-verify': {
197
+ script: 'scripts/verify-skill-md-export.js',
198
+ help: `Usage: skill-graph export-verify [path]\n\nVerify exported skills under marketplace/skills/ against the plain SKILL.md export shape contract.\n\nDefault path: marketplace/skills\n`,
199
+ },
200
+ 'export:verify-skill-md': {
201
+ script: 'scripts/verify-skill-md-export.js',
202
+ help: `Usage: skill-graph export:verify-skill-md [path]\n\nAlias for 'export-verify'. Verify exported skills against the plain SKILL.md export shape.\n`,
203
+ },
204
+ 'marketplace-export': {
205
+ script: 'scripts/export-marketplace-skills.js',
206
+ help: `Usage: skill-graph marketplace-export [options]\n\nGenerate and validate the public marketplace export surface (marketplace/ tree).\n\nOptions:\n --output <dir> Marketplace output root (default: marketplace).\n --check Validate only; fail if generated files are stale.\n`,
207
+ },
208
+ 'marketplace:export': {
209
+ script: 'scripts/export-marketplace-skills.js',
210
+ help: `Usage: skill-graph marketplace:export [options]\n\nAlias for 'marketplace-export'. Generate and validate the public marketplace surface.\n`,
211
+ },
212
+ 'protocol-check': {
213
+ script: 'scripts/check-protocol-consistency.js',
214
+ help: `Usage: skill-graph protocol-check [options]\n\nCheck cross-artifact protocol consistency across the C1-C8 invariants:\n\n C1 — Field-set parity (field-reference.md vs skill.schema.json)\n C2 — Authored-to-generated parity (skill.schema.json -> manifest.schema.json)\n C3 — Artifact-root convention\n C4 — Sample manifest correctness\n C5 — Example truth invariants\n C6 — Versioned schema parity (skill.schema.json vs skill.v6.schema.json)\n C7 — Generated field-reference parity\n C8 — JSON-LD context coverage (schema fields vs skill.context.jsonld)\n\nOptions:\n --verbose Print per-field diagnostics for each failed check.\n\nExit codes: 0 on PASS; non-zero on any FAIL.\n`,
215
+ },
192
216
  };
193
217
 
194
218
  function printHelp() {
@@ -0,0 +1,48 @@
1
+ # ADR 0009 — Sibling Repo Deprecation (Consolidation Addendum)
2
+
3
+ > Status: Accepted
4
+ > Date: 2026-05-18
5
+ > Linear: SH-6132 / SH-6137
6
+
7
+ ## Context
8
+
9
+ Per the SH-6132 monolith decision, schemas and source code from two sibling repos were consolidated into `@skill-graph/cli`:
10
+
11
+ - `skill-metadata-protocol` (`@skill-graph/protocol@1.3.0`) — JSON schemas, migration docs, examples, ADRs
12
+ - `skill-audit-loop` (`@skill-graph/audit@0.2.0`) — audit scripts, graders, shared utilities, eval fixtures
13
+
14
+ The consolidation shipped in `@skill-graph/cli@0.5.6` (commit `654b4df`, published 2026-05-18).
15
+
16
+ ## Decision
17
+
18
+ Both sibling repos become **docs-only mirrors** as of 2026-05-18:
19
+
20
+ - Source files (schemas/, src/, shared/, graders/, examples/, package.json) are removed from both repos.
21
+ - Canonical documents (SKILL_METADATA_PROTOCOL.md, SKILL_AUDIT_LOOP.md, SKILL_AUDIT_CHECKLIST.md, READMEs) are preserved for historical reference and inbound-link stability.
22
+ - Repos are NOT archived on GitHub (Option B) — they remain publicly readable.
23
+ - Deprecation banners are added to both READMEs pointing to `@skill-graph/cli`.
24
+
25
+ ## Version source of truth (post-consolidation)
26
+
27
+ The version source of truth for `schema_version` is now `@skill-graph/cli` — specifically the schemas bundled under `lib/schemas/` in the published package. ADR 0007 in `skill-metadata-protocol/docs/adr/0007-version-source-of-truth.md` documents the dual-versioning model; this ADR records the physical move.
28
+
29
+ New consumers should install `@skill-graph/cli` and reference:
30
+ - `https://github.com/jacob-balslev/skill-graph/blob/main/docs/SKILL_METADATA_PROTOCOL.md`
31
+ - `https://github.com/jacob-balslev/skill-graph/blob/main/docs/SKILL_AUDIT_LOOP.md`
32
+ - `https://www.npmjs.com/package/@skill-graph/cli`
33
+
34
+ ## Consequences
35
+
36
+ - `skill-metadata-protocol` and `skill-audit-loop` repos stay alive as read-only mirrors with deprecation banners.
37
+ - All new schema evolution and audit tooling development happens in `skill-graph`.
38
+ - External links to the sibling repos' README and canonical docs files remain valid.
39
+ - Links to source files (schemas/, src/) in the sibling repos become 404s — consumers must migrate to `@skill-graph/cli`.
40
+
41
+ ## Related
42
+
43
+ - SH-6132 — Monolith consolidation decision
44
+ - SH-6133 — Source consolidation into skill-graph
45
+ - SH-6134 — Unified CLI dispatcher
46
+ - SH-6136 — v0.5.6 publish
47
+ - ADR 0007 in `skill-metadata-protocol/docs/adr/` — version source of truth (with 2026-05-18 addendum)
48
+ - ADR 0008 — Skill surface split and curation policy
@@ -0,0 +1,17 @@
1
+ %%{init: {'theme':'neutral','flowchart':{'curve':'basis','padding':20}}}%%
2
+ graph TD
3
+ G["<b>skill-graph</b><br/><i>canonical monolith: spec, schemas, tooling, audit</i><br/>@skill-graph/cli — npm install -g"]
4
+ L["<b>skills</b><br/><i>public open-source skill library</i><br/>npx skills add jacob-balslev/skills"]
5
+ P["<b>skill-metadata-protocol</b><br/><i>deprecated · docs-only mirror</i><br/>SKILL_METADATA_PROTOCOL.md preserved"]
6
+ A["<b>skill-audit-loop</b><br/><i>deprecated · docs-only mirror</i><br/>SKILL_AUDIT_LOOP.md preserved"]
7
+
8
+ G -->|exports SKILL.md| L
9
+ G -. mirrors protocol spec to .-> P
10
+ G -. mirrors audit procedure to .-> A
11
+
12
+ classDef active fill:#dcfce7,stroke:#16a34a,stroke-width:2px,color:#14532d;
13
+ classDef tool fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#78350f;
14
+ classDef mirror fill:#f3f4f6,stroke:#9ca3af,stroke-width:1px,color:#4b5563,stroke-dasharray:4 3;
15
+ class G tool;
16
+ class L active;
17
+ class P,A mirror;
@@ -5,7 +5,7 @@
5
5
  > **Predicate glossary:** [`docs/glossary.md`](glossary.md).
6
6
  > **JSON-LD @context:** [`schemas/skill.context.jsonld`](../schemas/skill.context.jsonld).
7
7
 
8
- Schema version: **6** · Field count: **52** · Required: **13**
8
+ Schema version: **6** · Field count: **54** · Required: **13**
9
9
 
10
10
  ---
11
11
 
@@ -107,6 +107,16 @@ Hierarchical domain path using slash-delimited segments (e.g., `ecommerce/integr
107
107
 
108
108
  ---
109
109
 
110
+ ### `secondary_categories` *(optional)*
111
+
112
+ **Type:** array of string
113
+
114
+ Additive tags for cross-listing in marketplace collections. Primary `category` is MECE and decides folder placement; `secondary_categories` lets a skill that genuinely serves two audiences (e.g., `playwright-cli` is primarily `quality` but also relevant to `engineering`) appear in additional marketplace collections without affecting filesystem layout. Max 2 entries to prevent dilution. Drawn from the same closed 6-enum as `category`; MUST NOT include the primary `category` value.
115
+
116
+ **Full reference:** [`docs/field-reference.md#secondary_categories`](field-reference.md#secondary_categories)
117
+
118
+ ---
119
+
110
120
  ### `scope` *(required)*
111
121
 
112
122
  **Type:** `codebase` | `reference` | `portable`
@@ -397,6 +407,16 @@ Lifecycle posture for consumers. `experimental` (subject to change), `stable` (p
397
407
 
398
408
  ---
399
409
 
410
+ ### `marketplace_tier` *(optional)*
411
+
412
+ **Type:** `S` | `A` | `B` | `C`
413
+
414
+ Publication priority for the public marketplace at `github.com/jacob-balslev/skills` / `skills.sh`. `S` = featured (top-of-README, individual hero copy). `A` = high-demand (named in collection tables). `B` = standard utility (included in collection tables). `C` = niche (collapsed 'More' section). Omit entirely for skills that should not be published. Sourced from `marketplace-publication-priority-*.md` and authored per skill. Lint validates the enum; consumers (export-marketplace-skills.js, generate-marketplace-readmes.js) filter and group on this field.
415
+
416
+ **Full reference:** [`docs/field-reference.md#marketplace_tier`](field-reference.md#marketplace_tier)
417
+
418
+ ---
419
+
400
420
  ### `superseded_by` *(optional)*
401
421
 
402
422
  **Type:** string
@@ -227,6 +227,30 @@ category: integrations
227
227
 
228
228
  ---
229
229
 
230
+ ## `secondary_categories`
231
+
232
+ **Purpose.** Additive cross-listing tags for marketplace collections. Primary `category` is MECE and decides folder placement; `secondary_categories` lets a skill that genuinely serves two audiences (e.g., `playwright-cli` is primarily `quality` but also relevant to `engineering`) appear in additional marketplace collections without affecting filesystem layout.
233
+
234
+ **Rules.**
235
+
236
+ - Optional. Omit if the primary `category` is sufficient.
237
+ - Drawn from the same closed 6-enum as `category` (`foundations` | `engineering` | `design` | `quality` | `agent` | `product`).
238
+ - Max 2 entries to prevent dilution.
239
+ - MUST NOT include the primary `category` value.
240
+
241
+ **Example.**
242
+
243
+ ```yaml
244
+ category: quality
245
+ secondary_categories: [engineering]
246
+ ```
247
+
248
+ **When to use.** When a skill is genuinely useful in more than one browse bucket and you want it to surface in additional marketplace collections.
249
+
250
+ **When NOT to use.** Do not stuff this field as a dumping ground for tags. Use `workspace_tags` or `routing_bundles` for non-marketplace classification.
251
+
252
+ ---
253
+
230
254
  ## `domain`
231
255
 
232
256
  **Purpose.** Hierarchical domain path as slash-delimited segments. Complements `category`: flat bucket and tree path answer different questions. A UI or docs site uses `domain` to render a folder tree; a filter UI uses `category` for quick grouping.
@@ -829,6 +853,33 @@ stability: stable
829
853
 
830
854
  ---
831
855
 
856
+ ## `marketplace_tier`
857
+
858
+ **Purpose.** Publication priority for the public marketplace at `github.com/jacob-balslev/skills` / `skills.sh`. Drives which collection table or hero block a skill appears in. Omit entirely for skills that should not be published.
859
+
860
+ **Rules.**
861
+
862
+ - Optional. Omit on skills that are not publication candidates (the export pipeline filters those out).
863
+ - Closed enum: `S` | `A` | `B` | `C`.
864
+ - `S` — featured (top-of-README, individual hero copy).
865
+ - `A` — high-demand (named in collection tables).
866
+ - `B` — standard utility (included in collection tables).
867
+ - `C` — niche (collapsed "More" section).
868
+
869
+ **Example.**
870
+
871
+ ```yaml
872
+ marketplace_tier: A
873
+ ```
874
+
875
+ **When to use.** When you intend a skill to appear in the public marketplace and want explicit control over its placement. Sourced from `marketplace-publication-priority-*.md` and authored per skill.
876
+
877
+ **When NOT to use.** For repo-internal skills, sales-hub-private skills, or skills with PII bindings. Omit and they will not be published.
878
+
879
+ **Consumers.** `scripts/export-marketplace-skills.js` and `scripts/generate-marketplace-readmes.js` filter and group on this field.
880
+
881
+ ---
882
+
832
883
  ## `superseded_by`
833
884
 
834
885
  **Purpose.** Names the skill that replaces this one when `stability: deprecated`. Consumers and routers use this to follow a deprecation chain automatically instead of reading the body prose.
@@ -0,0 +1 @@
1
+ <svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 991.859px; background-color: transparent;" viewBox="0 0 991.859375 410" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#my-svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#my-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#my-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#my-svg .error-icon{fill:#552222;}#my-svg .error-text{fill:#552222;stroke:#552222;}#my-svg .edge-thickness-normal{stroke-width:1px;}#my-svg .edge-thickness-thick{stroke-width:3.5px;}#my-svg .edge-pattern-solid{stroke-dasharray:0;}#my-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#my-svg .edge-pattern-dashed{stroke-dasharray:3;}#my-svg .edge-pattern-dotted{stroke-dasharray:2;}#my-svg .marker{fill:#666;stroke:#666;}#my-svg .marker.cross{stroke:#666;}#my-svg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#my-svg p{margin:0;}#my-svg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#000000;}#my-svg .cluster-label text{fill:#333;}#my-svg .cluster-label span{color:#333;}#my-svg .cluster-label span p{background-color:transparent;}#my-svg .label text,#my-svg span{fill:#000000;color:#000000;}#my-svg .node rect,#my-svg .node circle,#my-svg .node ellipse,#my-svg .node polygon,#my-svg .node path{fill:#eee;stroke:#999;stroke-width:1px;}#my-svg .rough-node .label text,#my-svg .node .label text,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-anchor:middle;}#my-svg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#my-svg .rough-node .label,#my-svg .node .label,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-align:center;}#my-svg .node.clickable{cursor:pointer;}#my-svg .root .anchor path{fill:#666!important;stroke-width:0;stroke:#666;}#my-svg .arrowheadPath{fill:#333333;}#my-svg .edgePath .path{stroke:#666;stroke-width:1px;}#my-svg .flowchart-link{stroke:#666;fill:none;}#my-svg .edgeLabel{background-color:white;text-align:center;}#my-svg .edgeLabel p{background-color:white;}#my-svg .edgeLabel rect{opacity:0.5;background-color:white;fill:white;}#my-svg .labelBkg{background-color:rgba(255, 255, 255, 0.5);}#my-svg .cluster rect{fill:hsl(0, 0%, 98.9215686275%);stroke:#707070;stroke-width:1px;}#my-svg .cluster text{fill:#333;}#my-svg .cluster span{color:#333;}#my-svg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(-160, 0%, 93.3333333333%);border:1px solid #707070;border-radius:2px;pointer-events:none;z-index:100;}#my-svg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#000000;}#my-svg rect.text{fill:none;stroke-width:0;}#my-svg .icon-shape,#my-svg .image-shape{background-color:white;text-align:center;}#my-svg .icon-shape p,#my-svg .image-shape p{background-color:white;padding:2px;}#my-svg .icon-shape .label rect,#my-svg .image-shape .label rect{opacity:0.5;background-color:white;fill:white;}#my-svg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#my-svg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#my-svg .node .neo-node{stroke:#999;}#my-svg [data-look="neo"].node rect,#my-svg [data-look="neo"].cluster rect,#my-svg [data-look="neo"].node polygon{stroke:url(#my-svg-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#my-svg [data-look="neo"].node path{stroke:url(#my-svg-gradient);stroke-width:1px;}#my-svg [data-look="neo"].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#my-svg [data-look="neo"].node .neo-line path{stroke:#999;filter:none;}#my-svg [data-look="neo"].node circle{stroke:url(#my-svg-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#my-svg [data-look="neo"].node circle .state-start{fill:#000000;}#my-svg [data-look="neo"].icon-shape .icon{fill:url(#my-svg-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#my-svg [data-look="neo"].icon-shape .icon-neo path{stroke:url(#my-svg-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#my-svg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#my-svg .active&gt;*{fill:rgb(220, 252, 231)!important;stroke:rgb(22, 163, 74)!important;stroke-width:2px!important;color:rgb(20, 83, 45)!important;}#my-svg .active span{fill:rgb(220, 252, 231)!important;stroke:rgb(22, 163, 74)!important;stroke-width:2px!important;color:rgb(20, 83, 45)!important;}#my-svg .active tspan{fill:rgb(20, 83, 45)!important;}#my-svg .tool&gt;*{fill:rgb(254, 243, 199)!important;stroke:rgb(217, 119, 6)!important;stroke-width:2px!important;color:rgb(120, 53, 15)!important;}#my-svg .tool span{fill:rgb(254, 243, 199)!important;stroke:rgb(217, 119, 6)!important;stroke-width:2px!important;color:rgb(120, 53, 15)!important;}#my-svg .tool tspan{fill:rgb(120, 53, 15)!important;}#my-svg .mirror&gt;*{fill:rgb(243, 244, 246)!important;stroke:rgb(156, 163, 175)!important;stroke-width:1px!important;color:rgb(75, 85, 99)!important;stroke-dasharray:4,3!important;}#my-svg .mirror span{fill:rgb(243, 244, 246)!important;stroke:rgb(156, 163, 175)!important;stroke-width:1px!important;color:rgb(75, 85, 99)!important;stroke-dasharray:4,3!important;}#my-svg .mirror tspan{fill:rgb(75, 85, 99)!important;}</style><g><marker id="my-svg_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-pointStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="4.5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 5 L 10 10 L 10 0 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-pointEnd-margin" class="marker flowchart-v2" viewBox="0 0 11.5 14" refX="11.5" refY="7" markerUnits="userSpaceOnUse" markerWidth="10.5" markerHeight="14" orient="auto"><path d="M 0 0 L 11.5 7 L 0 14 z" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-pointStart-margin" class="marker flowchart-v2" viewBox="0 0 11.5 14" refX="1" refY="7" markerUnits="userSpaceOnUse" markerWidth="11.5" markerHeight="14" orient="auto"><polygon points="0,7 11.5,14 11.5,0" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="11" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-1" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleEnd-margin" class="marker flowchart-v2" viewBox="0 0 10 10" refY="5" refX="12.25" markerUnits="userSpaceOnUse" markerWidth="14" markerHeight="14" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleStart-margin" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-2" refY="5" markerUnits="userSpaceOnUse" markerWidth="14" markerHeight="14" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-crossEnd" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="12" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-crossStart" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="-1" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-crossEnd-margin" class="marker cross flowchart-v2" viewBox="0 0 15 15" refX="17.7" refY="7.5" markerUnits="userSpaceOnUse" markerWidth="12" markerHeight="12" orient="auto"><path d="M 1,1 L 14,14 M 1,14 L 14,1" class="arrowMarkerPath" style="stroke-width: 2.5;"/></marker><marker id="my-svg_flowchart-v2-crossStart-margin" class="marker cross flowchart-v2" viewBox="0 0 15 15" refX="-3.5" refY="7.5" markerUnits="userSpaceOnUse" markerWidth="12" markerHeight="12" orient="auto"><path d="M 1,1 L 14,14 M 1,14 L 14,1" class="arrowMarkerPath" style="stroke-width: 2.5; stroke-dasharray: 1, 0;"/></marker><g class="root"><g class="clusters"/><g class="edgePaths"><path d="M355.93,135.078L321.275,146.732C286.62,158.386,217.31,181.693,182.655,198.846C148,216,148,227,148,232.5L148,238" id="my-svg-L_G_L_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_G_L_0" data-points="W3sieCI6MzU1LjkyOTY4NzUsInkiOjEzNS4wNzg0Nzc2MDE4ODYxNn0seyJ4IjoxNDgsInkiOjIwNX0seyJ4IjoxNDgsInkiOjI0Mn1d" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M495.93,168L495.93,174.167C495.93,180.333,495.93,192.667,495.93,206.333C495.93,220,495.93,235,495.93,242.5L495.93,250" id="my-svg-L_G_P_0" class="edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_G_P_0" data-points="W3sieCI6NDk1LjkyOTY4NzUsInkiOjE2OH0seyJ4Ijo0OTUuOTI5Njg3NSwieSI6MjA1fSx7IngiOjQ5NS45Mjk2ODc1LCJ5IjoyNTR9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M635.93,135.078L670.585,146.732C705.24,158.386,774.549,181.693,809.204,198.846C843.859,216,843.859,227,843.859,232.5L843.859,238" id="my-svg-L_G_A_0" class="edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_G_A_0" data-points="W3sieCI6NjM1LjkyOTY4NzUsInkiOjEzNS4wNzg0Nzc2MDE4ODYxNn0seyJ4Ijo4NDMuODU5Mzc1LCJ5IjoyMDV9LHsieCI6ODQzLjg1OTM3NSwieSI6MjQyfV0=" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/></g><g class="edgeLabels"><g class="edgeLabel" transform="translate(148, 205)"><g class="label" data-id="L_G_L_0" transform="translate(-61.8671875, -12)"><foreignObject width="123.734375" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>exports SKILL.md</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(495.9296875, 205)"><g class="label" data-id="L_G_P_0" transform="translate(-86.4375, -12)"><foreignObject width="172.875" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>mirrors protocol spec to</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(843.859375, 205)"><g class="label" data-id="L_G_A_0" transform="translate(-95.4453125, -12)"><foreignObject width="190.890625" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>mirrors audit procedure to</p></span></div></foreignObject></g></g></g><g class="nodes"><g class="node default tool" id="my-svg-flowchart-G-0" data-look="classic" transform="translate(495.9296875, 88)"><rect class="basic label-container" style="fill:#fef3c7 !important;stroke:#d97706 !important;stroke-width:2px !important" x="-140" y="-80" width="280" height="160"/><g class="label" style="color:#78350f !important" transform="translate(-100, -60)"><rect/><foreignObject width="200" height="120"><div style="color: rgb(120, 53, 15) !important; display: table; white-space: break-spaces; line-height: 1.5; max-width: 200px; text-align: center; width: 200px;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#78350f !important" class="nodeLabel"><p><b>skill-graph</b><br /><i>canonical monolith: spec, schemas, tooling, audit</i><br />@skill-graph/cli — npm install -g</p></span></div></foreignObject></g></g><g class="node default active" id="my-svg-flowchart-L-1" data-look="classic" transform="translate(148, 322)"><rect class="basic label-container" style="fill:#dcfce7 !important;stroke:#16a34a !important;stroke-width:2px !important" x="-140" y="-80" width="280" height="160"/><g class="label" style="color:#14532d !important" transform="translate(-100, -60)"><rect/><foreignObject width="200" height="120"><div style="color: rgb(20, 83, 45) !important; display: table; white-space: break-spaces; line-height: 1.5; max-width: 200px; text-align: center; width: 200px;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#14532d !important" class="nodeLabel"><p><b>skills</b><br /><i>public open-source skill library</i><br />npx skills add jacob-balslev/skills</p></span></div></foreignObject></g></g><g class="node default mirror" id="my-svg-flowchart-P-2" data-look="classic" transform="translate(495.9296875, 322)"><rect class="basic label-container" style="fill:#f3f4f6 !important;stroke:#9ca3af !important;stroke-width:1px !important;stroke-dasharray:4 3 !important" x="-157.9296875" y="-68" width="315.859375" height="136"/><g class="label" style="color:#4b5563 !important" transform="translate(-117.9296875, -48)"><rect/><foreignObject width="235.859375" height="96"><div style="color: rgb(75, 85, 99) !important; display: table; white-space: break-spaces; line-height: 1.5; max-width: 200px; text-align: center; width: 200px;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#4b5563 !important" class="nodeLabel"><p><b>skill-metadata-protocol</b><br /><i>deprecated · docs-only mirror</i><br />SKILL_METADATA_PROTOCOL.md preserved</p></span></div></foreignObject></g></g><g class="node default mirror" id="my-svg-flowchart-A-3" data-look="classic" transform="translate(843.859375, 322)"><rect class="basic label-container" style="fill:#f3f4f6 !important;stroke:#9ca3af !important;stroke-width:1px !important;stroke-dasharray:4 3 !important" x="-140" y="-80" width="280" height="160"/><g class="label" style="color:#4b5563 !important" transform="translate(-100, -60)"><rect/><foreignObject width="200" height="120"><div style="color: rgb(75, 85, 99) !important; display: table; white-space: break-spaces; line-height: 1.5; max-width: 200px; text-align: center; width: 200px;" xmlns="http://www.w3.org/1999/xhtml"><span style="color:#4b5563 !important" class="nodeLabel"><p><b>skill-audit-loop</b><br /><i>deprecated · docs-only mirror</i><br />SKILL_AUDIT_LOOP.md preserved</p></span></div></foreignObject></g></g></g></g></g><defs><filter id="my-svg-drop-shadow" height="130%" width="130%"><feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"/></filter></defs><defs><filter id="my-svg-drop-shadow-small" height="150%" width="150%"><feDropShadow dx="2" dy="2" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"/></filter></defs><linearGradient id="my-svg-gradient" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="100%" y2="0%"><stop offset="0%" stop-color="hsl(0, 0%, 83.3333333333%)" stop-opacity="1"/><stop offset="100%" stop-color="hsl(0, 0%, 88.9215686275%)" stop-opacity="1"/></linearGradient></svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skill-graph/cli",
3
- "version": "0.5.6",
3
+ "version": "0.5.7",
4
4
  "description": "Skill Graph — library-level tooling for SKILL.md libraries: lint, manifest compiler, router, drift sentinel, and export pipeline.",
5
5
  "type": "commonjs",
6
6
  "license": "Apache-2.0",
@@ -167,6 +167,10 @@
167
167
  "category": {
168
168
  "type": "string"
169
169
  },
170
+ "secondary_categories": {
171
+ "type": "array",
172
+ "items": { "type": "string" }
173
+ },
170
174
  "domain": {
171
175
  "type": "string"
172
176
  },
@@ -190,6 +194,10 @@
190
194
  "deprecated"
191
195
  ]
192
196
  },
197
+ "marketplace_tier": {
198
+ "type": "string",
199
+ "enum": ["S", "A", "B", "C"]
200
+ },
193
201
  "superseded_by": {
194
202
  "type": "string",
195
203
  "description": "Name of the skill that replaces this one. Populated when authored `stability: deprecated`. Consumers use this to follow deprecation chains automatically."
@@ -167,6 +167,10 @@
167
167
  "category": {
168
168
  "type": "string"
169
169
  },
170
+ "secondary_categories": {
171
+ "type": "array",
172
+ "items": { "type": "string" }
173
+ },
170
174
  "domain": {
171
175
  "type": "string"
172
176
  },
@@ -190,6 +194,10 @@
190
194
  "deprecated"
191
195
  ]
192
196
  },
197
+ "marketplace_tier": {
198
+ "type": "string",
199
+ "enum": ["S", "A", "B", "C"]
200
+ },
193
201
  "superseded_by": {
194
202
  "type": "string",
195
203
  "description": "Name of the skill that replaces this one. Populated when authored `stability: deprecated`. Consumers use this to follow deprecation chains automatically."
@@ -45,6 +45,7 @@
45
45
  "@type": "xsd:date"
46
46
  },
47
47
  "stability": "sg:stability",
48
+ "marketplace_tier": "sg:marketplaceTier",
48
49
  "superseded_by": {
49
50
  "@id": "prov:wasRevisionOf",
50
51
  "@type": "@id",
@@ -54,6 +55,10 @@
54
55
  "archetype": "sg:archetype",
55
56
  "scope": "sg:scope",
56
57
  "category": "sg:browseCategory",
58
+ "secondary_categories": {
59
+ "@id": "sg:secondaryCategories",
60
+ "@container": "@set"
61
+ },
57
62
  "keywords": {
58
63
  "@id": "dcat:keyword",
59
64
  "@container": "@set"
@@ -89,6 +89,23 @@
89
89
  "pattern": "^[a-z0-9][a-z0-9-]*(/[a-z0-9][a-z0-9-]*)*$",
90
90
  "description": "Hierarchical domain path using slash-delimited segments (e.g., `ecommerce/integrations/shopify`). Complements `category`; the flat browse shelf and the domain tree answer different questions."
91
91
  },
92
+ "secondary_categories": {
93
+ "type": "array",
94
+ "maxItems": 2,
95
+ "uniqueItems": true,
96
+ "items": {
97
+ "type": "string",
98
+ "enum": [
99
+ "foundations",
100
+ "engineering",
101
+ "design",
102
+ "quality",
103
+ "agent",
104
+ "product"
105
+ ]
106
+ },
107
+ "description": "Additive tags for cross-listing in marketplace collections. Primary `category` is MECE and decides folder placement; `secondary_categories` lets a skill that genuinely serves two audiences (e.g., `playwright-cli` is primarily `quality` but also relevant to `engineering`) appear in additional marketplace collections without affecting filesystem layout. Max 2 entries to prevent dilution. Drawn from the same closed 6-enum as `category`; MUST NOT include the primary `category` value."
108
+ },
92
109
  "scope": {
93
110
  "type": "string",
94
111
  "enum": [
@@ -386,6 +403,16 @@
386
403
  ],
387
404
  "description": "Lifecycle posture for consumers. `experimental` (subject to change), `stable` (production-ready), `frozen` (no further changes expected), `deprecated` (use `superseded_by` to name the replacement). Drives consumer pinning decisions."
388
405
  },
406
+ "marketplace_tier": {
407
+ "type": "string",
408
+ "enum": [
409
+ "S",
410
+ "A",
411
+ "B",
412
+ "C"
413
+ ],
414
+ "description": "Publication priority for the public marketplace at `github.com/jacob-balslev/skills` / `skills.sh`. `S` = featured (top-of-README, individual hero copy). `A` = high-demand (named in collection tables). `B` = standard utility (included in collection tables). `C` = niche (collapsed 'More' section). Omit entirely for skills that should not be published. Sourced from `marketplace-publication-priority-*.md` and authored per skill. Lint validates the enum; consumers (export-marketplace-skills.js, generate-marketplace-readmes.js) filter and group on this field."
415
+ },
389
416
  "superseded_by": {
390
417
  "type": "string",
391
418
  "description": "Name of the skill that replaces this one. Required when `stability: deprecated` — enforced by the allOf rule so every deprecated skill names its successor and consumers can follow the chain automatically. Omit on non-deprecated skills."