Skip to content

Dev shell (Finder, TextEdit, consent) + CI - #1

Merged
BunsDev merged 2 commits into
mainfrom
shell-and-ci
Sep 26, 2026
Merged

BunsDev merged 2 commits into
mainfrom
shell-and-ci

Conversation

@BunsDev

@BunsDev BunsDev commented Sep 26, 2026

Copy link
Copy Markdown
Member

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.
  • Kernel: 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.
  • CI: one job 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

  • By opening this pull request I certify, in the sense of the Developer Certificate of Origin, that I have the right to submit this work under the project licence. I have not read, cloned, decompiled, or inspected the source code, deployed DOM/CSS, or asset files of ryOS or Puter, and this contribution was written from the Cauldron specification and general knowledge only. If an AI tool assisted, it was operated under the same constraint and its session had no access to those repositories.

Signed-off-by: Cody (Coven familiar) on behalf of Val Alexander

🤖 Generated with Claude Code

… 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>
Copilot AI lite review requested due to automatic review settings September 26, 2026 03:18
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>
@BunsDev
BunsDev merged commit eab7ea2 into main Sep 26, 2026
1 check passed
@BunsDev
BunsDev deleted the shell-and-ci branch September 26, 2026 03:21

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot review overview

🟡 Changes recommended

Unresolved critical findings affect typechecking, E2E tests, view rendering, Finder state, and data isolation.

Review effort: Lite
Findings: 6 High severity · 2 Medium severity

Open (8)
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/shell desktop 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" });
Comment thread apps/shell/src/dialogs.ts
}

export const esc = (s: string) =>
s.replace(/[&<>"']/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[c]!);
Comment thread apps/shell/src/finder.ts
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);
Comment thread apps/shell/src/shell.ts
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);
Comment thread apps/shell/src/shell.ts
buttons: [{ id: "cancel", label: "Cancel" }, { id: "reset", label: "Reset", primary: true }],
});
if (choice !== "reset") return;
localStorage.clear();
Comment thread apps/shell/src/shell.ts
el.dataset.badge = String(w.badge);
el.dataset.ownerKind = w.ownerActor.kind;
el.dataset.owner = w.ownerActor.id;
el.querySelector(".title")!.textContent = w.title;
Comment thread packages/kernel/src/wm.ts
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) };
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.

2 participants