skaile-cli 5.10.0 → 5.12.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 (3) hide show
  1. package/CHANGELOG.md +148 -0
  2. package/README.md +13 -0
  3. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,153 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.12.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#1058](https://github.com/skaile-ai/workspaces/pull/1058) [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9) Thanks [@mortegro](https://github.com/mortegro)! - Rendered agents: one render on `add` and `install`, and layouts each harness loads.
8
+
9
+ - `skaile add agent:…` renders the agent after its composed skills and delegate sub-agents are in place, so the file already holds the `## Installed Abilities` block and a later `install`, `install --locked` or `update` leaves it alone (no `Updated` line, mtime unchanged). Before, the first `install` or `update` rewrote it (p84, p300).
10
+ - A locked agent that a fresh clone has not restored yet is told `run skaile install --locked`; `skaile add <ref>` is named only for a ref the lock does not have (p303).
11
+ - omp: the agent is also written as the flat `.omp/agents/<name>.md` omp lists next to `<name>/agent.yaml`; local `composes` dirs are copied next to the omp `agent.yaml` (`../x` becomes `./composes/x`) (p356, p418).
12
+ - The Claude Code model aliases (`inherit`, `opus`, `sonnet`, `haiku`) are no longer written into Codex and omp files (p419).
13
+ - A delegate sub-agent or `role` is told it is a sub-agent and lists only the connectors its slots are bound to (p420).
14
+ - Docs say which harness release loads the rendered files: omp 18.12.5 does, Codex 0.159.3 does not list `.codex/agents/*.toml` as spawnable agents (p428).
15
+ - `skaile init` gitignores `__pycache__/`, `*.pyc`, `.omp/system.md`, `.omp/sessions/` and `.codex/skaile-session-instructions.md`; the environment section says "isolated container" only inside a container (p326, p354).
16
+ - `skaile add --global` deploys to the harness of the project you run it in as well as every harness dir that exists under `~`, and prints the path per harness (p353).
17
+
18
+ - [#1058](https://github.com/skaile-ai/workspaces/pull/1058) [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9) Thanks [@mortegro](https://github.com/mortegro)! - Library authoring guards agree across `validate`, `library index`, `asset import`, `migrate assets` and `library publish`.
19
+
20
+ - `library publish`, `register` and `yank` exit 1 for `--asset ""` instead of selecting every asset (p106).
21
+ - `library index` exits 1 and prints no green line when it skips an asset with a non-semver version, as `validate` does (p222). A yaml-number version (`version: 1.0`) is shown as written with the quoted fix (`"1.0.0"`) by `validate`, `index` and `publish` (p229).
22
+ - A flow with no `nodes:` fails `validate`, `index` and the publish plan like `nodes: []` (p230). `publish` and `register` refuse a skill, agent, prompt or contract whose body is still the untouched scaffold; `validate` still only warns (p231).
23
+ - `validate` fails for a `skaile.manifest.yaml` that does not parse and names the file (p308). Every invalid `dependencies:` form prints the same line in `index` and `validate` and exits 1 (p310). A `dependencies:` entry with an invalid publisher is refused the same way.
24
+ - `asset import` runs the shared asset checks before it copies, exits 1 with `Not imported` when they fail, and no longer prints a success line or `add` hint for such a skill (p223). `asset import` and `asset migrate --mode copy` leave `.DS_Store`, `node_modules/`, `__pycache__/` and `*.pyc` out (p224). `asset migrate` names the commands that make the asset addable (p225).
25
+ - `migrate assets` writes no `publisher:` into a preset and prints `version <old> → <new>` when the version changes (p226); a root-level bundle moves into `<name>/<name>.preset.yaml`, which `index` and `validate` accept (p307).
26
+ - `validate versions --changed-only` notices an edited or new helper file of an asset (p322). `--changed-only` and `validate changelog` outside a git repository print one line naming the problem and no git usage text (p501).
27
+ - `validate` checks agent manifests for what the schema cannot see: a cron no scheduler reads, a capability naming an undeclared connector slot, a local compose path that does not exist, an agent composing itself, a missing or oversized memory source (p415).
28
+ - `skaile` prints no raw JSON log record on stdout (p47) and prints one line, exit 1, when the index database stays locked by another `skaile` process for 5 seconds (p228).
29
+ - `library index` writes `version: 0.1.0` into the manifest entry of an `AGENT.md` or `agent.yaml` agent that declares none, so the version and the lock key are the same in every library (p323).
30
+
31
+ - [#1058](https://github.com/skaile-ai/workspaces/pull/1058) [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9) Thanks [@mortegro](https://github.com/mortegro)! - `skaile run` uses the composed agent it locked.
32
+
33
+ - A hand edit of a pinned convention file (`SOUL.md`, `RULES.md`, `DUTIES.md`, `knowledge/`) after `skaile rebuild` is now a `composition_conflict` (`hash_mismatch`): `skaile run` stops at session start and `skaile check` prints one line per edited file and exits 1. Before, only the `Revision` changed and `check` exited 0.
34
+ - `skaile add agent:@pub/name` from a project `sources:` clone deploys what the agent `composes:` (skills, connectors, sub-agents) as requirements, so `check` and `install --locked` exit 0 and `remove` prunes them. Before, `check` called them fixable while `install` printed `Nothing to install`.
35
+ - `DUTIES.md` is part of the live system prompt of `skaile run` (the duties section); omp does not read it from the agent directory.
36
+ - A role instance's `model.preferred` is the model of its nested `agent.run` session. Before, the child started on the parent's model or the driver default.
37
+ - `skaile run --skill <name> --dry-run` prints the skill (source, version, requires) and each `prerequisites.files` entry as present or missing; an unknown skill exits 1.
38
+
39
+ - [#1058](https://github.com/skaile-ai/workspaces/pull/1058) [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9) Thanks [@mortegro](https://github.com/mortegro)! - Drivers (5.11.0 critique, RCV drivers):
40
+
41
+ - `skaile.yaml` alone owns `driver`. `config set model` writes only `model`; a personal `driver` no longer overrides the project harness (a warning says so), and `config show` names the file that set each key (p340).
42
+ - `skaile run` with omp 18.x prints the answer when the reply arrives in `message_start` (p341), and a successful one-shot turn no longer logs `prompt failed - omp process killed` (p342, p427).
43
+ - `skaile repl` reads piped stdin line by line and exits at EOF; with no `skaile.yaml` a non-terminal repl refuses and names `skaile init` (p343).
44
+ - `integration install --driver omp` writes a default-export extension omp 18 loads, calling `skaile integration omp-exec` (p345); `--driver claude-code` writes project-root `.mcp.json` (p346) and its hooks call `skaile integration hook` (p346b).
45
+ - codex: the session home is always created (p347); no credential fails at once with `codex driver needs OPENAI_API_KEY` (p348); the `openai` entry is rendered as `skaile-openai` (p363).
46
+ - `run --help` and `repl --help` build the driver list from the registry (p350); omp start failures name omp's last error line as text (p359); the missing-SDK hint prints the project's package manager (p361); a provider entry whose credential variable is unset is named and not handed to omp (p362).
47
+
48
+ - [#1058](https://github.com/skaile-ai/workspaces/pull/1058) [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9) Thanks [@mortegro](https://github.com/mortegro)! - Serve, protocol and plugins behave as documented.
49
+
50
+ - `plugin install` resolves the plugin entry from `exports`/`main` (loads under node), loads the plugin once and fails, restoring `skaile.yaml`, when it does not load (p450, p451).
51
+ - `skaile serve` gains `--host`, prints bind address and auth state, warns loudly when it runs without a token, checks the driver SDK before it reports ready, and prints one line on a busy port (p458, p466, p468).
52
+ - A major protocol mismatch emits `incompatible_protocol` and shuts the runner down (p454); `resource_request` accepts `resourceId` as an alias for `connectorId` (p455); an unknown command is answered with an `error` event (p457).
53
+ - `validate` fails on a connector with no `driver` (including the old `adapter` spelling) (p456).
54
+ - The WebSocket client reports the HTTP status of a refused handshake and an `error` event when another client takes the connection over (close code 4001, no reconnect) (p465, p467).
55
+ - The reconnect replay now sends `protocol_info` before the buffered events and the status (p469).
56
+ - `@skaile/workspaces/runner` types no longer pull drizzle into consumers' type-check (p461); `createAgentSession` no longer writes runner log lines to stdout (p473).
57
+
58
+ - [#1058](https://github.com/skaile-ai/workspaces/pull/1058) [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9) Thanks [@mortegro](https://github.com/mortegro)! - `skaile install --locked` restores every origin in full, and `check` notices what is missing.
59
+
60
+ - A source- or store-origin asset is restored by fetching its locked commit again and deploying every file its lock entry lists, not only its `.md` files (p320, p381). `check`, `doctor`, `outdated` and `diff` compare the deployed folder with that list too: a deleted `build.py` next to an intact `SKILL.md` is drift (exit 1, `<ref> is deployed without <files>`), and `install` / `install --locked` restore it (p382).
61
+ - A store-added asset (`skaile add skill:@admin/review`) is a first-class lock entry: `check`, `doctor` and `outdated` no longer fail with `locked but no source or library provides it any more`, `install --locked` restores it from the pinned commit (or from the bytes in `.skaile/cache/store/` when every file still hashes to the lock), and `install` heals what `check` fails on instead of printing `Nothing to install` (p380, p403).
62
+ - `outdated` counts only the commits that touch an asset's own folder, so a commit to `pirate-report` no longer marks `speak-like-a-pirate` as `1 commit(s) behind` (p397).
63
+ - `skaile.lock.yaml` is always written with `schema_version: 4`, whatever origins it holds. A lock written as `3` still loads and is rewritten as `4` by the next `add`, `install` or `update` (p398).
64
+ - `add`, `install` and `update` refuse to lock a source commit that is in no remote branch of its clone (`<url> clone has unpublished commit <sha>`), and `install --locked` exits 1 with `could not check out pin <sha>` when the pinned commit cannot be fetched, instead of deploying another commit's files and printing `Done` (p260).
65
+ - A re-lock (`install`, `update`) removes the `.env`, `.venv/` and `.pytest_cache/` files an earlier release copied into an asset folder and prints `Removed <file> (not part of <ref>)` for each (p309).
66
+
67
+ - [#1058](https://github.com/skaile-ai/workspaces/pull/1058) [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9) Thanks [@mortegro](https://github.com/mortegro)! - State commands give one verdict and name the fix.
68
+
69
+ - `skaile update` keeps a locked asset on its library when another library holds the same ref at the same version, also after `library rename`; a higher version elsewhere still wins.
70
+ - `skaile diff <ref>` fails with exit 1 when a requirement of the ref lost its library, when the ref is of a publisher the lock does not hold (`is not deployed — run skaile add <ref>`), and for a ref without a publisher that names no locked asset (`publisher required`); a ref without a publisher that names exactly one locked asset still diffs it.
71
+ - `skaile install` refuses a declared asset whose requirement nothing holds before it deploys or locks anything (`nothing was installed`, exit 1).
72
+ - `skaile info`, `why` and `tree` print one `parse error` line and exit 1 for a `skaile.yaml` that does not parse; `why` and `tree` outside a project print `No skaile.yaml found` and exit 1.
73
+ - `skaile update --catalog-only` exits 1 when the catalog cannot be refreshed and no longer says the re-deploy continues.
74
+ - `check` and `install --locked` say `(run skaile install)` for a requirement that `install` can deploy, not `(fixable)`.
75
+ - `skaile library push` of a library that is only behind says `behind origin by <n> commit(s); run skaile library pull <name>`. `library link` records the checked-out branch of an existing repo; a push without the configured branch names `library set <name> backendConfig.branch=<branch>`.
76
+ - `skaile run <word>` with no flow of that id exits 1 `Flow not found: <id>` and lists the near ids; only text with a space is a prompt.
77
+
78
+ - [#1058](https://github.com/skaile-ai/workspaces/pull/1058) [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9) Thanks [@mortegro](https://github.com/mortegro)! - Store and catalog commands list only what `add` can install, and offline answers are honest.
79
+
80
+ - `store search`/`show`/`search` list only refs `skaile add` installs: no agent, contract or mcp-server entries, no non-canonical names, no `test-`/`demo-` entries (`--all` shows the test/demo ones). A plain store search prints at most 20 rows and says how many more match. `store show` prints `Requires:`.
81
+ - `store search`, `search --store` and `add` say `store unreachable` or `Store search failed` with the catalog URL and the cause, point at `skaile catalog test`, and exit 1 when the store was asked for. `add` honours `cache_ttl: 0`.
82
+ - Offline, the cached list answers `store search --kind` and `store show` (file list marked unavailable).
83
+ - A GitHub rate limit names `SKAILE_GITHUB_PAT` and the reset time; anonymous store adds read the raw-content host and spend no API calls.
84
+ - A source with a repo-level `publisher:` and no `assets:` can be added; one bad `sources:` entry is named and skipped instead of failing every `add`.
85
+ - `source manifest init`/`edit`/`rebuild` commit the manifest in the store repo; `store search` lists local curated manifests; the init hint prints the repo URL.
86
+ - `source add <bare-name>` is rejected (no made-up `skaile-ai/<name>` clone); a failed clone leaves no empty folders.
87
+ - `sha256 not pinned` is no longer printed on `source sync`, `add` and `update`.
88
+ - `config set|get catalog.url|catalog.cache_ttl|catalog.framing` writes and reads `config.yaml`.
89
+
90
+ ### Patch Changes
91
+
92
+ - [#1058](https://github.com/skaile-ai/workspaces/pull/1058) [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9) Thanks [@mortegro](https://github.com/mortegro)! - `skaile` no longer prints internal log records on stdout. Until a command sets up its own log store, the CLI keeps only warnings and errors and writes them to stderr (`SKAILE_LOG_LEVEL` still overrides the level). Before, `library index`, `search --local` and `add` printed the raw JSON record `asset scan truncated (cycle)` on stdout when a library held a symlink to an ancestor. `skaile run <flow> --dry-run` prints its plan as plain `[dry-run] …` lines instead of `[info] [flow-connector:run:…]` log lines.
93
+
94
+ The index database (`index.db`) and the log database (`logs.db`) now wait up to 5 seconds for another `skaile` process that holds the write lock. When the wait runs out, `skaile` prints `The skaile index is busy (another skaile process holds it); retry in a moment.` and exits 1 instead of printing a `SQLITE_BUSY` stack trace.
95
+
96
+ - [#1058](https://github.com/skaile-ai/workspaces/pull/1058) [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9) Thanks [@mortegro](https://github.com/mortegro)! - Docs match 5.11.0. The three tutorials run end to end as written: tutorial 01 creates a skill with `--description` and says what the `TODO:` placeholder blocks, tutorial 02 shows the real `config show` output and the `driver`, `model` and `apiKey.<provider>` keys, and tutorial 03 builds a strict-v2 flow and runs it. The command pages (`index`, `run`, `repl`, `session`, `connector`, `asset`, `diff`, `library`, `misc`, `project`, `validate`, `source`, `store`, `catalog`, `plugin`, `serve`) list the options, exit codes and messages the CLI has now. The new `integration` page covers `skaile integration install | uninstall | enable | disable | status | hook`; `skaile plugin` documents `install | remove | list` and the rollback of a failed install. `protocol-v2.md` describes the `session_init` handshake the runner speaks (`protocol_info`, `session_init_ack`). Links in the docs use the routes the docs loader generates. The factory skills `authoring-skaile-assets`, `authoring-skaile-manifests` and `skaile-author-asset` list the `requires:` forms 5.11.0 deploys, say that the asset file's version wins over a manifest entry, and name the `manifest-compliance` skill.
97
+
98
+ - Updated dependencies [[`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9), [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9), [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9), [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9), [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9), [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9), [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9), [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9), [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9), [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9), [`5b83a1b`](https://github.com/skaile-ai/workspaces/commit/5b83a1b31f6538877505565f86f4da82f70772b9)]:
99
+ - @skaile/workspaces@5.12.0
100
+
101
+ ## 5.11.0
102
+
103
+ ### Minor Changes
104
+
105
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - `validate`, `library index` and `library publish --dry-run` now give one verdict for every asset kind.
106
+
107
+ - `library create flow` and `library create preset` write the `TODO: describe this <kind>.` description when `--description` is missing, as the other kinds do. An unedited flow or preset (the `TODO:` description, `nodes: []`, the example preset item) fails all three commands with exit 1. It was a warning before.
108
+ - A manifest `dependencies:` entry with an invalid publisher fails `publish --dry-run` with the same message as `validate` and `index`.
109
+ - A missing `version` reads as `0.1.0` for all six kinds, and an empty `metadata:` as no metadata. A version that is present but not a string says `set version: 0.1.0` (`set metadata.version: 0.1.0` for skill, prompt and contract) instead of raw schema text.
110
+ - An asset name over 64 characters fails `library create`, `validate`, `index` and `publish --dry-run` with the asset-name rule. `library create skill <300-char name>` no longer ends in `ENAMETOOLONG` with a stack trace. `isValidAssetName` applies the 64-character limit.
111
+ - `library publish --ref` and `library register --ref` exit 1 before the plan when the ref is not a valid git ref name, or is not a branch, tag or commit of the library repo.
112
+ - `references/dependency-standard.md` of the `authoring-skaile-manifests` skill says the asset file's own version wins.
113
+
114
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - A locked asset is now identified by kind, publisher, name and the library its lock entry names.
115
+
116
+ - `skaile remove skill:@acme/x` no longer deletes the deployed copy of `skill:@mortegro/x` when only the mortegro one was added. It prints `Not deployed or declared` and exits 1. The deployed copy, the lock and `skaile.yaml` stay as they are.
117
+ - `skaile install` keeps a locked library asset on the library its lock entry names, also after `library default <other>` or when another library holds the same ref. `skaile update` and `skaile add` still pick the library by the default rules, and a pin moves an asset to the library that holds it. A move prints `! <ref> moved from <a> to <b>`. `AssetManager.install` takes `moveLibraries` (set by `update`), `InstallResult` has `moved`, and `AssetManager.add` takes `onLibraryMoved`.
118
+ - A `#0.1.0` pin resolves for an `AGENT.md` agent that has no version in its frontmatter, in `skaile add agent:@acme/x#0.1.0` and in a `skaile.yaml` dependency. The pin matches the version in the library manifest, as the lock key does.
119
+
120
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - The lock changes only when an entry changes, and a hand-edited deployed copy is no longer invisible.
121
+
122
+ - `skaile.lock.yaml` is written in one canonical order (`schema_version` and `locked_at` first, then every key sorted). `add`, `install` and `update` write nothing when only the order or `locked_at` differs, so the first `install` after `add`, and a `library rename` matched by URL, leave a committed lock byte-identical and print no `Lock file written`.
123
+ - `skaile check`, `doctor` and `outdated` exit 1 when a deployed file was edited by hand or an asset folder holds a file the asset does not ship, including a file a harness or agent wrote there after deploy. `skaile install --locked`, `install` and `update` overwrite or remove it and print `Restored <file>` (or `Removed <file> (not part of <ref>)`). `diff` shows the edit and keeps exit 0.
124
+ - `.venv/`, `venv/`, `.pytest_cache/`, `.mypy_cache/`, `.ruff_cache/`, `.idea/`, `.vscode/`, `*.pyo`, `Thumbs.db`, `.env` and `.env.*` in an asset folder are neither deployed nor hashed, so running `pytest` in a library no longer makes the lock drift. The templates `.env.example`, `.env.sample`, `.env.template` and `.env.dist` stay part of the asset. `skaile add` warns once per other `.env` file it finds in an asset folder.
125
+
126
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - A `skaile.yaml` that does not parse (a duplicate key, bad YAML, a root that is not a mapping) now stops `install`, `update`, `check`, `doctor`, `outdated`, `diff`, `add` and `remove` with `skaile.yaml — parse error: <reason>` and exit 1, before anything is deployed, undeployed or locked. Before, `install` read the broken file as "nothing declared", deleted every deployed asset and emptied the lock. `resolveSkWorkspaceConfig` and `resolveGlobalSkWorkspaceConfig` throw that error instead of returning `{}`. Outside a project, `check`, `doctor`, `outdated`, `install`, `update` and `diff` exit 1 with `No skaile.yaml found. Run skaile init to create one.` and write nothing, as `add` does.
127
+
128
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - `skaile run` and `skaile repl` end with the driver's error and exit 1 when the omp bridge does not start. Before, they ended on an unsettled top-level await with exit code 13 and no message (p137). `OmpDriver.start()` now rejects when omp exits before it is ready, and the CLI ends any command that has nothing left to wait for with one line and exit 1.
129
+
130
+ `skaile repl` no longer prints log records as raw JSON on stdout. They go to the project's log database; only warnings and errors print, on stderr (p47).
131
+
132
+ The README quick start and tutorial 01 name the optional SDK to install per driver: `@anthropic-ai/claude-agent-sdk` for `claude-sdk`, `@openai/codex-sdk` for `codex` (p138).
133
+
134
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - A command now ends with the verdict it printed.
135
+
136
+ - `skaile diff <ref>` of a locked asset whose library is not registered, or that has an unresolvable requirement, prints the state problem only and exits 1. It no longer prints `No differences.` first. A plain difference (edited copy, changed library files) still shows the diff and exits 0.
137
+ - `skaile update` ends with `Failed` and exit 1 (never `Done`) when a declared asset is missing, a source pull failed, an agent instance cannot be rendered or a library is not registered. `Nothing to update.` is no longer printed after a failure.
138
+ - `skaile add <ref>` of an asset whose requirement no registered library or source holds exits 1 with `<ref> requires <dep> (not found — register the library that holds it with skaile library init <name> --path <dir>, or remove the requirement from the asset's manifest) — nothing was added`. It was exit 0 with `was added without unresolved dependencies`, which left a project that `check`, `install` and `diff` all fail. `skaile.yaml`, the lock and the deployed files stay as they were. `AssetManager.add` throws instead of warning, so `skaile update <name>`, `skaile manage` and `skaile npx` fail the same way.
139
+
140
+ ### Patch Changes
141
+
142
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - `skaile manage` ticks a library group only when the group's own rows are installed: with the same ref in two libraries, only the group that holds the installed copy gets the tick. `skaile diff preset:<ref>` of an installed preset says `preset has no files of its own` and exits 0, and `skaile why preset:<ref>` finds the preset in the lock instead of printing `not found in lock file`. `AssetManager.diff()` can return the new status `no-files`.
143
+
144
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - `library rename` of a local library no longer breaks projects that lock it: the rename is recorded, and `install --locked`, `check` and `install` find the library under its new name. `library rename` and `library show` of a library whose folder is gone print the missing-directory line and exit 1, with no raw `ENOENT`. `library pull`, `sync` and `push` print `merge in progress; resolve the conflicts, then git commit` and exit 1 while a merge is unfinished, like they do for a rebase.
145
+
146
+ - [#1055](https://github.com/skaile-ai/workspaces/pull/1055) [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358) Thanks [@mortegro](https://github.com/mortegro)! - Every command now gives the fix text of the shared project state. For a declared ref that no library or source holds, `install`, `install --locked`, `update` and `why` print the `check` fix (`register the library ... or drop it with skaile remove`). They no longer say `run skaile install first` for a ref that `install` cannot resolve. `outdated` no longer advises `skaile install` for a requirement whose locked library is not registered; it names `library init` or `remove`. `run skaile add agent:... first` is printed only when a registered library holds the agent; otherwise the advice names `library init` or the binding to drop. `check`, `doctor` and `outdated` print the requiring asset as `kind:@publisher/name`. `LockGap.asset` of a `requires` gap now carries the publisher.
147
+
148
+ - Updated dependencies [[`87945dd`](https://github.com/skaile-ai/workspaces/commit/87945ddc111f3cdd5c2e354d387170ce2f6ca6a5), [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358), [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358), [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358), [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358), [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358), [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358), [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358), [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358), [`3c15671`](https://github.com/skaile-ai/workspaces/commit/3c1567160077b7e0e0ca888c02c2e7bf0bf02358)]:
149
+ - @skaile/workspaces@5.11.0
150
+
3
151
  ## 5.10.0
4
152
 
5
153
  ### Minor Changes
package/README.md CHANGED
@@ -7,6 +7,19 @@ npx skaile-cli install skill:@admin/agent-browser#0.0.0
7
7
  npx skaile-cli --help
8
8
  ```
9
9
 
10
+ `skaile run` and `skaile repl` start a driver (a harness). Two of the drivers need an
11
+ optional SDK that `skaile-cli` does not install. Install the one for your driver
12
+ in the project before the first `run` or `repl`:
13
+
14
+ | Driver | Install |
15
+ |---|---|
16
+ | `claude-sdk` (default) | `npm i @anthropic-ai/claude-agent-sdk` (with Bun: `bun add @anthropic-ai/claude-agent-sdk`) |
17
+ | `codex` | `npm i @openai/codex-sdk` (with Bun: `bun add @openai/codex-sdk`) |
18
+ | `omp` | none; needs the `omp` binary on your `PATH` and a configured model |
19
+
20
+ Without the SDK, `skaile run` exits 1 with `Claude Agent SDK not installed` (or
21
+ `Codex SDK not installed`).
22
+
10
23
  It depends on `@skaile/workspaces` (which ships the actual CLI) and forwards
11
24
  all arguments to its `skaile` binary. Versions are kept in lockstep with
12
25
  `@skaile/workspaces` via Changesets `fixed` groups.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skaile-cli",
3
- "version": "5.10.0",
3
+ "version": "5.12.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.10.0"
28
+ "@skaile/workspaces": "5.12.0"
29
29
  },
30
30
  "publishConfig": {
31
31
  "access": "public"