@skillsmith/cli 0.8.7 → 0.8.9

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
@@ -4,6 +4,142 @@ All notable changes to `@skillsmith/cli` are documented here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## v0.8.9
8
+
9
+ - **Feature**: SMI-6343 Wave 3 -- tamper-check classification (#2710)
10
+ - **Added**: `skillsmith update` now refuses to force-install over an already-corrupt manifest
11
+ entry — before overwriting the currently-installed skill, it runs the same shared tamper-
12
+ check classification `skill_outdated` uses and skips (rather than updates) any entry
13
+ classified `local-drift`, `identity-mismatch`, or `unknown`, naming the reason in a new
14
+ `Skipped` bucket in the update summary (SMI-6343 Wave 3). `sklx list --outdated` similarly
15
+ no longer reports `hasUpdates: true` for a `local-drift`/owner-mismatch/path-unresolved
16
+ entry — only the two signals that don't require a network call (this scan is offline by
17
+ design); a signal-2-only (front-matter) corruption still surfaces through `skill_outdated`.
18
+ - **Fix**: `skills-directory.ts`'s `hasUpdates` computation (read by `sklx list --outdated`)
19
+ previously read a nonexistent `contentHash`/`originalContentHash` field off the *parsed
20
+ SKILL.md* object instead of the manifest entry, so it always fell back to comparing a fresh
21
+ on-disk hash against `skill_versions`' pre-fix metadata-proxy hash and could not correctly
22
+ report `hasUpdates: true` (SMI-6343 Wave 2). Now reads the manifest's real recorded install
23
+ hash and compares it via the shared `compareSkillContentHashes()` comparator, matching the
24
+ MCP server's `skill_outdated`/`skill_updates` tools.
25
+ - **Fix**: `utils/manifest.ts`'s `saveManifest()` — a homedir-derived manifest write with no
26
+ path-override parameter — now refuses to touch a manifest inside the real user home while
27
+ running under vitest, via `@skillsmith/core`'s newly-exported `assertNotRealUserHome()`
28
+ (SMI-6343 Wave 1 follow-up, adversarial review). Previously the test-run `$HOME` sandbox
29
+ was this write path's only protection.
30
+ - **Fix**: `skillsmith registry --help` now states that publishing and listing are MCP-only
31
+ today (`private_registry_publish`/`private_registry_manage`), pointing at those tools and
32
+ the private-registry docs page — matching already-shipped website copy. Two external
33
+ testers had each independently read the silent absence of `registry publish`/`list` as an
34
+ accidental gap; no new CLI subcommands (full CLI parity is tracked separately) (SMI-6266
35
+ Wave 8, SMI-6278)
36
+ - **Fix**: The MCP config snippet for Google Antigravity now sets `SKILLSMITH_CLIENT: "antigravity"`,
37
+ so copying it verbatim installs skills to AntiGravity's own directory instead of silently
38
+ falling back to Claude Code's default — the same fix Cursor got earlier. `command`/`args`
39
+ stay plain `npx` (AntiGravity has no known `npx`-resolution problem, unlike Cursor) (SMI-6266
40
+ Wave 7, SMI-6277)
41
+ - **Feature**: `skillsmith whoami` now shows your live effective license tier (and, when the
42
+ live check returns one, your per-minute API rate limit) alongside the existing masked-key/
43
+ session display, resolved via the same credential-aware `resolveEffectiveTier()` live check
44
+ `audit advisories`/`diff`/`pin`/`audit-collisions` already use (SMI-6271) — previously
45
+ `whoami` showed no tier information at all. Reuses the existing `formatTierBadge()` tier-badge
46
+ formatting rather than reimplementing it. Unlike those gating commands, a transient live-check
47
+ failure here does not block the command (this is a display command, not a gate) — it shows a
48
+ "could not verify" message instead of ever displaying a fabricated tier, since a single-shot
49
+ CLI invocation has no cached last-known tier to fall back to (SMI-6266 Wave 2, SMI-6272)
50
+ - **Feature**: `install`/`update`/`remove` gain a new `--scope <global|workspace>` flag
51
+ (ADR-139, SMI-6274 Wave 4) — `workspace` resolves against the nearest ancestor workspace
52
+ marker or `.git` root instead of the client's home-anchored global directory, creating the
53
+ workspace skills directory if none exists yet (the only path allowed to create one implicitly).
54
+ Precedence: `--scope` > `SKILLSMITH_SCOPE` env var > per-client `~/.skillsmith/config.json`
55
+ default > auto-detecting an EXISTING workspace directory > global (unchanged default — no
56
+ existing install moves, nothing changes for anyone who doesn't opt in). `remove`/`update` now
57
+ resolve against the exact `(scope, client, name)` triple rather than "whichever scope happened
58
+ to match by name." `list` now scans every client's workspace directory (not just Claude Code's
59
+ repo-local one) alongside every global directory, labels each row's scope, and marks a skill
60
+ present on disk with no manifest entry `[untracked]` instead of silently omitting it —
61
+ `remove`/`update` now adopt such a skill (reconstructing a manifest entry from disk) instead of
62
+ requiring `--force`. `agent install --scope workspace` can bootstrap AntiGravity as a target in
63
+ a fresh repo by creating `.agents/skills`. `getLocalSkillsDir()` is now a deprecated thin
64
+ wrapper delegating to the new resolver (also fixing a real bug: it previously never walked up
65
+ from `cwd`, so `list` run from a repo subdirectory silently missed the repo-root
66
+ `.claude/skills`)
67
+
68
+ - **Fix**: `skillsmith diagnose` now checks whether your Cursor MCP registration (both the
69
+ global `~/.cursor/mcp.json` and any project-scoped copy) is on the current, working config
70
+ shape and tells you how to fix it if not — previously nothing detected this at all once the
71
+ MCP server failed to even start, since the CLI's own update-nudge only fires from inside a
72
+ running MCP process (GH#2368, SMI-6279)
73
+
74
+ - **Fix**: `audit advisories`, `diff`, `pin`, `config get/set audit_mode`, and `audit-collisions`
75
+ now correctly recognize a personal `SKILLSMITH_API_KEY` or a logged-in `skillsmith login`
76
+ session — previously they only ever checked `SKILLSMITH_LICENSE_KEY` (an offline license key
77
+ almost nobody uses), so an Enterprise customer using either of the two common auth methods was
78
+ always reported as Community tier (GH#2508, GH#2509, SMI-6271). Live tier verification now
79
+ fails closed on a network/timeout error rather than silently passing or downgrading a real
80
+ paying customer
81
+
82
+ - **Fix**: `skillsmith login` (device-code flow) now refuses cleanly for SSO-provisioned users
83
+ instead of silently logging into the wrong account. Prints the server's refusal message and
84
+ points to the personal-API-key alternative (`/account/cli-token/` + `SKILLSMITH_API_KEY`).
85
+ Server-supplied error text is sanitized (control characters, bidi-override characters) before
86
+ being written to the terminal. Part of SMI-6206.
87
+
88
+ - **Breaking**: `sync` (and `sync config --enable`) now require Team+ tier — Community and
89
+ Individual tiers can no longer bulk-download the skill registry. The registry has grown far
90
+ larger than this feature was designed for (hundreds of thousands of records, still growing),
91
+ with no size warning or cost boundary until now. Enforced both client-side (fast, friendly
92
+ failure) and server-side (a new `registry-sync` Edge Function, so a direct API call or an
93
+ older CLI can't bypass the gate). Before syncing, the CLI now shows a live record count
94
+ fetched from the registry and asks for confirmation — pass `-y`/`--yes` to skip the prompt for
95
+ scripted/automated use (`--json` implies `--yes`). No deprecation window; see ADR-136 for the
96
+ full rationale (SMI-6236). Adversarial security review before merge found and fixed a real
97
+ regression in the client-side gate: it originally resolved tier from `SKILLSMITH_LICENSE_KEY`
98
+ only, which a user authenticated via the documented `skillsmith login` flow never has set —
99
+ such a user would have been incorrectly blocked as "community" even on a real Team plan. The
100
+ gate now resolves tier from whichever credential the sync request actually authenticates
101
+ with, deferring to the server's own response when it can't be resolved offline
102
+
103
+ ## v0.8.8
104
+
105
+ - **Fix**: logout/whoami now detect JWT device-code sessions (#2578)
106
+ - **Fix**: `skillsmith logout` and `skillsmith whoami` now detect a JWT device-code session
107
+ (`skillsmith login`'s default flow, SMI-4402) — previously they only checked the legacy
108
+ API-key store, so `login` would report "Already authenticated" while `logout` immediately
109
+ after reported "Not authenticated. Nothing to log out.", a stuck loop with no way to
110
+ actually end the session. `logout` now clears both credential stores on confirm. (SMI-6235)
111
+ - **Docs**: README's framing sentence updated from the "lifecycle layer" tagline to a plain
112
+ descriptive sentence ("a registry for sharing, scanning, and tracking agent skills across
113
+ teams") as part of the site-wide positioning reframe. Wording-only. (SMI-6194)
114
+ - **Fix**: `skillsmith update` no longer force-installs an unrelated same-named registry skill
115
+ over a locally-authored one it was never asked to replace. `getSkillDiff()` now reads the
116
+ installed skill's own claimed author from its `SKILL.md` front-matter (`readClaimedAuthor()`)
117
+ and only trusts a local-registry-cache bare-name match when it agrees with the cache row's
118
+ author — scanning every same-name cache row for the matching author, not just the first one
119
+ found — otherwise it falls through to the existing confidence-gated manifest/`SourceRecoveryService`
120
+ path instead of silently substituting the wrong author's skill. Confirmed real incident: two
121
+ personal, unclaimed skills were overwritten with unrelated registry content this way (SMI-6103)
122
+ - **Fix**: the CLI's tier-gating messages (`require-tier.ts`) and `ab-test`'s upgrade prompt
123
+ (console and JSON `price` field) hardcoded the literal unpublished Enterprise price
124
+ (`$55/user/month`) — now `Custom pricing — Contact Sales`, matching the documented "unpublished"
125
+ pricing policy (SMI-6069, GH#2368-adjacent follow-up from SMI-5893)
126
+
127
+ - **Fix**: The Cursor MCP snippet (root README, `@skillsmith/mcp-server`'s README, and the website) no longer defaults to `npx`, which failed inside Cursor on two separate live UAT passes (a real Cursor-bundled-Node ENOENT). The copied `command` is now a resolved-path placeholder (`which`/`where skillsmith-mcp`) that can never point at a wrong path; `npx` stays documented as an explicit, clearly-labeled fallback. Also fixed in the canonical CLI snippet matrix (`templates/mcp-server.template.snippets.ts`, used to scaffold non-Skillsmith MCP servers via `skillsmith author mcp-init`): its Cursor placeholder was hardcoding the literal binary name `skillsmith-mcp` instead of deriving it from the scaffolded server's own package name, and `{{name}}` was never interpolated in a snippet's `notes` text at all — either bug would leak Skillsmith-specific text into a scaffolded (non-Skillsmith) server's generated README (SMI-5893 Wave 11, GH#2368 C-01)
128
+ - **Fix**: Community-tier quota corrected from a stale `1,000` to the actual `100` API calls/month in `displayLicenseStatus` (SMI-5893 Wave 11, GH#2368 C-19)
129
+ - **Fix**: `list`/`manage`'s footer "local: ..." segment, and `inventory status`'s
130
+ "Local skills: ..." line, both hand-typed the literal `./.claude/skills`
131
+ independent of `getLocalSkillsDir()`'s own path segments — now sourced from a
132
+ new `getLocalSkillsDirDisplay()` (`utils/local-skills-dir.ts`), which derives
133
+ from `getLocalSkillsDir()`'s actual return value via `path.relative()` rather
134
+ than reconstructing it from a separately-shared constant, so the two genuinely
135
+ can't drift apart (the `inventory status` instance was found as a sibling gap
136
+ during review — same bug class, second call site this wave hadn't touched
137
+ yet). Displayed text is unchanged in both places — SMI-1630's repo-local
138
+ convention still applies regardless of `--client`. `local-skills-dir.ts` is a
139
+ small new module split out of `utils/skills-directory.ts`, which was
140
+ approaching (not over — corrected from an earlier miswritten changelog entry)
141
+ the 500-line standard (SMI-6060)
142
+
7
143
  ## v0.8.7
8
144
 
9
145
  - **Fix**: Cursor UAT follow-up — website onboarding, CLI/MCP parity, hooks schema (#2375)
package/README.md CHANGED
@@ -4,11 +4,11 @@
4
4
 
5
5
  Command-line interface for Skillsmith — publish, manage, and author agent skills.
6
6
 
7
- Part of Skillsmith: a lifecycle layer for agent skills across teams.
7
+ Part of Skillsmith: a registry for sharing, scanning, and tracking agent skills across teams.
8
8
 
9
9
  ## Contents
10
10
 
11
- - [What's New](#whats-new-in-v087)
11
+ - [What's New](#whats-new-in-v089)
12
12
  - [Installation](#installation)
13
13
  - [Commands](#commands)
14
14
  - [inventory](#inventory)
@@ -16,7 +16,7 @@ Part of Skillsmith: a lifecycle layer for agent skills across teams.
16
16
  - [Examples](#examples)
17
17
  - [Privacy & Data Handling](#privacy--data-handling)
18
18
 
19
- ## What's New in v0.8.7
19
+ ## What's New in v0.8.9
20
20
 
21
21
  - **Multi-client targeting fixed across the board**: `install`, `list`, `remove`, `update`, `sync`, and `search -i`'s install action now all honor `SKILLSMITH_CLIENT`/`--client` consistently — previously several of these silently acted on the Claude Code directory regardless of the flag or env var.
22
22
  - **`update` no longer fails after a fresh install**: now resolves the installed skill's registry source from the manifest `install` already writes, instead of a dead-code path that could never find it.
@@ -59,7 +59,7 @@ npm update -g @skillsmith/cli
59
59
  npm install -g @skillsmith/cli@latest
60
60
 
61
61
  # Using npx always gets the latest
62
- npx @skillsmith/cli@latest sync
62
+ npx @skillsmith/cli@latest --version
63
63
  ```
64
64
 
65
65
  ## Command Alias
@@ -432,12 +432,15 @@ skillsmith import --topic claude-skill --max 500
432
432
 
433
433
  ### sync
434
434
 
435
- Synchronize your local skill database with the live Skillsmith registry.
435
+ Synchronize your local skill database with the live Skillsmith registry (Team+ tier). The registry holds hundreds of thousands of skills, so `sync` shows a live record count and asks for confirmation before downloading — pass `-y`/`--yes` to skip the prompt for scripted or automated use (e.g. running the CLI on a Team's own cloud instance to maintain a shared local mirror).
436
436
 
437
437
  ```bash
438
438
  # Sync skills from registry (differential - only changes)
439
439
  skillsmith sync
440
440
 
441
+ # Skip the confirmation prompt (automation)
442
+ skillsmith sync --yes
443
+
441
444
  # Force full sync (ignore last sync time)
442
445
  skillsmith sync --force
443
446
 
@@ -448,6 +451,7 @@ skillsmith sync --dry-run
448
451
  **Options:**
449
452
  - `-f, --force` - Force full sync, ignore last sync timestamp
450
453
  - `--dry-run` - Preview changes without writing to database
454
+ - `-y, --yes` - Skip the confirmation prompt (for automation; also implied by `--json`)
451
455
  - `-d, --db <path>` - Database path
452
456
  - `--json` - Output results as JSON
453
457
 
@@ -489,7 +493,7 @@ Configure automatic sync settings.
489
493
  # Show current configuration
490
494
  skillsmith sync config --show
491
495
 
492
- # Enable automatic background sync
496
+ # Enable automatic background sync (Team+ tier)
493
497
  skillsmith sync config --enable
494
498
 
495
499
  # Disable automatic sync
@@ -841,6 +845,8 @@ skillsmith search --interactive
841
845
 
842
846
  ### Keep Skills Up-to-Date
843
847
 
848
+ `sync` and background auto-sync require Team+ tier — see [sync](#sync) above.
849
+
844
850
  ```bash
845
851
  # Sync with the live registry
846
852
  skillsmith sync
@@ -1 +1 @@
1
- bbbc02d0207042137ce44e87cadc0140a1182fb9
1
+ f62a85156479633b6e42bda2582af08b36eacf4c