Skip to content

release: 0.0.22 — root-equivalent audit (#37), headless ecosystem mode (#42), review fixes - #43

Merged
steffenmaechtel merged 6 commits into
masterfrom
feature/improvement
Aug 24, 2026
Merged

release: 0.0.22 — root-equivalent audit (#37), headless ecosystem mode (#42), review fixes#43
steffenmaechtel merged 6 commits into
masterfrom
feature/improvement

Conversation

@steffenmaechtel

Copy link
Copy Markdown
Owner

What's in here

Release branch for 0.0.22 — two features from open issues, plus fixes and
test hardening from the project review (#36, extended to the full 0.0.15→0.0.22
delta).

Root-equivalent access audit (#37)

status.sh gains a report-only "Root-equivalent access" section: danger-group
check for the agent user (root-equivalent + credential-adjacent tiers), socket
scan over fixed paths plus the /mnt/wsl Docker Desktop / Rancher Desktop
integration sockets, Windows-interop exec probe, and a sudo-rules probe when
run as root. Pure stat math — no privileged probes, no prompts, no fixes
(removing access is an admin decision). ROOT_EQUIV_SOCKS override mirrors
LEAK_SCAN_DIRS. Documented in docs/concepts/security-model.md including
the deliberate non-findings (snapd peer-cred gate, setuid uidmap).

Headless mode for ecosystem tools (#42)

Research across the opencode ecosystem (official docs, awesome-opencode,
issue's two named tools) found two wrapper bugs beyond the 0.0.16 serve fix:

  • opencode run / acp / query subcommands printed the banner on stdout,
    breaking --format json / stream-json / JSON-RPC parsers (cezar, Vibe
    Kanban, eval-harness, CI runners, IDE agents)
  • the project-dir refusal blocked those invocations from git worktrees and
    temp checkouts

SERVE_MODE is generalized to HEADLESS covering serve, acp, run (message
arg or piped stdin), and query subcommands (models, agent, providers,
export, …): stdout stays machine-clean, diagnostics go to stderr, the CWD
check is skipped, container tools resolve silently. Interactive TUI starts
keep banner and check. The soft permission layer applies to every session as
before. Verified compatibility matrix shipped as
docs/reference/compatibility.md. OpenHarness researched too — not an
opencode client, no interaction with the kit.

Review 0.0.22 findings (issue #36)

  • fixed: the issue Migrate .agents/ folder to /home/opencode/.agents/ #19 migration copied ~/.claude WHOLE — move (the
    --yes default) transported Claude Code's .credentials.json into the
    agent's group-readable home. Scope now: ~/.agents whole (opencode's own
    namespace), ~/.claude/skills skills-only. e2e pins that credentials stay
    with the developer; security-model.md states the guarantee.
  • fixed: the audit section body never executed in CI (helpers were
    tested, wiring only grep-tested) — test-status.sh now runs the whole
    section under set -u against a real fake socket, red and green cases.
  • accepted: headless classifier counts flag values as message args
    (banner-only impact); documented.

Version

VERSION → 0.0.22.

Testing

  • make lint, make check-version, full unit suite green
  • Both e2e suites green: make e2e (236 checks, incl. new headless-run and
    migration-scope pins) and make e2e-rootless (42 checks)

Closes #37
Closes #42
Closes #36 (review)

…wsl desktop sockets, groups, interop) — issue #37

Report-only section in status.sh: danger-group check for the agent user
(root-equivalent tier + credential-adjacent tier), socket scan over fixed
paths plus the /mnt/wsl Docker Desktop / Rancher Desktop integration
sockets, Windows-interop exec probe, and a sudo-rules probe when run as
root. Pure stat math, no prompts, ROOT_EQUIV_SOCKS override. Unit tests
for both helpers; security-model.md documents the surface table and the
deliberate non-findings (snapd peer-cred gate, setuid uidmap).
…commands) — issue #42

Generalizes the 0.0.16 serve fix: orchestrators (cezar, Vibe Kanban,
eval harnesses, CI runners) spawn `opencode run` and parse stdout
(--format json), IDE agents use `opencode acp` (JSON-RPC over stdio),
and tools like cezar cache `opencode models` output. The wrapper
previously bannered on stdout (breaking those parsers) and refused
non-project CWDs (breaking worktree/temp-checkout invocations).

HEADLESS now covers serve, acp, run (message arg or piped stdin), and
the query subcommands: stdout stays machine-clean (diagnostics on
stderr), the project-dir check is skipped, and container tools resolve
silently (serve always; run/queries via project opt-in). The soft
permission layer applies to every session as before. Interactive TUI
starts keep banner and check. OpenHarness researched too — not an
opencode client (own harness/auth), no interaction with the kit.
New reference page listing tools that spawn opencode (UIs, orchestrators,
editor frontends, bots, plugins) with their invocation pattern and verified
status against the kit's wrapper, including the headless-contract link,
absolute-path and sudo-spawn caveats, and a last-verified stamp.
wrapper.md's inline tool listing now points at the matrix (single source
of truth).
…t -u (review 0.0.22)

The helper units covered the stat math, but the section body itself never
ran in CI — the e2e status.sh grep hits an earlier line and would pass
even if the section crashed. Extract-and-eval the whole section against
a real fake unix socket: world-writable (666) must flag AGENT-REACHABLE
red, group-writable with a foreign group must stay green. || true on the
captures (set -u deaths must not kill the runner, same pattern as
run_case).
… the agent home (review 0.0.22)

The issue #19 migration copied ~/.claude WHOLE, so move (the --yes
default) transported Claude Code's .credentials.json (OAuth tokens) and
account state into /home/opencode — group-readable, while the security
model kept promising no developer credentials are reachable. Scope now:
~/.agents migrates whole (opencode's own namespace), ~/.claude/skills
skills-only (the only part opencode loads); nothing else crosses, no
exclude list needed. Sub-path parents get the sharing baseline; the
guard never touches /home/opencode's mode 2750. e2e pins: credentials
stay with the developer, whole .agents moves, .claude parent survives.
Docs: getting-started, cli.md, security-model guarantee note.
Ships: root-equivalent access audit (#37), headless wrapper mode for
ecosystem tools (#42), compatibility matrix, skills-only .claude
migration (review finding), audit-section smoke tests (review 0.0.22).

@steffenmaechtel steffenmaechtel left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed

@steffenmaechtel
steffenmaechtel merged commit cd9a25a into master Aug 24, 2026
3 checks passed
@steffenmaechtel
steffenmaechtel deleted the feature/improvement branch August 24, 2026 19:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Check compatibility with other tools Check if there are other rootfull tools like docker Project review: 0.0.22

1 participant