skillcask 0.4.0 → 0.5.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/README.md CHANGED
@@ -208,7 +208,7 @@ skillcask -g install --frozen # e.g. from a dotfiles repository
208
208
 
209
209
  ### Commands
210
210
 
211
- Every command except `publish` takes `-g, --global`.
211
+ Every command except `publish` and `validate` takes `-g, --global`.
212
212
 
213
213
  | Command | |
214
214
  |---|---|
@@ -217,13 +217,16 @@ Every command except `publish` takes `-g, --global`.
217
217
  | `add github:<owner/repo>[/skill][@version-or-ref]` | The same from a GitHub repository, see below. |
218
218
  | `remove <vendor/name>…` | Drop from manifest and lock; delete files, links and gitignore lines. |
219
219
  | `install [--frozen]` | Install the lock. `--frozen` (implied by `CI`) fails when the lock is out of date. |
220
- | `update [vendor/name…]` | Re-resolve within constraints. |
221
- | `outdated` | Newer versions, and when cooled-down ones become eligible. |
220
+ | `update [vendor/name…] [--diff]` | Re-resolve within constraints. `--diff` prints what changes in each updated or added package; it does not ask before installing. |
221
+ | `outdated [--strict]` | Newer versions, and when cooled-down ones become eligible. `--strict` exits 1 when `update` would lock a newer version. |
222
+ | `diff [vendor/name] [--to constraint]` | Unified diff of skill files from the locked version to the one `update` would lock, see below. |
223
+ | `info <vendor/name[@constraint]\|github:owner/repo\|skill>` | A package's skills, versions, description, license and requirements, or which package installs a skill. |
222
224
  | `status` | Exit 1 when manifest, lock or installed files disagree. |
223
- | `doctor [--fix]` | Broken or committed links, stale gitignore block, modified skills. |
225
+ | `doctor [--fix]` | Broken or committed links, stale gitignore block, modified skills; lists each check it ran. |
224
226
  | `search <query>` | Packagist (`type=ai-agent-skill`) and skill packages of the other repositories, GitLab included. |
225
227
  | `auth set\|remove <host>` | Keep a registry token in git's credential helper (Keychain, Credential Manager, libsecret). |
226
228
  | `publish --vendor v --base-url URL --out DIR [--inline] [--dist-url TPL] [paths…]` | Build a static Composer repository from a monorepo. |
229
+ | `validate [paths…]` | Check `SKILL.md` files against the Agent Skills spec, see below. |
227
230
  | `<other>` | Runs `skillcask-<other>` from `PATH`, like git and cargo plugins. |
228
231
 
229
232
  Exit codes: 0 ok, 1 manifest/lock/status problems, 2 authentication, 3 network, 4 hash mismatch,
@@ -234,6 +237,37 @@ the next step on a `hint:` line. For coding agents, `--agent` or `SKILLCASK_AGEN
234
237
  uncoloured, tab-separated output with only the rows that need action; it is on by itself when
235
238
  `AI_AGENT` or `CLAUDECODE=1` is set, unless `SKILLCASK_AGENT=0`.
236
239
 
240
+ A failed connection, HTTP 429 or a 5xx response is retried twice, after 1 s and 2 s or after the
241
+ `Retry-After` seconds the server sends. A `Retry-After` above 60 s, a spent GitHub rate limit, a
242
+ timeout or a TLS error fails at once.
243
+
244
+ `add`, `update` and `outdated` warn about a package its registry marks `abandoned` and name the
245
+ replacement when there is one (and it is a valid package name). Installing from the lock does not ask the registry.
246
+
247
+ **Reviewing an update:** a skill is a prompt, so read what changes before you take it.
248
+ `skillcask diff` prints a unified diff of the skill files, from the locked version to the one
249
+ `update` would lock (newest within the constraint, past the cooldown), for every entry in
250
+ `skills.toml` with a newer version; `diff vendor/name --to 2.0.0` compares one package with
251
+ another version. A package new to the lock, such as a dependency a new version adds, is shown as
252
+ all added. Nothing is installed or written. Control characters, bidi controls and other
253
+ invisible characters in the diff are shown as `<U+XXXX>` (a carriage return too, when the line
254
+ ends change), and invisible characters in changed files are warned about. Files over 1 MiB or
255
+ 10,000 lines print `Files differ (too large to show)`. `update --diff` prints the same diff
256
+ before it writes the lock, then installs without asking: run `skillcask diff` first to review
257
+ and decide. A scheduled CI job can run `skillcask outdated --strict` (exit 1 when something is to
258
+ update), then `skillcask update --diff` and open a pull request with the output.
259
+
260
+ **Where a skill comes from:** `skillcask info vendor/name` shows the package's skills with their
261
+ descriptions, its versions, description, license, `abandoned` and `requires`, for the locked
262
+ version or else the newest one `add` would take (`@constraint` for another); `info
263
+ github:owner/repo` lists the skills of a GitHub repository before you add it. `skillcask info
264
+ <skill>` names the package that installs an installed skill and the `skills.toml` entry, or the
265
+ chain of `requires`, that brings it in.
266
+
267
+ **Merge conflicts in `skills.lock`:** a lock with conflict markers fails with a hint. Resolve
268
+ `skills.toml`, keep either side of the lock (`git checkout --theirs skills.lock`) and run
269
+ `skillcask install`: it locks the entries from the other side that the kept lock lacks.
270
+
237
271
  ### Skills from GitHub and skills.sh
238
272
 
239
273
  [skills.sh](https://skills.sh) lists skills as `owner/repo/skill`, for example
@@ -291,6 +325,13 @@ what you picked.
291
325
  and paths that collide by case or Unicode form fail a skill that contains them, and are
292
326
  skipped outside the selected skills.
293
327
  - No package code runs, ever. No telemetry.
328
+ - `add` and `update` (and `install` when it resolves) warn about characters a reviewer cannot
329
+ see in the text files of new content: bidi controls (`U+202A`-`U+202E`, `U+2066`-`U+2069`,
330
+ `U+200E`, `U+200F`, `U+061C`), zero-width characters (`U+200B`-`U+200D`, `U+2060`, `U+FEFF`) and
331
+ Unicode tags (`U+E0000`-`U+E007F`), as `warning: acme/x: skills/foo/SKILL.md:12: U+202E
332
+ RIGHT-TO-LEFT OVERRIDE`, at most five per file. A leading byte order mark and a zero width
333
+ joiner inside an emoji are not reported; right-to-left and Indic text can trigger warnings.
334
+ Installing from the lock does not warn again.
294
335
  - `min-release-age` for GitHub sources uses times GitHub sets: release publication for tags,
295
336
  push times from the Activity API for branches. A tag without a release, or a ref GitHub lists no
296
337
  pushes for, falls back to commit dates, which the committer sets; reviewing what `add`/`update`
@@ -319,6 +360,22 @@ This writes `packages.json`, `p2/acme/<name>.json` and deterministic zips under
319
360
  versions are immutable, and re-running on unchanged skills changes no file. Serve the directory
320
361
  over HTTPS.
321
362
 
363
+ Check the skills before publishing; `validate` exits 1 on any error and warns about invisible
364
+ Unicode, as `add` does:
365
+
366
+ ```sh
367
+ skillcask validate skills/
368
+ ```
369
+
370
+ It follows the [Agent Skills specification](https://agentskills.io/specification): `name` 1-64
371
+ lowercase letters, digits and single hyphens, equal to the directory name; `description` 1-1024
372
+ characters; `compatibility` at most 500. Without paths it searches the current directory.
373
+ `publish` skips a `SKILL.md` without `name` or `version` and names it in a warning.
374
+
375
+ To retire a skill, publish a new version with `deprecated: true`, or `deprecated: vendor/name`
376
+ naming its replacement, in the frontmatter. It becomes Composer's `abandoned`, and consumers see a
377
+ warning on `add`, `update` and `outdated`.
378
+
322
379
  Hosts that cannot serve `/` inside file names (GitLab's Generic Package Registry) take a single
323
380
  file instead:
324
381
 
@@ -19,7 +19,7 @@
19
19
  "hasInstallScript": true,
20
20
  "license": "MIT OR Apache-2.0",
21
21
  "name": "skillcask",
22
- "version": "0.4.0"
22
+ "version": "0.5.0"
23
23
  },
24
24
  "node_modules/detect-libc": {
25
25
  "engines": {
@@ -48,5 +48,5 @@
48
48
  }
49
49
  },
50
50
  "requires": true,
51
- "version": "0.4.0"
51
+ "version": "0.5.0"
52
52
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "artifactDownloadUrls": [
3
- "https://github.com/puniserv/skillcask/releases/download/v0.4.0"
3
+ "https://github.com/puniserv/skillcask/releases/download/v0.5.0"
4
4
  ],
5
5
  "bin": {
6
6
  "skillcask": "run-skillcask.js"
@@ -104,7 +104,7 @@
104
104
  "zipExt": ".tar.xz"
105
105
  }
106
106
  },
107
- "version": "0.4.0",
107
+ "version": "0.5.0",
108
108
  "volta": {
109
109
  "node": "18.14.1",
110
110
  "npm": "9.5.0"