2.9 KiB
2.9 KiB
Phase 4: EnterpriseArchitect Standards
Top-Level Structure
AgentCompany/
assets/
build/
docs/
scripts/
src/
main/
preload/
renderer/
shared/
tests/
unit/
integration/
e2e/
electron-builder.yml
package.json
tsconfig.json
.env.example
Process Boundaries
Main process owns
- window lifecycle
- app protocol registration
- IPC gateway
- menu construction
- native dialogs
- notifications
- updater
- backup/restore coordination
- safeStorage and vault bridge
Preload owns
- narrow typed API
- event subscription bridge
- no business logic
- no dynamic API exposure
Renderer owns
- UI composition
- read-only projections
- local interaction state
- invoking approved preload methods
Utility process owns
- run execution
- connector process supervision
- workspace and agent locking
- timeout handling
- normalized event emission
Naming Rules
- Use descriptive file names by role:
connector-service.ts,run-controller.ts,profile-repository.ts - Shared schemas live under
src/shared - No renderer component may import from
src/main - No preload module may import from
src/renderer
IPC Rules
- All channels are constants in
src/shared/contracts/ipc.ts - Every handler validates input with Zod before executing
- Response shape is always
{ ok, data, error } - Errors use explicit codes, never arbitrary thrown text at the renderer boundary
Security Rules
contextIsolation: truesandbox: truefor renderer windownodeIntegration: false- navigation locked to
app://content window.opendenied unless explicitly whitelisted- shell execution restricted to orchestration/connector host
- connector env injection uses allowlists, never raw
process.env
Resource Lifetime Rules
Following the memory-safety constraints for long-lived desktop processes:
- every event subscription returns a disposer
- every spawned child process is registered and terminated on app shutdown
- timers are stored centrally and cleared on teardown
- database handles are singleton-owned and closed during quit/update install
- utility-process channels are recreated deterministically after crash or restart
Module Boundaries
src/shared: pure types, schemas, ipc contracts, constantssrc/main/platform: OS integration, menu, notifications, pathssrc/main/storage: SQLite, migrations, repositoriessrc/main/services: profile, connectors, backups, updater, IPC compositionsrc/main/orchestrator: utility-process bootstrap and bridgesrc/renderer/pages: route-level viewssrc/renderer/components: reusable UI primitives and panelssrc/renderer/state: UI store, query clients, preferences
Non-Negotiable Constraints
- No ad hoc IPC from components
- No direct filesystem or shell access in renderer
- No secrets in renderer state
- No mixed god service containing windows, db, and orchestration together
- No placeholder routes or dead menu entries