@skill-map/spec 0.26.0 → 0.28.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 +334 -0
- package/architecture.md +29 -30
- package/cli-contract.md +55 -20
- package/conformance/README.md +4 -0
- package/conformance/cases/no-global-scope.json +13 -0
- package/conformance/cases/sidecar-end-to-end.json +4 -4
- package/conformance/coverage.md +7 -4
- package/conformance/fixtures/plugin-missing-ui/.skill-map/plugins/bad-provider/kinds/markdown/kind.json +3 -0
- package/conformance/fixtures/plugin-missing-ui/.skill-map/plugins/bad-provider/kinds/markdown/schema.json +6 -0
- package/conformance/fixtures/plugin-missing-ui/.skill-map/plugins/bad-provider/plugin.json +3 -2
- package/conformance/fixtures/plugin-missing-ui/.skill-map/plugins/bad-provider/providers/bad-provider/index.js +17 -0
- package/db-schema.md +7 -7
- package/index.json +26 -21
- package/package.json +1 -1
- package/plugin-author-guide.md +94 -47
- package/schemas/extensions/action.schema.json +28 -44
- package/schemas/extensions/analyzer.schema.json +34 -32
- package/schemas/extensions/base.schema.json +26 -55
- package/schemas/extensions/extractor.schema.json +35 -22
- package/schemas/extensions/formatter.schema.json +4 -14
- package/schemas/extensions/hook.schema.json +2 -9
- package/schemas/extensions/provider-kind.schema.json +71 -0
- package/schemas/extensions/provider.schema.json +3 -90
- package/schemas/plugins-registry.schema.json +11 -27
- package/schemas/project-config.schema.json +0 -11
- package/schemas/scan-result.schema.json +1 -6
- package/schemas/user-settings.schema.json +39 -0
- package/conformance/fixtures/plugin-missing-ui/.skill-map/plugins/bad-provider/provider.js +0 -30
package/cli-contract.md
CHANGED
|
@@ -19,7 +19,6 @@ These flags apply to every verb unless marked otherwise.
|
|
|
19
19
|
|
|
20
20
|
| Flag | Shape | Purpose |
|
|
21
21
|
|---|---|---|
|
|
22
|
-
| `-g` / `--global` | boolean | Operate on the global scope (`~/.skill-map/`) instead of project scope (`./.skill-map/`). |
|
|
23
22
|
| `--json` | boolean | Emit machine-readable output on stdout. Suppresses pretty printing. Human progress goes to stderr. |
|
|
24
23
|
| `-v` / `--verbose` | count | Increase log level (`-v` = info, `-vv` = debug, `-vvv` = trace). Logs to stderr. |
|
|
25
24
|
| `-q` / `--quiet` | boolean | Suppress all non-error stderr output. Does not affect stdout. |
|
|
@@ -31,13 +30,52 @@ Env-var equivalents are normative:
|
|
|
31
30
|
|
|
32
31
|
| Env var | Equivalent flag |
|
|
33
32
|
|---|---|
|
|
34
|
-
| `SKILL_MAP_SCOPE=global` | `-g` |
|
|
35
33
|
| `SKILL_MAP_JSON=1` | `--json` |
|
|
36
34
|
| `NO_COLOR=1` | `--no-color` (also honored per the NO_COLOR standard) |
|
|
37
35
|
| `SKILL_MAP_DB=<path>` | `--db <path>` |
|
|
38
36
|
|
|
39
37
|
CLI flag wins over env var. Env var wins over config file.
|
|
40
38
|
|
|
39
|
+
### Scope is always project-local
|
|
40
|
+
|
|
41
|
+
Every `sm` verb operates on the **project scope** (`<cwd>/.skill-map/`).
|
|
42
|
+
There is no opt-in global scope, no `-g/--global` flag, no
|
|
43
|
+
`SKILL_MAP_SCOPE` env var. Skill-map MUST NOT read anything from
|
|
44
|
+
`$HOME` by default. The only mechanism the user has to extend the
|
|
45
|
+
scan beyond the project root is the `scan.extraFolders` setting (see
|
|
46
|
+
§Scan), which lives in `<cwd>/.skill-map/settings.local.json` and is
|
|
47
|
+
written under an explicit privacy gate (`sm config set --yes` or the
|
|
48
|
+
Settings UI confirm dialog). Plugins load from
|
|
49
|
+
`<cwd>/.skill-map/plugins/` by default; an arbitrary external
|
|
50
|
+
location MAY be loaded via the `--plugin-dir <path>` escape hatch on
|
|
51
|
+
the `sm plugins …` verb family, again user-explicit per invocation.
|
|
52
|
+
|
|
53
|
+
### User-settings file (narrow, documented exception)
|
|
54
|
+
|
|
55
|
+
Genuinely per-user, per-machine preferences live in a **single file**
|
|
56
|
+
at `~/.skill-map/settings.json`, validated against
|
|
57
|
+
[`user-settings.schema.json`](./schemas/user-settings.schema.json).
|
|
58
|
+
The file holds preferences that have no project meaning (the update-
|
|
59
|
+
check toggle + its throttle bookkeeping today; future locale, theme,
|
|
60
|
+
etc.). Constraints:
|
|
61
|
+
|
|
62
|
+
- **One file, no `.local` partner**: values here are already
|
|
63
|
+
per-machine, so the project / project-local split has no meaning.
|
|
64
|
+
- **NOT part of the config layer system**: the project config loader
|
|
65
|
+
(`defaults` → `project` → `project-local` → `override`) MUST NOT
|
|
66
|
+
read or merge this file. Modules that own a user-scope feature
|
|
67
|
+
read it directly through a dedicated helper.
|
|
68
|
+
- **Narrow scope**: implementations SHOULD keep the key set small
|
|
69
|
+
(only preferences whose value is meaningless inside a project).
|
|
70
|
+
Anything that belongs to a project goes in
|
|
71
|
+
`<cwd>/.skill-map/settings.json` instead.
|
|
72
|
+
- **Closed list of writers**: today only the update-check store
|
|
73
|
+
(`src/cli/util/update-check-store.ts` in the reference impl)
|
|
74
|
+
reads and writes the file. New user-scope features extend that
|
|
75
|
+
module rather than opening new home access points.
|
|
76
|
+
|
|
77
|
+
Everything else under `$HOME` MUST NOT be touched.
|
|
78
|
+
|
|
41
79
|
---
|
|
42
80
|
|
|
43
81
|
## Targeted fan-out flags
|
|
@@ -93,9 +131,9 @@ Dry-run is **per-verb opt-in**. The flag is not global; verbs that do not declar
|
|
|
93
131
|
|
|
94
132
|
#### `sm init`
|
|
95
133
|
|
|
96
|
-
Bootstrap the
|
|
134
|
+
Bootstrap the project scope.
|
|
97
135
|
|
|
98
|
-
- Creates `./.skill-map
|
|
136
|
+
- Creates `./.skill-map/`.
|
|
99
137
|
- Provisions the database.
|
|
100
138
|
- Runs migrations.
|
|
101
139
|
- Runs a first scan.
|
|
@@ -118,7 +156,6 @@ Common behaviour for both variants:
|
|
|
118
156
|
- Writes the chosen file at the top level (single file, no subdirectory).
|
|
119
157
|
- Content is the canonical `SKILL.md` shipped with the implementation. Any conforming implementation MUST embed equivalent tutorial sources (the prose itself is informative; what is normative is that the verb produces a single readable file at the chosen path that a Claude Code skill can consume).
|
|
120
158
|
- Does NOT require an initialized project, runs in any directory, including empty ones, and never reads or writes `.skill-map/`.
|
|
121
|
-
- Is NOT scope-aware: `-g` is accepted (inherited global flag) but has no effect; the file is always written under the cwd.
|
|
122
159
|
|
|
123
160
|
Flags: `--force` (overwrite the existing target file, whichever variant was selected, without prompting).
|
|
124
161
|
|
|
@@ -185,11 +222,11 @@ Consumers: docs generator, shell completion, Web UI form generation, IDE extensi
|
|
|
185
222
|
|---|---|
|
|
186
223
|
| `sm config list` | Effective config after layered merge. |
|
|
187
224
|
| `sm config get <key>` | Single value. |
|
|
188
|
-
| `sm config set <key> <value> [--yes]` | Write to
|
|
189
|
-
| `sm config reset <key>` | Remove user override; revert to default
|
|
190
|
-
| `sm config show <key> --source` | Reveals origin: `default` / `project` / `
|
|
225
|
+
| `sm config set <key> <value> [--yes]` | Write to project config. Privacy-sensitive keys require `--yes` to confirm, see §Privacy-sensitive config below. |
|
|
226
|
+
| `sm config reset <key>` | Remove user override; revert to default. |
|
|
227
|
+
| `sm config show <key> --source` | Reveals origin: `default` / `project` / `project-local` / `env` / `flag`. |
|
|
191
228
|
|
|
192
|
-
Config precedence (lowest → highest): library defaults →
|
|
229
|
+
Config precedence (lowest → highest): library defaults → project config → project-local config → env vars → CLI flags.
|
|
193
230
|
|
|
194
231
|
Keys are dot-paths (`jobs.minimumTtlSeconds`, `scan.tokenize`). Unknown keys → exit 5.
|
|
195
232
|
|
|
@@ -207,9 +244,8 @@ The Settings UI's Project section enforces the same analyzer via a confirm dialo
|
|
|
207
244
|
|
|
208
245
|
The three privacy-sensitive keys above PLUS `allowEditSmFiles` are members of `PROJECT_LOCAL_ONLY_KEYS` (see [`architecture.md` §Config layering · Per-key locality](./architecture.md#per-key-locality)). The values are per-user-per-project and MUST NOT travel via the committed repo:
|
|
209
246
|
|
|
210
|
-
- `sm config set` writes them to `<cwd>/.skill-map/settings.local.json` (gitignored)
|
|
211
|
-
-
|
|
212
|
-
- The loader strips them (with a warning) when found in the committed `project` layer. An older install that wrote one of these keys to `settings.json` keeps validating against the schema, but the value is ignored at read time and `sm config show --source` surfaces the warning.
|
|
247
|
+
- `sm config set` writes them to `<cwd>/.skill-map/settings.local.json` (gitignored).
|
|
248
|
+
- The loader strips them (with a warning) when found in the committed `project` layer (`settings.json`). An older install that wrote one of these keys to `settings.json` keeps validating against the schema, but the value is ignored at read time and `sm config show --source` surfaces the warning.
|
|
213
249
|
|
|
214
250
|
---
|
|
215
251
|
|
|
@@ -231,7 +267,7 @@ The three privacy-sensitive keys above PLUS `allowEditSmFiles` are members of `P
|
|
|
231
267
|
**Effective roots** (one-shot `sm scan`):
|
|
232
268
|
|
|
233
269
|
- `sm scan [roots...]`: when positional roots are given, they ARE the effective roots (verbatim). When omitted: the effective roots are `[cwd]` plus the appended set below.
|
|
234
|
-
- `scan.extraFolders[]` is appended verbatim (entries starting with `~` resolve against the user home; relative entries resolve against the project root). This is the ONLY way to extend the scan beyond the project: there is no implicit HOME walk and Providers cannot opt their own directory in.
|
|
270
|
+
- `scan.extraFolders[]` (project-local config) is appended verbatim (entries starting with `~` resolve against the user home; relative entries resolve against the project root). This is the ONLY way to extend the scan beyond the project: there is no implicit `$HOME` walk, no opt-in global scope, and Providers cannot opt their own directory in. See §Scope is always project-local at the top of this file for the broader principle.
|
|
235
271
|
|
|
236
272
|
**Reference paths** (`scan.referencePaths[]`): walked in parallel by the scan to collect existing absolute paths into a side set. Files there are NOT parsed and NOT indexed as nodes; the kernel passes the set to analyzers via `IAnalyzerContext.referenceablePaths` so `core/broken-ref` can resolve a link against the filesystem when the in-graph lookup misses.
|
|
237
273
|
|
|
@@ -486,7 +522,7 @@ Destructive verbs (`reset --state`, `reset --hard`, `restore`) require interacti
|
|
|
486
522
|
|
|
487
523
|
| Command | Purpose |
|
|
488
524
|
|---|---|
|
|
489
|
-
| `sm serve [--port N] [--host ...] [--
|
|
525
|
+
| `sm serve [--port N] [--host ...] [--db <path>] [--no-built-ins] [--no-plugins] [--open\|--no-open] [--dev-cors] [--ui-dist <path>] [--no-ui] [--no-watcher]` | Start Hono + WebSocket for the Web UI. Single-port mandate: SPA + REST + WS under one listener. Default port 4242, default host 127.0.0.1 (loopback-only through v0.6.0; multi-host deferred, see §Server). The watcher is on by default (Decision #121: a server with stale DB is a footgun); pass `--no-watcher` for CI / read-only deployments. `--no-ui` skips the SPA bundle (dev workflow alongside the Angular dev server); see §Server flags. |
|
|
490
526
|
|
|
491
527
|
#### Server
|
|
492
528
|
|
|
@@ -503,15 +539,15 @@ The reference implementation ships a Hono BFF rooted at `src/server/`. One Node
|
|
|
503
539
|
|
|
504
540
|
**Boot output**: after the listener binds, `sm serve` writes a startup banner to **stderr**. Stdout is reserved for `--json` payloads on other verbs and stays empty here. The banner shape depends on `isTTY(stderr)` and the standard color toggles (`NO_COLOR`, `FORCE_COLOR`, `--no-color`):
|
|
505
541
|
|
|
506
|
-
- **TTY + color**: an ASCII-art figlet logo split into a violet upper half and a green lower half, a dim version line right-aligned under the logo, then a dim-labelled data block (`Server <url>`, `
|
|
542
|
+
- **TTY + color**: an ASCII-art figlet logo split into a violet upper half and a green lower half, a dim version line right-aligned under the logo, then a dim-labelled data block (`Server <url>`, `Path <cwd>`, `DB <path>`) and the `Press Ctrl+C to stop.` hint. The `Path` row shows the cwd the verb is running from; when it sits under the user's home, the prefix is replaced with `~` for legibility. The URL value is rendered in green with an underline. Implementations MAY choose any figlet-style rendering and any palette consistent with the violet-upper / green-lower split; the reference impl uses xterm 256-color codes (`\x1b[38;5;141m` violet, `\x1b[38;5;42m` green) and does NOT degrade to 16-color terminals, users on legacy terminals MUST set `NO_COLOR`.
|
|
507
543
|
- **TTY + `NO_COLOR` (or `--no-color`)**: same figlet block + version + data block, with zero ANSI escapes.
|
|
508
|
-
- **Non-TTY (pipes / redirects)**: banner suppressed; the verb emits two flat lines, `sm serve: listening on http://<host>:<port> (
|
|
544
|
+
- **Non-TTY (pipes / redirects)**: banner suppressed; the verb emits two flat lines, `sm serve: listening on http://<host>:<port> (db=<path>)` followed by `sm serve: opening <url>/ in your browser. Press Ctrl+C to stop.` (or `sm serve: visit <url>/ ...` under `--no-open`). This shape is **stable**; tooling that scrapes those lines (CI capture, `tee log.txt`) MUST keep working across releases.
|
|
509
545
|
|
|
510
546
|
**Endpoints (v14.2 surface)**:
|
|
511
547
|
|
|
512
548
|
| Path | Status | Shape |
|
|
513
549
|
|---|---|---|
|
|
514
|
-
| `GET /api/health` | implemented | `{ ok: true, schemaVersion, specVersion, implVersion,
|
|
550
|
+
| `GET /api/health` | implemented | `{ ok: true, schemaVersion, specVersion, implVersion, db: 'present'\|'missing', cwd: string, dbPath: string }`. `cwd` is the absolute project root the BFF resolves against (`runtimeContext.cwd`); `dbPath` is the absolute project DB path (`IServerOptions.dbPath`). Both are surfaced so the SPA's About panel can show "you are looking at <project>" + the DB location without a second endpoint. |
|
|
515
551
|
| `GET /api/scan` | implemented | latest persisted `ScanResult` (1:1 with `scan-result.schema.json`; byte-equal to `sm scan --json` modulo whitespace). DB absent → empty `ScanResult` shape (zero `nodes` / `links` / `issues`). |
|
|
516
552
|
| `GET /api/scan?fresh=1` | implemented | runs an in-memory scan and returns the produced `ScanResult` without persistence. Rejects with `bad-query` (400) when the server was started with `--no-built-ins` or `--no-plugins` (would yield empty / partial results). |
|
|
517
553
|
| `POST /api/scan` | implemented | Run a fresh scan **and persist it** through the same `runScanWithRenames` + `persistScanResult` pipeline the watcher uses. Body is empty (`{}` or no body). Response: the persisted `ScanResult` inline (same shape as `GET /api/scan`). Side effects: broadcasts `scan.started` then `scan.completed` over `/ws` so other connected clients can refresh, the per-batch sequence is identical to a watcher-driven batch. **Concurrency**: only one scan may run at a time across the whole BFF process. A POST that arrives while a watcher batch is in flight (or while another POST is in flight) is rejected with `409 scan-busy` so the caller can decide whether to retry. **Pipeline gate**: rejected with `400 bad-query` when the server was started with `--no-built-ins` or `--no-plugins` (a partial pipeline would persist a misleading DB the next watcher boot would have to reconcile). **DB gate**: rejected with `500 db-missing` when the project DB file is absent, the read-side `/api/scan` degrades to the empty shape, but a write path cannot, so it fails fast. |
|
|
@@ -521,7 +557,7 @@ The reference implementation ships a Hono BFF rooted at `src/server/`. One Node
|
|
|
521
557
|
| `GET /api/issues?severity=&analyzerId=&node=` | implemented | `RestEnvelope` (`kind: 'issues'`), list of issues. Filters: `severity` (CSV from `error\|warn\|info`), `analyzerId` (CSV; qualified or short suffix per `sm check --analyzers`), `node` (filter to issues whose `nodeIds` includes the path). No pagination at v14.2. |
|
|
522
558
|
| `GET /api/graph?format=ascii\|json\|md` | implemented | formatter-rendered graph. `Content-Type` per format: `text/plain` (ascii), `application/json` (json), `text/markdown` (md / mermaid). Default `format=ascii`. Unknown format → 400 `bad-query`. |
|
|
523
559
|
| `GET /api/config` | implemented | `RestEnvelope` (`kind: 'config'`), merged effective config (defaults → user → user-local → project → project-local → override). |
|
|
524
|
-
| `GET /api/plugins` | implemented | `RestEnvelope` (`kind: 'plugins'`), list of installed plugins (built-in + drop-in) with status. Item shape: `{ id, version, kinds, status, reason, source: 'built-in'\|'project'
|
|
560
|
+
| `GET /api/plugins` | implemented | `RestEnvelope` (`kind: 'plugins'`), list of installed plugins (built-in + drop-in) with status. Item shape: `{ id, version, kinds, status, reason, source: 'built-in'\|'project', granularity: 'bundle'\|'extension', description?: string, locked?: boolean, startsAsDisabled?: boolean, extensions?: Array<{ id, kind, version, enabled, description?: string, locked?: boolean }> }`. The `granularity` field reflects the manifest declaration (built-ins: hardcoded per `built-in-plugins/built-ins.ts`; drop-ins: from `plugin.json#/granularity`, default `'bundle'`). The `description` field on the bundle item carries the manifest-declared description (built-ins: hardcoded on `IBuiltInBundle`; drop-ins: `plugin.json#/description`); each `extensions[]` entry carries its extension manifest's `description` per `IExtensionBase` (`extensions/base.schema.json#/properties/description`). The SPA's Settings list renders the descriptions as muted secondary text and includes them in its substring-search index alongside the ids. The `extensions` array is present **only** when `granularity === 'extension'` AND the plugin loaded successfully; each entry's `enabled` reflects the per-extension override resolution (DB > settings.json > installed default). For `granularity: 'bundle'` plugins the array is omitted (the bundle is the only toggle-able key). The optional `locked: true` flag is stamped when the bundle id (or qualified extension id) appears in the host's lock-list (`src/server/locked-plugins.ts`); locked items render the toggle disabled in the SPA and any `PATCH` against them returns `403 locked`. The flag is omitted when false. The optional `startsAsDisabled: true` flag is stamped on drop-in plugins (never built-ins) whose discovery-time `status` was `'disabled'`, that is, the user had them disabled in `config_plugins` / `settings.json` at `sm serve` boot, so their handlers were never bucketed into the runtime. The SPA renders a per-row hint when this flag is set AND the user toggles the row back on, since re-enabling them requires `sm serve` restart (the rest of the toggle pipeline applies live). The flag is omitted when false. |
|
|
525
561
|
| `PATCH /api/plugins/:id` | implemented | Toggle one plugin's user override. `:id` MUST be a top-level bundle id; qualified-id form (`bundle/extension`) is the sibling route below. Body `{ enabled: boolean }` (JSON). Persists to `config_plugins` via `IConfigPluginsPort.set`, same path the CLI's `sm plugins enable\|disable` uses. Response is the canonical `{ id, version, kinds, status, reason, source }` row for the affected plugin (post-write `status` reflects the new override resolution). **Granularity**, rejected with 400 `bad-query` when the target bundle declares `granularity: 'extension'` (only the qualified-id form is toggle-able for those). **Lock**, rejected with 403 `locked` when the bundle id is in the host lock-list (`src/server/locked-plugins.ts`). **Apply window**, the override applies on the next scan (manual via `POST /api/scan` or `sm scan`, automatic via watcher batch); both the BFF and the watcher build a fresh resolver from `config_plugins` before composing extensions, so the toggle is honoured without restarting `sm serve`. The endpoint purges `scan_contributions` rows for the plugin immediately on disable so the UI stops rendering its chips before the next scan. **Exception**, drop-in plugins whose discovery-time `status` was `'disabled'` (carried as `startsAsDisabled: true` on the read shape) are NOT in the runtime extension buckets; re-enabling them via PATCH persists the override but requires `sm serve` restart for the handlers to be loaded. The SPA surfaces this per-row when the user re-enables such a plugin. The endpoint does NOT broadcast a WS event today. |
|
|
526
562
|
| `PATCH /api/plugins/:bundleId/extensions/:extensionId` | implemented | Qualified-id form for `granularity: 'extension'` bundles (today: `core` + any user plugin that opts in). Body `{ enabled: boolean }`. Both segments are URL-path-segment-encoded (no slash inside `:bundleId` or `:extensionId`). Rejected with 400 `bad-query` when the target bundle declares `granularity: 'bundle'` (use the sibling route above). **Lock**, rejected with 403 `locked` when either the bundle id or the qualified `bundleId/extensionId` appears in the host lock-list. Same persistence + apply-window semantics as the bundle form (including the `startsAsDisabled` exception). |
|
|
527
563
|
| `PATCH /api/plugins` | implemented | Bulk toggle. Body `{ "changes": Array<{ "id": string, "enabled": boolean }> }` where each `id` is either a bare bundle id or a qualified `<bundle>/<extension>` id (the dispatcher branches on the slash exactly like the single-id routes above). Empty `changes` array is accepted as a no-op (returns the current `GET /api/plugins` envelope). The route validates the **entire batch** before writing, any invalid entry (`unknown-plugin` / `granularity-mismatch` / `locked`) rejects the whole request with the offending id in `error.details.id`, and the DB is not touched. Valid batches are applied in **one SQLite transaction**: `IConfigPluginsPort.set` per entry, then one grouped `scan_contributions` purge per disabled plugin (enables skip the purge). Response is the same `RestEnvelope` (`kind: 'plugins'`) shape as `GET /api/plugins`, reflecting the post-write state, the SPA replaces its modal state from this envelope. Apply-window and `startsAsDisabled` exception semantics match the per-id routes. The single-id `PATCH /api/plugins/:id` and qualified-id sibling stay available for CLI / external automation; the bulk variant exists so the SPA can stage edits in a buffered modal and ship the final delta atomically. |
|
|
@@ -569,8 +605,7 @@ Error code sources at v14.2:
|
|
|
569
605
|
|---|---|---|
|
|
570
606
|
| `--port N` | `4242` | Listening port. `0` = OS-assigned (handle reports the bound port). |
|
|
571
607
|
| `--host <ip>` | `127.0.0.1` | Listening host. Implementations MUST NOT bind `0.0.0.0` by default. |
|
|
572
|
-
| `--
|
|
573
|
-
| `--db <path>` | resolved per spec § Global flags | Override the DB file location. Missing explicit `--db` exits 5. |
|
|
608
|
+
| `--db <path>` | `<cwd>/.skill-map/skill-map.db` | Override the DB file location. Missing explicit `--db` exits 5. |
|
|
574
609
|
| `--no-built-ins` | off | Skip built-in plugin registration (parity with `sm scan --no-built-ins`). |
|
|
575
610
|
| `--no-plugins` | off | Skip drop-in plugin discovery. |
|
|
576
611
|
| `--open` / `--no-open` | `--open` | Auto-open the SPA in the user's default browser after listen. |
|
package/conformance/README.md
CHANGED
|
@@ -119,6 +119,10 @@ Assertion types beyond this list MAY be proposed via spec-vX.Y.Z minor bumps. Im
|
|
|
119
119
|
| Id | Verifies |
|
|
120
120
|
|---|---|
|
|
121
121
|
| `kernel-empty-boot` | With every Provider/Extractor/Analyzer disabled, scanning an empty scope returns a valid empty graph. |
|
|
122
|
+
| `no-global-scope` | The `-g/--global` flag does not exist. Implementations MUST reject it on every verb (exit `2`, "unknown option"). Guards `cli-contract.md` §Scope is always project-local. |
|
|
123
|
+
| `orphan-markdown-fallback` | Multi-Provider corpus where one node lands via the universal `core/markdown` fallback and another via vendor-specific claude classification. Locks the orchestrator's path-dedup contract. |
|
|
124
|
+
| `plugin-missing-ui-rejected` | Drop-in Provider whose `kinds[*]` entry omits the required `ui` block fails AJV validation with `invalid-manifest` while the rest of the pipeline keeps running. |
|
|
125
|
+
| `sidecar-end-to-end` | Co-located `.sm` sidecar shape, stale / orphan detection, populated `Node.sidecar` overlay, both `annotation-stale` and `annotation-orphan` issues emitted. |
|
|
122
126
|
|
|
123
127
|
Cases explicitly referenced elsewhere in the spec (landing before v1.0):
|
|
124
128
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://skill-map.dev/spec/v0/conformance-case.schema.json",
|
|
3
|
+
"id": "no-global-scope",
|
|
4
|
+
"description": "Skill-map operates exclusively on the project scope. Implementations MUST NOT expose a `-g/--global` flag (the historical opt-in for a global / user scope) on any verb. Passing the flag to any verb MUST be rejected as an unknown option (exit `2`, usage error) without writing any state. Guards the principle declared in `cli-contract.md` §Scope is always project-local.",
|
|
5
|
+
"invoke": {
|
|
6
|
+
"verb": "scan",
|
|
7
|
+
"flags": ["-g", "--json"]
|
|
8
|
+
},
|
|
9
|
+
"assertions": [
|
|
10
|
+
{ "type": "exit-code", "value": 2 },
|
|
11
|
+
{ "type": "stderr-matches", "pattern": "[Uu]nknown option" }
|
|
12
|
+
]
|
|
13
|
+
}
|
|
@@ -16,10 +16,10 @@
|
|
|
16
16
|
{ "type": "json-path", "path": "$.nodes[0].sidecar.status", "matches": "^stale-(body|frontmatter|both)$" },
|
|
17
17
|
{ "type": "json-path", "path": "$.nodes[0].sidecar.annotations.version", "equals": 7 },
|
|
18
18
|
{ "type": "json-path", "path": "$.stats.issuesCount", "equals": 2 },
|
|
19
|
-
{ "type": "json-path", "path": "$.issues[0].analyzerId", "equals": "annotation-
|
|
19
|
+
{ "type": "json-path", "path": "$.issues[0].analyzerId", "equals": "annotation-orphan" },
|
|
20
20
|
{ "type": "json-path", "path": "$.issues[0].severity", "equals": "warn" },
|
|
21
|
-
{ "type": "json-path", "path": "$.issues[
|
|
22
|
-
{ "type": "json-path", "path": "$.issues[1].
|
|
23
|
-
{ "type": "json-path", "path": "$.issues[1].
|
|
21
|
+
{ "type": "json-path", "path": "$.issues[0].data.expectedMdPath", "equals": ".claude/agents/orphan.md" },
|
|
22
|
+
{ "type": "json-path", "path": "$.issues[1].analyzerId", "equals": "annotation-stale" },
|
|
23
|
+
{ "type": "json-path", "path": "$.issues[1].severity", "equals": "warn" }
|
|
24
24
|
]
|
|
25
25
|
}
|
package/conformance/coverage.md
CHANGED
|
@@ -25,13 +25,14 @@ This file is hand-maintained. A CI check before spec release compares the schema
|
|
|
25
25
|
| 15 | `summaries/hook.schema.json` |, | 🔴 missing | Blocked by Step 11. |
|
|
26
26
|
| 16 | `summaries/markdown.schema.json` |, | 🔴 missing | Blocked by Step 11. |
|
|
27
27
|
| 17 | `extensions/base.schema.json` |, | 🔴 missing | Meta-case: every manifest under `src/extensions/` validates against the appropriate kind schema (which extends base via `allOf`). |
|
|
28
|
-
| 18 | `extensions/provider.schema.json` | `plugin-missing-ui-rejected` | 🟡 partial | A
|
|
29
|
-
| 19 | `extensions/extractor.schema.json` |, | 🔴 missing | Case: `frontmatter` + `slash` + `at-directive` extractor manifests validate; an extractor
|
|
28
|
+
| 18 | `extensions/provider.schema.json` | `plugin-missing-ui-rejected` | 🟡 partial | A Provider plugin whose `kinds/<kindName>/kind.json` omits the required `ui` block fails AJV validation with `invalid-manifest` while the rest of the pipeline keeps running (built-in Claude Provider, exit 0). Since the structure-as-truth refactor, Providers no longer carry a `kinds` map in the manifest; per-kind metadata lives under `kinds/<kindName>/kind.json` and frontmatter schemas under `kinds/<kindName>/schema.json`. The complementary positive case (canonical Claude Provider validates) lives in `provider:claude` conformance. Direct case for missing `kinds/` directory rejection still pending. |
|
|
29
|
+
| 19 | `extensions/extractor.schema.json` |, | 🔴 missing | Case: `frontmatter` + `slash` + `at-directive` extractor manifests validate; an extractor declaring a `precondition.kind` against an unknown qualified kind emits `precondition-kind-unknown` in `sm plugins doctor`. |
|
|
30
30
|
| 20 | `extensions/analyzer.schema.json` |, | 🔴 missing | Case: `trigger-collision`, `broken-ref`, `superseded` manifests validate. |
|
|
31
|
-
| 21 | `extensions/action.schema.json` |, | 🔴 missing | Case: a `deterministic` action manifest validates; a `probabilistic` action
|
|
31
|
+
| 21 | `extensions/action.schema.json` |, | 🔴 missing | Case: a `deterministic` action manifest validates; a `probabilistic` action without `<action-dir>/prompt.md` surfaces as `load-error` (structure-as-truth: prompt template lives on disk by convention, no `promptTemplateRef` field). |
|
|
32
32
|
| 22 | `extensions/formatter.schema.json` |, | 🔴 missing | Case: `ascii` formatter manifest validates. |
|
|
33
33
|
| 23 | `history-stats.schema.json` |, | 🔴 missing | Blocked by Step 5 (history). Case: seed `state_executions` with a deterministic fixture, run `sm history stats --json --since <T0> --until <T1> --period month --top 5`, assert the document validates and that `totals.executionsCount == sum(perAction.executionsCount)` and `errorRates.global == totals.failedCount / totals.executionsCount`. Percentiles (`p95`/`p99`) intentionally omitted in v1, add later as a minor bump without breaking consumers. |
|
|
34
|
-
| 24 | `extensions/hook.schema.json` |, | 🔴 missing | Case: a
|
|
34
|
+
| 24 | `extensions/hook.schema.json` |, | 🔴 missing | Case: a hook manifest with `triggers: ['scan.completed']` validates; a hook declaring an unknown trigger (e.g. `scan.progress`) fails with `invalid-manifest` at load time. Hooks are deterministic-only since structure-as-truth; manifests carrying a `mode` field are rejected. |
|
|
35
|
+
| 36 | `extensions/provider-kind.schema.json` |, | 🔴 missing | Case: `<plugin>/kinds/<kindName>/kind.json` carrying a valid `{ ui }` block validates; a kind folder missing `kind.json` or `schema.json` surfaces as `invalid-manifest`; a `kind.json` whose `ui.color` is not `#RRGGBB` fails AJV. |
|
|
35
36
|
| 25 | `api/rest-envelope.schema.json` |, | 🔴 missing | Step 14.2 BFF list-envelope shape (`{ schemaVersion, kind, items \| item \| value, filters, counts }`). Case: hit `GET /api/nodes` against a primed scope, validate the response against the schema; assert the `oneOf` rejects an envelope that carries both `items` and `item`. Implementation-side coverage exists today (`src/test/server-endpoints.test.ts`) but a kernel-agnostic conformance case is required before v1.0.0 ships. |
|
|
36
37
|
| 26 | `sidecar.schema.json` | `sidecar-end-to-end` | 🟢 covered | Co-located YAML sidecar (`<basename>.sm`) root shape: reserved blocks `for` / `annotations` / `settings` / `audit` plus opt-in plugin namespacing. Step 9.6.2 (2026-05-05) shipped the kernel reader; Step 9.6.3 (2026-05-05) formalised the `audit:` sub-shape populated by the built-in `bump` Action; Step 9.6.6 (2026-05-06) flips this row 🟢 with the end-to-end `sidecar-end-to-end` case (fixture `sidecar-end-to-end/`): a scan over a stale-`.sm` + orphan-`.sm` corpus produces a populated `Node.sidecar` overlay with `present: true` and `status: stale-*`, denormalises `annotations.version` into the node row, and emits both `annotation-stale` and `annotation-orphan` issues from the built-in core analyzers. Structural sample (untouched) at `fixtures/sidecar-example/agent-example.sm`. |
|
|
37
38
|
| 27 | `annotations.schema.json` | `sidecar-end-to-end` | 🟢 covered | Curated catalog of 15 conventional skill-map annotation fields (versioning, supersession, provenance, lifecycle, taxonomy, display, docs). `additionalProperties: true` so users / plugins extend without coordination; the `unknown-field` Tier-1 analyzer shipped in Step 9.6.6 emits warnings on truly unrecognized keys. Step 9.6.2 (2026-05-05) wired the kernel reader; Step 9.6.6 (2026-05-06) flips this row 🟢 via `sidecar-end-to-end`, which asserts that an `annotations.version: 7` value round-trips through `state_scan_nodes.annotations_json` and surfaces in the node's `sidecar.annotations` overlay AND in the denormalised `Node.version` column. Structural sample at `fixtures/sidecar-example/agent-example.sm`. Catalog trimmed from 31 to 15 fields on 2026-05-07 after UX review. |
|
|
@@ -42,6 +43,7 @@ This file is hand-maintained. A CI check before spec release compares the schema
|
|
|
42
43
|
| 32 | `refresh-report.schema.json` |, | 🔴 missing | Machine-readable output of `sm refresh <node.path> --json` and `sm refresh --stale --json`. Reports the count of enrichment rows persisted across targeted nodes (universal enrichment layer per `architecture.md` §A.8). Direct conformance case pending: seed a fixture with one Provider-classified node, run `sm refresh <node> --json`, assert the envelope validates and `refreshed >= 0`. Implementation tests at `src/test/node-enrichments.test.ts` cover the runtime behaviour today. |
|
|
43
44
|
| 33 | `plugins-doctor.schema.json` |, | 🔴 missing | Machine-readable output of `sm plugins doctor --json`. Aggregates per-status counts plus structured issue / warning lists. Direct conformance case pending: prime a scope with one healthy + one invalid-manifest drop-in plugin, run `sm plugins doctor --json`, assert the envelope validates and the invalid plugin appears under `issues[]`. Implementation tests at `src/test/plugins-cli.test.ts` cover the runtime behaviour. |
|
|
44
45
|
| 34 | `conformance-result.schema.json` |, | 🔴 missing | Machine-readable output of `sm conformance run --json`. Self-referential by design (a conformance case would invoke the verb against itself); a direct case is deferred until the runner gains a meta-loopback mode. Implementation tests at `src/test/conformance-cli.test.ts` cover the envelope shape today. |
|
|
46
|
+
| 35 | `user-settings.schema.json` | (indirect via `no-global-scope`) | 🟡 partial | Per-user / per-machine settings file at `~/.skill-map/settings.json` (the narrow `$HOME` exception, see `cli-contract.md` §User-settings file). Direct case is not added because alt-impls MAY choose to not ship an update-check feature, requiring them to produce this file would over-prescribe. The implementation-side AJV round-trip is covered by `src/test/user-settings-store.test.ts` (15 cases: defaults, malformed JSON, schemaVersion mismatch, wrong-type fields, unknown top-level keys, deep-merge writes, off-shape rejection). The behavioral counterpart (no global / user scope) lives at `no-global-scope` in the non-schema table below. |
|
|
45
47
|
|
|
46
48
|
> **Note on Provider-owned schemas.** Per-kind frontmatter schemas (`skill`, `agent`, `command`, `note` for the built-in Claude Provider; other Providers MAY declare different kinds) live with the Provider that emits them, for the built-in Claude Provider, under `src/extensions/providers/claude/schemas/`. Those schemas are NOT counted in the spec's coverage matrix above; they belong to the Provider's own conformance suite at `src/extensions/providers/claude/conformance/coverage.md`. The same split applies to the cases that exercise Provider-specific kinds (`basic-scan`, `rename-high`, `orphan-detection`), they live in the Provider's `cases/` directory.
|
|
47
49
|
|
|
@@ -65,6 +67,7 @@ These have their own conformance cases even though they are not JSON Schemas.
|
|
|
65
67
|
| J | Plugin DDL rejection |, | 🔴 missing | Blocked by Step 9. Plugin migration referencing `state_jobs` → disabled with `invalid-manifest`. |
|
|
66
68
|
| K | Plugin prefix injection |, | 🔴 missing | Blocked by Step 9. Plugin declares `CREATE TABLE foo` → kernel applies as `plugin_<id>_foo`. |
|
|
67
69
|
| L | Elapsed-time reporting |, | 🔴 missing | Blocked by Step 4 (first real verb work). Run any in-scope verb; stderr last line MUST match `/^done in (\d+ms\|\d+\.\d+s\|\d+m \d+s)$/`. In-scope verb with `--json` returning an object MUST carry `elapsedMs`. Exempt verb (`sm version`) MUST NOT emit the line. |
|
|
70
|
+
| M | No global / user scope (no `-g/--global` flag) | `no-global-scope` | 🟢 covered | Skill-map operates exclusively on the project scope (see `cli-contract.md` §Scope is always project-local). Implementations MUST reject `-g/--global` on every verb as an unknown option (exit `2`). The case invokes `sm scan -g --json` and asserts exit code `2` plus a stderr line matching `/(?i)unknown option/`. The matching implementation-side coverage lives at `src/test/global-flag-removed.test.ts` (regression guard) and `src/test/no-implicit-home-reads.test.ts` (no implicit `$HOME` reads from any verb on the default path). |
|
|
68
71
|
|
|
69
72
|
## Release gates
|
|
70
73
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Conformance fixture: provider whose `kinds/markdown/kind.json`
|
|
2
|
+
// deliberately omits the required `ui` block (structure-as-truth
|
|
3
|
+
// refactor moved the kind catalog from the manifest map to per-kind
|
|
4
|
+
// folders on disk). The plugin loader MUST reject this manifest with
|
|
5
|
+
// a clear "missing required property 'ui'" diagnostic and the plugin
|
|
6
|
+
// MUST end up in `invalid-manifest` status. The companion case
|
|
7
|
+
// `plugin-missing-ui-rejected.json` asserts the stderr text and that
|
|
8
|
+
// `sm scan` survives (the loader degrades the bad plugin and lets the
|
|
9
|
+
// rest of the pipeline continue).
|
|
10
|
+
export default {
|
|
11
|
+
version: '0.1.0',
|
|
12
|
+
description: 'provider whose markdown kind is missing the ui block',
|
|
13
|
+
async *walk() {},
|
|
14
|
+
classify() {
|
|
15
|
+
return 'markdown';
|
|
16
|
+
},
|
|
17
|
+
};
|
package/db-schema.md
CHANGED
|
@@ -12,16 +12,15 @@ The spec assumes a relational, SQL-like store but is **engine-agnostic**. The re
|
|
|
12
12
|
|
|
13
13
|
## Scope and location
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
One scope. Skill-map operates on the project scope only (`<cwd>/.skill-map/`). There is no global / user-level DB, the CLI never reads `$HOME` by default (see `cli-contract.md` §Scope is always project-local). To extend the scan beyond the current repository the user adds explicit paths via `scan.extraFolders` in the project-local config; the scan walks those paths against the same project DB.
|
|
16
16
|
|
|
17
17
|
| Scope | Default DB location | Scan roots |
|
|
18
18
|
|---|---|---|
|
|
19
|
-
| `project`
|
|
20
|
-
| `global` (`-g`) | `~/.skill-map/skill-map.db` | User-level skill directories (e.g. `~/.claude/`). |
|
|
19
|
+
| `project` | `<cwd>/.skill-map/skill-map.db` | The current repository, plus any paths the user added to `scan.extraFolders`. |
|
|
21
20
|
|
|
22
|
-
The project DB is gitignored by default. Teams MAY opt in to sharing it by setting `history.share: true` in `.skill-map/settings.json`, the file is then committed and the execution log becomes a team artifact.
|
|
21
|
+
The project DB is gitignored by default. Teams MAY opt in to sharing it by setting `history.share: true` in `.skill-map/settings.json`, the file is then committed and the execution log becomes a team artifact.
|
|
23
22
|
|
|
24
|
-
The `--db <path>` CLI flag overrides
|
|
23
|
+
The `--db <path>` CLI flag overrides the DB location as an escape hatch (debugging, custom layouts).
|
|
25
24
|
|
|
26
25
|
---
|
|
27
26
|
|
|
@@ -135,14 +134,13 @@ Indexes: `ix_scan_issues_analyzer_id`, `ix_scan_issues_severity`.
|
|
|
135
134
|
|
|
136
135
|
### `scan_meta`
|
|
137
136
|
|
|
138
|
-
Single-row table holding the metadata of the last persisted scan. Lets `loadScanResult` return the real `
|
|
137
|
+
Single-row table holding the metadata of the last persisted scan. Lets `loadScanResult` return the real `roots` / `scannedAt` / `scannedBy` / `providers` / `stats.filesWalked|filesSkipped|durationMs` instead of synthesising them. Replaced atomically with the rest of the `scan_*` zone on every `sm scan`.
|
|
139
138
|
|
|
140
139
|
`nodesCount` / `linksCount` / `issuesCount` are not stored here, they derive from `COUNT(*)` of the sibling tables.
|
|
141
140
|
|
|
142
141
|
| Column | Type | Constraint |
|
|
143
142
|
|---|---|---|
|
|
144
143
|
| `id` | INTEGER | PRIMARY KEY, CHECK `id = 1` |
|
|
145
|
-
| `scope` | TEXT | NOT NULL, CHECK in (`project`, `global`) |
|
|
146
144
|
| `roots_json` | TEXT | NOT NULL | JSON array of strings (filesystem roots walked). |
|
|
147
145
|
| `scanned_at` | INTEGER | NOT NULL | Unix milliseconds. |
|
|
148
146
|
| `scanned_by_name` | TEXT | NOT NULL |
|
|
@@ -153,6 +151,8 @@ Single-row table holding the metadata of the last persisted scan. Lets `loadScan
|
|
|
153
151
|
| `stats_files_skipped` | INTEGER | NOT NULL |
|
|
154
152
|
| `stats_duration_ms` | INTEGER | NOT NULL |
|
|
155
153
|
|
|
154
|
+
The `scope` column was removed pre-1.0 along with the `-g/--global` flag (see `cli-contract.md` §Scope is always project-local); every persisted scan is project-scoped so the column never carried any information worth round-tripping. Older DBs are not migrated, the column drop is a greenfield change and a fresh `sm init` regenerates the schema.
|
|
155
|
+
|
|
156
156
|
No indexes (single row).
|
|
157
157
|
|
|
158
158
|
### `scan_extractor_runs`
|
package/index.json
CHANGED
|
@@ -174,24 +174,27 @@
|
|
|
174
174
|
}
|
|
175
175
|
]
|
|
176
176
|
},
|
|
177
|
-
"specPackageVersion": "0.
|
|
177
|
+
"specPackageVersion": "0.28.0",
|
|
178
178
|
"integrity": {
|
|
179
179
|
"algorithm": "sha256",
|
|
180
180
|
"files": {
|
|
181
|
-
"CHANGELOG.md": "
|
|
181
|
+
"CHANGELOG.md": "9d49970b380a997e8321ea9e7da326284c4b3bb2ac56bc26633e5108a96d8486",
|
|
182
182
|
"README.md": "54c4649fa9742bf2f74423ea78788a7474ce09649cbe1e72a270b606cf16a0a5",
|
|
183
|
-
"architecture.md": "
|
|
184
|
-
"cli-contract.md": "
|
|
185
|
-
"conformance/README.md": "
|
|
183
|
+
"architecture.md": "d40423d3df102c31744186f3b5e91446e57fb78839e67c010501fb210db6d545",
|
|
184
|
+
"cli-contract.md": "c22f7c82d460714efaf34a04a2d2367d21eb04985100aef1291071e6726cbc64",
|
|
185
|
+
"conformance/README.md": "6871dde25b5770ed945284c9e0f749e0768ec3f5ba4966bdb215985789e43887",
|
|
186
186
|
"conformance/cases/kernel-empty-boot.json": "2a5be9c93143d07a16d998df09dcc8fa4ea2d2f9a0bff6417573ed5a770352c1",
|
|
187
|
+
"conformance/cases/no-global-scope.json": "1284763988026d924c0bd78ba8a9f417dc88f5b7e9f4c2b642ae0c447758bfd4",
|
|
187
188
|
"conformance/cases/orphan-markdown-fallback.json": "8ef6e49b7e6532bd845d9f54974a16e537cf98d355f0c5e4f4fb06abac3adcc5",
|
|
188
189
|
"conformance/cases/plugin-missing-ui-rejected.json": "bdebee810436e6be88edf2fe38ddc6939fd3f53e6a12dc1d66da051c4922f1e9",
|
|
189
|
-
"conformance/cases/sidecar-end-to-end.json": "
|
|
190
|
-
"conformance/coverage.md": "
|
|
190
|
+
"conformance/cases/sidecar-end-to-end.json": "dbb3640f95769a36b881855a261f918481edadea13a7eb0765c6090f2417a142",
|
|
191
|
+
"conformance/coverage.md": "7c02052750ee5fca711218cbf993313dd1ed7c68bcac000b2cb23b5f688a4a2c",
|
|
191
192
|
"conformance/fixtures/orphan-markdown/.claude/agents/reviewer.md": "7f062731106f2d9811e4fffcf6ab44b8dfff4cfb16536a469514cc0664e832bf",
|
|
192
193
|
"conformance/fixtures/orphan-markdown/ARCHITECTURE.md": "d6b6e18d4b963b26a292de73348c3396fd4710ab4c4bdd6cf094e581f99ec8d6",
|
|
193
|
-
"conformance/fixtures/plugin-missing-ui/.skill-map/plugins/bad-provider/
|
|
194
|
-
"conformance/fixtures/plugin-missing-ui/.skill-map/plugins/bad-provider/
|
|
194
|
+
"conformance/fixtures/plugin-missing-ui/.skill-map/plugins/bad-provider/kinds/markdown/kind.json": "6676a89bae5197e23cf50f1c11d596db558ac80f7334a7208fe57d8b92422251",
|
|
195
|
+
"conformance/fixtures/plugin-missing-ui/.skill-map/plugins/bad-provider/kinds/markdown/schema.json": "42795e7f1759fa25115a426edf5cd1b0c91b091b408aeee3f4f9fbc8f89f32bc",
|
|
196
|
+
"conformance/fixtures/plugin-missing-ui/.skill-map/plugins/bad-provider/plugin.json": "fb3f52f82f1635d0e5de74788eb5f640d0e36b19464a46f0b2812f6aa9db435f",
|
|
197
|
+
"conformance/fixtures/plugin-missing-ui/.skill-map/plugins/bad-provider/providers/bad-provider/index.js": "6eac0555de4194c3266c2abef89e39d833159990e1822ae1d4895df67c31d18f",
|
|
195
198
|
"conformance/fixtures/plugin-missing-ui/notes/example.md": "55767f0aa1b6774546a99f28c58e7b732aa9cfa5dfce8d0326470f7f622f577e",
|
|
196
199
|
"conformance/fixtures/preamble-v1.txt": "1e0aeef224b64477bdc13a949c3ad402e68249caf499ecdba1302371677c068b",
|
|
197
200
|
"conformance/fixtures/sidecar-end-to-end/.claude/agents/orphan.sm": "3102ff10a0f08f60c014f82409d45ad4faf2cefa04d652a87676d3557ad64944",
|
|
@@ -199,11 +202,11 @@
|
|
|
199
202
|
"conformance/fixtures/sidecar-end-to-end/.claude/agents/stale.sm": "cb04f7f3103b4218b09fd4da92f7ea429588b04c1dac6a9547ce362263b11224",
|
|
200
203
|
"conformance/fixtures/sidecar-example/agent-example.md": "741131403e8c9580d0b7a8c2446cb4502d01f80053b7a2092663de92431aaa82",
|
|
201
204
|
"conformance/fixtures/sidecar-example/agent-example.sm": "8329950d49c69a1199bbe6c06e32b8513973e64207b0db8756b67301e6a1f1e2",
|
|
202
|
-
"db-schema.md": "
|
|
205
|
+
"db-schema.md": "51fb96bb372ca20de0478b3d6596e39a87f882a561264c4857ec55a23c422548",
|
|
203
206
|
"interfaces/security-scanner.md": "e8049712b9cf7a07c786bf19f8f775f8ef9638f063f7fba5c7a8b1431b92f38e",
|
|
204
207
|
"job-events.md": "84206168ac12b536d34470d62f8c8cba95dab181fee66d23203c2cf5dfbee716",
|
|
205
208
|
"job-lifecycle.md": "9c429121f98a07c8795f8979ed1abc5e5334e3f89db51585a8da55c527ef855b",
|
|
206
|
-
"plugin-author-guide.md": "
|
|
209
|
+
"plugin-author-guide.md": "02a040a873c51843a4c3c667a40eea3ad4c7f343e08396d7de666010ed833c88",
|
|
207
210
|
"plugin-kv-api.md": "1acc69ed82433a74e35ada61d63a6d7379fb61046ff83de1e0facbe884c64704",
|
|
208
211
|
"prompt-preamble.md": "9dd4f6d1bc6a425f8782fcee10cbe75909e8d64e28781fda56c2fae909b02f40",
|
|
209
212
|
"schemas/annotations.schema.json": "e39990d47f53e25a1b3a5587a5714486d0b819b8eeaac10d42783a675296aee1",
|
|
@@ -212,13 +215,14 @@
|
|
|
212
215
|
"schemas/conformance-case.schema.json": "f6d4c9fb92e79cb516eeeb9d042223572a3bd5ff8e7871a0becce13916f20cf6",
|
|
213
216
|
"schemas/conformance-result.schema.json": "426998e4f5cb079778ca7d0233634667d4fbc5a7e399cc41211fabd768db8ee0",
|
|
214
217
|
"schemas/execution-record.schema.json": "0d61e33f2dc1aaa4cc7337b5eac4ea8b9034022ce24bae9156c3c9f33204c250",
|
|
215
|
-
"schemas/extensions/action.schema.json": "
|
|
216
|
-
"schemas/extensions/analyzer.schema.json": "
|
|
217
|
-
"schemas/extensions/base.schema.json": "
|
|
218
|
-
"schemas/extensions/extractor.schema.json": "
|
|
219
|
-
"schemas/extensions/formatter.schema.json": "
|
|
220
|
-
"schemas/extensions/hook.schema.json": "
|
|
221
|
-
"schemas/extensions/provider.schema.json": "
|
|
218
|
+
"schemas/extensions/action.schema.json": "9f6c2427ce3f0d6fa329adf0f13129821116ab79a1d2a53f96464513ff044ebe",
|
|
219
|
+
"schemas/extensions/analyzer.schema.json": "f9bed3ba1305b2b64da277dccfbe760f7c058c4bb62a2d845af9c75787f159f6",
|
|
220
|
+
"schemas/extensions/base.schema.json": "8aaf1f8f1693d401e32feb91d4e064ff80ec7d4b0e3f15eff4202c708febaef4",
|
|
221
|
+
"schemas/extensions/extractor.schema.json": "5994088bf669321d2a7b8262c07cc94e05e5e2f49a235ae5389b7c66ecc1b2e1",
|
|
222
|
+
"schemas/extensions/formatter.schema.json": "d6d417df20260e5ddfe71f104b11a45873869706f86372c3c3c78c583e06e8d5",
|
|
223
|
+
"schemas/extensions/hook.schema.json": "76bf2c07f9e689b3fd1c67cbad4516a4df10604f07103759e82670e5213ddcdf",
|
|
224
|
+
"schemas/extensions/provider-kind.schema.json": "add3c5648721e67887eb971a76b39319628effac6315cffd51f7dcf679810740",
|
|
225
|
+
"schemas/extensions/provider.schema.json": "ae528d6ce1e083a2b5e3e7c6c701fbfaa8d58c79fb1f71616dc2d00c1a841cb7",
|
|
222
226
|
"schemas/frontmatter/base.schema.json": "df0056a9478514a0db7a705e59868fa4f67673ac1cc9c9da979de4237cdd62a1",
|
|
223
227
|
"schemas/history-stats.schema.json": "5170dec0299f3d04382a38079a27b1f26300a6b95fdb1ea0fae11050ad9f0574",
|
|
224
228
|
"schemas/input-types.schema.json": "c713b768d0b0e3d0c764afb401189f7fb624a82b4e988b73aab015cf9c67c01f",
|
|
@@ -227,18 +231,19 @@
|
|
|
227
231
|
"schemas/link.schema.json": "7fc429d03aca7e4c0b9a28241712c1aa2a5275870cea5ed938c2f97e8cccb081",
|
|
228
232
|
"schemas/node.schema.json": "e5da06c9262cc0f2f7584d5733ebc1c08acd75487952ed7b4d6035fb417aaa4b",
|
|
229
233
|
"schemas/plugins-doctor.schema.json": "c1d92f30fdb0080e8cd8f7dc5d43e01aae02a16640bc5eb04811c337a275de58",
|
|
230
|
-
"schemas/plugins-registry.schema.json": "
|
|
231
|
-
"schemas/project-config.schema.json": "
|
|
234
|
+
"schemas/plugins-registry.schema.json": "cca7ae65f0c22510ea27ea5ae34e0074f5beb5871a57b005b6b831e6ceaff5c0",
|
|
235
|
+
"schemas/project-config.schema.json": "7bb695476015b6b43026db78208aedf67350f4bc2c796c822fa87d0c9093b13f",
|
|
232
236
|
"schemas/refresh-report.schema.json": "54519b8caf86ba84c182f9565be9b5084bc1631ae05e9217ee18f34c0039fff3",
|
|
233
237
|
"schemas/report-base-deterministic.schema.json": "9d318d0181d121097c906ef3af1c52d71c782740bd04cf23418d7627ce2c3ed5",
|
|
234
238
|
"schemas/report-base.schema.json": "a1021e9a59b4df9f99cd92454d797e88469766e7d49f52d231c4645ffdfdad8f",
|
|
235
|
-
"schemas/scan-result.schema.json": "
|
|
239
|
+
"schemas/scan-result.schema.json": "214bc12fbb9946642cbba3b23513dade60e7d6a5b6a9ed3dd0818f135b450185",
|
|
236
240
|
"schemas/sidecar.schema.json": "8856c387477340efbdd0a585d74bfb07a99ba15b9ce593cc67d9efebc67c6bfc",
|
|
237
241
|
"schemas/summaries/agent.schema.json": "bf540f9a804f2b43756ab33b7deb0462620d26e88cc9379c75a5f87d3b1b47d8",
|
|
238
242
|
"schemas/summaries/command.schema.json": "c26f6965f77c5058608feb5e7b9f807395de8e015b0dea5efcdb44cb1820551a",
|
|
239
243
|
"schemas/summaries/hook.schema.json": "58420ec485e152fdd21fa3d87337ad74b0d81a48d3b83dd072d4a2d196f78573",
|
|
240
244
|
"schemas/summaries/markdown.schema.json": "f7b2b5ae9e4836c94bb6a84edc730412f19296a6ef13552016690d7ba6f5391d",
|
|
241
245
|
"schemas/summaries/skill.schema.json": "a2e23e35fe1545fb7bb8a6bb87dcad2248afa5a0f23aebc089eb5464201f4654",
|
|
246
|
+
"schemas/user-settings.schema.json": "969638f7235b2de2bbe38f291e3f576fc54f2f2f22e30b37d1578fd9e8538b51",
|
|
242
247
|
"schemas/view-slots.schema.json": "b151740016585ab2ba6cde376b071fc79ef1a1b484032216d841afeb593d06fd",
|
|
243
248
|
"versioning.md": "bab36cda6deb3edc29d7d40d97399ea4a213551257b0dd3321ddf95e2a60bff2"
|
|
244
249
|
}
|