Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ breaking entries are marked **BREAKING**.

## [Unreleased]

## [0.17.1] - 2026-09-02

### Migrating to 0.17.0

- **A zero-padded time or date field in a numeric comparison now fails, and it
Expand All @@ -30,9 +32,11 @@ breaking entries are marked **BREAKING**.
stdin stay leaf-only, refused at `build()` on a node. See
`docs/wrapped_command.md` for the full grammar.
- **`Filesystem::canonicalize` and `KernelBackend::canonicalize`** — a
defaulted, containment-checked path canonicalizer. `LocalFs` and
`VfsRouter` override it with `resolve_beneath`; `readlink -f` and
`realpath` are now thin callers instead of walking symlinks themselves.
defaulted path canonicalizer; the default inherits whatever containment
`lstat`/`read_link` already give. `LocalFs` overrides it with one
`resolve_beneath` call, containment-checked; `VfsRouter` delegates to the
owning mount. `readlink -f` and `realpath` are now thin callers instead of
walking symlinks themselves.

### Fixed
- **A mount point's ancestors are navigable again** — with a backend at `/` and
Expand Down Expand Up @@ -2625,7 +2629,8 @@ Initial public release of **kaish** (会sh) — a predictable Bourne-like shell
- **REPL** (`kaish-repl`) with multi-line input, completion, and history; **MCP server** (`kaish-mcp`) exposing `kaish_execute` with help resources and structured + plain-text content blocks.
- **`KernelClient` trait** + `EmbeddedClient` for in-process embedding; topic-based help system; `kaish-wasi` `wasm32-wasip1` target.

[Unreleased]: https://github.com/tobert/kaish/compare/v0.17.0...HEAD
[Unreleased]: https://github.com/tobert/kaish/compare/v0.17.1...HEAD
[0.17.1]: https://github.com/tobert/kaish/compare/v0.17.0...v0.17.1
[0.17.0]: https://github.com/tobert/kaish/compare/v0.16.0...v0.17.0
[0.16.0]: https://github.com/tobert/kaish/compare/v0.15.0...v0.16.0
[0.15.0]: https://github.com/tobert/kaish/compare/v0.14.1...v0.15.0
Expand Down
20 changes: 10 additions & 10 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ members = [
]

[workspace.package]
version = "0.17.0"
version = "0.17.1"
edition = "2024"
rust-version = "1.85"
authors = ["Amy Tobey <tobert@gmail.com>"]
Expand Down
6 changes: 3 additions & 3 deletions crates/kaish-client/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ readme = "../../README.md"
# Feature-neutral on purpose: the embedder decides the kernel's feature set
# (kaish-web builds no-default for wasm; native hosts add localfs etc.).
# Unification means enabling defaults here would trample that choice.
kaish-kernel = { path = "../kaish-kernel", version = "0.17.0", default-features = false }
kaish-types = { path = "../kaish-types", version = "0.17.0" }
kaish-kernel = { path = "../kaish-kernel", version = "0.17.1", default-features = false }
kaish-types = { path = "../kaish-types", version = "0.17.1" }

# Async traits only — no runtime: the library spawns nothing itself, and a
# tokio dep here would drag net/mio into wasm builds (kaish-extras).
Expand All @@ -39,7 +39,7 @@ tracing = { workspace = true }
# this, `cargo test -p kaish-client` alone sees a no-localfs kernel while a
# whole-workspace run gets localfs unified in by the REPL, and outcomes
# depend on which crates happened to build.
kaish-kernel = { path = "../kaish-kernel", version = "0.17.0", features = ["localfs"] }
kaish-kernel = { path = "../kaish-kernel", version = "0.17.1", features = ["localfs"] }
proptest = { workspace = true }
tempfile = { workspace = true }
# Tests drive the async client API; the library itself needs no runtime —
Expand Down
2 changes: 1 addition & 1 deletion crates/kaish-help/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ categories.workspace = true
readme = "../../README.md"

[dependencies]
kaish-types = { path = "../kaish-types", version = "0.17.0" }
kaish-types = { path = "../kaish-types", version = "0.17.1" }

[lints]
workspace = true
12 changes: 6 additions & 6 deletions crates/kaish-kernel/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ readme = "../../README.md"
exclude = ["tests/snapshots/"]

[dependencies]
kaish-glob = { path = "../kaish-glob", version = "0.17.0" }
kaish-types = { path = "../kaish-types", version = "0.17.0", features = [] }
kaish-help = { path = "../kaish-help", version = "0.17.0" }
kaish-tool-api = { path = "../kaish-tool-api", version = "0.17.0" }
kaish-vfs = { path = "../kaish-vfs", version = "0.17.0", features = ["memory", "overlay"] }
kaish-glob = { path = "../kaish-glob", version = "0.17.1" }
kaish-types = { path = "../kaish-types", version = "0.17.1", features = [] }
kaish-help = { path = "../kaish-help", version = "0.17.1" }
kaish-tool-api = { path = "../kaish-tool-api", version = "0.17.1" }
kaish-vfs = { path = "../kaish-vfs", version = "0.17.1", features = ["memory", "overlay"] }

# Async runtime — minimal base; `localfs` adds tokio/fs, `subprocess` adds
# tokio/process + tokio/rt-multi-thread (see [features]).
Expand Down Expand Up @@ -90,7 +90,7 @@ jaq-json = { workspace = true }
# Optional deps, each pulled in by its capability feature:
# kaish-tools-host → host, trash/directories → os-integration,
# tiktoken-rs → tokens.
kaish-tools-host = { path = "../kaish-tools-host", version = "0.17.0", optional = true }
kaish-tools-host = { path = "../kaish-tools-host", version = "0.17.1", optional = true }
trash = { workspace = true, optional = true }
directories = { workspace = true, optional = true }
tiktoken-rs = { workspace = true, optional = true }
Expand Down
6 changes: 3 additions & 3 deletions crates/kaish-repl/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ path = "src/main.rs"
[dependencies]
# The REPL is the full interactive human shell: it needs every capability
# (external commands + job control, git, host introspection, tokens, trash).
kaish-kernel = { path = "../kaish-kernel", version = "0.17.0", features = ["full"] }
kaish-client = { path = "../kaish-client", version = "0.17.0" }
kaish-types = { path = "../kaish-types", version = "0.17.0" }
kaish-kernel = { path = "../kaish-kernel", version = "0.17.1", features = ["full"] }
kaish-client = { path = "../kaish-client", version = "0.17.1" }
kaish-types = { path = "../kaish-types", version = "0.17.1" }

# Line editing
rustyline = { workspace = true }
Expand Down
2 changes: 1 addition & 1 deletion crates/kaish-tool-api/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ categories.workspace = true
readme = "../../README.md"

[dependencies]
kaish-types = { path = "../kaish-types", version = "0.17.0", features = [] }
kaish-types = { path = "../kaish-types", version = "0.17.1", features = [] }

async-trait = { workspace = true }
clap = { workspace = true }
Expand Down
4 changes: 2 additions & 2 deletions crates/kaish-tools-host/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ categories.workspace = true
readme = "../../README.md"

[dependencies]
kaish-types = { path = "../kaish-types", version = "0.17.0", features = [] }
kaish-tool-api = { path = "../kaish-tool-api", version = "0.17.0" }
kaish-types = { path = "../kaish-types", version = "0.17.1", features = [] }
kaish-tool-api = { path = "../kaish-tool-api", version = "0.17.1" }

async-trait = { workspace = true }
clap = { workspace = true }
Expand Down
2 changes: 1 addition & 1 deletion crates/kaish-vfs/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ categories.workspace = true
readme = "../../README.md"

[dependencies]
kaish-types = { path = "../kaish-types", version = "0.17.0", features = [] }
kaish-types = { path = "../kaish-types", version = "0.17.1", features = [] }
async-trait = { workspace = true }
# DevFs's /dev/urandom pulls from the OS CSPRNG. Pure (no tokio); works on
# Unix/macOS/WASI.
Expand Down
7 changes: 4 additions & 3 deletions docs/EMBEDDING.md
Original file line number Diff line number Diff line change
Expand Up @@ -407,9 +407,10 @@ default fails the first case rather than passing silently.
`readlink -f` and `realpath` both resolve through `Filesystem::canonicalize`
(and its mirror, `KernelBackend::canonicalize`): follow every symlink hop,
fold `.` and `..` lexically. The final component may be missing when the
caller passes `allow_missing_final: true` (GNU `readlink -f` semantics,
which `realpath` also uses but then requires the answer to exist); a missing
INTERMEDIATE component is always an error, whichever way that flag is set.
caller passes `allow_missing_final: true` (GNU `readlink -f` semantics).
`realpath` passes `false`: the final component, like every intermediate one,
must exist. A missing INTERMEDIATE component is always an error, whichever
way that flag is set.
Symlink hops are capped at 40, matching Linux `MAXSYMLINKS`.

The default walks component by component through `lstat`/`read_link`, so it
Expand Down