13 KiB
Moonrepo Migration Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Migrate the monorepo to moonrepo for centralized task orchestration, caching, and consistent dependency management across all 7 apps.
Architecture: moonrepo sits as a task orchestration layer above the existing Nix build system. .moon/tasks/ holds shared task definitions (TypeScript and Rust). Each app gets a moon.yml with tags and inter-project dependencies. Nix, Docker Compose, git submodules, and infra remain untouched.
Tech Stack: moonrepo CLI, Node 22, Bun, TypeScript 5+, Cargo (Rust)
Task 1: Install moonrepo CLI and scaffold .moon/ directory
Files:
-
Create:
.moon/workspace.yml -
Create:
.moon/toolchain.yml -
Create:
.moon/tasks/(directory) -
Step 1: Install moonrepo CLI via curl
curl -fsSL https://moonrepo.dev/install/moon.sh | bash
- Step 2: Verify installation
Run: moon --version
Expected: prints version number (e.g., moon 1.x.x)
- Step 3: Create .moon/ scaffold directories
mkdir -p .moon/tasks
- Step 4: Commit
git add .moon/
git commit -m "chore: scaffold .moon/ directory for moonrepo"
Task 2: Configure workspace.yml
Files:
-
Create:
.moon/workspace.yml -
Step 1: Write .moon/workspace.yml
# https://moonrepo.dev/docs/config/workspace
$schema: "https://moonrepo.dev/schemas/workspace.json"
projects:
- "apps/*"
vcs:
manager: "git"
defaultBranch: "main"
runner:
implicitDeps:
# TypeScript apps: lint depends on build (for typecheck path)
- "typescript-build.build"
cacheTtl: 604800
- Step 2: Validate config structure
Run: moon check
Expected: no errors (will warn about missing project configs — expected)
- Step 3: Commit
git add .moon/workspace.yml
git commit -m "chore: configure moonrepo workspace with project glob"
Task 3: Configure toolchain.yml
Files:
-
Create:
.moon/toolchain.yml -
Step 1: Write .moon/toolchain.yml
# https://moonrepo.dev/docs/config/toolchain
$schema: "https://moonrepo.dev/schemas/toolchain.json"
node:
version: "22.11.0"
packageManager: "bun"
bun:
version: "1.3.11"
typescript:
syncProjectReferences: true
createMissingConfig: false
routeOutDirToCache: false
- Step 2: Commit
git add .moon/toolchain.yml
git commit -m "chore: configure moonrepo toolchain (Node 22, Bun 1.3)"
Task 4: Create shared TypeScript task definitions
Files:
-
Create:
.moon/tasks/typescript-build.yml -
Create:
.moon/tasks/typescript-lint.yml -
Create:
.moon/tasks/typescript-test.yml -
Step 1: Write .moon/tasks/typescript-build.yml
# https://moonrepo.dev/docs/config/tasks
$schema: "https://moonrepo.dev/schemas/tasks.json"
tasks:
build:
command: "bun run build"
inputs:
- "src/**/*"
- "tsconfig.json"
- "package.json"
outputs:
- ".next"
- "dist"
- ".output"
options:
cache: true
dev:
command: "bun run dev"
local: true
options:
persistent: true
- Step 2: Write .moon/tasks/typescript-lint.yml
# https://moonrepo.dev/docs/config/tasks
$schema: "https://moonrepo.dev/schemas/tasks.json"
tasks:
lint:
command: "bun run lint"
inputs:
- "src/**/*"
- "eslint.config.mjs"
- "tsconfig.json"
options:
cache: false
typecheck:
command: "bun run check-types"
inputs:
- "src/**/*"
- "tsconfig.json"
options:
cache: false
- Step 3: Write .moon/tasks/typescript-test.yml
# https://moonrepo.dev/docs/config/tasks
$schema: "https://moonrepo.dev/schemas/tasks.json"
tasks:
test:
command: "bun test"
inputs:
- "src/**/*"
- "test/**/*"
- "tests/**/*"
- "vitest.config.ts"
options:
cache: false
e2e:
command: "noop"
local: true
options:
cache: false
- Step 4: Commit
git add .moon/tasks/typescript-build.yml .moon/tasks/typescript-lint.yml .moon/tasks/typescript-test.yml
git commit -m "chore: add shared TypeScript task definitions"
Task 5: Create shared Rust task definitions
Files:
-
Create:
.moon/tasks/rust-build.yml -
Create:
.moon/tasks/rust-test.yml -
Create:
.moon/tasks/rust-lint.yml -
Step 1: Write .moon/tasks/rust-build.yml
# https://moonrepo.dev/docs/config/tasks
$schema: "https://moonrepo.dev/schemas/tasks.json"
tasks:
build:
command: "cargo build --release"
platform: system
inputs:
- "src/**/*"
- "Cargo.toml"
- "Cargo.lock"
- "build.rs"
outputs:
- "target/release/*"
options:
cache: true
envFile: false
dev:
command: "cargo run"
platform: system
local: true
options:
persistent: true
envFile: false
- Step 2: Write .moon/tasks/rust-test.yml
# https://moonrepo.dev/docs/config/tasks
$schema: "https://moonrepo.dev/schemas/tasks.json"
tasks:
test:
command: "cargo test"
platform: system
inputs:
- "src/**/*"
- "Cargo.toml"
- "Cargo.lock"
- "tests/**/*"
options:
cache: false
envFile: false
- Step 3: Write .moon/tasks/rust-lint.yml
# https://moonrepo.dev/docs/config/tasks
$schema: "https://moonrepo.dev/schemas/tasks.json"
tasks:
lint:
command: "cargo clippy -- -D warnings"
platform: system
inputs:
- "src/**/*"
- "Cargo.toml"
options:
cache: false
envFile: false
fmt-check:
command: "cargo fmt --check"
platform: system
inputs:
- "src/**/*"
options:
cache: false
envFile: false
- Step 4: Commit
git add .moon/tasks/rust-build.yml .moon/tasks/rust-test.yml .moon/tasks/rust-lint.yml
git commit -m "chore: add shared Rust task definitions"
Task 6: Create per-app moon.yml for TypeScript apps
Files:
-
Create:
apps/nextjs/moon.yml -
Create:
apps/elysia/moon.yml -
Create:
apps/solidjs/moon.yml -
Step 1: Write apps/nextjs/moon.yml
# https://moonrepo.dev/docs/config/project
$schema: "https://moonrepo.dev/schemas/project.json"
type: "application"
language: "typescript"
platform: "node"
tags:
- "lang:typescript"
- "type:frontend"
dependsOn:
- id: "rust-auth"
- id: "elysia"
- Step 2: Write apps/elysia/moon.yml
# https://moonrepo.dev/docs/config/project
$schema: "https://moonrepo.dev/schemas/project.json"
type: "application"
language: "typescript"
platform: "bun"
tags:
- "lang:typescript"
- "type:backend"
- Step 3: Write apps/solidjs/moon.yml
# https://moonrepo.dev/docs/config/project
$schema: "https://moonrepo.dev/schemas/project.json"
type: "application"
language: "typescript"
platform: "bun"
tags:
- "lang:typescript"
- "type:frontend"
dependsOn:
- id: "elysia"
- id: "rust-auth"
- Step 4: Commit
git add apps/nextjs/moon.yml apps/elysia/moon.yml apps/solidjs/moon.yml
git commit -m "chore: add moon.yml for TypeScript apps (nextjs, elysia, solidjs)"
Task 7: Create per-app moon.yml for Rust apps
Files:
-
Create:
apps/rust/moon.yml -
Create:
apps/rust-auth/moon.yml -
Create:
apps/leptos/moon.yml -
Step 1: Write apps/rust/moon.yml
# https://moonrepo.dev/docs/config/project
$schema: "https://moonrepo.dev/schemas/project.json"
type: "application"
language: "rust"
platform: "system"
tags:
- "lang:rust"
- "type:backend"
fileGroups:
sources:
- "src/**/*.rs"
- "Cargo.toml"
- "Cargo.lock"
- "build.rs"
- "rustfmt.toml"
- Step 2: Write apps/rust-auth/moon.yml
# https://moonrepo.dev/docs/config/project
$schema: "https://moonrepo.dev/schemas/project.json"
type: "application"
language: "rust"
platform: "system"
tags:
- "lang:rust"
- "type:backend"
fileGroups:
sources:
- "src/**/*.rs"
- "Cargo.toml"
- "Cargo.lock"
- Step 3: Write apps/leptos/moon.yml
# https://moonrepo.dev/docs/config/project
$schema: "https://moonrepo.dev/schemas/project.json"
type: "application"
language: "rust"
platform: "system"
tags:
- "lang:rust"
- "type:frontend"
dependsOn:
- id: "rust"
fileGroups:
sources:
- "src/**/*.rs"
- "Cargo.toml"
- "Cargo.lock"
- "Trunk.toml"
- "rust-toolchain.toml"
- Step 4: Commit
git add apps/rust/moon.yml apps/rust-auth/moon.yml apps/leptos/moon.yml
git commit -m "chore: add moon.yml for Rust apps (rust, rust-auth, leptos)"
Task 8: Create moon.yml for 9router
Files:
-
Create:
apps/9router/moon.yml -
Step 1: Write apps/9router/moon.yml
# https://moonrepo.dev/docs/config/project
$schema: "https://moonrepo.dev/schemas/project.json"
type: "application"
language: "unknown"
platform: "system"
tags:
- "type:router"
fileGroups:
sources:
- "src/**/*"
- "next.config.mjs"
- "package.json"
- Step 2: Commit
git add apps/9router/moon.yml
git commit -m "chore: add moon.yml for 9router"
Task 9: Update flake.nix — add moon CLI to devShell
Files:
-
Modify:
flake.nix -
Step 1: Add moon to nativeBuildInputs in flake.nix
Find the devShells.default block in flake.nix. Add moon to nativeBuildInputs:
devShells.default = pkgs.mkShell {
name = "ultimate-asepharyana-dev";
nativeBuildInputs = with pkgs; [
rustToolchain
bun
nodejs_22
pkg-config
openssl
trunk
wasm-bindgen-cli
binaryen
process-compose
mysql84
redis
minio-client
gh
git
moon # <-- add this line
];
# ... shellHook unchanged
};
- Step 2: Verify Nix can still evaluate the flake
Run: nix flake check --no-build 2>&1 | head -20
Expected: no evaluation errors
- Step 3: Commit
git add flake.nix
git commit -m "chore: add moon CLI to Nix devShell"
Task 10: Update .gitignore
Files:
-
Modify:
.gitignore -
Step 1: Add moonrepo cache entries to .gitignore
Append to .gitignore:
# moonrepo
.moon/cache
.~moon
- Step 2: Commit
git add .gitignore
git commit -m "chore: add moonrepo cache entries to .gitignore"
Task 11: Validate installation with moon check
Files: (none — validation only)
- Step 1: Run moon check
moon check
Expected: OK or zero errors. If warnings about unresolved project IDs appear, verify that apps/* glob in workspace.yml matches all project directories.
- Step 2: Run moon query projects
moon query projects
Expected: lists all 7 projects with their tags: nextjs, elysia, solidjs, rust, rust-auth, leptos, 9router
- Step 3: Verify tag queries work
moon query projects --tag lang:typescript
Expected: nextjs, elysia, solidjs
moon query projects --tag lang:rust
Expected: rust, rust-auth, leptos
- Step 4: Commit (if any fixes were needed)
No commit needed if check passes clean.
Task 12: Test — moon run build on TypeScript apps
Files: (none — test only)
- Step 1: Build nextjs
moon run nextjs:build
Expected: next build runs successfully, outputs to .next/
- Step 2: Build elysia
moon run elysia:build
Expected: bun build runs successfully, outputs to dist/
- Step 3: Build solidjs
moon run solidjs:build
Expected: vinxi build runs successfully, outputs to .output/
- Step 4: Verify caching on second build (nextjs)
moon run nextjs:build
Expected: Cached — no rebuild, uses moonrepo cache
Task 13: Test — moon run lint and test
Files: (none — test only)
- Step 1: Run lint across TypeScript apps
moon run :lint
Expected: all apps with a lint task run it. Note failures as they exist pre-migration (not caused by moonrepo).
- Step 2: Run tests across TypeScript apps
moon run :test
Expected: all apps with a test task run it.
- Step 3: Run tag-scoped commands
moon run --tag lang:typescript :build
Expected: builds nextjs, elysia, solidjs only (not Rust apps).
Task 14: Final commit and documentation
Files:
-
Modify:
.gitignore(if any final updates) -
Step 1: Final moon check
moon check
Expected: clean, no errors.
- Step 2: Commit any remaining changes
git status
If nothing outstanding, move on.
- Step 3: Verify the full workspace is clean
git status
Expected: working tree clean.