skaile-cli 5.4.0 → 5.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.
Files changed (2) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,107 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#1025](https://github.com/skaile-ai/workspaces/pull/1025) [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd) Thanks [@mortegro](https://github.com/mortegro)! - The runner now resolves one agent instance per session. `resolveAgentInstance({ instanceId, instance, asset, projectDir, source?, host?, ... })` (`@skaile/workspaces/runner`) replaces `resolveAgentComposition` and returns a `ResolvedAgentInstance`: inline blocks, discoverable entries, `subagents: { delegate, run }`, `memoryBlocks`, effective `triggers`, `io`, connector `slots`, `warnings` and a stable `revisionHash`. The convention files (`SOUL.md`, `RULES.md`, `DUTIES.md`, `knowledge/`) compose first as implicit items; a standalone `persona` / `ruleset` composes like its convention file. `kind: agent` items default to `delegate` when the driver has native sub-agents, else `run`. Memory blocks take the instance's `memory.scope`, are seeded from their `source` file and take host content when the host provides it; triggers merge by id with the instance's overrides (`enabled: false` drops one). A required `capabilities[]` entry that the host, the composition and the bound connector slots do not provide fails session start with `composition_asset_missing`; an optional one is a warning. `createAgentSession` accepts `instanceId` (default `default`) and exposes the resolved instance as `session.composition`.
8
+
9
+ `revisionHash` (`computeRevisionHash`, `hashAgentFiles`) is the SHA-256 of the normalized manifest, the sorted file entries and the composition entries; it excludes timestamps, host ids, the instance id and connector bindings. `skaile run --dry-run` prints the instance and its revision hash, and `skaile rebuild` now compiles the convention-file items too.
10
+
11
+ One section builder fixes the order of an agent's prompt for both the install renderers and the runner (`buildAgentPromptSections`, `@skaile/workspaces/core`): soul → `<MEMORY>` → fragments → constraints → duties → abilities → contracts → composed blocks → prompt-extensions. `<MEMORY>` frames each memory block as `<block name=… scope=…>` capped at its `max_chars`. The system-prompt breakdown (`SystemPromptSection`) gains a `memory` label. `resolveAgentMixins` and `AgentMixinContent` (runner `mixin-resolver`) are removed; their persona / rules / knowledge fields are read through `composes:` and the convention files.
12
+
13
+ - [#1025](https://github.com/skaile-ai/workspaces/pull/1025) [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd) Thanks [@mortegro](https://github.com/mortegro)! - Agent runs have a framework-owned lifecycle. `createRunController({ store, launch, authorize, getInstance, execute, workspaceId, limits? })` (`@skaile/workspaces/runner`) is the authority behind `agent.run` / status / cancel / result / `approval.decide`: `AgentRun` records move `queued -> running -> waiting_approval | waiting_children -> succeeded | failed | cancelled`; delegation depth is capped at 2 and a root run has at most 4 live children (a parent in `waiting_children` holds no driver and resumes with a `children_finished` host message when the last child ends); the runs of one `standing` instance execute one at a time; cancel stops the run and every descendant; `agent.run` is idempotent per `(callerSessionId, callId)`, so a redelivered dispatch answers the same `runId`. Approvals are persisted: a held capability call (or a held start) parks the run, deciding claims the approval with a compare-and-set, executes the stored operation exactly once under its `operationId`, persists the result and resumes the native session with `{ type: "approval_result", operationId, status, result }`. A replay with changed args, a consumed or expired approval, or stored args that no longer match their `argsHash` is `approval_invalid`; an approval a restart cut short is never re-run (`operation_outcome_unknown`). State changes append `AgentRunEvent`s to the store (a host persists them as `agent_run_events` and broadcasts from `onEvent`); `subagent` events carry `runId`. The controller imports no host code: storage is the injected `RunStore` (`createInMemoryRunStore()` ships for `skaile run`, `skaile repl` and tests; Forge brings a durable one), execution the injected `launch`.
14
+
15
+ The in-process `agent.run` host that serves `skaile run` / `skaile repl` is now this controller over the in-memory store with a nested-driver launcher; there is no second lifecycle. New types in `@skaile/workspaces/types`: `AgentRun`, `AgentRunEvent`, `AgentRunEventRecord`, `AgentApproval`, `RunStore`, `RunHostMessage`, `AgentRunFilter`, `AgentRunPatch`, `AgentApprovalPatch`.
16
+
17
+ - [#1025](https://github.com/skaile-ai/workspaces/pull/1025) [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd) Thanks [@mortegro](https://github.com/mortegro)! - Protocol 4.16: a session can list and run the workspace's agent instances, and read/write memory blocks and triggers. The runner registers the framework capabilities `agent.list`, `agent.run`, `agent.status`, `agent.cancel`, `agent.result`, `approval.decide`, `memory.read|write|append|list` and `trigger.list|upsert|toggle` from what the host advertises in `session_init.capabilities`: `host.agent_run` switches on `agent.*` + `approval.decide` (host-backed over the existing host-request channel), `host.memory_store` switches on `memory.*`, `host.trigger_store` switches on `trigger.*`. Nothing is registered without the advertisement. A session with no host (`skaile run`, `skaile repl`) serves `agent.list` / `agent.run` in-process: `agent.run` starts a nested driver session of the role instance (`createAgentSession` with that `instanceId`), bounded by the role's `runtime.max_turns`, and its final JSON reply is the run's output; memory and trigger capabilities are absent and `<MEMORY>` renders only the seeded blocks.
18
+
19
+ `agent.run` validates `input` against the instance's `io.input` before the run starts (`input_invalid`, nothing started) and the run's `output` against `io.output` after it (`output_invalid`, reported as a failed run). `requiresApproval` follows the instance's `permissions.permission_mode`. New types in `@skaile/workspaces/types`: `AgentRun*`, `AgentInstanceSummary`, `HostAgentRun*`, `HostMemoryStore*`, `HostTriggerStore*`. `SubagentEvent` gains `runId`, `instanceId`, `input`, `runStatus`, `error` and a widened `output`; new events `memory_changed` and `trigger_fired`; `session_init_ack.instances[]` carries each instance's id, ref, lifecycle, revision hash and io summary. `PROTOCOL_VERSION` is 4.16.0. `skaile run` prints `subagent` events of `agent.run` runs.
20
+
21
+ - [#1025](https://github.com/skaile-ai/workspaces/pull/1025) [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd) Thanks [@mortegro](https://github.com/mortegro)! - Agent asset schema `spec_version: "0.2"` (`@skaile/workspaces/types/manifests`). `agent.yaml` gains `lifecycle: standing | role` (default `standing`; a `role` requires an `io: { input, output }` JSON-Schema block), `memory: { blocks[{ name, scope: instance | user | workspace, max_chars, source? }], consolidation? }`, `triggers[]` (discriminated by `kind: schedule | webhook | channel | event`, each with an `id`), and `capabilities[{ name, connector?, required }]`. Memory and triggers are top-level fields only; `memory` / `trigger` are rejected as `composes[].kind`.
22
+
23
+ `composes[]` items take an optional slot `id` (`[a-z][a-z0-9_-]*`, required for `connector` and `mcp-server`), `as` and `config`; `kind` stays an open string validated against the kind registry (plus the `soul` pseudo-kind). `kind: agent` items take `binding: delegate | run` (default `delegate`); the new `Binding` values are valid on `agent` items only. New pure helpers `conventionItems()` / `effectiveComposes()` expose `SOUL.md` / `RULES.md` / `DUTIES.md` / `knowledge/` as implicit composition items.
24
+
25
+ The deprecated 0.1 inputs (`skills`, `abilities`, `contracts`, `persona`, `rules`, `knowledge`, `requires`, `dependencies`, `metadata.soul` / `orchestrates` / `routes_to` / `knows`) still parse but are no longer read for the catalog: `CatalogEntry.requires` of an agent now lists its `composes[].ref` entries. `agentDeprecationDiagnostics()` returns one named `deprecated_agent_<field>` warning per field, and `skaile validate` prints them. `skaile validate` also reports duplicate slot ids as `composition_conflict`.
26
+
27
+ The second, divergent loose `AgentManifest` type in `@skaile/workspaces/core` is removed; `AgentManifest` from `@skaile/workspaces/types/manifests` is the only agent manifest type.
28
+
29
+ - [#1025](https://github.com/skaile-ai/workspaces/pull/1025) [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd) Thanks [@mortegro](https://github.com/mortegro)! - `skaile install` renders every agent instance of `skaile.yaml` (`agent:` as `default`, plus the `agents:` map) for the target harness, not only the primary agent. Each rendering is named by the instance id: `.claude/agents/<id>.md`, `.omp/agents/<id>/` (its `agent.yaml` carries `composes`, `lifecycle`, `io`, `memory`, `triggers` and `capabilities` verbatim) and `.codex/agents/<id>.toml`. The instance's model, `budget.max_turns` and lifecycle override the asset's. `composes: [{ kind: agent }]` items with binding `delegate` render flat as their own files; `binding: run` items get none.
30
+
31
+ Claude frontmatter gains `skills` (composed skills), `mcpServers` (the servers the `mcp-server` slots are bound to through the instance's `connectors` map) and `background: true` for a `role` instance whose agent sets the new `runtime.background`. Codex has no per-tool allowlist, so a tool surface that cannot write or run commands renders `sandbox_mode = "read-only"`.
32
+
33
+ Files an earlier install wrote for an instance that has left `skaile.yaml` are removed on the next install, tracked in `.skaile/agent-instances-managed.json`; hand-written agent files are never touched. `skaile install` prints one `agent <id>: <files>` line per instance, and `InstallResult` gains `agentInstances` and `agentFilesRemoved`. `installAgentInstances` is exported from `@skaile/workspaces/asset-manager`.
34
+
35
+ The session now forwards the instance id as the native `agentName` (it was `agent.yaml#name`), so a session loads the file its own instance rendered. The Codex driver reads `.codex/skaile-agents/<agentName>.md` instead of the single `.codex/skaile-agent.md`, which would have let two instances overwrite each other.
36
+
37
+ - [#1025](https://github.com/skaile-ai/workspaces/pull/1025) [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd) Thanks [@mortegro](https://github.com/mortegro)! - Asset-kind providers declare where `skaile install` puts them. `IAssetKindProvider.installTarget` (`skill`, `agent`, `prompt`, `flow` or `contract`) replaces the per-kind installer branches and the `NON_DEPLOYABLE_KINDS` list: a kind with a target is copied into the active driver target's directory using the provider's file filter; a kind without one (`connector`, `mcp-server`, `knowledge`, `persona`, `ruleset`, `preset`) is fetched, verified and cached under `.skaile/cache/store/` for composition only. `AiComponent` is now derived from the provider type. `removeAsset` and the asset manager no longer resolve a harness directory for a composition-only kind.
38
+
39
+ `persona` and `ruleset` assets are now discoverable and publishable as `PERSONA.md` and `RULESET.md` (provider version 1.1.0). An agent's own `RULES.md` is never a standalone asset.
40
+
41
+ - [#1025](https://github.com/skaile-ai/workspaces/pull/1025) [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd) Thanks [@mortegro](https://github.com/mortegro)! - The asset-kind provider registry is now the only authority on which asset kinds exist. `createDefaultKindRegistry(extra?)` (`@skaile/workspaces/discovery`) replaces `createDefaultRegistry()`; the CLI builds one registry per process (built-ins plus flow and knowledge) and passes it to the asset manager, catalog sources and `skaile validate`. The static lists are gone: `AssetKindValues`, `AssetKindSchema`, `validateByKind` (types), `ASSET_KINDS`, `INDIVIDUAL_KINDS` (core) and `KNOWN_ASSET_KINDS`, `KnownAssetKind` (library); `AssetKind` is `string`.
42
+
43
+ A `SKILL.md` whose `type:` names an unregistered kind (for example `mount`) is no longer silently catalogued as a skill: the scanners skip it and report an `unknown_asset_kind` error diagnostic. `skaile validate` reports `unknown_asset_kind` for an unregistered kind of a manifest file or of an `agent.yaml` `composes:` item. Composition binding resolution throws on an item whose kind has no default binding and no explicit `binding`, instead of falling back to `discoverable`.
44
+
45
+ - [#1025](https://github.com/skaile-ai/workspaces/pull/1025) [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd) Thanks [@mortegro](https://github.com/mortegro)! - New `skaile migrate agents [paths...]` and `skaile migrate assets [root]` upgrade existing assets mechanically. Both are dry runs by default: they print a unified diff per file and write nothing until `--write`. A migrated `agent.yaml` that would not pass the 0.2 manifest checks is reported and left untouched.
46
+
47
+ `migrate agents` rewrites deprecated agent inputs into `composes:` (through the `yaml` Document API, so comments and key order survive) and bumps `spec_version` to `"0.2"`:
48
+
49
+ - `skills:` / `abilities:` become `skill` items (`./skills/<name>` when the agent directory ships that skill, otherwise `skill:<name>`); `contracts:` become `contract` items; `knowledge:` becomes `knowledge` items.
50
+ - `persona:` / `rules:` path refs become `persona` / `ruleset` items with the path kept.
51
+ - `requires:` / `dependencies:` become `agent` items with `binding: delegate` (a `kind:` prefix on a string picks another kind; `requires[].name` becomes `as`, `requires[].source` the ref). `mcp-server` and `connector` items get a generated slot `id`.
52
+ - `metadata.orchestrates` becomes items whose kind comes from the `kind:` prefix (usually `skill`); `metadata.routes_to` becomes `agent` items and `metadata.knows` `knowledge` items, for explicit refs only (a `kind:` prefix, a `./`/`../`/`/` path, or `@publisher/name`). Prose entries cannot be resolved and move unchanged to `metadata.routing_notes` / `metadata.knowledge_notes`, so nothing is lost.
53
+ - `metadata.soul` is dropped when it names `SOUL.md` (the convention file) and becomes a `persona` item otherwise.
54
+ - A workspace `skaile.yaml` with `agent.subagents.<name>` gets a local role asset `.skaile/agents/<name>/agent.yaml` (`lifecycle: role`, `io` `{task}` → `{result}`; the prompt becomes `SOUL.md`) plus an `agents.<name>: { ref: ./.skaile/agents/<name>, lifecycle: role }` instance. A subagent whose target directory already exists is kept and reported.
55
+
56
+ `migrate assets` moves a repo onto the registry-derived kind model:
57
+
58
+ - `type: persona` / `type: ruleset` markdown (`_agent-parts/personas/<n>.md`) moves to `<n>/PERSONA.md` / `<n>/RULESET.md` with `type:` dropped, and agent `persona:` / `rules:` refs to the old path become compose items at the new path.
59
+ - Every `*.bundle.yaml`, and every `kind: bundle` entry of `skaile.yaml#assets`, becomes `<name>.preset.yaml` (`version: 1.0.0`, `items: [{ref: kind:@publisher/name}]`); `bundle:@…` refs in `skaile.yaml#dependencies` become `preset:@…`.
60
+ - The publication half of `skaile.yaml` (`publisher`, `version`, `assets`) moves into a publisher-only `skaile.manifest.yaml`, written with the same `encodeSkaileManifest` writer `skaile source manifest` uses (publisher normalised to the bare `skaile-ai`); the old `assets:` inventory is dropped (a manifest with `assets:` restricts discovery to the listed assets), the keys are removed from `skaile.yaml`, and a `skaile.yaml` left empty is deleted. An existing `skaile.manifest.yaml` is never overwritten.
61
+ - Frontmatter `type:` values that name no registered kind (in `SKILL.md` files and under `_agent-parts/`) are reported, never rewritten.
62
+
63
+ - [#1025](https://github.com/skaile-ai/workspaces/pull/1025) [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd) Thanks [@mortegro](https://github.com/mortegro)! - `preset` is now the only grouping primitive. The `bundle` and `mount` asset kinds are deleted (types, core, library, runner, the capability origin enum). A `preset:@pub/name#ver` entry in `skaile.yaml` `dependencies` expands the preset's asset items (nested presets up to depth 3) into the install set; the lock records only the expanded items. `library://`, placeholder and connector/MCP instance items are skipped and `skaile install` prints `preset <ref>: N assets, M instance items skipped (apply with skaile preset apply)`. Nesting deeper than 3 or a cycle raises `preset_depth_exceeded`; a `bundle:` ref raises `unknown_asset_kind` naming `preset:`. Presets are indexed by `LocalCatalogSource` and kept in curated manifests. `*.bundle.yaml` is replaced by `*.preset.yaml`; `skaile create -k preset` and `skaile add preset:…` replace the bundle forms, and the first-party `workspaces-authoring` bundle is now a preset.
64
+
65
+ - [#1025](https://github.com/skaile-ai/workspaces/pull/1025) [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd) Thanks [@mortegro](https://github.com/mortegro)! - Running an agent now uses the composition bytes that were compiled or pinned, not whatever the sources hold today.
66
+
67
+ - New `CompositionContentSource` (`createCompositionContentSource`) resolves a `composes:` ref from a local path, the project lock (a lock pin wins over the catalog; the pinned bytes are hash-verified) or the local catalog scan. Nothing is fetched from the network at session start. A ref that cannot be served exactly as pinned fails with a typed `CompositionError` (`composition_asset_missing`, `composition_conflict`, `composition_rebuild_required`) instead of being skipped.
68
+ - `compile_manifest.json` is schema 2: each entry also carries `kind`, `resolved_ref` and the captured `content`; hashes are recomputed on read. `inline-snapshot` serves the compiled bytes only (the live-read drift warning is gone); an uncompiled snapshot item is `composition_rebuild_required`. `inline-live` is read once per new run and stored in `.skaile/composition-runs/<session>.json`; a resumed session reuses those bytes. `discoverable` items serve their captured content.
69
+ - `skaile rebuild` regenerates the manifest from the content source and rejects an agent that composes itself through `kind: agent` items.
70
+ - `skaile run --agent-definition <ref|path>` selects the agent asset for one single-shot invocation (error when combined with a flow). `skaile run --dry-run "<prompt>"` prints each resolved item (ref, kind, binding, version, hash, source) and how it reaches the claude-code, omp and codex harnesses, without starting a model.
71
+
72
+ - [#1025](https://github.com/skaile-ai/workspaces/pull/1025) [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd) Thanks [@mortegro](https://github.com/mortegro)! - `skaile.yaml` gains a root `agents:` map of named agent instances (`AgentConfig.instances` in `@skaile/workspaces/core`). Each instance has a `ref`, an optional `lifecycle` (`standing | role`), `model`, `permissions` (same shape as `agent.permissions`), `memory.scope` (`instance | user | workspace | none`), `triggers` (merged by id into the asset's), a `connectors` map from compose slot ids to `connectors[].id`, and a `budget`. `agent:` stays the primary agent and equals `agents.default`; declaring both is an `agent_default_conflict` error. Layers merge instances by id: scalars overlay-win, triggers merge by id, deny lists are unioned. New exports: `AgentInstanceConfig` and friends, `effectiveAgentInstances()`, `mergeAgentInstances()`, `mergeAgentPermissions()`, `normalizeAgentInstances()`, `agentInstanceDiagnostics()`, `resolveAgentDefinitionDir()`.
73
+
74
+ `agent.subagents` is removed (the `SubagentConfig` type, the merge, and the `ResolvedSkaileConfig.subagents` session_init field that only forced a session recreate). A `skaile.yaml` that still contains it fails to load with an error pointing to `agents:`.
75
+
76
+ `skaile validate` checks every `agents.*.ref` resolves to an `agent.yaml`, role instances have an asset `io`, `connectors` keys are connector slot ids of the asset and values exist in `connectors[]`, and trigger ids are unique per instance and either exist in the asset or are declared in full.
77
+
78
+ ### Patch Changes
79
+
80
+ - [#1025](https://github.com/skaile-ai/workspaces/pull/1025) [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd) Thanks [@mortegro](https://github.com/mortegro)! - Two fixes for the agent composition migration:
81
+
82
+ - `skaile migrate assets` no longer converts the old `skaile.yaml#assets` inventory into the new `skaile.manifest.yaml`. A manifest with an `assets:` list switches discovery into manifest mode where only listed assets exist, which shrank real catalogs (96 skills to 42; agents vanished). The emitted manifest is publisher-only (`publisher`, `version`), the plan prints one line naming how many `assets[]` entries were dropped, and discovery keeps walking the whole tree.
83
+ - A knowledge dir whose valid `index.yaml` declares `documents: []` is an empty knowledge base, not a missing asset. It compiles (captured with its index bytes), contributes no prompt text or capability and raises no warning or error. A missing dir, or one without a valid index, still fails with `composition_asset_missing`.
84
+
85
+ - [#1025](https://github.com/skaile-ai/workspaces/pull/1025) [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd) Thanks [@mortegro](https://github.com/mortegro)! - Review fixes for the agent composition release. A run cancelled while its nested role session is being created now ends `cancelled` (the half-started driver is disposed) instead of hanging `agent.run`; `dispose()` waits for nested drivers; finished runs no longer leak approval and call-id entries, and an `agent.run` call id is only replayed for the session that made it. The run ledger behind `agent.status` / `agent.result` survives session rebuilds, so `io.output` is still validated and `finished` is emitted once. `composes[].as` and a composed sub-agent's name must match `[a-z][a-z0-9_-]*` (they name rendered files; `../x` is rejected in the schema and at install, and the instance ledger only removes paths inside the deploy dirs). `SubagentEvent.output` keeps its structured harness shape; the typed output of a role run is `SubagentEvent.result`. A host that declares `host.memory_store` / `host.trigger_store` / `host.agent_run` with `capability_register` instead of `session_init` now gets `memory.*` / `trigger.*` / `agent.*`; `capability_deregister` removes them.
86
+
87
+ - Updated dependencies [[`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd), [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd), [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd), [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd), [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd), [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd), [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd), [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd), [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd), [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd), [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd), [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd), [`840afda`](https://github.com/skaile-ai/workspaces/commit/840afda25ba0a8621b69e7254ee988717c2c5bcd)]:
88
+ - @skaile/workspaces@5.6.0
89
+
90
+ ## 5.5.0
91
+
92
+ ### Patch Changes
93
+
94
+ - [#1023](https://github.com/skaile-ai/workspaces/pull/1023) [`8a9a3f8`](https://github.com/skaile-ai/workspaces/commit/8a9a3f87814be915ee0e1c3080c847165d118515) Thanks [@mortegro](https://github.com/mortegro)! - The "`<ref>` exists in N libraries" warning of `skaile add`, `install`, `update` and `npx skills add` is printed after the spinner stops; on a terminal the spinner frames used to overwrite it. New `AssetManagerOptions.onLibraryCollision` receives the message (without the `skaile:` prefix) instead of `console.warn`; without it nothing changes.
95
+
96
+ - [#1023](https://github.com/skaile-ai/workspaces/pull/1023) [`8a9a3f8`](https://github.com/skaile-ai/workspaces/commit/8a9a3f87814be915ee0e1c3080c847165d118515) Thanks [@mortegro](https://github.com/mortegro)! - `skaile library init <name> --reader` / `--contributor` now work on an existing git clone: the ownership check ran before the clone's `origin` was detected, so it failed with "needs --git" and the clone could only be adopted as `owner`, which makes `library push` / `sync` push to that origin. The "Adopted existing git clone" line now names the ownership, and for `owner` it says that `sync` pushes there and how to switch (`skaile library set <name> ownership=reader`).
97
+
98
+ - [#1023](https://github.com/skaile-ai/workspaces/pull/1023) [`8a9a3f8`](https://github.com/skaile-ai/workspaces/commit/8a9a3f87814be915ee0e1c3080c847165d118515) Thanks [@mortegro](https://github.com/mortegro)! - `skaile search` catches a mistyped kind. A single word one typo from a kind (`skaile search skils`) is still searched as text, but the CLI now says so and names the kind to filter by (`skaile search skill`). With two arguments the first must be a kind: `skaile search skils pirate` used to filter by a kind that matches nothing and print an empty table; it now exits 1 with `Unknown asset kind "skils" (did you mean "skill"?)`.
99
+
100
+ - [#1019](https://github.com/skaile-ai/workspaces/pull/1019) [`28520c4`](https://github.com/skaile-ai/workspaces/commit/28520c4dc33e71b1c1cd31e35eec799a8fc51140) Thanks [@mortegro](https://github.com/mortegro)! - `skaile add` now installs the dependencies of an asset that comes from a store (e.g. `skaile.store`), not only of one that comes from a git source. Before, `skaile add skill:@skaile-ai/report-html` in a project with no `sources:` installed `report-html` alone and `skaile doctor` reported nothing missing. The dependencies now come from the store's catalog entry (`requiresJson.refs`). A cached "no such asset" answer from before the asset was published is checked with the store again. If the lookup fails or the store has no catalog entry for the asset, the asset still installs and a warning says it was installed without its dependencies. Catalog entries cached by an older `skaile` carry no dependency list and are fetched again; air-gapped mode, or a failed fetch, still serves them. The cache index format is unchanged, so an older `skaile` sharing the cache keeps its entries.
101
+
102
+ - Updated dependencies [[`8a9a3f8`](https://github.com/skaile-ai/workspaces/commit/8a9a3f87814be915ee0e1c3080c847165d118515), [`8a9a3f8`](https://github.com/skaile-ai/workspaces/commit/8a9a3f87814be915ee0e1c3080c847165d118515), [`8a9a3f8`](https://github.com/skaile-ai/workspaces/commit/8a9a3f87814be915ee0e1c3080c847165d118515), [`28520c4`](https://github.com/skaile-ai/workspaces/commit/28520c4dc33e71b1c1cd31e35eec799a8fc51140)]:
103
+ - @skaile/workspaces@5.5.0
104
+
3
105
  ## 5.4.0
4
106
 
5
107
  ### Minor Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skaile-cli",
3
- "version": "5.4.0",
3
+ "version": "5.6.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.4.0"
28
+ "@skaile/workspaces": "5.6.0"
29
29
  },
30
30
  "publishConfig": {
31
31
  "access": "public"