skillcask 0.4.1 → 0.6.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
@@ -77,7 +77,6 @@ skills.lock # lock, commit it
77
77
  .agents/skills/<name>/ # installed skill (gitignored)
78
78
  .agents/skills/.skillcask-installed # what this machine installed (gitignored)
79
79
  .claude/skills/<name> -> ../../.agents/skills/<name>
80
- .junie/skills/<name> -> ../../.agents/skills/<name>
81
80
  .gitignore # managed block
82
81
  ```
83
82
 
@@ -108,7 +107,7 @@ github = { type = "github", url = "https://api.github.com" } # GitHub Enterpri
108
107
  "anthropics/skills" = { github = true, skills = ["pdf"] } # default branch
109
108
 
110
109
  [agents]
111
- targets = [".claude/skills", ".junie/skills"]
110
+ targets = ["claude", "kiro"] # agent names or paths with a "/"; default: config.toml, else ["claude"]
112
111
  local = ".skills" # project skills
113
112
 
114
113
  [policy]
@@ -119,6 +118,32 @@ github-requires = false # true: dependencies may come from GitHub
119
118
  allow-sources = ["acme", "own", "packagist", "github"] # only these sources; default: all
120
119
  ```
121
120
 
121
+ ### Agents
122
+
123
+ Most agents read `.agents/skills` themselves (Codex, Copilot, Cursor, Gemini CLI, OpenCode, Amp,
124
+ Junie, Devin/Windsurf, Roo Code, Cline, Goose, Factory, Mistral Vibe), so they need no link.
125
+ `[agents] targets` lists the agents that need one, by name, or any directory as a path with a `/`:
126
+
127
+ | Name | Project | Home (`--global`) |
128
+ |---|---|---|
129
+ | `claude` | `.claude/skills` | `~/.claude/skills` |
130
+ | `kiro` | `.kiro/skills` | `~/.kiro/skills` |
131
+ | `junie` | store | `~/.junie/skills` |
132
+ | `codex`, `copilot`, `cursor`, `gemini`, `opencode`, `amp`, `devin`, `roo`, `cline`, `goose`, `factory`, `vibe` | store | store |
133
+
134
+ Set the list once in `config.toml` next to the global manifest; a `skills.toml` that sets
135
+ `targets` replaces it. Manifests from before 0.6.0 carry an explicit list: delete the line to
136
+ follow `config.toml`.
137
+
138
+ ```toml
139
+ # ~/.config/skillcask/config.toml
140
+ [agents]
141
+ targets = ["claude", "kiro"]
142
+ ```
143
+
144
+ When a target is dropped, the next `install` removes the links skillcask made there; `doctor`
145
+ reports them. `status` prints the targets, where they came from and the directories they link.
146
+
122
147
  Constraints follow Composer semantics: `^0.3` means `>=0.3.0 <0.4.0`, `~1.2` means
123
148
  `>=1.2 <2.0`, and pre-releases are only selected when the constraint names a stability
124
149
  (`^1.0@beta`).
@@ -148,6 +173,18 @@ allow-sources = ["https://gitlab.example.com/", "github"]
148
173
  enforce = ["allow-sources"]
149
174
  ```
150
175
 
176
+ An enforced `min-release-age` also applies to a repository's own `min-release-age`: a project
177
+ may only make it longer. Exceptions, by URL prefix, stay in `config.toml`:
178
+
179
+ ```toml
180
+ [policy]
181
+ min-release-age = "3d"
182
+ enforce = ["min-release-age"]
183
+
184
+ [policy.repository-min-release-age]
185
+ "https://gitlab.example.com/" = "0" # internal skills, reviewed in merge requests
186
+ ```
187
+
151
188
  `config.toml` and the environment take URL prefixes, not repository names, since a name means
152
189
  whatever a project calls it. `skillcask status` prints each key that is set and where it came
153
190
  from.
@@ -199,8 +236,8 @@ skillcask -g install --frozen # e.g. from a dotfiles repository
199
236
 
200
237
  - `skills.toml`, `skills.lock` and an optional `auth.json` live in `~/.config/skillcask`
201
238
  (`$XDG_CONFIG_HOME/skillcask`; `SKILLCASK_HOME` overrides both). Keep them in your dotfiles.
202
- - Skills go to `~/.agents/skills` (read by Codex), with links in `~/.claude/skills` and
203
- `~/.junie/skills` (`[agents] targets`, relative to home). Links are absolute, so a symlinked
239
+ - Skills go to `~/.agents/skills` (read by most agents), with links in `~/.claude/skills`
240
+ (`[agents] targets`, see Agents). Links are absolute, so a symlinked
204
241
  `~/.claude` works. `[agents] local` does not apply.
205
242
  - Personal skills you wrote by hand stay where they are and are not linked anywhere.
206
243
  - The list of managed paths is `~/.agents/skills/.skillcask-installed`, local to the machine;
@@ -208,7 +245,7 @@ skillcask -g install --frozen # e.g. from a dotfiles repository
208
245
 
209
246
  ### Commands
210
247
 
211
- Every command except `publish` takes `-g, --global`.
248
+ Every command except `publish` and `validate` takes `-g, --global`.
212
249
 
213
250
  | Command | |
214
251
  |---|---|
@@ -217,13 +254,16 @@ Every command except `publish` takes `-g, --global`.
217
254
  | `add github:<owner/repo>[/skill][@version-or-ref]` | The same from a GitHub repository, see below. |
218
255
  | `remove <vendor/name>…` | Drop from manifest and lock; delete files, links and gitignore lines. |
219
256
  | `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. |
257
+ | `update [vendor/name…] [--diff]` | Re-resolve within constraints. `--diff` prints what changes in each updated or added package; it does not ask before installing. |
258
+ | `outdated [--strict]` | Newer versions, and when cooled-down ones become eligible. `--strict` exits 1 when `update` would lock a newer version. |
259
+ | `diff [vendor/name] [--to constraint]` | Unified diff of skill files from the locked version to the one `update` would lock, see below. |
260
+ | `info <vendor/name[@constraint]\|github:owner/repo\|skill>` | A package's skills, versions, description, license and requirements, or which package installs a skill. |
222
261
  | `status` | Exit 1 when manifest, lock or installed files disagree. |
223
- | `doctor [--fix]` | Broken or committed links, stale gitignore block, modified skills. |
262
+ | `doctor [--fix]` | Broken or committed links, stale gitignore block, modified skills; lists each check it ran. |
224
263
  | `search <query>` | Packagist (`type=ai-agent-skill`) and skill packages of the other repositories, GitLab included. |
225
264
  | `auth set\|remove <host>` | Keep a registry token in git's credential helper (Keychain, Credential Manager, libsecret). |
226
265
  | `publish --vendor v --base-url URL --out DIR [--inline] [--dist-url TPL] [paths…]` | Build a static Composer repository from a monorepo. |
266
+ | `validate [paths…]` | Check `SKILL.md` files against the Agent Skills spec, see below. |
227
267
  | `<other>` | Runs `skillcask-<other>` from `PATH`, like git and cargo plugins. |
228
268
 
229
269
  Exit codes: 0 ok, 1 manifest/lock/status problems, 2 authentication, 3 network, 4 hash mismatch,
@@ -234,6 +274,37 @@ the next step on a `hint:` line. For coding agents, `--agent` or `SKILLCASK_AGEN
234
274
  uncoloured, tab-separated output with only the rows that need action; it is on by itself when
235
275
  `AI_AGENT` or `CLAUDECODE=1` is set, unless `SKILLCASK_AGENT=0`.
236
276
 
277
+ A failed connection, HTTP 429 or a 5xx response is retried twice, after 1 s and 2 s or after the
278
+ `Retry-After` seconds the server sends. A `Retry-After` above 60 s, a spent GitHub rate limit, a
279
+ timeout or a TLS error fails at once.
280
+
281
+ `add`, `update` and `outdated` warn about a package its registry marks `abandoned` and name the
282
+ replacement when there is one (and it is a valid package name). Installing from the lock does not ask the registry.
283
+
284
+ **Reviewing an update:** a skill is a prompt, so read what changes before you take it.
285
+ `skillcask diff` prints a unified diff of the skill files, from the locked version to the one
286
+ `update` would lock (newest within the constraint, past the cooldown), for every entry in
287
+ `skills.toml` with a newer version; `diff vendor/name --to 2.0.0` compares one package with
288
+ another version. A package new to the lock, such as a dependency a new version adds, is shown as
289
+ all added. Nothing is installed or written. Control characters, bidi controls and other
290
+ invisible characters in the diff are shown as `<U+XXXX>` (a carriage return too, when the line
291
+ ends change), and invisible characters in changed files are warned about. Files over 1 MiB or
292
+ 10,000 lines print `Files differ (too large to show)`. `update --diff` prints the same diff
293
+ before it writes the lock, then installs without asking: run `skillcask diff` first to review
294
+ and decide. A scheduled CI job can run `skillcask outdated --strict` (exit 1 when something is to
295
+ update), then `skillcask update --diff` and open a pull request with the output.
296
+
297
+ **Where a skill comes from:** `skillcask info vendor/name` shows the package's skills with their
298
+ descriptions, its versions, description, license, `abandoned` and `requires`, for the locked
299
+ version or else the newest one `add` would take (`@constraint` for another); `info
300
+ github:owner/repo` lists the skills of a GitHub repository before you add it. `skillcask info
301
+ <skill>` names the package that installs an installed skill and the `skills.toml` entry, or the
302
+ chain of `requires`, that brings it in.
303
+
304
+ **Merge conflicts in `skills.lock`:** a lock with conflict markers fails with a hint. Resolve
305
+ `skills.toml`, keep either side of the lock (`git checkout --theirs skills.lock`) and run
306
+ `skillcask install`: it locks the entries from the other side that the kept lock lacks.
307
+
237
308
  ### Skills from GitHub and skills.sh
238
309
 
239
310
  [skills.sh](https://skills.sh) lists skills as `owner/repo/skill`, for example
@@ -291,6 +362,13 @@ what you picked.
291
362
  and paths that collide by case or Unicode form fail a skill that contains them, and are
292
363
  skipped outside the selected skills.
293
364
  - No package code runs, ever. No telemetry.
365
+ - `add` and `update` (and `install` when it resolves) warn about characters a reviewer cannot
366
+ see in the text files of new content: bidi controls (`U+202A`-`U+202E`, `U+2066`-`U+2069`,
367
+ `U+200E`, `U+200F`, `U+061C`), zero-width characters (`U+200B`-`U+200D`, `U+2060`, `U+FEFF`) and
368
+ Unicode tags (`U+E0000`-`U+E007F`), as `warning: acme/x: skills/foo/SKILL.md:12: U+202E
369
+ RIGHT-TO-LEFT OVERRIDE`, at most five per file. A leading byte order mark and a zero width
370
+ joiner inside an emoji are not reported; right-to-left and Indic text can trigger warnings.
371
+ Installing from the lock does not warn again.
294
372
  - `min-release-age` for GitHub sources uses times GitHub sets: release publication for tags,
295
373
  push times from the Activity API for branches. A tag without a release, or a ref GitHub lists no
296
374
  pushes for, falls back to commit dates, which the committer sets; reviewing what `add`/`update`
@@ -319,6 +397,22 @@ This writes `packages.json`, `p2/acme/<name>.json` and deterministic zips under
319
397
  versions are immutable, and re-running on unchanged skills changes no file. Serve the directory
320
398
  over HTTPS.
321
399
 
400
+ Check the skills before publishing; `validate` exits 1 on any error and warns about invisible
401
+ Unicode, as `add` does:
402
+
403
+ ```sh
404
+ skillcask validate skills/
405
+ ```
406
+
407
+ It follows the [Agent Skills specification](https://agentskills.io/specification): `name` 1-64
408
+ lowercase letters, digits and single hyphens, equal to the directory name; `description` 1-1024
409
+ characters; `compatibility` at most 500. Without paths it searches the current directory.
410
+ `publish` skips a `SKILL.md` without `name` or `version` and names it in a warning.
411
+
412
+ To retire a skill, publish a new version with `deprecated: true`, or `deprecated: vendor/name`
413
+ naming its replacement, in the frontmatter. It becomes Composer's `abandoned`, and consumers see a
414
+ warning on `add`, `update` and `outdated`.
415
+
322
416
  Hosts that cannot serve `/` inside file names (GitLab's Generic Package Registry) take a single
323
417
  file instead:
324
418
 
@@ -19,7 +19,7 @@
19
19
  "hasInstallScript": true,
20
20
  "license": "MIT OR Apache-2.0",
21
21
  "name": "skillcask",
22
- "version": "0.4.1"
22
+ "version": "0.6.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.1"
51
+ "version": "0.6.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.1"
3
+ "https://github.com/puniserv/skillcask/releases/download/v0.6.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.1",
107
+ "version": "0.6.0",
108
108
  "volta": {
109
109
  "node": "18.14.1",
110
110
  "npm": "9.5.0"