Title: Collagility Monorepo Architecture Specification (v1.0.0-draft)
Author: Staff Software Architect
Status: Draft / Proposal
Created: July 2026
Target Tooling: TypeScript, pnpm workspaces, TurboRepo, Fastify, Commander.js, Ink TUI
This document specifies the scalable monorepo architecture for Collagility, an open-source multiplayer workspace for local AI coding agents.
As Collagility expands across multiple client form factors (CLI (done), Web Application (future), VS Code Extension (future)) and backend components (Relay Server (done)), a strict monorepo strategy is essential to prevent code duplication, enforce type safety across network boundaries, maintain build determinism, and streamline package publishing.
This specification details the pnpm workspace directory tree, package boundaries, dependency flow rules, shared configuration packages, plugin extensions, build pipelines, CI/CD stages, and version management strategy designed for long-term production scalability.
The monorepo uses a modular multi-package structure organized into standard top-level workspaces: apps/, packages/, tools/, and docs/.
collagility/
├── .github/ # GitHub Actions CI/CD workflows & automation templates (done)
├── apps/ # Executable applications and entrypoint targets
│ ├── cli/ # Terminal CLI binary application (@collagility/cli) (done)
│ ├── server/ # Fastify WebSocket relay server (@collagility/server) (done)
│ └── web/ # Next.js Web browser client SPA (@collagility/web) (future)
├── packages/ # Core domain, shared libraries, and abstractions
│ ├── adapters/ # Multi-provider AI process adapters (@collagility/adapters) (done)
│ ├── protocol/ # WebSocket event schemas & serialization (@collagility/protocol) (done)
│ ├── sdk/ # Unified WebSocket SDK for clients (@collagility/sdk) (done)
│ ├── stream/ # Token chunking & stream assembler (@collagility/stream) (done)
│ └── types/ # Shared TypeScript domain interfaces (@collagility/types) (done)
├── docs/ # Architecture RFCs, user guides, API docs (done)
├── install.sh # Standalone quick installer script (done)
├── pnpm-workspace.yaml # pnpm workspace configuration file (done)
├── turbo.json # TurboRepo build pipeline definition (done)
├── tsconfig.base.json # Root TypeScript base configuration (done)
└── README.md # Project overview and quickstart (done)
apps/cli(@collagility/cli): The primary command-line binary. Uses Commander.js for CLI flag parsing and React/Ink for TUI rendering. Hosts local session drivers and handles terminal I/O streams.apps/server(@collagility/server): The stateless Fastify WebSocket and HTTP relay control plane. Manages authentication, room routing, Redis pub/sub fanout, and participant presence.apps/web(@collagility/web): Future Web Assembly / React web viewer enabling browser-based zero-install session observation.apps/vscode(@collagility/vscode): Future VS Code extension embedding Collagility session views into the IDE side-bar.
packages/core(@collagility/core): Contains framework-agnostic domain models (Session,Participant,Workspace), value objects, role policies, and application use cases. Zero external dependencies.packages/protocol(@collagility/protocol): Shared TypeScript types, JSON schemas, correlation utilities, and envelope serializers for the real-time WebSocket protocol (collagility-v1).packages/drivers(@collagility/drivers): AbstractIAgentDriverport definitions, process manager wrappers, and driver registry factory.packages/tui(@collagility/tui): Reusable React/Ink TUI components (side-chat, presence bar, prompt dialogs, ANSI stream view).packages/client-sdk(@collagility/client-sdk): High-level WebSocket client library encapsulating auto-reconnection, event ordering buffers, and RPC callbacks for non-CLI clients.
To maintain clean separation of concerns, dependencies MUST flow strictly from outer applications inward toward core domain packages. Circular dependencies between packages are strictly forbidden.
graph TD
subgraph Applications Layer ["Applications Tier (apps/)"]
CLI["@collagility/cli"]
Server["@collagility/server"]
Web["@collagility/web (Future)"]
VSCode["@collagility/vscode (Future)"]
end
subgraph Plugins Layer ["Plugins Tier (plugins/)"]
GeminiPlugin["@collagility/driver-gemini"]
ClaudePlugin["@collagility/driver-claude"]
end
subgraph Shared Packages ["Shared Libraries Tier (packages/)"]
ClientSDK["@collagility/client-sdk"]
TUI["@collagility/tui"]
Drivers["@collagility/drivers"]
Protocol["@collagility/protocol"]
Core["@collagility/core"]
Logger["@collagility/logger"]
end
CLI --> TUI
CLI --> ClientSDK
CLI --> Drivers
CLI --> Logger
Server --> Protocol
Server --> Core
Server --> Logger
Web --> ClientSDK
VSCode --> ClientSDK
GeminiPlugin --> Drivers
ClaudePlugin --> Drivers
ClientSDK --> Protocol
Drivers --> Core
TUI --> Protocol
Protocol --> Core
Shared development configurations are centralized under tools/ and packages/ to ensure consistent code styling, linting, and build settings across all workspace packages:
tools/eslint-config: Exported ESLint rulesets (@collagility/eslint-config/node,@collagility/eslint-config/react).tsconfig.json(Root Base): Strict base TypeScript configuration shared viaextends: "@collagility/tsconfig/base.json".
Collagility uses TurboRepo combined with pnpm to deliver incremental builds, parallel execution, and aggressive remote caching.
graph TD
Lint["turbo run lint"] --> TypeCheck["turbo run typecheck"]
TypeCheck --> Test["turbo run test"]
Test --> BuildCore["Build @collagility/core & protocol"]
BuildCore --> BuildDrivers["Build @collagility/drivers"]
BuildDrivers --> BuildApps["Build @collagility/cli & @collagility/server"]
BuildApps --> Bundle["Package Binaries & Docker Images"]
build: Depends on^build(topological dependency ordering). Outputsdist/**.test: Depends onbuild. Runs unit and integration tests.lint: Runs ESLint across all workspaces in parallel.
Workspace configurations follow a single-source-of-truth model:
- Package Management:
pnpm-workspace.yamldeclares package directories (apps/*,packages/*,plugins/*). - TypeScript Transpilation: Project References (
tsc --build) enable incremental type-checking without re-compiling unmodified dependencies. - Bundle Isolation: CLI binaries are bundled into single standalone executables using
esbuildto minimize startup cold-boot latency.
Collagility enforces a three-tiered testing hierarchy across the monorepo:
+-----------------------------------------------------------------------+
| 1. End-to-End Tests (Playwright / CLI Integration) |
| - Test full session host, join, and stream loop across WebSockets. |
+-----------------------------------------------------------------------+
| 2. Integration Tests (Vitest + Redis/Fastify Containers) |
| - Test protocol framing, session state transitions, auth guards. |
+-----------------------------------------------------------------------+
| 3. Unit Tests (Vitest) |
| - Test domain logic, driver adapters, and TUI component state. |
+-----------------------------------------------------------------------+
Continuous Integration workflows are executed via GitHub Actions on every pull request and push to main.
sequenceDiagram
autonumber
actor Dev as Developer Push
participant CI as GitHub Actions CI
participant Cache as Turbo Remote Cache
Dev->>CI: Git Push / PR Created
CI->>Cache: Fetch Cached Build Artifacts
CI->>CI: pnpm install --frozen-lockfile
CI->>CI: turbo run lint typecheck
CI->>CI: turbo run test (Unit & Integration)
CI->>CI: turbo run build
CI-->>Dev: Green Checkmark / Merge Ready
Collagility adopts Changesets for automated package versioning and changelog generation.
- Independent Versioning: Core packages (
@collagility/core,@collagility/protocol) maintain independent Semantic Versioning (SemVer:MAJOR.MINOR.PATCH). - CLI & Server Alignment: Executive applications (
@collagility/cliand@collagility/server) publish aligned release tags (e.g.v0.1.0).
To allow third-party developers to contribute AI provider drivers without modifying core codebase repositories, Collagility provides a pluggable driver discovery model:
graph LR
subgraph Core CLI Engine
Registry["Driver Registry"]
end
subgraph Native Plugins
Gemini["@collagility/driver-gemini"]
Claude["@collagility/driver-claude"]
end
subgraph Community Plugins
CustomPlugin["collagility-driver-custom"]
end
Registry -->|"Load at Runtime"| Gemini
Registry -->|"Load at Runtime"| Claude
Registry -.->|"Dynamic Import"| CustomPlugin
- Plugin Interface: Plugins export a standard factory function returning an
IAgentDriverinstance. - Discovery Mechanism: The CLI auto-detects installed npm packages matching the pattern
collagility-driver-*or@collagility/driver-*.
All architecture documents and user manuals reside under docs/:
docs/
├── RFC-0001-VISION-AND-REQUIREMENTS.md
├── RFC-0002-HIGH-LEVEL-ARCHITECTURE.md
├── RFC-0003-WEBSOCKET-PROTOCOL-SPECIFICATION.md
├── RFC-0004-SESSION-LIFECYCLE-SPECIFICATION.md
├── RFC-0005-AI-ADAPTER-ARCHITECTURE.md
└── RFC-0006-MONOREPO-ARCHITECTURE-SPECIFICATION.md
- Workspace Package Prefix: All official monorepo packages use the
@collagility/npm scope. - Directory Names: Kebab-case (e.g.,
client-sdk,driver-gemini). - Source Files: CamelCase for classes/components (
SessionController.ts), camelCase for utilities (serializeFrame.ts).
As Collagility matures, the monorepo is designed to seamlessly incorporate the following planned packages:
apps/desktop(@collagility/desktop): Tauri / Electron cross-platform desktop wrapper.plugins/driver-ollama(@collagility/driver-ollama): Local open-source model driver adapter.packages/crypto-e2ee(@collagility/crypto-e2ee): WebRTC Noise protocol end-to-end payload encryption package.