@hasna/skills 0.10.72 → 0.10.73

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.
@@ -195,7 +195,7 @@ plugin dependency declarations refuse because this validator does not resolve
195
195
  or review unselected external plugins.
196
196
  The request may declare `functionHooksEnv: "1"`; without that declaration the
197
197
  environment document is preserved unchanged. For a measured Claude 2.1.276,
198
- 2.1.278, 2.1.282, 2.1.287, 2.1.293, 2.1.296 or 2.1.299 user-scoped install,
198
+ 2.1.278, 2.1.282, 2.1.287, 2.1.293, 2.1.296, 2.1.299 or 2.1.300 user-scoped install,
199
199
  `candidate.settingsMarketplaceSource: "directory"`
200
200
  explicitly declares the native settings registration. Skills derives
201
201
  `extraKnownMarketplaces[candidate.marketplace].source` from the exact frozen
@@ -249,6 +249,49 @@ structural refusal checks do not prove hook behavior. Recheck all preimages and
249
249
  candidate closure immediately before the first native mutation. The validator
250
250
  does not claim native install atomicity or crash recovery.
251
251
 
252
+ The reviewed discovery inputs must bind every current Claude settings and
253
+ registration source: the user settings, both project settings files,
254
+ `known_marketplaces.json` and `installed_plugins.json`. A project
255
+ `.claude/settings.json` or `.claude/settings.local.json` that the reviewed
256
+ sources omit is exempt only when no other expected source (the target settings
257
+ or the user settings) shares its path, and it is either:
258
+
259
+ - absent, with a null preimage; or
260
+ - present, and all of the following hold:
261
+ - its current bytes match its preimage SHA-256; a mismatch refuses with
262
+ `<name> preimage changed`;
263
+ - those exact bytes are strict UTF-8 without a byte-order mark and parse as
264
+ one JSON object within the native JSON witness limits (no comments,
265
+ trailing commas, trailing content or duplicate keys at any depth);
266
+ - none of `enabledPlugins`, `extraKnownMarketplaces`,
267
+ `additionalMarketplaces` or `skillOverrides` is present at any value,
268
+ including `null`, `{}` and `[]`;
269
+ - every top-level key is on the exemption allowlist with its type:
270
+ `permissions` (an object), `outputStyle`, `model`, `theme` and
271
+ `effortLevel` (strings), and `verbose` and `spinnerTipsEnabled` (booleans);
272
+ - `permissions` holds only `allow`, `deny` and `ask` (arrays of strings) and
273
+ `defaultMode` (a string).
274
+
275
+ Anything else keeps the file required, including `env` (Claude reads
276
+ `CLAUDE_CODE_PLUGIN_DIRS` from it), `hooks`, `permissions.additionalDirectories`
277
+ (Claude loads skills, commands and agents from those directories), `__proto__`
278
+ and unknown keys. The allowlist names settings reviewed as not configuring
279
+ plugins, marketplaces, skills, hooks, extra directories or the environment. It
280
+ does not prove that Claude cannot discover anything from the file; a setting
281
+ joins it only after that review.
282
+
283
+ This covers the permissions-only `~/.claude/settings.local.json` that Claude
284
+ writes when it saves a permission rule during a user-scope install, whose
285
+ project path is the Claude home. A present unreviewed file that fails the parse,
286
+ discovery-key or allowlist checks refuses and names the reason. Each exempt file
287
+ is re-checked against its exact preimage (still absent, or the same bytes) after
288
+ discovery and again before the result, so a change, creation or removal in
289
+ between refuses. The live hooks' project check still runs on top; it refuses
290
+ any of the four discovery keys (`additionalMarketplaces` included, because
291
+ Claude 2.1.300 rewrites it into `extraKnownMarketplaces` on every settings read)
292
+ and its other project skill and hook settings. The user settings and both
293
+ registries are never exempt.
294
+
252
295
  The optional release manifest witness binds the complete supplied release.json
253
296
  file bytes, path and SHA-256 in the request/receipt. Harnesses remains
254
297
  responsible for verifying that its release options correspond to every
@@ -270,8 +313,12 @@ skills hook capture-claude-installer --request /absolute/request.json --json
270
313
  The UTF-8 request is a bounded JSON object with schema
271
314
  `skills.claude-installer-capture/v1`, the exact configured `commandPath`, one
272
315
  fixed `operation` (`settings`, `marketplace-registry`, `managed-plugin-registry`,
273
- `path-bytes`, `discovery-directories`, `plugin-manifest`, or `candidate`), and
274
- only that operation's documented inputs. The result uses
316
+ `path-bytes`, `discovery-directories`, `plugin-manifest`, `candidate`, or
317
+ `discovery-binding`), and only that operation's documented inputs. The
318
+ `discovery-binding` operation verifies the stored Claude discovery binding as a
319
+ whole, including witnesses retained under an absent retired plugin-cache
320
+ version; its request and result contract is in the README section
321
+ "Claude installer witness CLI". The result uses
275
322
  `skills.claude-installer-capture-result/v1` and contains a Skills producer
276
323
  receipt plus the selected existing witness result. Candidate manifests include
277
324
  their plugin name, canonical path, `hashMode: "claude-plugin-manifest-v1"`, and
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/skills",
3
- "version": "0.10.72",
3
+ "version": "0.10.73",
4
4
  "description": "Skills library for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {