🦋 New version release - #6
Merged
Merged
Conversation
brentrager
force-pushed
the
changeset-release/main
branch
from
April 17, 2026 14:49
555dacb to
d79e0f9
Compare
brentrager
added a commit
that referenced
this pull request
Jun 23, 2026
…red reads Extends the macOS Seatbelt bash profile toward the plan's P1 security acceptance criteria: - P1 #5: kernel-deny writes to workspace/.git/config (not just .git/hooks). A writable git config can repoint core.hooksPath or install executing aliases that later run OUTSIDE the sandbox — same escape class as a planted hook. - P1 #6: extend credential read-denial from ~/.ssh / ~/.aws / ~/.config/gh / ~/.gnupg to also cover ~/.config/gcloud, ~/.kube, ~/.docker, ~/.netrc. Adds two adversarial tests (run + pass on macOS): a postinstall-style attempt to plant .git/hooks/post-checkout and overwrite .git/config both fail (files never exist), and cat-ing cloud/registry/netrc creds leaks no secret material. 34 smooth-tools tests pass; clippy clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016wBikCFJyoowRokiWK5rX1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@smooai/smooth@0.4.0
Minor Changes
e7e533e: MCP servers, CLI-wrapper plugins, and project-scoped config.
th mcp add/list/remove/test/pathfor stdio MCP servers (Playwright,GitHub, filesystem, etc.). Servers register as
<server>.<tool>.th plugin init/list/path/removefor file-based CLI-wrapper tools at.smooth/plugins/<name>/plugin.toml. Plugins register asplugin.<name>and run the configured shell command with{{placeholder}}substitution.~/.smooth/(global) and<repo>/.smooth/(project); project entries shadow global onname collision.
--projectflags onadd/init/remove/pathscope to the repo.(CliGuard, injection, secrets, LLM judge) and the microVM contains
the blast radius. See
SECURITY.mdanddocs/extending.md.3657db9: Chat gets sessions. The smooth-web chat page now lists prior
sessions in a sidebar, each persisting its own message history in
the Dolt
session_messagestable. New/api/chat/sessionsendpoints (create/list/get/delete + messages). The LLM receives the
last 50 messages on every turn so multi-turn context is preserved.
Session titles auto-rename to the first 60 chars of the opening
prompt. Chat layout fixed so the input row sits flush to the
viewport bottom (no stray scroll).
3657db9: Retire SQLite. Pearls, sessions, memories, config, and worker metadata
all live in the Dolt store at
~/.smooth/dolt/(home) or<repo>/.smooth/dolt/(per-project).smooth.dbis gone; thedashboard reads "Dolt store (pearls + config)" instead of
"Database (SQLite)".
th pearls migrate-from-sqliteremoved —transitional tool, no longer needed.
3657db9: Run in sandbox — the agent does its work in a microVM, you review it live.
smooai/smooth-operatorimage (unified — agent installs toolchains atruntime via
mise; covers node/python/rust/go/bun/deno/~140 more).th run [pearl-id] [--keep-alive] [--image ...] [--memory-mb N]—dispatches via
/api/tasks, streams SSE events, optionally keeps theVM alive for dev-server review.
th operators list / kill <id>— see and tear down running VMs.th cache list / prune / path / clear— project-scoped sandboxcache at
~/.smooth/project-cache/<name>-<hash>/, bind-mountedat
/opt/smooth/cacheinside the VM. LRU prune by mtime.5173, 8000, 8080, 8888) on keep-alive runs; print reachable
http://localhost:<host>URLs after the agent completes.TaskRequest → SandboxConfig.4f91014:
th service— background service wrapper forth up.User-level install by default on all three platforms:
~/Library/LaunchAgents/com.smooai.smooth.plist,drives
launchctl bootstrap gui/$UID.~/.config/systemd/user/smooth.service, drivessystemctl --user enable --now. Prints a hint to runloginctl enable-lingerso the service survives logout.schtasks.Commands:
install [--system],uninstall,start,stop,restart,status,logs [-f].--systemprints the system-level artifact +install instructions to stdout instead of running under sudo.
Logs stream to
~/.smooth/service.logand~/.smooth/service.err.Patch Changes
11f0c00: Fix 5 cast_integration tests that had been failing in CI since the
Wonk bearer-token auth was added in
f7676d8. The release workflowhas been red for ~8 days, stranding 12 changesets and blocking every
version bump.
Root cause:
ALLOW_EXAMPLE_POLICYhas[auth] token = "test-token",so Wonk's
require_operator_tokenmiddleware rejects any requestwithout
Authorization: Bearer test-tokenwith a 401 (empty body).The tests built
reqwest::Client::new()directly and called.post(...).json(...).send().await.unwrap().json().await.unwrap(),which panicked at the final
.json()withreqwest::Error { kind: Decode, source: Error("EOF while parsing a value") }.Fix: introduce
TEST_AUTH_TOKEN = "test-token"next to the policyfixture, attach
.bearer_auth(TEST_AUTH_TOKEN)to every direct Wonkrequest, and switch
spawn_goalietoWonkClient::with_authso its/check/*calls carry the header too. Thegoalie_forwards_..._for_allowed_requesttest had surfaced as a
403 != 200assertion for the same reason —Goalie was failing its auth to Wonk and correctly denying the request.
Narc / Scribe / Archivist tests were never affected (those services
do not require auth).
3b1a88a: Diagnostic logging on the sandboxed dispatch path so we can tell
why
th run/th code --headlessfail when they do:bill::exec_sandboxlogs exec start + non-zero-exit withcaptured stdout/stderr tails (was silent before, making code=-1
failures opaque).
/bin/shprobe againstthe sandbox before exec-ing the runner — surfaces whether
bind-mounts landed, whether the runner binary is visible + executable,
and what the guest's
/optactually contains.Pearl
th-1ec3ce(P0) tracks the underlying issue: on plain alpine,microsandbox's bind-mounts aren't reaching the guest at all, so
every sandboxed dispatch fails with
exit=-1 stderr="". Fix requiresdigging into microsandbox's mount-arg plumbing; these changes just
give us the visibility to do it.
72f7eef: Fix P0 (th-1ec3ce): sandbox bind-mounts not landing in the guest VM.
The microsandbox guest agent does not
mkdir -pmount targets beforecalling
mount -t virtiofs— mounts to paths that don't pre-exist inthe rootfs (
/opt/smooth/bin,/opt/smooth/policy,/workspace)silently fail. We were falling back to plain
alpinebecause ourcustom
smooth-operatorimage was only in Docker Desktop's localstore and microsandbox couldn't pull it; alpine has an empty
/opt,so every mount missed.
Fix: publish
smooai/smooth-operatorandsmooai/boardroomimagesto GitHub Container Registry (public), and default to pulling from
there. The
Dockerfile.smooth-operatorpre-creates/workspace,/opt/smooth/bin, and/opt/smooth/cache/mise— so every bind-mounttarget now exists before the guest agent tries to mount on top of it.
SandboxConfigdefault image:alpine→ghcr.io/smooai/smooth-operator:latestth rundefault:smooai/smooth-operator:latest→ghcr.io/smooai/smooth-operator:latestscripts/build-smooth-operator-image.sh+build-boardroom-image.sh:default
SMOOTH_IMAGE_REPOtoghcr.io/smooai/..., add--pushflag so one command builds + publishes.
/opt/smooth/bin/smooth-operator-runneris executable inside the VM and the runner boots as expected.
Users can override with
SMOOTH_WORKER_IMAGE/SMOOTH_OPERATOR_IMAGEif they publish a fork to a different registry. Public pulls from
ghcr.io/smooai/*require no auth.3657db9: Buildable OCI images for the microVM cast:
docker/Dockerfile.smooth-operator+scripts/build-smooth-operator-image.sh→
smooai/smooth-operator:<version>(alpine + mise + runner).docker/Dockerfile.boardroom+scripts/build-boardroom-image.sh→
smooai/boardroom:<version>(alpine + boardroom bin + smooth-dolt).(
build-operator-runner.sh/build-boardroom.sh).build-boardroom.sh(
-p smooth-bigsmooth→smooai-smooth-bigsmooth).Still pending: registry publish on release so
microsandboxcanpull without Docker on end-user machines.
3657db9: Pearl fixes:
/api/pearls+/api/projects/pearlsdefault to unbounded(
?limit=0). The dashboard was silently capped at 100 — a repowith 150+ pearls showed "100 closed, 0 open" when the open ones
were past the limit. LLM tool callers still get a 100-row
default via
list_pearls().PearlStore::closeis now invoked on every error-path exit ofthe sandboxed dispatch handler (runner not found, workspace
create failed, LLM provider missing, runner exited non-zero).
Previously only exit-0 closed the pearl; leaked
Task: ...pearls accumulated from E2E runs.
install:thnow re-adhoc-signs a neighborsmooth-doltbinaryin
~/.cargo/bin/soscp'd copies work underlaunchdwithout a manual
codesign.3657db9:
th doctor --init-home-reposcaffolds~/.smooth/as a git repo forbackup / cross-machine sync. Writes a
.gitignorethat excludessecrets (
providers.json), service logs, audit logs, the Doltstore (has its own push/pull), the project cache, and ephemeral
debug captures. Idempotent. Optional
--remote <url>adds origin.3657db9: Wordmark + cast renames in user-facing surfaces:
thCLI + web dashboard now say "Big Smooth" (not "Leader") and"Smooth Operators" (not "Sandbox").
images/logo.png,crates/smooth-web/web/public/logo.svg)replaces the old mark.
th up/th status/th doctorbanners render "Smooth" withthe logo's gradient colors via ANSI 24-bit truecolor escapes
("Smoo" orange→pink, "th" teal→blue).
/healthservice field renamedsmooth-leader→big-smooth.SMOOTH_SANDBOX_MAX_CONCURRENCYenv +th up --max-operators Nflag expose the previously hardcoded pool cap of 3.
3b1a88a: Wordmark gradient (
"Smoo"orange→pink,"th"teal→blue) live inth up/th status/th doctorbanners via a newgradientmodule in smooth-cli. Helpersmooth()stitches thetwo halves into the full word;
smoo_ai()covers the Smoo AIbrand. Pure ANSI 24-bit truecolor, no new deps. 4 unit tests.