Dev shell (Finder, TextEdit, consent) + CI - #1
Merged
Merged
Conversation
… hidden
apps/shell (@opencoven/cauldron-shell): plain-DOM desktop on the kernel.
Menu bar, draggable/resizable windows, Finder list view (sort, navigate,
new folder, rename, trash, Get Info with provenance), TextEdit (save,
save-as, dirty title, drafts, "Changed by <familiar>" banner), kernel
consent dialog ("Sage wants to change … Allow / Not now"), localStorage
persistence. window.cauldron.as(id).exec() drives the public command bus.
Kernel: wm.setTitle/setDocumentPath; an agent window opened behind focus
shifts so 40px peeks out (found by visual acceptance: a centered agent
window was fully covered by Finder).
CI: one job "unit + e2e" — kernel tests, typecheck, Playwright Chromium.
Tests: kernel 43/43; shell e2e 20/20 (WM-01..09, FND-01/02/03/05/06/08,
TXT-01/02/05/07, VFS-07 UI).
Clean-room attestation: written from the Cauldron spec and general
knowledge only; no ryOS or Puter source, DOM, CSS, or assets consulted.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Apply once the repo is public or the org plan allows rulesets: gh api -X POST repos/OpenCoven/cauldron/rulesets --input .github/rulesets/main.json Today it returns 403 (Free plan + private repo). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Unresolved critical findings affect typechecking, E2E tests, view rendering, Finder state, and data isolation.
Review effort: Lite
Findings: 6
Open (8)
Add required ifRev to acceptance test command · New Pass ifRev in opt-in screenshot test · New Type replacement map before indexing with string key · New Handle create failure before entering rename mode · New Register views before constructor-triggered rendering · New Limit reset to shell-namespaced localStorage keys · New Update section aria-label when the window title changes · New Ensure fallback placement remains visible for full-area windows · New
What changed in this PR
Adds a browser-based development shell with Finder, TextEdit, dialogs, persistence, window-manager enhancements, Playwright coverage, and CI.
Changes:
- Adds the
apps/shelldesktop UI and command-bus harness. - Extends kernel window metadata and agent-window placement.
- Adds workspace tooling, E2E tests, CI, and branch rules.
| File | Reviewed change and findings |
|---|---|
README.md |
Documents the shell and commands. Nit (1 vote): the example omits required ifRev. |
packages/kernel/test/wm.test.ts |
Adds window-manager behavior tests. Nit (1 vote): the new test lacks a spec-row identifier. |
packages/kernel/src/wm.ts |
Adds title/document metadata and agent peeking. Nit (1 vote): document events are not asserted. Moderate (3 votes): full-area focused windows can still hide agents. |
package.json |
Adds workspaces and scripts. |
package-lock.json |
Locks workspace dependencies. |
apps/shell/vite.config.ts |
Configures the shell dev server. |
apps/shell/tsconfig.json |
Configures strict TypeScript checking. |
apps/shell/src/types.ts |
Defines shell view and menu types. |
apps/shell/src/textedit.ts |
Implements TextEdit. Moderate (1 vote): collision-renamed moves may be treated as deletion. |
apps/shell/src/storage.ts |
Implements localStorage persistence. |
apps/shell/src/slate.css |
Adds shell styling. |
apps/shell/src/shell.ts |
Implements desktop orchestration. Moderate (3 votes): ARIA labels can become stale. Critical (1 vote): views can render before registration. Critical (2 votes): reset clears unrelated origin data. Moderate (1 vote): restored untitled names can collide. |
apps/shell/src/main.ts |
Boots the shell and exposes the harness. |
apps/shell/src/finder.ts |
Implements Finder. Critical (3 votes): failed folder creation still enters rename mode. Moderate (1 vote): deleting the current folder can make the fallback listing fail. |
apps/shell/src/dialogs.ts |
Implements modal dialogs. Critical (1 vote): strict typechecking fails for the replacement map indexing. |
apps/shell/playwright.config.ts |
Configures Playwright. |
apps/shell/package.json |
Defines shell scripts and dependencies. |
apps/shell/index.html |
Provides the shell entrypoint. |
apps/shell/e2e/screenshots.spec.ts |
Adds screenshot acceptance coverage. Critical (1 vote): the create command omits required ifRev. |
apps/shell/e2e/desktop.spec.ts |
Adds desktop acceptance tests. Critical (1 vote): the create command omits required ifRev. |
.gitignore |
Ignores generated test artifacts. |
.github/workflows/ci.yml |
Adds unit, typecheck, and E2E CI. |
.github/rulesets/main.json |
Configures branch protections. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| }); | ||
|
|
||
| test("FND-08 Get Info on a familiar's file shows who created and modified it", async ({ page }) => { | ||
| expect(await sage(page, "vfs.create", { path: "/Shared/sources.md", kind: "file", content: "- a source" })).toMatchObject({ ok: true }); |
| await page.goto("/"); | ||
| await page.evaluate(async () => { | ||
| const sage = window.cauldron.as("sage"); | ||
| await sage.exec("vfs.create", { path: "/Shared/sources.md", kind: "file", content: "# Sources\n- AgentRoom\n- YoloFS\n" }); |
| } | ||
|
|
||
| export const esc = (s: string) => | ||
| s.replace(/[&<>"']/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[c]!); |
Comment on lines
+113
to
+115
| await this.#run(() => this.#shell.kernel.vfs.create(u, this.#join(name), "folder")); | ||
| this.#selected = name; | ||
| this.startRename(name); |
| w.appId === "finder" | ||
| ? new FinderView(this, w.id, s as { path?: string }) | ||
| : new TextEditView(this, w.id, s as { path?: string }); | ||
| this.#views.set(w.id, view); |
| buttons: [{ id: "cancel", label: "Cancel" }, { id: "reset", label: "Reset", primary: true }], | ||
| }); | ||
| if (choice !== "reset") return; | ||
| localStorage.clear(); |
| el.dataset.badge = String(w.badge); | ||
| el.dataset.ownerKind = w.ownerActor.kind; | ||
| el.dataset.owner = w.ownerActor.id; | ||
| el.querySelector(".title")!.textContent = w.title; |
| if (right + r.w <= area.x + area.w) return { ...r, x: right }; | ||
| const left = over.x - peek; | ||
| if (left >= area.x) return { ...r, x: left }; | ||
| return { ...r, y: Math.max(area.y, over.y - this.#m.titleBarHeight - peek) }; |
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.


What & why
Adds the dev shell that the spec's UI acceptance rows run against, plus CI.
apps/shell— plain-DOM desktop on@opencoven/cauldron: menu bar, draggable/resizable windows, Finder list view (sort, navigate, new folder, rename, trash, Get Info with provenance), TextEdit (save, save-as, dirty title, drafts, "Changed by ‹familiar›" banner), kernel consent dialog, localStorage persistence.window.cauldron.as(id).exec(op, args)drives the public command bus as a familiar.wm.setTitle/wm.setDocumentPath; an agent window opened behind focus now shifts so 40px peeks out. Visual acceptance found a centered agent window fully hidden behind Finder; spec §4.2 and WM-09 updated.unit + e2e— kernel tests, typecheck, Playwright (Chromium).Spec rows covered
Kernel 43/43 · Shell e2e 20/20: WM-01…09, FND-01/02/03/05/06/08, TXT-01/02/05/07, VFS-07 (UI).
Not yet: FND-04 (drag between windows), FND-07 (desktop icons), TXT-03 (undo), TXT-04, TXT-06 (find), icon view.
Clean-room attestation
Signed-off-by: Cody (Coven familiar) on behalf of Val Alexander
🤖 Generated with Claude Code