# 09. Repository Structure Proposal ## 1. Decision **Choose: Monorepo for LetsBe first-party code, with OpenClaw kept as separate pinned upstream dependency.** This is the best speed/quality tradeoff for a 3-month launch while preserving the non-fork requirement. ## 2. Why This Over Multi-Repo ## 2.1 Benefits - Shared TypeScript contracts across Hub, Mobile, Website, and Safety services. - One CI graph with selective test execution and consistent policy checks. - Easier cross-cutting refactors (API shape changes, auth, telemetry schema updates). - Better fit for AI-assisted coding workflows where context continuity matters. ## 2.2 Risks - Larger repo and CI complexity. - Migration effort from existing repo layout. ## 2.3 Mitigations - Use path-based CI execution and build caching. - Keep OpenClaw external to avoid massive vendor code in monorepo. - Execute migration in controlled steps with history-preserving imports. ## 3. Proposed Structure ```text letsbe-platform/ apps/ hub/ # Next.js admin + customer portal + APIs website/ # public onboarding and marketing app mobile/ # React Native + Expo services/ safety-wrapper/ # OpenClaw plugin package egress-proxy/ # LLM redaction proxy provisioner/ # provisioning controller + scripts/templates packages/ api-contracts/ # OpenAPI specs + TS SDKs policy-engine/ # shared classification and gate logic tooling-sdk/ # adapter framework + SECRET_REF utilities ui-kit/ # shared design components (web/mobile where possible) config/ # eslint/tsconfig/jest/shared tooling infra/ gitea-workflows/ docker/ scripts/ docs/ architecture-proposal/ runbooks/ ``` ## 4. OpenClaw Upstream Strategy (No Fork) OpenClaw remains outside monorepo as independent upstream source: - Track pinned release tag in `services/safety-wrapper/openclaw-version.lock`. - CI job pulls pinned OpenClaw version for compatibility tests. - Upgrade workflow: 1. open compatibility PR bumping lock file 2. run hook-contract test suite 3. run staging canary tenants 4. promote if green If a temporary patch is unavoidable, maintain patch as isolated overlay and upstream contribution plan; do not maintain long-lived fork branch. ## 5. Migration Plan From Current Repos ## 5.1 Current Inputs - `letsbe-hub` - `letsbe-ansible-runner` - `letsbe-orchestrator` (reference only, not migrated as active runtime) - `letsbe-sysadmin-agent` (reference only, patterns ported into Safety) - `openclaw` (kept external) ## 5.2 Migration Steps 1. Create monorepo skeleton and shared package manager workspace. 2. Import `letsbe-hub` into `apps/hub` with history. 3. Import `letsbe-ansible-runner` into `services/provisioner`. 4. Create new `services/safety-wrapper` and `services/egress-proxy`. 5. Scaffold `apps/mobile` and `apps/website`. 6. Extract shared contracts from hub into `packages/api-contracts`. 7. Add compatibility adapters so existing deployments continue during transition. 8. Archive deprecated repos as read-only references after cutover. ## 6. Governance Model - CODEOWNERS by area (`hub`, `safety`, `provisioner`, `mobile`, `website`). - Required reviewer policy: - 2 reviewers for `safety-wrapper`, `egress-proxy`, `provisioner` secrets paths. - 1 reviewer for non-security UI changes. - Architectural Decision Records (ADR) stored under `docs/adr`. ## 7. Alternative Considered: Keep Multi-Repo Rejected for v1 because cross-repo contract drift is already visible in current state (legacy APIs, deprecated stacks, stale references). Under a 12-week launch window, contract drift risk is higher than monorepo migration overhead. ## 8. Post-Launch Option After launch, if team scaling or compliance requirements demand stricter isolation, split out mobile and website into separate repos while preserving shared contract package publication.