@skill-map/spec 0.44.0 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Spec changelog
2
2
 
3
+ ## 0.45.0
4
+
5
+ ### Minor Changes
6
+
7
+ - `sm plugins create <kind> <plugin-id>` now takes the extension kind as a required first positional and scaffolds a loader-clean stub for each of the six kinds (provider, extractor, analyzer, action, formatter, hook). The slot / input-type catalog gains a single source of truth: the spec enums become `oneOf` const+description, and the kernel + CLI mirrors are generated from it by `scripts/generate-view-catalog.js`, guarded by `view-catalog:check` in `validate:compile`.
8
+
9
+ ## User-facing
10
+
11
+ `sm plugins create` now takes the extension kind as a required first argument: `sm plugins create <kind> <plugin-id>` (kinds: provider, extractor, analyzer, action, formatter, hook). Previously it only scaffolded extractors.
12
+
3
13
  ## 0.44.0
4
14
 
5
15
  ### Minor Changes
package/index.json CHANGED
@@ -174,11 +174,11 @@
174
174
  }
175
175
  ]
176
176
  },
177
- "specPackageVersion": "0.44.0",
177
+ "specPackageVersion": "0.45.0",
178
178
  "integrity": {
179
179
  "algorithm": "sha256",
180
180
  "files": {
181
- "CHANGELOG.md": "357f6aa8652f437eb6400edec3f638fd0243a106cfd3fea062d97e05a94d3ddc",
181
+ "CHANGELOG.md": "fa5ecf5982b20b186d2532b9c4e06881bb1a46031064b8273d0ed128fde82949",
182
182
  "README.md": "a7505a7b0672c39a8b011e3c5e7d41826306476ee63768249bba4bdb3c03d4d1",
183
183
  "architecture.md": "49644c727384f8e12061be834bc97e57d47459dae7bea096f94330b74f568a93",
184
184
  "cli-contract.md": "08b03016e89bd3ce48f32c1b31489f769c97fa1893fe1d13c99a70d8238783e1",
@@ -212,7 +212,7 @@
212
212
  "interfaces/security-scanner.md": "e8049712b9cf7a07c786bf19f8f775f8ef9638f063f7fba5c7a8b1431b92f38e",
213
213
  "job-events.md": "9d5b35d4c451a7f8eef9915d85316d924ac52f1c026a316cdda5f1099d496854",
214
214
  "job-lifecycle.md": "9c429121f98a07c8795f8979ed1abc5e5334e3f89db51585a8da55c527ef855b",
215
- "plugin-author-guide.md": "6af14aa45d2778a57a485b3fbf66411355a578581b326468efbaaf10dffdde40",
215
+ "plugin-author-guide.md": "b0c510529eb660c753cedfa6397fbf0520135f83f6c8e3cb3816fbfa1c9537a9",
216
216
  "plugin-kv-api.md": "1acc69ed82433a74e35ada61d63a6d7379fb61046ff83de1e0facbe884c64704",
217
217
  "prompt-preamble.md": "9dd4f6d1bc6a425f8782fcee10cbe75909e8d64e28781fda56c2fae909b02f40",
218
218
  "schemas/annotations.schema.json": "8c639b149cad675fdd4e7d6be2b47e920cfdd24087b41361d6e1b8280f646322",
@@ -231,7 +231,7 @@
231
231
  "schemas/extensions/provider.schema.json": "75a565b8be6f1a08f0dbfec34e10c5d4d7c990489842bf338519a7d4b97dfe8f",
232
232
  "schemas/frontmatter/base.schema.json": "cff81510ed94824dfd12ab8b30ce9fbac65e42d61ae0edf3fbb6bbb6bb8bcb8c",
233
233
  "schemas/history-stats.schema.json": "436aa0ffe744bdb699000447e86b45724fbd2cc4642781074eb1527522b9058c",
234
- "schemas/input-types.schema.json": "cc9739aedcfdc72c1fa1285547e1392f9582169d578d72737918099acc721de0",
234
+ "schemas/input-types.schema.json": "1c81704783627c5e89dd40cb20368d9e9aa94a15f32c2f929964e392cf2a12b6",
235
235
  "schemas/issue.schema.json": "d173aa5c5312b3d2a2cd249f55c10943c8f3cd5799e4645ae3c66316221e12d1",
236
236
  "schemas/job.schema.json": "dbcedf137de03fde38f74686f594e600c627bf808f2aad23511a26617a663a02",
237
237
  "schemas/link.schema.json": "10f700feb3e23d89453d4d11cbe559bcc0b31f6edf08fffbe9e6773e58120512",
@@ -251,7 +251,7 @@
251
251
  "schemas/summaries/markdown.schema.json": "369d75a18710eb6c7ee4220b2899767ddbc07dada24f81b611827fe2e3a2977a",
252
252
  "schemas/summaries/skill.schema.json": "85d68056054bade62391948cc038fcfa70cdcf465e2b295f69cd520bbdba0134",
253
253
  "schemas/user-settings.schema.json": "d155552ffca9c7dd4c6e31398aff4950dd9721d2a1f4b308cf0fe33000ca31b5",
254
- "schemas/view-slots.schema.json": "f78d0c5f0414f01dc045680b655b3d636373048eae4b75cc9dbd0fe0babd60bc",
254
+ "schemas/view-slots.schema.json": "4623cf8d774f44435f960b1dd3ad4c8b241e37b234ce8eab5b390b9ae8a2acb1",
255
255
  "telemetry.md": "fa659b47c59e692f50c7a091470888d5e7c98dcf858978fa549af25b2562803f",
256
256
  "versioning.md": "28a13f165f837921fe5066f4bfce61012cd9f1b7c451f88eeb67252e39a0981a"
257
257
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skill-map/spec",
3
- "version": "0.44.0",
3
+ "version": "0.45.0",
4
4
  "description": "JSON Schemas, prose contracts, and conformance suite for the skill-map specification.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -712,10 +712,10 @@ Analyzers take a `ctx` with `nodes`, `links`, and (if you assert on view contrib
712
712
  Hand-writing the manifest is supported (the spec is the source of truth) but discouraged. Run:
713
713
 
714
714
  ```sh
715
- sm plugins create
715
+ sm plugins create <kind> <plugin-id>
716
716
  ```
717
717
 
718
- The scaffolder walks you through the closed catalogs (settings + view slots) and emits a complete plugin directory with manifest, extension stub, test scaffold, and README; it catches invalid slot picks at author time, while a hand-written manifest only fails at load. Companion verbs:
718
+ `<kind>` (the first positional, required) is one of the six extension kinds (`provider`, `extractor`, `analyzer`, `action`, `formatter`, `hook`). The scaffolder emits a loader-clean plugin directory: a lean `plugin.json`, a per-kind extension stub at `<kind>s/<id>-<kind>/index.js` (plus any sibling files the kind needs, e.g. an action's `report.schema.json`, or a provider skeleton you extend with a `kinds/` folder), and a `README.md`. The extractor stub pre-fills one setting (`string-list`) and one view contribution (slot `card.footer.left`), both pulled from the generated catalog so they cannot drift. Browse the closed catalogs with `sm plugins slots list` (the scaffolder does not walk them interactively). Companion verbs:
719
719
 
720
720
  - `sm plugins doctor`, surfaces `incompatible-catalog`, `invalid-manifest`, deprecated-slot usage.
721
721
  - `sm plugins upgrade <id>`, applies catalog migrations.
@@ -7,19 +7,19 @@
7
7
  "$defs": {
8
8
  "InputTypeName": {
9
9
  "type": "string",
10
- "enum": [
11
- "string-list",
12
- "single-string",
13
- "boolean-flag",
14
- "integer",
15
- "enum-pick",
16
- "enum-multipick",
17
- "path-glob",
18
- "regex",
19
- "secret",
20
- "key-value-list"
10
+ "oneOf": [
11
+ { "const": "string-list", "description": "Array of free-form strings." },
12
+ { "const": "single-string", "description": "Single text input." },
13
+ { "const": "boolean-flag", "description": "On/off toggle." },
14
+ { "const": "integer", "description": "Integer with optional bounds." },
15
+ { "const": "enum-pick", "description": "Pick one from a closed set." },
16
+ { "const": "enum-multipick", "description": "Pick zero or more from a closed set." },
17
+ { "const": "path-glob", "description": "Glob pattern (single or multiple)." },
18
+ { "const": "regex", "description": "ECMAScript regex pattern body." },
19
+ { "const": "secret", "description": "Sensitive string (encrypted at rest)." },
20
+ { "const": "key-value-list", "description": "Editable mapping of strings to strings." }
21
21
  ],
22
- "description": "Closed enum of input-type identifiers. Adding an entry requires the full spec/UI/CLI/tests round-trip. Removing or renaming an entry is a catalog-major-bump and triggers `sm plugins upgrade` migration."
22
+ "description": "Closed enum of input-type identifiers. Adding an entry requires the full spec/UI/CLI/tests round-trip. Removing or renaming an entry is a catalog-major-bump and triggers `sm plugins upgrade` migration. Each member's `description` is the catalog summary surfaced by `sm plugins slots list` and is the single source of truth for the generated kernel + CLI mirrors (see `scripts/generate-view-catalog.js`)."
23
23
  },
24
24
  "ISettingDeclaration": {
25
25
  "description": "Manifest-side declaration of a single setting, keyed in `IPluginManifest.settings[<settingId>]`. Discriminated by `type`; per-type parameters live in the `oneOf` branches below. The plugin author NEVER writes JSON Schema, `type` is a name from `InputTypeName`, the kernel validates the user-supplied value against the per-type value schema.",
@@ -7,23 +7,23 @@
7
7
  "$defs": {
8
8
  "SlotName": {
9
9
  "type": "string",
10
- "enum": [
11
- "card.title.right",
12
- "card.subtitle.left",
13
- "card.footer.left",
14
- "card.footer.right",
15
- "graph.node.alert",
16
- "inspector.header.badge.counter",
17
- "inspector.header.badge.tag",
18
- "inspector.body.panel.breakdown",
19
- "inspector.body.panel.records",
20
- "inspector.body.panel.tree",
21
- "inspector.body.panel.key-values",
22
- "inspector.body.panel.link-list",
23
- "inspector.body.panel.markdown",
24
- "topbar.nav.start"
10
+ "oneOf": [
11
+ { "const": "card.title.right", "description": "Small icon marker next to the card title (language flag, platform glyph)." },
12
+ { "const": "card.subtitle.left", "description": "Single non-negative integer in the card subtitle row." },
13
+ { "const": "card.footer.left", "description": "Counter chip in the left footer of the card." },
14
+ { "const": "card.footer.right", "description": "Counter chip in the right footer of the card." },
15
+ { "const": "graph.node.alert", "description": "Reserved corner badge on the graph node, special-case signals only. No core analyzer emits here; routine \"this node has a problem\" findings belong in `card.footer.right`." },
16
+ { "const": "inspector.header.badge.counter", "description": "Counter chip in the inspector header badge cluster." },
17
+ { "const": "inspector.header.badge.tag", "description": "Qualitative tag chip in the inspector header badge cluster." },
18
+ { "const": "inspector.body.panel.breakdown", "description": "Top-N labeled values rendered as a bar chart in the inspector body." },
19
+ { "const": "inspector.body.panel.records", "description": "Tabular data (rows × columns ≤ 50 × 6) in the inspector body." },
20
+ { "const": "inspector.body.panel.tree", "description": "Recursive label/children hierarchy (depth ≤ 6, total ≤ 200) in the inspector body." },
21
+ { "const": "inspector.body.panel.key-values", "description": "Flat key/value pairs (≤ 50) in the inspector body." },
22
+ { "const": "inspector.body.panel.link-list", "description": "Clickable scope-relative paths (≤ 100) in the inspector body." },
23
+ { "const": "inspector.body.panel.markdown", "description": "Sanitized markdown text (≤ 4096 chars) in the inspector body." },
24
+ { "const": "topbar.nav.start", "description": "Scope-wide indicator chip at the start of the topbar nav (before the view-switcher links)." }
25
25
  ],
26
- "description": "Closed enum of slot identifiers. Adding an entry requires the full spec/UI/scaffolder/conformance round-trip per ROADMAP.md §UI contribution system. Removing or renaming an entry is a catalog-major-bump and triggers `sm plugins upgrade` migration. Slots that share a payload shape (e.g. `card.subtitle.left`, `card.footer.right`, and `card.footer.left` all carry a counter) reference the same payload schema in `$defs.payloads`."
26
+ "description": "Closed catalog of slot identifiers. Adding an entry requires the full spec/UI/scaffolder/conformance round-trip per ROADMAP.md §UI contribution system. Removing or renaming an entry is a catalog-major-bump and triggers `sm plugins upgrade` migration. Slots that share a payload shape (e.g. `card.subtitle.left`, `card.footer.right`, and `card.footer.left` all carry a counter) reference the same payload schema in `$defs.payloads`. Each member's `description` is the catalog summary surfaced by `sm plugins slots list` and is the single source of truth for the generated kernel + CLI mirrors (see `scripts/generate-view-catalog.js`)."
27
27
  },
28
28
  "Severity": {
29
29
  "type": "string",