skillcask 0.10.4 → 0.10.6

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
@@ -19,7 +19,7 @@ Composer or Node.
19
19
  **macOS, Linux**
20
20
 
21
21
  ```sh
22
- brew install puniserv/tap/skillcask
22
+ brew install getresponse/tap/skillcask
23
23
  # or, without Homebrew:
24
24
  curl --proto '=https' --tlsv1.2 -LsSf https://github.com/GetResponse/skillcask/releases/latest/download/skillcask-installer.sh | sh
25
25
  ```
@@ -36,13 +36,23 @@ it in `~/.cargo/bin` (`%USERPROFILE%\.cargo\bin` on Windows).
36
36
  **Desktop app (macOS 14+ only for now)**
37
37
 
38
38
  ```sh
39
- brew install puniserv/tap/skillcask puniserv/tap/skillcask-app
39
+ brew install getresponse/tap/skillcask getresponse/tap/skillcask-app
40
40
  skillcask app # or open Skillcask from Applications
41
41
  ```
42
42
 
43
43
  Install with the full names: Homebrew loads a third-party tap's cask only when it is named in full
44
44
  (or listed by `brew trust`); after that, `brew upgrade` takes the short name.
45
45
 
46
+ The tap was `puniserv/tap` before 0.10.5. If you installed from it, move to the new name once
47
+ (your app settings stay):
48
+
49
+ ```sh
50
+ brew uninstall --cask puniserv/tap/skillcask-app # skip if you have no app
51
+ brew uninstall puniserv/tap/skillcask
52
+ brew untap puniserv/tap
53
+ brew install getresponse/tap/skillcask getresponse/tap/skillcask-app
54
+ ```
55
+
46
56
  Without Homebrew:
47
57
 
48
58
  ```sh
@@ -180,7 +190,8 @@ allow-ranges = true # false: every version must be exact
180
190
  packagist = true # false: drop the implicit Packagist repository
181
191
  github-requires = false # true: dependencies may come from GitHub or git URLs
182
192
  allow-sources = ["acme", "own", "packagist", "github"] # only these sources; default: all
183
- deny-patterns = false # true: risky patterns in new skill text fail instead of warning
193
+ deny-patterns = false # true: risky patterns and invisible characters in new skill text fail instead of warning
194
+ deny-packages = ["evil/*"] # refused by name from any source, also in a lock; default: none
184
195
  ```
185
196
 
186
197
  ### Agents
@@ -218,18 +229,28 @@ Constraints follow Composer semantics: `^0.3` means `>=0.3.0 <0.4.0`, `~1.2` mea
218
229
 
219
230
  ### Allowed sources and policy for every project
220
231
 
221
- `allow-sources` lists the only places skills may come from: repository names, `packagist`,
222
- `github`, or `https://` URL prefixes (`https://api.github.com/repos/acme/` allows one GitHub
223
- organisation). Other repositories get no request, and `install` refuses a lock entry from them,
224
- also with `--frozen`, so a committed lock cannot bring them back. Dependencies follow the same
225
- rule.
232
+ `allow-sources` lists the only places skills may come from: repository names, `packagist`, `github`,
233
+ or `https://` URL prefixes (`https://api.github.com/repos/acme/` allows one GitHub organisation).
234
+ End a prefix with `/` (`https://gitlab.example.com/`): an entry without one also names a registry
235
+ declared at exactly that URL, whose archives may then come from any host. Other repositories get no
236
+ request, and `install` refuses a lock entry from them, also with `--frozen`, so a committed lock
237
+ cannot bring them back. Dependencies follow the same rule.
238
+
239
+ `deny-packages` refuses packages by name, `vendor/name` or a whole `vendor/*`, whatever source
240
+ serves them (a GitHub `owner/repo` counts as `owner/repo`). A plain git entry is matched by its key
241
+ in `skills.toml`, which the project picks, so limit git URLs with `allow-sources`. It is checked
242
+ before any download and again on every lock entry, so it also stops a dependency or a committed
243
+ lock. Enforced in `config.toml`, the list is a floor: a project may add packages to it, not drop
244
+ any.
226
245
 
227
246
  Policy can also come from `config.toml` next to the global manifest (`~/.config/skillcask`) and
228
247
  from the environment. The first layer that sets a key wins:
229
248
 
230
249
  1. `SKILLCASK_ALLOW_SOURCES`, `SKILLCASK_MIN_RELEASE_AGE`, `SKILLCASK_ALLOW_RANGES`,
231
- `SKILLCASK_PACKAGIST`, `SKILLCASK_GITHUB_REQUIRES`, `SKILLCASK_DENY_PATTERNS` (overriding an
232
- enforced key prints a warning);
250
+ `SKILLCASK_PACKAGIST`, `SKILLCASK_GITHUB_REQUIRES`, `SKILLCASK_DENY_PATTERNS`,
251
+ `SKILLCASK_DENY_PACKAGES` (lists comma-separated; against an enforced key only a stricter value
252
+ is accepted: a longer cooldown, `deny-patterns` on, the others off, narrower sources, more
253
+ denied packages);
233
254
  2. keys `config.toml` lists in `enforce`: a project that sets them otherwise fails;
234
255
  3. `[policy]` in `skills.toml`;
235
256
  4. the other keys of `config.toml`, as defaults.
@@ -241,6 +262,10 @@ allow-sources = ["https://gitlab.example.com/", "github"]
241
262
  enforce = ["allow-sources"]
242
263
  ```
243
264
 
265
+ `"github"` in an enforced `allow-sources` is public GitHub (`https://api.github.com/repos/`):
266
+ `SKILLCASK_GITHUB_API` and `GITHUB_API_URL` do not move it. For GitHub Enterprise, enforce its
267
+ prefix, e.g. `"https://ghe.example.com/api/v3/repos/"`.
268
+
244
269
  An enforced `min-release-age` also applies to a repository's own `min-release-age`: a project
245
270
  may only make it longer. Exceptions, by URL prefix, stay in `config.toml`:
246
271
 
@@ -253,6 +278,19 @@ enforce = ["min-release-age"]
253
278
  "https://gitlab.example.com/" = "0" # internal skills, reviewed in merge requests
254
279
  ```
255
280
 
281
+ `enforce` stops a project and its dependencies from loosening the policy for what they resolve, and
282
+ a lock entry from a source outside an enforced `allow-sources`, or younger than an enforced or
283
+ environment `min-release-age`, from installing. The environment, which a project's CI configuration
284
+ also sets, may only make an enforced key stricter. A pinned version is not scanned again for `deny-
285
+ patterns`, and its release time is what the lock says. Under `allow-sources`, a GitHub or git entry
286
+ downloads only from its repository, and a registry the list admits only by a prefix only from inside
287
+ the list; the archive URL of Packagist or a registry the list names (or gives by its exact URL,
288
+ without a trailing `/`) is what the lock says, so review lock changes. `enforce` does not stop the
289
+ person running skillcask: `SKILLCASK_HOME`, `XDG_CONFIG_HOME` or `HOME` can point at a config
290
+ without it. For a rule nobody may skip, run `skillcask install --frozen` as a required check on pull
291
+ requests, with the policy in the job's environment and `.github/workflows/` protected (CODEOWNERS or
292
+ a required workflow), since a pull request runs its own copy of the workflow.
293
+
256
294
  `config.toml` and the environment take URL prefixes, not repository names, since a name means
257
295
  whatever a project calls it. `skillcask status` prints each key that is set and where it came
258
296
  from.
@@ -333,7 +371,7 @@ Every command except `publish`, `validate` and `projects` takes `-g, --global`.
333
371
  | `info <vendor/name[@constraint]\|github:owner/repo\|git:url\|skill>` | A package's skills, versions, description, license and requirements, or which package installs a skill. |
334
372
  | `status` | Exit 1 when manifest, lock or installed files disagree. Also lists the repositories in use (name, type, URL without credentials) and whether `allow-sources` admits each. |
335
373
  | `doctor [--fix]` | Broken or committed links, stale gitignore block, modified skills; lists each check it ran. |
336
- | `audit [--json\|--sarif]` | What each installed skill reaches (commands, hosts, paths, env vars, scripts) and its findings: modified files, risky lines, invisible characters. Exit 1 on any finding. |
374
+ | `audit [--json\|--sarif] [--advisories]` | What each installed skill reaches (commands, hosts, paths, env vars, scripts) and its findings: modified files, risky lines, invisible characters; with `--advisories` also published security advisories and abandoned packages. Exit 1 on any finding. |
337
375
  | `config [key [value…]] [--unset] [--json]` | Settings with where each comes from: `[policy]` and `[agents] targets` of `skills.toml`, or with `-g` of `config.toml` (also `policy.enforce` and `search.skills-sh`). `config policy.min-release-age 5d` sets a key, `--unset` removes it, each checked before the file is written; `config edit` opens the file in `$VISUAL`/`$EDITOR` and checks it afterwards. |
338
376
  | `search [query] [--skills-sh\|--no-skills-sh [--remember]]` | Packagist (`type=ai-agent-skill`) and skill packages of the other repositories, GitLab included; with skills.sh on, also the GitHub skills it lists, as `github:owner/repo/skill` with their install count. skills.sh is off until you turn it on, since it receives the query: the first search in a terminal asks once, `--remember` saves a flag's choice (no query needed), both in `config.toml`. |
339
377
  | `auth set\|remove <host>` | Keep a registry token in git's credential helper (Keychain, Credential Manager, libsecret). |
@@ -525,25 +563,41 @@ too young falls back to an older commit when the server supports partial fetches
525
563
  | tells the agent to ignore its instructions | "ignore (all) previous/prior instructions", "disregard all previous/prior" |
526
564
 
527
565
  Skills that teach shell setup trigger some of these legitimately, so they are warnings. With
528
- `deny-patterns = true` under `[policy]` (or enforced in `config.toml`) they fail the command
529
- with exit 1 and nothing is written.
566
+ `deny-patterns = true` under `[policy]` (or enforced in `config.toml`) they, and the invisible
567
+ characters above, fail the command with exit 1 and nothing is written.
530
568
  - `skillcask audit` reviews what is installed now, every skill in `.agents/skills` and the project
531
569
  skills: the commands its shell code blocks run, the hosts of its URLs, the paths in the home
532
570
  directory or under system roots, the environment variables it reads and the files an agent could
533
- run. That is read from the text, so it is a hint for review, not a sandbox. It also reports a
534
- locked skill that differs from the lock, and every risky line and invisible character above,
535
- with no limit per file, and exits 1 on any of them. `--sarif` prints a SARIF 2.1.0 log for code
536
- scanning, e.g. in GitHub Actions:
571
+ run. That is read from the text, so it is a hint for review, not a sandbox, and a skill without
572
+ findings is not known to be safe. It also reports a locked skill that differs from the lock, and
573
+ every risky line and invisible character above, with no limit per file, and exits 1 on any of
574
+ them.
575
+ - `skillcask audit --advisories` also asks the sources of the locked packages what is published
576
+ about them: security advisories from a Composer repository that offers them (Packagist does) and
577
+ from a GitHub repository's security advisories, matched against the locked version, and
578
+ packages marked abandoned. An entry locked at a commit has no version to match, so only
579
+ advisories published after that commit count. A source that cannot be read fails the run;
580
+ packages whose source publishes no advisories, and plain git entries, are listed as unchecked.
581
+ Plain `audit` stays offline. To warn users of
582
+ your skill, publish a GitHub security advisory on its repository (for a Composer package, with
583
+ the `composer` ecosystem and the package name, so Packagist lists it too).
584
+ - `--sarif` prints a SARIF 2.1.0 log for code scanning, e.g. in GitHub Actions. Scripts a skill
585
+ bundles with their own dependencies (`package.json`, `requirements.txt`) are not covered by
586
+ `--advisories`; [OSV-Scanner](https://github.com/google/osv-scanner) checks those:
537
587
 
538
588
  ```yaml
539
- - uses: GetResponse/skillcask@v0.8.0
589
+ - uses: GetResponse/skillcask@v0.10.5
540
590
  with:
541
591
  args: install --frozen
542
- - run: skillcask audit --sarif > skills.sarif
592
+ - run: skillcask audit --advisories --sarif > skills.sarif
593
+ env:
594
+ GITHUB_TOKEN: ${{ github.token }} # anonymous GitHub API calls are limited to 60 an hour
543
595
  - uses: github/codeql-action/upload-sarif@v3
544
596
  if: always()
545
597
  with:
546
598
  sarif_file: skills.sarif
599
+ # optional, needs osv-scanner on PATH (e.g. google/osv-scanner-action): dependencies of bundled scripts
600
+ - run: osv-scanner scan source -r .agents/skills
547
601
  ```
548
602
  - Plain git sources pin the commit; the lock's `dist-sha256` hashes the commit's file list
549
603
  (path, mode, sha256 of the content), so it does not depend on how a server packs objects.
@@ -619,7 +673,7 @@ on the formula; name both, since Homebrew loads from a third-party tap only what
619
673
  or what `brew trust` lists:
620
674
 
621
675
  ```sh
622
- brew install puniserv/tap/skillcask puniserv/tap/skillcask-app
676
+ brew install getresponse/tap/skillcask getresponse/tap/skillcask-app
623
677
  ```
624
678
 
625
679
  Every release also has `Skillcask-X.Y.Z-macos-universal.zip`, signed with a Developer ID and
@@ -19,7 +19,7 @@
19
19
  "hasInstallScript": true,
20
20
  "license": "MIT OR Apache-2.0",
21
21
  "name": "skillcask",
22
- "version": "0.10.4"
22
+ "version": "0.10.6"
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.10.4"
51
+ "version": "0.10.6"
52
52
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "artifactDownloadUrls": [
3
- "https://github.com/GetResponse/skillcask/releases/download/v0.10.4"
3
+ "https://github.com/GetResponse/skillcask/releases/download/v0.10.6"
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.10.4",
107
+ "version": "0.10.6",
108
108
  "volta": {
109
109
  "node": "18.14.1",
110
110
  "npm": "9.5.0"