Add AGENTS.md, CLAUDE.md, and the agents-docs/ tree (workflow, lessons, engineering standards, context map, ADR seed, feature template) plus a domain-bearing CONTEXT.md for each of the six subdomains: toju-app, electron, server, e2e, website, docs-site. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.8 KiB
Desktop Shell (electron)
Owns the desktop runtime: the Electron main process, the preload bridge that exposes window.api to the renderer, IPC handlers, the local TypeORM + sql.js database, the plugin loader, OS-integration adapters (window controls, idle detection, game detection, audio), update flow, and the Local API server that hosts the Docusaurus bundle inside the app.
Format reference:
- Vocabulary — bold term, one-sentence definition, aliases to avoid.
- Relationships — bullets with bold terms and cardinality.
- Boundaries / IO — what this subdomain exposes and consumes.
- Invariants — rules that always hold.
- Flagged ambiguities — terms in dispute with proposed resolutions.
See
agents-docs/AGENTS_CONTEXT.mdfor the contract. Update in the same turn a trigger fires (seeagents-docs/AGENT_WORKFLOW.md§ CONTEXT.md upkeep).
Vocabulary
| Term | Definition | Aliases to avoid |
|---|---|---|
| Preload bridge | electron/preload.ts — the only surface that the renderer can call into Node through; exposes window.api.* after contextBridge.exposeInMainWorld. |
"preloader" |
| IPC handler | A main-process function registered against an IPC channel name; lives under electron/ipc/ (system, window-controls) and electron/cqrs.ts. |
"rpc handler" |
| CQRS handler | Command or query handler dispatched through electron/ipc/cqrs.ts; pattern shared with server/src/cqrs/. |
"command processor" |
| Local API server | An in-process HTTP server (electron/api/local-api-server.ts) that serves the prebuilt Docusaurus docs and OpenAPI views to the renderer over http://localhost:<port>/. |
"internal API" |
| Plugin library | The plugin loader (electron/plugin-library.ts) — resolves manifests, validates entry points, and prepares the sandbox the renderer mounts plugins into. |
"plugin manager" |
| Data archive | The export/import format implemented in electron/data-archive.ts for moving a user's local database between installs. |
"backup" |
Relationships
- The Preload bridge is the only path between the Renderer (toju-app) and Main; the renderer cannot import Electron, Node, or TypeORM directly.
- An IPC channel maps 1:1 to a method on
window.api.*. Adding a method on the preload requires registering its handler inelectron/ipc/orelectron/cqrs.ts. - The Plugin library loads manifests at startup and on user action; it owns the contract the renderer's plugins domain consumes (defined in
toju-app/src/app/shared-kernel/plugin-system.contracts.ts). - TypeORM migrations in
electron/migrations/are applied on startup against the per-user SQLite file resolved byelectron/runtime-paths.ts. - The Local API server serves the Docusaurus bundle built into
docs-site/build/and the OpenAPI artifacts underelectron/api/openapi.ts.
Boundaries / IO
- Exposes:
window.api.*surface (preload bridge) — the canonical IPC contract for the renderer.- IPC channel names registered in
electron/ipc/index.ts,electron/ipc/cqrs.ts,electron/ipc/system.ts,electron/ipc/window-controls.ts. - Local API HTTP endpoints (
electron/api/router.ts) underhttp://localhost:<port>/. - Plugin host contract (
electron/plugin-library.ts) — defines what plugin manifests must declare and what the plugin runtime can call back into.
- Consumes:
- The renderer (toju-app) via IPC
invoke/handleand event emitters. - The local SQLite database via
electron/data-source.tsand entities underelectron/entities/. - OS APIs: window controls, idle detection (
electron/idle/), game detection (electron/game-detection/), process list (electron/process-list.ts). - The audio worklet bundle (
toju-app/public/rnnoise-worklet.jsbuilt from@timephy/rnnoise-wasm).
- The renderer (toju-app) via IPC
Invariants
- The Renderer never has direct access to Node, the filesystem, or the database — every privileged operation goes through an IPC handler.
- Every schema change is accompanied by a TypeORM migration; the database is never mutated outside the migration system.
- IPC handler errors are translated to typed error envelopes before crossing back into the renderer — the renderer never sees a raw
Errorfrom main. - The Preload bridge exposes a frozen, allow-listed set of methods; adding a method requires touching both
preload.tsand the matching handler.
Flagged ambiguities
- None recorded yet — add entries when an IPC channel name or plugin contract term resists clean definition.
Agent-procedural rules (TDD, lint, build) live in /AGENTS.md. Cross-context contract details (IPC envelope shapes, plugin manifest schema) belong in agents-docs/features/. This file is the bounded-context domain artefact for the desktop shell.