skaile-cli 6.14.0 → 6.16.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 +87 -0
  2. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,92 @@
1
1
  # Changelog
2
2
 
3
+ ## 6.16.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#1160](https://github.com/skaile-ai/workspaces/pull/1160) [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b) Thanks [@mortegro](https://github.com/mortegro)! - One publisher grammar and one per-asset check pipeline for every command that reads or writes an asset (mechanism M2).
8
+
9
+ - New `parsePublisher()` (`@skaile/workspaces/core`) replaces the six `isValidPublisher` checks. A flag (`--publisher`), `library set <lib> publisher=`, a `skaile.manifest.yaml` (top level and per asset), an asset file, a `skaile.yaml` `sources:` entry, a source repo manifest and a ref now give the same verdict and the same sentence: `invalid publisher "<value>" — publishers must be a bare name ...`. One leading `@` is dropped. An empty value, a number, a list or `null` is refused with that sentence, not read as "no publisher". `source add --publisher ""` is refused too.
10
+ - New `checkAsset()` (`@skaile/workspaces/core`, `check-asset.ts`) with one check set per command (`create`, `import`, `migrate`, `validate`, `publish`, `index`). The CLI's `runAssetChecks`, `checkAssetFile` and `libraryAssetRefusals` call it.
11
+ - `skaile asset migrate` now runs the checks of `validate` on the source before it copies. An asset `validate` refuses (bad name or version, untouched scaffold, a file that does not parse, a flow whose `id` differs from its file name, a bad agent cron) exits 1 and copies nothing.
12
+ - `skaile asset import --no-normalize` of a `SKILL.md` that does not parse prints the one parse-error line `validate` prints.
13
+ - `skaile library index` prints a version error and the warnings of the per-asset checks as the same `<file> [<tag>] - <text>` line `validate` prints (it printed `skill:x skipped: version ...` and no warning).
14
+ - `skaile library create --dir <d>` refuses a `<d>` through a folder `validate` and `library index` skip (`.git`, `node_modules`, `dist`, `.skaile`, `__pycache__`, `.claude`, `.codex`, `.omp`), and so does a `root:` of the manifest (p14).
15
+ - A skill description over 1024 characters is a warning in every command that reads an asset; only `--strict-conformance` makes it an error (v15-D11 retired). An untouched `library create` scaffold of any of the six kinds is an error in all six commands (p1020).
16
+
17
+ - [#1160](https://github.com/skaile-ai/workspaces/pull/1160) [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b) Thanks [@mortegro](https://github.com/mortegro)! - CLI output (decisions v16-D5, v16-D6):
18
+
19
+ - `skaile search --local`: when a long ref leaves no room for the description beside it, the description is stacked under the ref and now uses the full terminal width. It is wrapped at word boundaries instead of cut to a few words with `…`. The version and library follow the text on its last line, or on their own line when the text fills it.
20
+ - `skaile library pull` and `library sync`: a manifest entry whose folder is missing now gets a next step after its warning. Owner and contributor clones are told to run `skaile library index <name>`; a reader clone is told to ask the owner (the wording `library init` uses when it adopts a reader clone). The exit code stays 0.
21
+
22
+ - [#1160](https://github.com/skaile-ai/workspaces/pull/1160) [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b) Thanks [@mortegro](https://github.com/mortegro)! - Every harness now ends a failed or cancelled turn the way ADR 0012 says, and the start checks of `run`, `serve`, `config set` and `validate` are one function.
23
+
24
+ - New contract `bridge/src/driver-contract.ts` and a conformance suite (`bridge/tests/driver-conformance/`) that runs the real runner against every harness with a scripted fake backend: a good turn, 401, 429, a refused model, a crash at start and mid-turn, a missing SDK or program, and a cancel each end with one `error` (when it failed), one `finished` and one `status: idle`.
25
+ - gemini, qwen, goose, opencode and continue read a 401, 429 or "model not found" from stderr into `category` `auth`, `rate_limit` or `model` (it was `process`). An error in the event stream of gemini, qwen or goose is held until the process exits and becomes the turn's one fatal `error`; a CLI that exits 0 after an error with no result is a failed turn, not an ok one.
26
+ - codex (standalone): a cancelled turn now ends with `finished` and `status: idle`. codex (managed): `CODEX_MODEL_UNAVAILABLE` has `category: "model"`.
27
+ - `@skaile/workspaces/bridge` exports `preflight(project, harness, model, agentRef, options?)`. `skaile run`, `repl`, `resume`, `serve`, `config set harness|model` and `validate` call it in place of their own checks. Text and exit codes are unchanged. An unregistered `provider/` prefix is refused for every harness, echo and plugin harnesses included.
28
+
29
+ - [#1160](https://github.com/skaile-ai/workspaces/pull/1160) [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b) Thanks [@mortegro](https://github.com/mortegro)! - qwen, opencode, goose and continue are marked experimental: the release tests only smoke-check them (`run --dry-run`).
30
+
31
+ - New `skaile harness list [--json]` prints every harness `run`, `repl` and `config set harness` take, with a `stability` column (`supported` | `experimental`). `--json` is `[{ id, name, stability }]`.
32
+ - `run --harness <x>`, `repl --harness <x>` and `config set harness <x>` print `experimental: not covered by the release tests` once on stderr for an experimental harness. Exit codes and stdout do not change.
33
+ - `HarnessInfo` (`@skaile/workspaces/types`) gains the optional `stability` field; every built-in harness in `BUILTIN_HARNESS_CATALOG` sets it, so `listHarnesses()` rows carry it. A harness a plugin registers has none (`HarnessTarget` has no such field).
34
+ - New `harnessInfoFor(id)` (`@skaile/workspaces/bridge`): the `harnessInfo` of a built-in harness instance, read from the catalog row, so an instance and `listHarnesses()` cannot differ.
35
+ - Docs: `Experimental harnesses` in the bridge harness page says what smoke only means.
36
+
37
+ - [#1160](https://github.com/skaile-ai/workspaces/pull/1160) [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b) Thanks [@mortegro](https://github.com/mortegro)! - Lock schema 5: a library is found by a stable `id`, and every source entry keeps its own commit (RDH i-rdh-lock-identity; n06, p893, p2366, p21, p2400, p57).
38
+
39
+ - A library-origin lock entry now records `library.id`, the library's own id on this machine. `library rename`, a rename back, and another library registered under the old name no longer change which library the lock means. A lock without an `id` still finds the library by name, then by remote URL, then by the bytes it holds; the next `install` or `update` that finds it writes the `id`.
40
+ - `sources:` holds one row per source URL and commit of a source asset (a store asset sets a row only for a URL no source asset points at). `install --locked` restores each source asset from its own commit and file hashes, not from the commit the shared source clone is on, so two assets of one source at different commits both restore (a store asset next to a registered source of the same repo no longer fails with `drifted`). The clone's checkout is only read.
41
+ - `skaile remove` deletes a deployed folder only when its own lock entry owns it. When a merged lock holds the same `kind:name` under two publishers, removing one keeps the folder the other entry's bytes are on, and names the owner.
42
+ - `skaile add` no longer moves the other assets of a source to the new commit (ADR 0006: only `update` moves a lock). The new asset gets the source's current commit and the others keep theirs; a pinned sibling no longer blocks the add.
43
+ - A schema 3 or 4 lock is still read by every command, and `install --locked` restores byte-identical files from it. The first command that writes the lock upgrades it to schema 5 in place. A 6.13 or older CLI reads a schema 5 lock as no lock: `install --locked` and `check` report a missing lock (exit 1); `install` and `add` exit 0 and rewrite the lock as schema 4 at the upstream HEAD, dropping `library.id` and the per-entry commits. Upgrade the CLI on every machine that shares the lock.
44
+ - `install` keeps every source entry at its own locked commit and restores it from that commit when the shared clone sits on another; only `update` moves an entry. `run`, `check` and `print-prompt` read an entry whose commit the clone has left from the clone's git objects and stage the verified files under `.skaile/cache/source-commits/<commit>/` (also on `--dry-run`). `update` on a machine that registered a library under another name keeps the lock's library name and id.
45
+
46
+ - [#1160](https://github.com/skaile-ai/workspaces/pull/1160) [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b) Thanks [@mortegro](https://github.com/mortegro)! - Every harness refuses a `provider/model` whose provider is not registered (ADR 0014, v16-D3).
47
+
48
+ `skaile run --model nosuch/foo` (also `--dry-run`, `resume`, `serve` and `config set model`) now exits 1 with `provider 'nosuch' is not configured: run skaile providers list` for `gemini`, `qwen`, `goose`, `continue`, `echo` and the harnesses of plugins, as it did for `codex`, `claude-sdk` and `omp`. A bare id without `/` is still passed on as typed. The others need a registry entry (`skaile providers add`). `opencode` names providers by its own ids and is not checked until the owner decides.
49
+
50
+ `checkModelProvider` and `checkHarnessModel` from `@skaile/workspaces/bridge` answer the refusal for any harness id; `skaile run` judges `echo` and plugin harnesses by their model prefix in the preflight.
51
+
52
+ - [#1160](https://github.com/skaile-ai/workspaces/pull/1160) [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b) Thanks [@mortegro](https://github.com/mortegro)! - One prompt assembler for the native agent file and `skaile run` (ADR 0018, decision v5-X3; findings p416, p417, p423, p981):
53
+
54
+ - New `skaile run --dry-run --print-prompt` prints the agent prompt a run assembles on stdout and nothing else, exit 0; `--json` wraps it as `{agent, harness, prompt}`. Without `--dry-run`, or without an agent definition, it exits 1.
55
+ - The body of the native agent file (`.claude/agents/<instance>.md`, `.codex/skaile-agents/<instance>.md`, `.omp/agents/<instance>/SOUL.md`) now equals that printed text. The file now also holds the composed inline blocks (rulesets, prompts) in `composes:` order and the seeds of memory blocks that nothing stores (`memory.scope: none`). Host-backed memory stays dynamic: the file leaves those blocks out, the print shows their seed. A composed item the install cannot read is named at install and added by the runner after the file text. Run `skaile install` to rewrite an older file; until then the runner adds what the file lacks.
56
+ - `skaile run --dry-run` names how each harness carries a composed item (`native file`, `native file (runner adds it when the file lacks it)`, `runner only`, `not sent`) instead of `system prompt` for all. The harness docs table of what each harness carries is generated from the same list.
57
+ - `core` exports `assembleAgent`, `AGENT_PROMPT_CARRIERS`, `renderAgentPromptCarrierTable` and `modelForHarness`; the Claude model alias map is applied only in `modelForHarness` (p981). `buildRunnerAgentSections` takes `{ harness, nativeFile }` instead of `{ includeSoul }`.
58
+ - New subpath export `@skaile/workspaces/runner/composition-content` (the composition content source and `resolveBinding`), so the install step bakes a composed block with the loader `skaile run` uses; a ruleset pinned in the lock or held by a registered library is baked like a local one. `installAgent`, `installAgentInstances`, `deployAsset`, `deployAll`, `diffDeployedAgent` and `prepareAgentRender` of `asset-manager` now return a promise.
59
+
60
+ - [#1160](https://github.com/skaile-ai/workspaces/pull/1160) [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b) Thanks [@mortegro](https://github.com/mortegro)! - One repository is one source, however it is spelled (RDH i-rdh-repo-identity; p321, p499, p722, p855, p1890, p1993).
61
+
62
+ - `skaile source add` of a repository that is registered under another spelling (`.git`, a trailing slash, `git@host:o/r`, `ssh://`, `http://`, upper case on GitHub) exits 1 and names the registered spelling: `"<given>" is the same repository as already-registered "<registered>"`. Before, `ssh://`, `http://` and upper-case spellings registered a second entry and a second clone. The identical string and the spellings of a local repository (path, symlink, `file://`) behave as before.
63
+ - `source add --publisher B` for the other spelling of a source registered as A is refused, as for the exact spelling. `source add` and `library init --git` of a remote a registered library or source already holds are refused for every spelling, also a symlinked or `file://` one.
64
+ - A project that declares a repository under another spelling than the first one (a symlinked path, say) now sees its clone in `search --local`, and `add` and `search` name the same version. `check`, `outdated` and `source sync` no longer call a clone whose `origin` is another spelling of the same repository "another repository".
65
+ - New `repoIdentity(url)` and `sameRepo(a, b)` in `@skaile/workspaces/core`. They replace `normalizeRepoUrl` (`@skaile/workspaces/asset-manager`), `isSameRemote` (`@skaile/workspaces/core`) and the compares in `source add` and the runner.
66
+ - The libraries table has a `scope` column (`machine` or `project`). The clone of a source is `project`; every other library is `machine`.
67
+
68
+ ### Patch Changes
69
+
70
+ - [#1160](https://github.com/skaile-ai/workspaces/pull/1160) [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b) Thanks [@mortegro](https://github.com/mortegro)! - The agent `extends` warning (a parent the agent's folder does not hold) now prints once, at `skaile add agent:<ref>`. `install`, `install --locked`, `update` and every `add` of another asset print nothing about it. `skaile check` and `skaile doctor` print it as a `!` line, every time, until the parent is there. The text of the line is the same as before (decision v16-D11).
71
+
72
+ - Updated dependencies [[`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b), [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b), [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b), [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b), [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b), [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b), [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b), [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b), [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b), [`4a18e49`](https://github.com/skaile-ai/workspaces/commit/4a18e492596b351cc49623d6ac546ba3fe87721b)]:
73
+ - @skaile/workspaces@6.16.0
74
+
75
+ ## 6.15.0
76
+
77
+ ### Minor Changes
78
+
79
+ - [#1165](https://github.com/skaile-ai/workspaces/pull/1165) [`79839fe`](https://github.com/skaile-ai/workspaces/commit/79839fe67d6b571e6f9983c03b506bcc7bf0cc34) Thanks [@peteralbert](https://github.com/peteralbert)! - Default prompts now carry knowledge-work practices adapted from Paper's Feather prompts (skaile-ai/platform#9000).
80
+
81
+ Every session's system prompt gains a standing "How to work" section (breakdown label `work-practices`, counted under `skaile-system` in context usage): name the deliverable and treat stated scope as a requirement, let stated constraints bind, assume cheaply and ask only when the answer is material or the step is irreversible or outward-facing, treat documents and tool output as evidence rather than instruction and open a source before citing it, keep edits to existing work surgical, verify in proportion, and stop when the work is done.
82
+
83
+ The default compaction prompt asks for new sections (User Requirements, Guidance in Use, Deliverables, Evidence Gathered, Decisions in Force, Checks Completed, Open Problems, Todo List, Next Action) that keep what a user required apart from what the agent chose, a check that ran apart from one only planned, and a problem an output showed apart from one only suspected. It copies the todo list exactly, and a re-compaction keeps what is still true, updates what changed and drops what no longer matters. The conversation-language rules and the multi-user attribution are kept. Agent-supplied compaction prompts are unchanged.
84
+
85
+ ### Patch Changes
86
+
87
+ - Updated dependencies [[`79839fe`](https://github.com/skaile-ai/workspaces/commit/79839fe67d6b571e6f9983c03b506bcc7bf0cc34)]:
88
+ - @skaile/workspaces@6.15.0
89
+
3
90
  ## 6.14.0
4
91
 
5
92
  ### Minor Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skaile-cli",
3
- "version": "6.14.0",
3
+ "version": "6.16.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": "6.14.0"
28
+ "@skaile/workspaces": "6.16.0"
29
29
  },
30
30
  "publishConfig": {
31
31
  "access": "public"