skillcask 0.5.0 → 0.7.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 +110 -8
- package/npm-shrinkwrap.json +2 -2
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -60,6 +60,27 @@ build provenance attestations:
|
|
|
60
60
|
gh attestation verify skillcask-x86_64-unknown-linux-gnu.tar.xz -R puniserv/skillcask
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
+
**GitHub Actions**
|
|
64
|
+
|
|
65
|
+
```yaml
|
|
66
|
+
permissions:
|
|
67
|
+
contents: read
|
|
68
|
+
attestations: read # for the provenance check
|
|
69
|
+
steps:
|
|
70
|
+
- uses: actions/checkout@<sha>
|
|
71
|
+
- uses: puniserv/skillcask@<commit sha of a release tag> # vX.Y.Z
|
|
72
|
+
with:
|
|
73
|
+
version: X.Y.Z # needed when the action is pinned to a sha, not a tag
|
|
74
|
+
args: install --frozen # default
|
|
75
|
+
# working-directory: .
|
|
76
|
+
# verify-attestation: "true" # default
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
The action downloads the release archive for the runner (Linux x64 and arm64, macOS, Windows
|
|
80
|
+
x64), checks its sha256 and its build provenance attestation, puts `skillcask` on `PATH` and runs
|
|
81
|
+
it with `args`. It runs no other action. Used at a tag (`@vX.Y.Z`) it takes the version from the
|
|
82
|
+
tag.
|
|
83
|
+
|
|
63
84
|
## Use
|
|
64
85
|
|
|
65
86
|
```sh
|
|
@@ -77,7 +98,6 @@ skills.lock # lock, commit it
|
|
|
77
98
|
.agents/skills/<name>/ # installed skill (gitignored)
|
|
78
99
|
.agents/skills/.skillcask-installed # what this machine installed (gitignored)
|
|
79
100
|
.claude/skills/<name> -> ../../.agents/skills/<name>
|
|
80
|
-
.junie/skills/<name> -> ../../.agents/skills/<name>
|
|
81
101
|
.gitignore # managed block
|
|
82
102
|
```
|
|
83
103
|
|
|
@@ -108,7 +128,7 @@ github = { type = "github", url = "https://api.github.com" } # GitHub Enterpri
|
|
|
108
128
|
"anthropics/skills" = { github = true, skills = ["pdf"] } # default branch
|
|
109
129
|
|
|
110
130
|
[agents]
|
|
111
|
-
targets = ["
|
|
131
|
+
targets = ["claude", "kiro"] # agent names or paths with a "/"; default: config.toml, else ["claude"]
|
|
112
132
|
local = ".skills" # project skills
|
|
113
133
|
|
|
114
134
|
[policy]
|
|
@@ -117,8 +137,35 @@ allow-ranges = true # false: every version must be exact
|
|
|
117
137
|
packagist = true # false: drop the implicit Packagist repository
|
|
118
138
|
github-requires = false # true: dependencies may come from GitHub
|
|
119
139
|
allow-sources = ["acme", "own", "packagist", "github"] # only these sources; default: all
|
|
140
|
+
deny-patterns = false # true: risky patterns in new skill text fail instead of warning
|
|
120
141
|
```
|
|
121
142
|
|
|
143
|
+
### Agents
|
|
144
|
+
|
|
145
|
+
Most agents read `.agents/skills` themselves (Codex, Copilot, Cursor, Gemini CLI, OpenCode, Amp,
|
|
146
|
+
Junie, Devin/Windsurf, Roo Code, Cline, Goose, Factory, Mistral Vibe), so they need no link.
|
|
147
|
+
`[agents] targets` lists the agents that need one, by name, or any directory as a path with a `/`:
|
|
148
|
+
|
|
149
|
+
| Name | Project | Home (`--global`) |
|
|
150
|
+
|---|---|---|
|
|
151
|
+
| `claude` | `.claude/skills` | `~/.claude/skills` |
|
|
152
|
+
| `kiro` | `.kiro/skills` | `~/.kiro/skills` |
|
|
153
|
+
| `junie` | store | `~/.junie/skills` |
|
|
154
|
+
| `codex`, `copilot`, `cursor`, `gemini`, `opencode`, `amp`, `devin`, `roo`, `cline`, `goose`, `factory`, `vibe` | store | store |
|
|
155
|
+
|
|
156
|
+
Set the list once in `config.toml` next to the global manifest; a `skills.toml` that sets
|
|
157
|
+
`targets` replaces it. Manifests from before 0.6.0 carry an explicit list: delete the line to
|
|
158
|
+
follow `config.toml`.
|
|
159
|
+
|
|
160
|
+
```toml
|
|
161
|
+
# ~/.config/skillcask/config.toml
|
|
162
|
+
[agents]
|
|
163
|
+
targets = ["claude", "kiro"]
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
When a target is dropped, the next `install` removes the links skillcask made there; `doctor`
|
|
167
|
+
reports them. `status` prints the targets, where they came from and the directories they link.
|
|
168
|
+
|
|
122
169
|
Constraints follow Composer semantics: `^0.3` means `>=0.3.0 <0.4.0`, `~1.2` means
|
|
123
170
|
`>=1.2 <2.0`, and pre-releases are only selected when the constraint names a stability
|
|
124
171
|
(`^1.0@beta`).
|
|
@@ -135,8 +182,8 @@ Policy can also come from `config.toml` next to the global manifest (`~/.config/
|
|
|
135
182
|
from the environment. The first layer that sets a key wins:
|
|
136
183
|
|
|
137
184
|
1. `SKILLCASK_ALLOW_SOURCES`, `SKILLCASK_MIN_RELEASE_AGE`, `SKILLCASK_ALLOW_RANGES`,
|
|
138
|
-
`SKILLCASK_PACKAGIST`, `SKILLCASK_GITHUB_REQUIRES` (overriding an
|
|
139
|
-
warning);
|
|
185
|
+
`SKILLCASK_PACKAGIST`, `SKILLCASK_GITHUB_REQUIRES`, `SKILLCASK_DENY_PATTERNS` (overriding an
|
|
186
|
+
enforced key prints a warning);
|
|
140
187
|
2. keys `config.toml` lists in `enforce`: a project that sets them otherwise fails;
|
|
141
188
|
3. `[policy]` in `skills.toml`;
|
|
142
189
|
4. the other keys of `config.toml`, as defaults.
|
|
@@ -148,6 +195,18 @@ allow-sources = ["https://gitlab.example.com/", "github"]
|
|
|
148
195
|
enforce = ["allow-sources"]
|
|
149
196
|
```
|
|
150
197
|
|
|
198
|
+
An enforced `min-release-age` also applies to a repository's own `min-release-age`: a project
|
|
199
|
+
may only make it longer. Exceptions, by URL prefix, stay in `config.toml`:
|
|
200
|
+
|
|
201
|
+
```toml
|
|
202
|
+
[policy]
|
|
203
|
+
min-release-age = "3d"
|
|
204
|
+
enforce = ["min-release-age"]
|
|
205
|
+
|
|
206
|
+
[policy.repository-min-release-age]
|
|
207
|
+
"https://gitlab.example.com/" = "0" # internal skills, reviewed in merge requests
|
|
208
|
+
```
|
|
209
|
+
|
|
151
210
|
`config.toml` and the environment take URL prefixes, not repository names, since a name means
|
|
152
211
|
whatever a project calls it. `skillcask status` prints each key that is set and where it came
|
|
153
212
|
from.
|
|
@@ -199,8 +258,8 @@ skillcask -g install --frozen # e.g. from a dotfiles repository
|
|
|
199
258
|
|
|
200
259
|
- `skills.toml`, `skills.lock` and an optional `auth.json` live in `~/.config/skillcask`
|
|
201
260
|
(`$XDG_CONFIG_HOME/skillcask`; `SKILLCASK_HOME` overrides both). Keep them in your dotfiles.
|
|
202
|
-
- Skills go to `~/.agents/skills` (read by
|
|
203
|
-
|
|
261
|
+
- Skills go to `~/.agents/skills` (read by most agents), with links in `~/.claude/skills`
|
|
262
|
+
(`[agents] targets`, see Agents). Links are absolute, so a symlinked
|
|
204
263
|
`~/.claude` works. `[agents] local` does not apply.
|
|
205
264
|
- Personal skills you wrote by hand stay where they are and are not linked anywhere.
|
|
206
265
|
- The list of managed paths is `~/.agents/skills/.skillcask-installed`, local to the machine;
|
|
@@ -215,6 +274,7 @@ Every command except `publish` and `validate` takes `-g, --global`.
|
|
|
215
274
|
| `init` | Create `skills.toml`. |
|
|
216
275
|
| `add <vendor/name>[@constraint] [--repository r]` | Resolve, lock and install. |
|
|
217
276
|
| `add github:<owner/repo>[/skill][@version-or-ref]` | The same from a GitHub repository, see below. |
|
|
277
|
+
| `add git:<https-url>[@version-or-ref]` | The same from any git repository over HTTPS, see below. |
|
|
218
278
|
| `remove <vendor/name>…` | Drop from manifest and lock; delete files, links and gitignore lines. |
|
|
219
279
|
| `install [--frozen]` | Install the lock. `--frozen` (implied by `CI`) fails when the lock is out of date. |
|
|
220
280
|
| `update [vendor/name…] [--diff]` | Re-resolve within constraints. `--diff` prints what changes in each updated or added package; it does not ask before installing. |
|
|
@@ -229,6 +289,11 @@ Every command except `publish` and `validate` takes `-g, --global`.
|
|
|
229
289
|
| `validate [paths…]` | Check `SKILL.md` files against the Agent Skills spec, see below. |
|
|
230
290
|
| `<other>` | Runs `skillcask-<other>` from `PATH`, like git and cargo plugins. |
|
|
231
291
|
|
|
292
|
+
`status`, `outdated`, `info`, `search` and `doctor` take `--json`: one JSON document on one line of
|
|
293
|
+
stdout, with the same exit code; warnings and errors stay on stderr. Package text in it is
|
|
294
|
+
escaped as in the terminal (`<U+202E>`). For example `skillcask outdated --json | jq
|
|
295
|
+
'.packages[] | select(.within != .locked)'`.
|
|
296
|
+
|
|
232
297
|
Exit codes: 0 ok, 1 manifest/lock/status problems, 2 authentication, 3 network, 4 hash mismatch,
|
|
233
298
|
5 IO or archive error.
|
|
234
299
|
|
|
@@ -308,8 +373,29 @@ entry; `install` from the lock uses none, it downloads the pinned archive. Set `
|
|
|
308
373
|
for a higher limit and for private repositories. `SKILLCASK_GITHUB_API` points at GitHub
|
|
309
374
|
Enterprise (`https://ghe.example.com/api/v3`).
|
|
310
375
|
|
|
311
|
-
skills.sh itself is not queried: its API
|
|
312
|
-
what you picked.
|
|
376
|
+
skills.sh itself is not queried: its API is undocumented and may change without notice. Search
|
|
377
|
+
on the website, then add what you picked.
|
|
378
|
+
|
|
379
|
+
### Skills from any git repository
|
|
380
|
+
|
|
381
|
+
GitLab, Bitbucket, Azure DevOps, Gitea or a self-hosted server work without a Composer registry:
|
|
382
|
+
|
|
383
|
+
```sh
|
|
384
|
+
skillcask add git:https://gitlab.example.com/acme/skills.git
|
|
385
|
+
skillcask add git:https://gitlab.example.com/acme/skills.git@main
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
```toml
|
|
389
|
+
"acme/skills" = { git = "https://gitlab.example.com/acme/skills.git", version = "^1.0" }
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
Versions, `ref` and `skills = [...]` work as for GitHub; the entry is named after the last two
|
|
393
|
+
parts of the URL. skillcask speaks git's HTTPS protocol itself: no git binary runs, so no hook or
|
|
394
|
+
filter of the repository can. It fetches the one commit it needs and checks every file against
|
|
395
|
+
the commit's object ids. Credentials come from the same places as for registries (`auth.json`,
|
|
396
|
+
the credential helper, `$CI_JOB_TOKEN` in GitLab CI). Git servers keep no release or push times,
|
|
397
|
+
so `min-release-age` uses commit dates, which the committer sets; a branch whose newest commit is
|
|
398
|
+
too young falls back to an older commit when the server supports partial fetches (`filter`).
|
|
313
399
|
|
|
314
400
|
## Security
|
|
315
401
|
|
|
@@ -332,6 +418,22 @@ what you picked.
|
|
|
332
418
|
RIGHT-TO-LEFT OVERRIDE`, at most five per file. A leading byte order mark and a zero width
|
|
333
419
|
joiner inside an emoji are not reported; right-to-left and Indic text can trigger warnings.
|
|
334
420
|
Installing from the lock does not warn again.
|
|
421
|
+
- The same commands warn about lines that usually mean harm, as `warning: acme/x:
|
|
422
|
+
skills/foo/SKILL.md:12: downloads code into a shell`, at most five per file:
|
|
423
|
+
|
|
424
|
+
| Warning | Matches (case-insensitive) |
|
|
425
|
+
|---|---|
|
|
426
|
+
| downloads code into a shell | `curl`, `wget`, `irm`, `iwr`, `Invoke-WebRequest` or `Invoke-RestMethod` piped (`\|`) into `sh`, `bash`, `zsh`, `dash`, `iex`, `Invoke-Expression`, `python`, `perl`, `ruby` or `node`, also after `sudo` |
|
|
427
|
+
| decodes base64 and runs it | `base64 -d`, `base64 --decode`, `b64decode` or `FromBase64String` with a pipe into a shell, `eval`, `exec(` or `iex` |
|
|
428
|
+
| reads SSH keys | `~/.ssh`, `$HOME/.ssh`, `id_rsa`, `id_ed25519` |
|
|
429
|
+
| reads system account files | `/etc/passwd`, `/etc/shadow` |
|
|
430
|
+
| tells the agent to ignore its instructions | "ignore (all) previous/prior instructions", "disregard all previous/prior" |
|
|
431
|
+
|
|
432
|
+
Skills that teach shell setup trigger some of these legitimately, so they are warnings. With
|
|
433
|
+
`deny-patterns = true` under `[policy]` (or enforced in `config.toml`) they fail the command
|
|
434
|
+
with exit 1 and nothing is written.
|
|
435
|
+
- Plain git sources pin the commit; the lock's `dist-sha256` hashes the commit's file list
|
|
436
|
+
(path, mode, sha256 of the content), so it does not depend on how a server packs objects.
|
|
335
437
|
- `min-release-age` for GitHub sources uses times GitHub sets: release publication for tags,
|
|
336
438
|
push times from the Activity API for branches. A tag without a release, or a ref GitHub lists no
|
|
337
439
|
pushes for, falls back to commit dates, which the committer sets; reviewing what `add`/`update`
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"hasInstallScript": true,
|
|
20
20
|
"license": "MIT OR Apache-2.0",
|
|
21
21
|
"name": "skillcask",
|
|
22
|
-
"version": "0.
|
|
22
|
+
"version": "0.7.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.
|
|
51
|
+
"version": "0.7.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.
|
|
3
|
+
"https://github.com/puniserv/skillcask/releases/download/v0.7.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.
|
|
107
|
+
"version": "0.7.0",
|
|
108
108
|
"volta": {
|
|
109
109
|
"node": "18.14.1",
|
|
110
110
|
"npm": "9.5.0"
|