Skip to content

refactor: DDD domain packages — replace @paws/types with colocated domains#55

Merged
arek-e merged 8 commits into
mainfrom
refactor/ddd-domain-packages
Mar 31, 2026
Merged

refactor: DDD domain packages — replace @paws/types with colocated domains#55
arek-e merged 8 commits into
mainfrom
refactor/ddd-domain-packages

Conversation

@arek-e
Copy link
Copy Markdown
Owner

@arek-e arek-e commented Mar 31, 2026

Summary

  • Create 8 domain packages under packages/domains/ with colocated types, stores, routes, and logic
  • Migrate all consumers from @paws/types to domain-specific imports
  • Delete @paws/types package entirely (was 15 source files + 14 test files)
  • Delete @paws/scheduler package (absorbed into @paws/domain-fleet)
  • Remove 13 duplicate files from control-plane (routes, stores, governance, events)

Domain packages

Package Contents
@paws/domain-common IdSchema, ErrorCode, ErrorResponse
@paws/domain-network NetworkConfig, NetworkAllocation, PortExposure
@paws/domain-browser BrowserConfig, BrowserAction, routes
@paws/domain-session Session, SessionStore, events, WS messages, routes
@paws/domain-daemon Daemon, Trigger, AgentConfig, Governance, DaemonStore, routes
@paws/domain-snapshot Snapshot, SnapshotConfig, templates, routes
@paws/domain-fleet Worker, FleetOverview, CostSummary, scheduler, routes
@paws/domain-audit AuditEvent, AuditStore, routes
@paws/domain-mcp McpServerConfig, McpToolCall, McpServerStore

Test plan

  • All domain packages typecheck independently
  • bun test passes (46/46 excluding pre-existing CLI issues)
  • Zero remaining @paws/types imports across the entire codebase
  • No circular dependencies between domain packages

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added domain-specific packages (@paws/domain-*) for audit, browser, daemon, fleet, MCP, network, session, and snapshot functionality.
    • Consolidated daemon stores, session management, and governance checking into dedicated domain packages.
  • Refactor

    • Reorganized codebase to use modular domain packages instead of a single centralized package.
    • Updated TypeScript configuration to use project references for improved build performance.

arek-e and others added 8 commits March 31, 2026 21:52
Create 6 domain packages with colocated types, stores, routes, and logic:
- @paws/domain-common: shared primitives (IdSchema, ErrorCode, ErrorResponse)
- @paws/domain-network: NetworkConfig, NetworkAllocation, PortExposure
- @paws/domain-browser: BrowserConfig, BrowserAction, routes
- @paws/domain-session: Session lifecycle, SessionStore, events, WS messages, routes
- @paws/domain-audit: AuditEvent, AuditStore, audit routes
- @paws/domain-mcp: McpServerConfig, McpToolCall, McpServerStore

Session domain consumers fully migrated (17 files). Other domain consumer
migrations pending — currently in dual-source state with @paws/types.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Daemon domain with colocated types, agent config, governance checker,
store interface + in-memory impl, and route definitions. Includes
Trigger types (webhook/schedule/watch/github), AgentConfig with
generateAgentScript(), and GovernanceChecker for rate limiting.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Snapshot domain with types (build request/response/status, size, jobs),
config (SnapshotConfig, SnapshotTemplateId), and 6 built-in templates
(minimal, node, python, docker, fullstack, claude-code).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fleet domain with Worker types, FleetOverview, CostSummary, and
scheduler (selectWorker, workerAvailableCapacity). Absorbs the
scheduling logic from @paws/scheduler into the fleet domain.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Zero remaining imports from @paws/types across the entire codebase.
All consumers now import directly from their domain package:

- ErrorCode/ErrorResponseSchema → @paws/domain-common
- NetworkAllocation/NetworkConfig/PortExposure → @paws/domain-network
- BrowserAction/BrowserConfig → @paws/domain-browser
- Session/SessionStore/WsMessages → @paws/domain-session
- Daemon/Trigger/AgentConfig/Governance → @paws/domain-daemon
- Snapshot/SnapshotConfig/templates → @paws/domain-snapshot
- Worker/FleetOverview/CostSummary → @paws/domain-fleet
- McpServerConfig/McpToolCall → @paws/domain-mcp
- AuditStore/AuditEvent → @paws/domain-audit

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Delete all type source files from @paws/types. The package is now empty
(exports {}). All types live in their domain packages under packages/domains/.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove the @paws/types package entirely. Fix all tsconfig project
references to point to domain packages instead. Fix inline import()
references in app.ts, autoscaler.ts, executor.ts, and SDK client.

The monorepo now has zero references to @paws/types.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove all duplicate code from control-plane that now lives in domain packages:
- routes: browser, audit, daemons, webhooks, fleet, snapshots, snapshot-configs, templates, sessions
- stores: audit, mcp (+ their tests)
- governance.ts, events.ts

Delete @paws/scheduler entirely — absorbed into @paws/domain-fleet.

Add routes to domain-fleet (fleet overview, workers, cost) and domain-snapshot
(build, list, configs CRUD, templates).

Control-plane app.ts now imports everything from domain packages.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@arek-e arek-e merged commit 55c7e10 into main Mar 31, 2026
0 of 3 checks passed
@arek-e arek-e deleted the refactor/ddd-domain-packages branch March 31, 2026 21:14
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 31, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1e7373b1-d03e-4ed0-84a3-57f850f1a0e8

📥 Commits

Reviewing files that changed from the base of the PR and between 75db10c and 4eb9ac2.

⛔ Files ignored due to path filters (1)
  • bun.lock is excluded by !**/*.lock
📒 Files selected for processing (132)
  • apps/control-plane/package.json
  • apps/control-plane/src/app.ts
  • apps/control-plane/src/autoscaler.ts
  • apps/control-plane/src/discovery/index.ts
  • apps/control-plane/src/discovery/k8s.ts
  • apps/control-plane/src/discovery/pangolin.ts
  • apps/control-plane/src/discovery/registry.ts
  • apps/control-plane/src/discovery/routing.test.ts
  • apps/control-plane/src/discovery/static.ts
  • apps/control-plane/src/errors.ts
  • apps/control-plane/src/events.test.ts
  • apps/control-plane/src/events.ts
  • apps/control-plane/src/governance.test.ts
  • apps/control-plane/src/index.ts
  • apps/control-plane/src/metrics.ts
  • apps/control-plane/src/routes/mcp.ts
  • apps/control-plane/src/routes/servers.ts
  • apps/control-plane/src/routes/sessions.ts
  • apps/control-plane/src/routes/settings.test.ts
  • apps/control-plane/src/routes/settings.ts
  • apps/control-plane/src/routes/webhooks.ts
  • apps/control-plane/src/routes/ws.ts
  • apps/control-plane/src/store/audit.test.ts
  • apps/control-plane/src/store/builds.ts
  • apps/control-plane/src/store/daemons.ts
  • apps/control-plane/src/store/mcp.test.ts
  • apps/control-plane/src/store/sessions.ts
  • apps/control-plane/src/store/snapshot-configs.ts
  • apps/control-plane/src/store/templates.ts
  • apps/control-plane/src/worker-client.ts
  • apps/control-plane/tsconfig.json
  • apps/dashboard/package.json
  • apps/dashboard/src/api/client.ts
  • apps/dashboard/src/components/SessionTable.tsx
  • apps/dashboard/src/components/WorkerCard.tsx
  • apps/dashboard/src/components/topology/useTopologyLayout.ts
  • apps/dashboard/src/hooks/useWebSocket.ts
  • apps/dashboard/src/pages/Snapshots.tsx
  • apps/dashboard/src/pages/Topology.tsx
  • apps/dashboard/tsconfig.json
  • apps/worker/package.json
  • apps/worker/src/routes.ts
  • apps/worker/src/session/executor.ts
  • apps/worker/src/tunnel/pangolin-resources.ts
  • apps/worker/tsconfig.json
  • package.json
  • packages/cli/package.json
  • packages/cli/src/commands/status.test.ts
  • packages/cli/src/commands/status.tsx
  • packages/cli/tsconfig.json
  • packages/domains/audit/package.json
  • packages/domains/audit/src/index.ts
  • packages/domains/audit/src/routes.ts
  • packages/domains/audit/src/store.ts
  • packages/domains/audit/tsconfig.json
  • packages/domains/browser/package.json
  • packages/domains/browser/src/index.ts
  • packages/domains/browser/src/routes.ts
  • packages/domains/browser/src/types.ts
  • packages/domains/common/package.json
  • packages/domains/common/src/index.ts
  • packages/domains/daemon/package.json
  • packages/domains/daemon/src/agent.ts
  • packages/domains/daemon/src/governance.ts
  • packages/domains/daemon/src/index.ts
  • packages/domains/daemon/src/routes.ts
  • packages/domains/daemon/src/store.ts
  • packages/domains/daemon/src/types.ts
  • packages/domains/daemon/tsconfig.json
  • packages/domains/fleet/package.json
  • packages/domains/fleet/src/fleet.ts
  • packages/domains/fleet/src/index.ts
  • packages/domains/fleet/src/routes.ts
  • packages/domains/fleet/src/scheduler.ts
  • packages/domains/fleet/src/worker.ts
  • packages/domains/fleet/tsconfig.json
  • packages/domains/mcp/package.json
  • packages/domains/mcp/src/index.ts
  • packages/domains/mcp/src/store.ts
  • packages/domains/mcp/src/types.ts
  • packages/domains/mcp/tsconfig.json
  • packages/domains/network/package.json
  • packages/domains/network/src/index.ts
  • packages/domains/session/package.json
  • packages/domains/snapshot/package.json
  • packages/domains/snapshot/src/config.ts
  • packages/domains/snapshot/src/index.ts
  • packages/domains/snapshot/src/routes-configs.ts
  • packages/domains/snapshot/src/routes-snapshots.ts
  • packages/domains/snapshot/src/routes-templates.ts
  • packages/domains/snapshot/src/templates.ts
  • packages/domains/snapshot/src/types.ts
  • packages/domains/snapshot/tsconfig.json
  • packages/firecracker/package.json
  • packages/firecracker/src/network/ip-pool.ts
  • packages/firecracker/src/network/iptables.test.ts
  • packages/firecracker/src/network/iptables.ts
  • packages/firecracker/src/network/tap.test.ts
  • packages/firecracker/src/network/tap.ts
  • packages/firecracker/tsconfig.json
  • packages/mcp-server/package.json
  • packages/mcp-server/tsconfig.json
  • packages/scheduler/src/index.ts
  • packages/scheduler/src/select.test.ts
  • packages/scheduler/vitest.config.ts
  • packages/sdk/package.json
  • packages/sdk/src/client.test.ts
  • packages/sdk/src/client.ts
  • packages/sdk/src/errors.ts
  • packages/sdk/src/index.ts
  • packages/sdk/tsconfig.json
  • packages/types/src/agent.test.ts
  • packages/types/src/browser.test.ts
  • packages/types/src/common.test.ts
  • packages/types/src/common.ts
  • packages/types/src/daemon.test.ts
  • packages/types/src/error.test.ts
  • packages/types/src/error.ts
  • packages/types/src/fleet.test.ts
  • packages/types/src/index.ts
  • packages/types/src/mcp.test.ts
  • packages/types/src/network.test.ts
  • packages/types/src/network.ts
  • packages/types/src/session.test.ts
  • packages/types/src/session.ts
  • packages/types/src/snapshot-config.test.ts
  • packages/types/src/snapshot.test.ts
  • packages/types/src/worker.test.ts
  • packages/types/src/ws.test.ts
  • packages/types/src/ws.ts
  • packages/types/vitest.config.ts
  • tsconfig.json

📝 Walkthrough

Walkthrough

This refactoring migrates the monorepo from a monolithic @paws/types package to a domain-driven architecture with specialized @paws/domain-* packages. Type definitions and implementations are moved into their respective domains, TypeScript configurations are reorganized to use project references, and build scripts are updated to use tsc --build instead of tsc --noEmit across multiple packages.

Changes

Cohort / File(s) Summary
New Domain Packages: Audit
packages/domains/audit/package.json, packages/domains/audit/src/index.ts, packages/domains/audit/src/store.ts, packages/domains/audit/tsconfig.json
New @paws/domain-audit package exporting audit store factory and types, with comment cleanups in store logic and full package infrastructure.
New Domain Packages: Browser
packages/domains/browser/package.json, packages/domains/browser/src/index.ts, packages/domains/browser/src/routes.ts
New @paws/domain-browser package providing browser-related schemas/types and route handlers; updates error schema import source to @paws/domain-common.
New Domain Packages: Common
packages/domains/common/package.json, packages/domains/common/src/index.ts
Rebrands @paws/scheduler@paws/domain-common, exports primitive schemas (DurationMsSchema, IdSchema, PortSchema, etc.) and error types (ErrorCode, ErrorResponseSchema).
New Domain Packages: Daemon
packages/domains/daemon/package.json, packages/domains/daemon/src/governance.ts, packages/domains/daemon/src/index.ts, packages/domains/daemon/src/routes.ts, packages/domains/daemon/src/store.ts, packages/domains/daemon/src/types.ts, packages/domains/daemon/tsconfig.json
New @paws/domain-daemon package providing daemon governance, store implementation, route handlers, and schemas; adds receiveWebhookRoute POST endpoint; updates type imports from @paws/types to domain-specific packages.
New Domain Packages: Fleet
packages/domains/fleet/package.json, packages/domains/fleet/src/index.ts, packages/domains/fleet/src/routes.ts, packages/domains/fleet/src/scheduler.ts, packages/domains/fleet/src/worker.ts, packages/domains/fleet/tsconfig.json
New @paws/domain-fleet package exporting worker/fleet schemas, types, scheduler utilities (selectWorker, workerAvailableCapacity), and routes; updates type imports and documentation.
New Domain Packages: MCP
packages/domains/mcp/package.json, packages/domains/mcp/src/index.ts, packages/domains/mcp/src/store.ts, packages/domains/mcp/tsconfig.json
Renames @paws/types@paws/domain-mcp, exports MCP server config/tool schemas, types, and store; updates type import source for McpServerConfig.
New Domain Packages: Network
packages/domains/network/package.json, packages/domains/network/src/index.ts
New @paws/domain-network package providing network/credential/port exposure schemas and types for VM networking configuration.
New Domain Packages: Snapshot
packages/domains/snapshot/package.json, packages/domains/snapshot/src/config.ts, packages/domains/snapshot/src/index.ts, packages/domains/snapshot/src/routes-configs.ts, packages/domains/snapshot/src/routes-snapshots.ts, packages/domains/snapshot/src/routes-templates.ts, packages/domains/snapshot/src/templates.ts, packages/domains/snapshot/src/types.ts, packages/domains/snapshot/tsconfig.json
New @paws/domain-snapshot package for snapshot management; updates error/schema imports to domain-specific sources; adds comprehensive route handlers and template utilities.
Control Plane Type Imports
apps/control-plane/src/app.ts, apps/control-plane/src/autoscaler.ts, apps/control-plane/src/discovery/*.ts, apps/control-plane/src/errors.ts, apps/control-plane/src/governance.test.ts, apps/control-plane/src/index.ts, apps/control-plane/src/metrics.ts, apps/control-plane/src/routes/mcp.ts, apps/control-plane/src/routes/servers.ts, apps/control-plane/src/routes/settings.ts, apps/control-plane/src/routes/ws.ts, apps/control-plane/src/worker-client.ts
Updates type imports from @paws/types to domain-specific packages; consolidates route/store imports to use domain package re-exports instead of local modules.
Control Plane Store Removals
apps/control-plane/src/events.ts, apps/control-plane/src/routes/sessions.ts, apps/control-plane/src/routes/webhooks.ts, apps/control-plane/src/store/audit.test.ts
Removes local session events pub/sub implementation, session route handlers, webhook routes, and audit store tests (moved to domain packages).
Control Plane Store Refactoring
apps/control-plane/src/store/builds.ts, apps/control-plane/src/store/daemons.ts, apps/control-plane/src/store/mcp.test.ts, apps/control-plane/src/store/sessions.ts, apps/control-plane/src/store/snapshot-configs.ts, apps/control-plane/src/store/templates.ts
Updates type imports across store modules; replaces local createSessionStore with domain package re-export while keeping SQLite adapter logic intact; removes MCP test suite.
Dashboard App Updates
apps/dashboard/package.json, apps/dashboard/src/api/client.ts, apps/dashboard/src/components/SessionTable.tsx, apps/dashboard/src/components/WorkerCard.tsx, apps/dashboard/src/components/topology/useTopologyLayout.ts, apps/dashboard/src/hooks/useWebSocket.ts, apps/dashboard/src/pages/Snapshots.tsx, apps/dashboard/src/pages/Topology.tsx, apps/dashboard/tsconfig.json
Updates type imports from @paws/types to domain packages; replaces HTML elements with shared UI components (Table, Card, Badge, Button, Progress, Skeleton, Alert); updates TypeScript config to extend app-react config with project references.
Worker App Updates
apps/worker/package.json, apps/worker/src/routes.ts, apps/worker/src/session/executor.ts, apps/worker/src/tunnel/pangolin-resources.ts, apps/worker/tsconfig.json
Updates type imports from @paws/types to domain packages; changes TypeScript config to extend app-bun config with project references to firecracker, logger, proxy, snapshot-store.
CLI Package Updates
packages/cli/package.json, packages/cli/src/commands/status.test.ts, packages/cli/src/commands/status.tsx, packages/cli/tsconfig.json
Updates type imports from @paws/types to domain packages; changes TypeScript config to extend library config with references to common and sdk domains.
Firecracker Package Updates
packages/firecracker/package.json, packages/firecracker/src/network/ip-pool.ts, packages/firecracker/src/network/iptables.test.ts, packages/firecracker/src/network/iptables.ts, packages/firecracker/src/network/tap.test.ts, packages/firecracker/src/network/tap.ts, packages/firecracker/tsconfig.json
Replaces @paws/types dependency with @paws/domain-network; updates all network-related type imports; modifies TypeScript config to extend library config with domain-network reference.
SDK Package Updates
packages/sdk/package.json, packages/sdk/src/client.test.ts, packages/sdk/src/client.ts, packages/sdk/src/errors.ts, packages/sdk/src/index.ts, packages/sdk/tsconfig.json
Replaces @paws/types with domain-specific dependencies; updates all type imports and error handling casts; updates type re-exports to source from specific domain packages; modifies TypeScript config to extend library config with common reference.
MCP Server Package Updates
packages/mcp-server/package.json, packages/mcp-server/tsconfig.json
Removes @paws/types dependency; updates TypeScript config to extend library config with references to common and sdk.
Scheduler Package Cleanup
packages/scheduler/src/index.ts, packages/scheduler/src/select.test.ts, packages/scheduler/vitest.config.ts
Removes re-exports of scheduler functions; deletes test suite and Vitest config (scheduler functionality moved to fleet domain).
Removed Types Package Content
packages/types/src/agent.test.ts, packages/types/src/browser.test.ts, packages/types/src/common.test.ts, packages/types/src/common.ts, packages/types/src/daemon.test.ts, packages/types/src/error.test.ts, packages/types/src/error.ts, packages/types/src/fleet.test.ts, packages/types/src/index.ts, packages/types/src/mcp.test.ts, packages/types/src/network.test.ts, packages/types/src/network.ts, packages/types/src/session.test.ts, packages/types/src/session.ts, packages/types/src/snapshot-config.test.ts, packages/types/src/snapshot.test.ts, packages/types/src/worker.test.ts, packages/types/src/ws.test.ts, packages/types/src/ws.ts, packages/types/vitest.config.ts
Removes all schema definitions, type aliases, and test suites from the old monolithic types package (logic migrated to respective domain packages).
TypeScript Configuration Refactoring
apps/control-plane/tsconfig.json, tsconfig.json
Updates root tsconfig.json to use project references architecture instead of single config; updates app configs to extend shared configurations and reference dependent domain packages.
Build Script Updates
apps/control-plane/package.json, apps/dashboard/package.json, apps/worker/package.json, packages/cli/package.json, packages/firecracker/package.json, packages/mcp-server/package.json, packages/sdk/package.json, package.json
Changes typecheck script from tsc --noEmit to tsc --build across multiple packages; adds root-level typecheck:root, test:affected, typecheck:affected scripts; updates check and clean scripts to run additional linting and cleanup tasks.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes


🐰 Hop along the domain path, where types now scatter,
Each package finds its home, each schema's placement does matter,
References link the projects in a web of build,
The monolith dissolves—a new architecture rebuilt!

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/ddd-domain-packages

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.

1 participant