# mosaic.ps1 — Unified agent launcher and management CLI (Windows) # # Usage: # mosaic claude [args...] Launch Claude Code with SOUL.md injected # mosaic opencode [args...] Launch OpenCode # mosaic codex [args...] Launch Codex # mosaic init [args...] Generate SOUL.md interactively # mosaic doctor [args...] Health audit # mosaic sync [args...] Sync skills $ErrorActionPreference = "Stop" $MosaicHome = if ($env:MOSAIC_HOME) { $env:MOSAIC_HOME } else { Join-Path $env:USERPROFILE ".config\mosaic" } $Version = "0.1.0" function Show-Usage { Write-Host @" mosaic $Version - Unified agent launcher Usage: mosaic [args...] Agent Launchers: claude [args...] Launch Claude Code with SOUL.md injected opencode [args...] Launch OpenCode codex [args...] Launch Codex Management: init [args...] Generate SOUL.md (agent identity contract) doctor [args...] Audit runtime state and detect drift sync [args...] Sync skills from canonical source bootstrap Bootstrap a repo with Mosaic standards Options: -h, --help Show this help -v, --version Show version "@ } function Assert-MosaicHome { if (-not (Test-Path $MosaicHome)) { Write-Host "[mosaic] ERROR: ~/.config/mosaic not found." -ForegroundColor Red Write-Host "[mosaic] Install with: irm https://git.mosaicstack.dev/mosaic/bootstrap/raw/branch/main/remote-install.ps1 | iex" exit 1 } } function Assert-Soul { $soulPath = Join-Path $MosaicHome "SOUL.md" if (-not (Test-Path $soulPath)) { Write-Host "[mosaic] SOUL.md not found. Running mosaic init..." & (Join-Path $MosaicHome "bin\mosaic-init.ps1") } } function Assert-Runtime { param([string]$Cmd) if (-not (Get-Command $Cmd -ErrorAction SilentlyContinue)) { Write-Host "[mosaic] ERROR: '$Cmd' not found in PATH." -ForegroundColor Red Write-Host "[mosaic] Install $Cmd before launching." exit 1 } } if ($args.Count -eq 0) { Show-Usage exit 0 } $command = $args[0] $remaining = if ($args.Count -gt 1) { $args[1..($args.Count - 1)] } else { @() } switch ($command) { "claude" { Assert-MosaicHome Assert-Soul Assert-Runtime "claude" $soulFile = Join-Path $MosaicHome "SOUL.md" Write-Host "[mosaic] Launching Claude Code with SOUL.md injection..." & claude --append-system-prompt-file $soulFile @remaining } "opencode" { Assert-MosaicHome Assert-Soul Assert-Runtime "opencode" Write-Host "[mosaic] Launching OpenCode..." & opencode @remaining } "codex" { Assert-MosaicHome Assert-Soul Assert-Runtime "codex" Write-Host "[mosaic] Launching Codex..." & codex @remaining } "init" { Assert-MosaicHome & (Join-Path $MosaicHome "bin\mosaic-init.ps1") @remaining } "doctor" { Assert-MosaicHome & (Join-Path $MosaicHome "bin\mosaic-doctor.ps1") @remaining } "sync" { Assert-MosaicHome & (Join-Path $MosaicHome "bin\mosaic-sync-skills.ps1") @remaining } "bootstrap" { Assert-MosaicHome Write-Host "[mosaic] NOTE: mosaic-bootstrap-repo requires bash. Use Git Bash or WSL." -ForegroundColor Yellow & (Join-Path $MosaicHome "bin\mosaic-bootstrap-repo") @remaining } { $_ -in "-h", "--help" } { Show-Usage } { $_ -in "-v", "--version" } { Write-Host "mosaic $Version" } default { Write-Host "[mosaic] Unknown command: $command" -ForegroundColor Red Write-Host "[mosaic] Run 'mosaic --help' for usage." exit 1 } }