skaile-cli 5.8.0 → 5.10.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.
Files changed (2) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,115 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.10.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#1052](https://github.com/skaile-ai/workspaces/pull/1052) [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda) Thanks [@mortegro](https://github.com/mortegro)! - The shared per-asset checks now cover every kind, the manifest and the publish selection.
8
+
9
+ - A `SKILL.md` with only `name:` fails `validate`, `library index` and `library publish --dry-run` with the same message. `index` no longer adds a new, versionless asset that fails the checks to the manifest (p07).
10
+ - A `TODO:` description is an error for every kind, not only for skills. Before, an agent, prompt, contract, flow or preset with it only warned (p103).
11
+ - `validate versions` reads preset and contract versions (p109).
12
+ - `library publish --asset <ref>` exits 1 with `No asset matches "<ref>"` when the ref selects nothing. A `#version` pin that the asset file does not hold exits 1 (p106).
13
+ - The publish plan names a directory that repeats a kind and name the manifest already holds, and exits 1, as `index` does (p107).
14
+ - `library index` and `validate` warn about a manifest `dependencies:` entry that no registered library holds. The check is offline. The exit code stays 0 (p119).
15
+ - `skaile add` of a library asset that the manifest does not list exits 1 and names `skaile library index <lib>`, where it deployed `SKILL.md` without its helper files. After `library index`, `add` deploys every file (p127).
16
+ - Library API: `syncManifestWithDisk` reports `FailedAsset.inManifest`. New `scanUnlistedAssets` and `UnlistedAsset`.
17
+
18
+ - [#1052](https://github.com/skaile-ai/workspaces/pull/1052) [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda) Thanks [@mortegro](https://github.com/mortegro)! - `skaile check` and `skaile doctor` fail wherever `install --locked` fails (5.8.0 critique, second recheck). `AssetManager.projectState()` carries the new cases, so no command has its own copy.
19
+
20
+ - A library asset whose files changed since the lock fails `check` and `doctor` with `content changed since lock`, like `outdated` and `install --locked` (p125). A lock written by 4.x holds a hash from before the shared asset hash; it reads the same way and the line names `skaile install` to re-lock it (p118). A newer version in the library stays `outdated` news.
21
+ - A locked asset whose library and deployed copy are both gone names only the library fix. `install` and `update` say `its lock entry is kept; no deployed copy exists` instead of claiming a kept deployed copy (p64).
22
+ - `skaile doctor` exits 1 for every problem that makes `check` exit 1, including files missing from a deployed asset (p117).
23
+ - An `agents.<id>.ref` that binds to no agent is a project-state problem: `check` and `doctor` exit 1 (p124). `skaile remove agent:<ref>` also removes the `agents.<id>` bindings that point at it and the rendered agent file, so `validate` passes afterwards. `LockGap.type` gains `content` and `agent`.
24
+
25
+ - [#1052](https://github.com/skaile-ai/workspaces/pull/1052) [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda) Thanks [@mortegro](https://github.com/mortegro)! - Small fixes for the CLI library flow:
26
+
27
+ - `skaile run "<prompt>"` no longer prints internal log records (`building workspace MCP server`, `spawning omp`, capability-registry events) as raw JSON on stdout. They go to the project's log database (`.skaile/logs.db`); warnings and errors still print on stderr (p47).
28
+ - `library init` no longer tells you to pass `--publisher`, an option it does not have. It names `skaile library set <name> publisher=<name>`. `library create` and `asset import`, which have the flag, still advise it (p104).
29
+ - The `library create prompt` and `library create contract` scaffolds say `Prompt goes here.` and `Contract goes here.` instead of the skill wording. `validate` flags the new text and the old skill text as an untouched scaffold. New exports: `PROMPT_BODY_PLACEHOLDER`, `CONTRACT_BODY_PLACEHOLDER` (`@skaile/workspaces/types/manifests`) (p105).
30
+ - A library name longer than 64 characters is refused with one line before any directory is created (`✗ Invalid library name (300 characters): at most 64 characters.`). Before, it ended in a raw `ENAMETOOLONG` error (p113).
31
+ - `skaile add` in a directory with no `skaile.yaml` exits 1 and names `skaile init`. It writes nothing. Before, it deployed the asset and wrote a lock file that `list` ignored (p123).
32
+ - `skaile add` prints one `! skipped symlink <path>` line for each symlink inside an asset directory that it does not deploy (p132). Symlinks are still not deployed. `AssetManager.add()` gains an `onSkippedSymlink` option and `DeployOptions` gains `onSkippedSymlink`.
33
+
34
+ - [#1052](https://github.com/skaile-ai/workspaces/pull/1052) [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda) Thanks [@mortegro](https://github.com/mortegro)! - A registered library without its directory has one state everywhere (5.8.0 critique, second recheck).
35
+
36
+ - `library list`, `library show`, `library status`, `check`, `outdated`, `install`, `add` and the git verbs describe it with one line: `library "<name>" is registered but its directory <path> is missing - run skaile library init <name> --path <dir> or skaile library remove <name>`. New exports from `@skaile/workspaces/library`: `libraryDirMissing`, `missingLibraryDirMessage`, `LibraryManager.requireLibraryDir` (p115).
37
+ - `library push`, `pull`, `sync`, `commit`, `git`, `link` and `publish` exit 1 with that line instead of a JS `TypeError` or `spawnSync git ENOENT` (p114).
38
+ - `library index <name>` and `library create --library <name>` refuse the missing directory and create nothing. `search --local` no longer lists the assets of that library (p116).
39
+ - A library removed with `library remove` (without `--purge`) keeps its directory but no longer resolves for `add`, `install --locked` or flow discovery. `library remove` records its name in `.unregistered-libraries` in the libraries dir. A directory nobody registered still resolves as a hand-made library (p121).
40
+ - Plain `skaile install` fails like `install --locked` when the lock pins a library that is not registered here, or whose directory is gone: the same `Missing: ... library "<name>" is not registered` lines, exit 1, no clone, no lock write, deployed files kept. It no longer re-resolves the asset from a `sources:` repository or from another library that holds the same asset. The lookup lives in one place, `AssetManager.unavailableLockedLibraries`, so a later lock-recorded URL fallback extends it there (p128).
41
+
42
+ - [#1052](https://github.com/skaile-ai/workspaces/pull/1052) [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda) Thanks [@mortegro](https://github.com/mortegro)! - A `library:` lock entry of a git-backed library now records the library's remote as an optional `url:` field (credentials of an `https://user:token@…` URL are left out; a local library without a remote writes none). The library name in the lock is local to a machine, so a teammate who cloned the same remote under another name could not `install --locked`. When the locked name is not registered (or its directory is gone), `install --locked`, `install` and `check` now use the registered library whose remote is the same repository (`.git` suffix, trailing `/` and `git@host:o/r` against `https://host/o/r` do not matter), exit 0, deploy the locked files and leave the lock unchanged. With neither the name nor the remote registered, the `Missing:` line names the library and the remote and says `skaile library init <name> --git <url>`. The lock schema version is not bumped, a lock without `url:` resolves by name as before, and an older CLI ignores the key. `LockLibraryOrigin` gains `url?: string` (p122).
43
+
44
+ - [#1052](https://github.com/skaile-ai/workspaces/pull/1052) [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda) Thanks [@mortegro](https://github.com/mortegro)! - Store and factory assets deploy their `requires`, and `add`, `info` and `search` agree on one version (second 5.8.0 recheck).
45
+
46
+ - `skaile add skill:@skaile-ai/skailify` deploys `skailify` and every asset it requires. `check` and `install --locked` exit 0 afterwards, and `install` deploys a requirement that is missing instead of printing `Nothing to install` (p131).
47
+ - `add`, `info` and `search` show the same version for one ref. When the factory, a project source or a library hold it at different versions, all three name the origin they chose (p126).
48
+ - The "did you mean" hint of `add` with a ref that has no publisher lists only refs that resolve (p129).
49
+ - `search --local` lists one row per publisher for the same name, so `skill:@mortegro/speak-like-a-pirate` no longer hides behind `skill:@acme/speak-like-a-pirate` (p130).
50
+ - Library API: `LocalIndex.pruneAssetDefs` returns the ids of the removed rows (`string[]`), not the count. Use `.length` for the count. `LocalCatalogSource.sync()` also returns `pruned` and takes an optional `only` set. When a library re-publishes a ref under another publisher, `library index` restores the index row that another library still holds.
51
+
52
+ - [#1052](https://github.com/skaile-ai/workspaces/pull/1052) [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda) Thanks [@mortegro](https://github.com/mortegro)! - `update` and sources respect local state and report git and cache errors cleanly (p108, p110, p111, p112, p120).
53
+
54
+ - `skaile update <name>` updates only the declared asset the name matches (`kind:@publisher/name`, `kind:name` or `name`). A name that matches none exits 1 with `No declared asset matches "<name>".`, before any network work. Before, the name was ignored and an unknown one exited 0 (p110).
55
+ - `skaile update` never resets a source clone that holds commits the remote lacks. `pullRepoResult` refuses with `Not possible to fast-forward, aborting.`, the message `skaile source sync` gives, and the clone stays as it is. Before, the force-sync dropped the local commits (p111).
56
+ - A `sources:` item in `skaile.yaml` without a `url:` fails with one line that names it (`sources[0] has no url: "skill:@x/y" (write it as "- url: <git url>")`) in every command that reads sources. `source list` no longer ends in a `TypeError`. The new `parseSourceEntries()` and `SourceEntryError` are exported from `@skaile/workspaces/core`; `normalizeConfig()` and `WorkspaceYamlEditor.getSources()` throw it instead of skipping the item (p112).
57
+ - `skaile library pull` and `sync` print `uncommitted changes in <lib>; commit or stash them first` and exit 1 when local edits block the pull, not git's multi-line error (p108).
58
+ - The catalog cache is keyed by `catalog.url`: listings and cached misses ("not found") are stored under a hash of the URL. After the URL changes, results come only from the new URL, a ref the old catalog lacked is asked of the new one at once, and an unreachable URL prints `store unavailable` instead of the old catalog's results. Found assets and tarballs stay shared, so an air-gapped run still resolves what an online run cached. `CatalogCacheOptions` has a new optional `scope` (p120).
59
+
60
+ - [#1047](https://github.com/skaile-ai/workspaces/pull/1047) [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3) Thanks [@mortegro](https://github.com/mortegro)! - Library authoring refuses the inputs it let through before (p13, p14, p74, p76, p85).
61
+
62
+ - One publisher slug decides everywhere: 1–39 lowercase letters, digits and single hyphens inside (the lowercase form of the ref parser's publisher grammar). `library create --publisher`, `library set <lib> publisher=`, `asset import --publisher`, `validate`, `library index` and the `library publish` plan now all refuse `a.b`, `Bad!`, `-x`, `x-`, `a--b`, `a_b` and a 40-character name with the same `Invalid publisher "…"` line, so a ref that `create` or `import` prints can always be added (p13). A store login is lowercased before it is used as the publisher.
63
+ - `library create --dir <d>` checks the real path of `<d>`: a symlink that leaves the library is refused and the message names the path it resolves to (p14). A file at `<d>` exits 1 with `… is not a directory`, no stack trace (p74).
64
+ - `library init <name> --path <dir>` refuses a directory inside a registered library, a directory that contains one, and the libraries folder (p85).
65
+ - Adopting a directory whose `skaile.manifest.yaml` lists only some of its assets prints `! <n> asset(s) on disk are not in the manifest; run library index` (p76).
66
+
67
+ - [#1047](https://github.com/skaile-ai/workspaces/pull/1047) [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3) Thanks [@mortegro](https://github.com/mortegro)! - One requirement identity from the 5.8.0 critique. A requirement is `publisher/kind:name` wherever it is declared: a bare `report-table` in a SKILL.md `requires` and `skill:@acme/report-table` in the manifest `dependencies` are one requirement, so `info`, `check`, `doctor` and `install --locked` list it once, publisher-qualified (p90, p99). A `dependencies:` entry whose publisher is not a valid slug (`skill:@Bad/x`) now fails `skaile validate` and `skaile library index` (p95). `skaile remove` with the library gone reads the deployed asset's `requires` and prunes the dependencies only it required (p95). An asset added from a project `sources:` clone deploys its `requires` like a library asset, so `check` and `install --locked` exit 0 afterwards and `install` no longer says "Nothing to install" while `check` calls a requirement fixable (p83).
68
+
69
+ - [#1047](https://github.com/skaile-ai/workspaces/pull/1047) [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3) Thanks [@mortegro](https://github.com/mortegro)! - `remove` guards dependencies, the lock stays quiet, `update` says "replaced", build leftovers leave the deploy and the hash (p88, p93, p92, p98).
70
+
71
+ - `skaile remove <ref>` of an asset another installed asset requires prints `! <ref> is required by <ref2>`, keeps files, declaration and lock entry, and exits 1. `--force` removes it anyway (p88).
72
+ - `skaile install` and `skaile update` rewrite `skaile.lock.yaml` only when its content changes, so a no-op run keeps the file byte-identical (`locked_at` included) and prints no `Lock file written` line (p93).
73
+ - When an asset moves to another locked version, `install` and `update` print `<ref> replaced 0.1.1 → 0.1.2` instead of the `! Removed: …#0.1.1` warning (p92).
74
+ - `__pycache__/`, `*.pyc`, `.DS_Store`, `node_modules/` and symlinks in an asset folder are neither deployed nor hashed. A `.pyc` that a helper script writes into a library no longer makes the lock report `content changed since lock` (p98).
75
+
76
+ - [#1047](https://github.com/skaile-ai/workspaces/pull/1047) [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3) Thanks [@mortegro](https://github.com/mortegro)! - Hints and `diff` of a project whose assets live in more than one library (5.8.0 critique). A "did you mean" hint after a publisher change names the asset of the library the lock recorded for the old ref, never a same-named asset of another library, and the `skaile library set <lib> publisher=<old>` advice names that library (p78). With the same ref in two libraries, `skaile diff` compares the deployed copy with the library the lock records, at the locked version, instead of the highest version of another library (p87). The "`<ref>` exists in N libraries" warning is printed by `skaile add` (and `npx skills add`) only; `diff`, `check`, `outdated`, `install` and `update` no longer repeat a choice the lock or a pin already made (p87).
77
+
78
+ One project state for `check`, `doctor`, `outdated`, `diff` and `install --locked` (5.8.0 critique). `AssetManager.projectState()` (replaces `lockGaps()`) computes every way the project differs from what it declares and locks, and all five commands take their verdict and exit code from it. A hand-declared preset that nothing holds, or one with an item that does not resolve, now fails `doctor`, `outdated` and `install --locked` as it fails `check`, also in a project that already has a lock (p46); the lock gains an optional `presets:` list that records every preset `install` and `add` expanded, so this holds offline. After `library rename` or removal, `check` and `doctor` fail like `install --locked` and `outdated` (p89); `outdated` and `diff <ref>` exit 1 on a project-state problem. `install --locked` ends with `Failed`, never `Done`, when a locked asset is missing (p100). A declared ref that no library or source holds is no longer advised `skaile install`; the line names `skaile library init` / `skaile remove <ref>` (p91).
79
+
80
+ - [#1047](https://github.com/skaile-ai/workspaces/pull/1047) [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3) Thanks [@mortegro](https://github.com/mortegro)! - `skaile validate`, `skaile library index` and `skaile library publish --dry-run` now run one shared per-asset check list: a flow file the flow engine cannot parse (p72) and a skill whose description is still the scaffold `TODO:` placeholder (p73) fail all three with the same message, and `index` now reports it (exit 1, closing line `✗ <n> asset(s) fail the checks of skaile validate`) while keeping the asset in the manifest and the search index. The factory skill `authoring-skaile-manifests` now says the asset file's version wins over `assets[].version` (p45). `skaile migrate assets --write` keeps a bundle's `version` in the preset it writes, and prints `version <old> → 1.0.0` when it has to reset an unusable one (p94).
81
+
82
+ ### Patch Changes
83
+
84
+ - [#1052](https://github.com/skaile-ai/workspaces/pull/1052) [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda) Thanks [@mortegro](https://github.com/mortegro)! - `skaile library init <name> --path <dir>` on a directory with no manifest (or one that lists no assets) now writes one manifest entry per asset it indexes. It runs the same sync and index as `library index`, so `Indexed N asset(s)` matches the manifest, a second `library index` changes nothing, and an asset that fails the checks is reported with the same lines and exit code as `index`. A manifest that already lists assets keeps its entries, and the `! <n> asset(s) on disk are not in the manifest` line still fires for the rest (p133).
85
+
86
+ - [#1053](https://github.com/skaile-ai/workspaces/pull/1053) [`1d24047`](https://github.com/skaile-ai/workspaces/commit/1d240475becac3df0eec5c93cb7a51dd7840f55e) Thanks [@mortegro](https://github.com/mortegro)! - `skaile manage` now ticks the right library row when the lock's library is registered here under another name. It finds the library the way `check` and `install --locked` do: by the locked name, else by the git remote the lock records. Before, only a row with the locked name was ticked, so an installed asset showed as not installed (p134). A lock entry whose library is not registered here ticks no library row. A copy placed by `skaile asset install` still ticks only the row of its library, by the name the lock records, even when that library is no longer registered. `AssetManager` has a new method, `lockedLibraryNames()`, that returns this lookup for every library entry of the project lock.
87
+
88
+ - [#1047](https://github.com/skaile-ai/workspaces/pull/1047) [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3) Thanks [@mortegro](https://github.com/mortegro)! - Library agents behave like skills through the consume chain. A deployed agent is left alone on a repeat `skaile install`, `install --locked` and `update` (no `Updated` line, file untouched) (p84). `skaile diff agent:…` finds the deployed `<name>.md` / `<name>.toml` and compares it with the rendered source (p96). `skaile install` exits 1 for an `agents:` instance whose agent was never added and says `run skaile add agent:… first` (p97). The `add`/`install` line of an `AGENT.md` agent prints `#<version>` from the lock (p101). The `library create agent` `SOUL.md` scaffold says `Agent prompt goes here.`; `validate` still flags it, and the older skill wording (p102).
89
+
90
+ - [#1047](https://github.com/skaile-ai/workspaces/pull/1047) [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3) Thanks [@mortegro](https://github.com/mortegro)! - CLI polish from the 5.8.0 critique: `skaile why <ref>` now exits 1 when the ref is not a dependency of the project (p77); `skaile run` no longer prints Node's `ExperimentalWarning: SQLite is an experimental feature` on stderr, other warnings are kept (p75); `skaile manage` ticks an asset as installed only when kind, name and publisher all match, so an unrelated same-named asset of another publisher or library is no longer shown as installed (p86).
91
+
92
+ - [#1047](https://github.com/skaile-ai/workspaces/pull/1047) [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3) Thanks [@mortegro](https://github.com/mortegro)! - Library git verbs and sources report what git did (p79–p82).
93
+
94
+ - `skaile library push` counts the commits the remote it pushes to lacks. After `skaile library set <name> backendConfig.url=<url>` the first push no longer reports every commit as pushed (p79).
95
+ - `library pull`, `sync` and `push` print one line, `rebase in progress; finish it with git rebase --continue`, and exit 1 while a rebase is unfinished. Before, `pull` and `sync` printed git's raw text and `push` advised the rebase that was already running (p80).
96
+ - `skaile source list`, `show` and `remove` tell two sources with the same repo name apart. `list` shows the second under its clone-cache key; `show` and `remove` of a shared name exit 1 and list both URLs, and a URL or the listed key picks one. `remove` no longer drops the first match silently (p81).
97
+ - A failed source pull prints git's whole error on one line, for example `fatal: '<path>' does not appear to be a git repository Could not read from remote repository. …`, not only its last line (p82).
98
+
99
+ - Updated dependencies [[`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda), [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda), [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda), [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda), [`1d24047`](https://github.com/skaile-ai/workspaces/commit/1d240475becac3df0eec5c93cb7a51dd7840f55e), [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda), [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda), [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda), [`b591c9c`](https://github.com/skaile-ai/workspaces/commit/b591c9c8531f61de64eb864adfe376de01e6ddda), [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3), [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3), [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3), [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3), [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3), [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3), [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3), [`62ccbae`](https://github.com/skaile-ai/workspaces/commit/62ccbae130408b1db4361762bac87a5eaa58a5a3)]:
100
+ - @skaile/workspaces@5.10.0
101
+
102
+ ## 5.9.0
103
+
104
+ ### Minor Changes
105
+
106
+ - [#1048](https://github.com/skaile-ai/workspaces/pull/1048) [`dde2065`](https://github.com/skaile-ai/workspaces/commit/dde20655e419552b9a2dc46bfaf26b758e0cc188) Thanks [@peteralbert](https://github.com/peteralbert)! - Typed platform blocks and a per-turn tool allowlist on the `prompt` command (protocol 4.18.0, runtime feature `platformBlocks.v1`). A host can attach `platformBlocks` (`{ kind, id, text, attrs? }`, kinds `platform_notice`, `skaile_research`, `platform_research_complete`) and a `toolAllowlist` to a prompt. The runner renders the blocks in reserved tags (`<PLATFORM_NOTICE>`, `<SKAILE_RESEARCH>`, `<PLATFORM_RESEARCH_COMPLETE>`) at the very start of the turn, each block id once per runner process, and escapes those tag names everywhere else it hands text to the agent (prompt text, a reply, a flow turn), so a message that imitates a platform block reaches the model visibly escaped. A new system-prompt section (`platform-blocks`) tells the agent that only those tags at the start of a turn come from Skaile. With a `toolAllowlist`, the Claude SDK driver lets that turn, and every subagent it starts, call only the listed tools, enforced in a `PreToolUse` hook because the query runs under `bypassPermissions`. A driver that cannot enforce an allowlist (every other built-in), an unknown tool name, or a flow-routed prompt refuses the prompt with a non-fatal `error` (`category: "validation"`) instead of running it unrestricted. `AgentClient.prompt` takes `{ platformBlocks, toolAllowlist }`, and a `SessionDispatcher` `transformPrompt` may return `{ prompt, platformBlocks, toolAllowlist }`. The runner now lists `platformBlocks.v1` in `protocol_info.runtimeFeatures` on every host.
107
+
108
+ ### Patch Changes
109
+
110
+ - Updated dependencies [[`dde2065`](https://github.com/skaile-ai/workspaces/commit/dde20655e419552b9a2dc46bfaf26b758e0cc188)]:
111
+ - @skaile/workspaces@5.9.0
112
+
3
113
  ## 5.8.0
4
114
 
5
115
  ### Minor Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skaile-cli",
3
- "version": "5.8.0",
3
+ "version": "5.10.0",
4
4
  "description": "Run the Skaile CLI via `npx skaile-cli` — thin wrapper around @skaile/workspaces",
5
5
  "type": "module",
6
6
  "bin": {
@@ -25,7 +25,7 @@
25
25
  "asset-manager"
26
26
  ],
27
27
  "dependencies": {
28
- "@skaile/workspaces": "5.8.0"
28
+ "@skaile/workspaces": "5.10.0"
29
29
  },
30
30
  "publishConfig": {
31
31
  "access": "public"