Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
3667ae6
chore(spec-lint): split AGENTS.md's budget into prose plus a per-inde…
nedtwigg Aug 31, 2026
d5a844c
docs(dor-tool): re-cut the design — opt-in identity, port-triggered s…
nedtwigg Aug 31, 2026
8b47a63
feat(host): dormouse.yml parsing, dedupe keys, and the repo-trust record
nedtwigg Aug 31, 2026
6cfe6b7
feat(dor): `dor tool` and the tool Surface kind
nedtwigg Aug 31, 2026
d25ffc7
feat(tool): the tool Surface — host plumbing, params, and the two-cap…
nedtwigg Aug 31, 2026
3ed079b
feat(tool): `surface.tool` handler, the serving trigger, and the trus…
nedtwigg Aug 31, 2026
08b0ef9
feat(tool): OSC 367 — the announcement that disambiguates, never mints
nedtwigg Aug 31, 2026
fada288
feat(tool): ab-screencast rendering, so an agent can drive a tool's b…
nedtwigg Aug 31, 2026
dc780bb
docs(dor-tool): promote the atom above the fold; gate it on dormouse.…
nedtwigg Aug 31, 2026
a8c4c08
fix(tool): hide the inactive half with visibility, not display
nedtwigg Aug 31, 2026
8375116
simplify(tool): apply /simplify findings
nedtwigg Aug 31, 2026
50a625d
fix(tool): apply the correctness review — namespaced keys, safe rende…
nedtwigg Aug 31, 2026
a1d7fe4
chore(website): disclose the yaml dependency
nedtwigg Aug 31, 2026
1b05bdf
fix(tool): address the PR #493 review
nedtwigg Aug 31, 2026
ba789ca
fix(tool): make the size-cap tests load-bearing; stop offering pop-ou…
nedtwigg Aug 31, 2026
c460a83
fix(tool): gate pop-out at both registration sites; make the gate tes…
nedtwigg Aug 31, 2026
3d61939
fix(tool): call isToolParams in the controller; correct the header's …
nedtwigg Aug 31, 2026
cff909d
fix(tool): actually move the orphaned doc comment
nedtwigg Aug 31, 2026
0e3e7f1
feat(tool): autobind — declare the port strategy, and refuse to guess…
nedtwigg Aug 31, 2026
f572c11
feat(tool): key trust on the upstream remote, and ask in the pane
nedtwigg Aug 31, 2026
8bdb85c
fix(tool): let a late announcement override a committed conflict
nedtwigg Aug 31, 2026
22dbf2b
simplify(tool): apply /simplify findings
nedtwigg Aug 31, 2026
b5820bb
fix(tool): the pending-approval flow was broken end to end
nedtwigg Aug 31, 2026
a100a1b
fix(tools): stage approved shell before reveal
nedtwigg Aug 31, 2026
55269c6
fix(tools): bound untrusted tool file reads
nedtwigg Aug 31, 2026
433af76
fix(tools): respawn commands on session restore
nedtwigg Aug 31, 2026
71c2369
fix(tools): retire browser resources on exit
nedtwigg Aug 31, 2026
10d7e7b
fix(tools): route terminal-face clipboard keys
nedtwigg Aug 31, 2026
4eb2ea8
fix(tools): preserve untouched state until input
nedtwigg Aug 31, 2026
7abc558
fix(tools): validate integration before approval
nedtwigg Aug 31, 2026
14e11ac
fix(tools): serialize trust-file grants
nedtwigg Aug 31, 2026
e493eae
fix(tools): report revealed reuse as visible
nedtwigg Aug 31, 2026
437b650
fix(tools): start approved minimized sessions
nedtwigg Aug 31, 2026
c599f7a
fix(tools): guard untouched destructive actions
nedtwigg Aug 31, 2026
053c489
fix(tools): report revealed pending reuse
nedtwigg Aug 31, 2026
1ad6eb9
fix(tools): expire orphaned trust locks
nedtwigg Aug 31, 2026
149ea04
fix(tools): reject symlinks on every host
nedtwigg Aug 31, 2026
f4dff4d
fix(tools): resolve trust upstream host-side
nedtwigg Aug 31, 2026
a3f5995
fix(tools): preserve browser navigation
nedtwigg Aug 31, 2026
4592af2
fix(tools): reveal pending approval surfaces
nedtwigg Aug 31, 2026
a4123e9
docs(tools): repair trust approval flow
nedtwigg Aug 31, 2026
9254df4
fix(tools): confirm keyboard kills
nedtwigg Aug 31, 2026
5e18609
fix(tools): remove untrusted grant URL
nedtwigg Aug 31, 2026
fb6d7ee
fix(tools): make stale lock recovery race-free
nedtwigg Aug 31, 2026
d5fd9b9
refactor(tools): reuse tool params classifier
nedtwigg Aug 31, 2026
a6521f0
docs(tools): sync untouched kill shortcuts
nedtwigg Aug 31, 2026
a131c0e
fix(tools): migrate legacy trust lock
nedtwigg Aug 31, 2026
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ standalone/sidecar/dor-cli/
standalone/sidecar/iframe-proxy.cjs
standalone/sidecar/agent-browser-host.cjs
standalone/sidecar/remote-host.cjs
standalone/sidecar/tool-host.cjs
standalone/sidecar/node_modules/
standalone/node_modules/

Expand Down
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ Use one implementation map per spec: either an exhaustive `Files` / `Code Map` s
- **`docs/specs/theme.md`** — Theme system: the two-layer CSS variable strategy, the consumed-token resolver, the terminal color contract, and the theme debugger.
- **`docs/specs/dor-cli.md`** — The `dor` CLI staged onto every Dormouse terminal's `PATH`: bundling + env contract, `spawnAndCapture` rules for external binaries, control-socket plumbing, the Surface handle model, and the command set.
- **`docs/specs/dor-browser.md`** — The unified browser surface: `BrowserPanel` with swappable `renderMode`, browser chrome, the agent-browser stack, and the iframe proxy + CSP boundaries. Builds on the handle model in dor-cli.md.
- **`docs/specs/dor-tool.md`** — Dor Tools (design-stage): the `tool` Surface — a terminal and a browser on one Session spine — with its capability-gated verb model and OSC 367 contract. Only the capability gating is implemented.
- **`docs/specs/dor-tool.md`** — Dor Tools: the `tool` Surface — a terminal and a browser on one Session spine — its capability-gated verbs, the port scan that grows the browser, `dormouse.yml` identity, the repo-trust gate, and OSC 367. Behind the `dormouse.flags.tools` flag.
- **`docs/specs/vscode.md`** — VS Code host layer: webview hosting, webview ↔ Workspace mapping, persistence ordering, theme integration, CSP, and the build/dogfood pipeline. The transport protocol it speaks lives in transport.md.
- **`docs/specs/standalone.md`** — Standalone (Tauri) host layer: the Rust ↔ Node-sidecar bridge, boot sequence, AppBar, persistence, shutdown ordering, and the build/dev workflow. The transport protocol it speaks lives in transport.md.
- **`docs/specs/auto-update.md`** — Standalone auto-update: check → user-approved download → install-on-quit, the Baseboard update notice, Windows sidecar teardown, and per-platform quit behavior.
Expand Down Expand Up @@ -90,7 +90,7 @@ Specs are written ahead of the code on purpose: a new component's spec starts as
- **Reservations.** When unbuilt design constrains present code — a reserved wire field, a reserved ref grammar, an additive-evolution guarantee — state that constraint in the body, marked `Reserved:`, pointing at the `## Future` item it serves. Test: if deleting the sentence would let someone break future compatibility today, it belongs in the body.
- **Promotion is part of done.** Implementing a staged item is not finished until its text moves above the fold — rewritten from "will" to "is", with `Source of truth:` added — and the built portion is deleted from `## Future`. Never leave completed plan text (build orders, phase lists) below the fold; delete it — git history keeps the record.

The mechanically checkable parts of these conventions are enforced by `scripts/spec-lint.mjs` (`pnpm lint:specs`, also the first step of the root `pnpm test`): every spec indexed here, `## Future` last, relative links/anchors resolving, backticked repo paths existing on disk, the leading glossary callout wherever its vocabulary is used, one implementation map per spec, scopes defined exactly once with references resolving, `Reserved:` paragraphs naming `## Future` or a scope, and every `*.rationale.md` pairing with its spec, keyed by that spec's headings, with no `## Future`. It also ratchets file size: every spec, rationale file, and this file carries a word budget in `scripts/spec-word-budgets.json`, and growth past it fails the lint — cut, or raise the budget deliberately in the same PR. `SELF_HOST.md` — the one spec living outside `docs/specs/` — rides the same checks.
The mechanically checkable parts of these conventions are enforced by `scripts/spec-lint.mjs` (`pnpm lint:specs`, also the first step of the root `pnpm test`): every spec indexed here, `## Future` last, relative links/anchors resolving, backticked repo paths existing on disk, the leading glossary callout wherever its vocabulary is used, one implementation map per spec, scopes defined exactly once with references resolving, `Reserved:` paragraphs naming `## Future` or a scope, and every `*.rationale.md` pairing with its spec, keyed by that spec's headings, with no `## Future`. It also ratchets file size: every spec, rationale file, and this file carries a word budget in `scripts/spec-word-budgets.json`, and growth past it fails the lint — cut, or raise the budget deliberately in the same PR. This file's budget is split — conventions prose and each spec-index line are capped separately, so adding a spec never costs another spec's routing line. `SELF_HOST.md` — the one spec living outside `docs/specs/` — rides the same checks.

Advisory spec/comment reviews follow `docs/prose-audit.md` (`pnpm audit:prose`).

Expand Down
13 changes: 13 additions & 0 deletions docs/specs/dor-cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,12 @@ on `dor-lib-common`. It owns three concerns:
argument containing a literal `%VAR%`** — `cmd.exe` expands it on the way
through a `.cmd` shim, an unavoidable batch limitation. Today's forwarded
arguments (URLs, selectors, the host's hardcoded `eval` scripts) carry none.
- **`git` is the second caller.** The host resolves a project's upstream for the
Dor Tools trust key (`docs/specs/dor-tool.md` -> Trust). `spawnAndCapture`
exposes no `cwd` and the sidecar's is `/` under a macOS `.app`, so the
directory travels in argv as `git -C <absolute path>` — a host-resolved
project root, never a raw string off the wire. Both subcommands are
repository-local, so no credential prompt can block on the closed stdin.
- **`windowsHide`.** cross-spawn runs `.cmd` shims through `cmd.exe`; without it
each spawn flashes a focus-stealing console window — and the panel's
screenshot loop spawns one per stream-frame pulse, so a live page would
Expand Down Expand Up @@ -342,6 +348,13 @@ baseboard. `dor list` rows sort by the Workspace-stable `surface:N` ref, whose
registry `Wall` owns and persists with the session, independent of Lath layout
order.

`dor tool` runs a command as a Dor Tool — a Surface that grows a browser in
place once the command binds a port. It uses the `ensure` spawn path's
mechanics but **not** its command+cwd matching: a tool has an identity only if
a `dormouse.yml` entry gave it one. Source of truth: `dor/src/commands/tool.ts`,
help snapshot `dor/test/snapshots/help/tool.md`; behavior is owned by
`docs/specs/dor-tool.md`.

**Port enumeration is opt-in.** When the request sets `includePorts` (`dor list
--ports` / `--port`), the host calls `PlatformAdapter.getOpenPorts(id)`
(`docs/specs/dor-browser.md` → Dev-Server Chip) for each terminal Surface in
Expand Down
Loading