From b38cfac760894448b7d3f1e66a7dc1ff9810967b Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Wed, 1 Apr 2026 21:19:21 -0500 Subject: [PATCH] feat: integrate framework files into monorepo under packages/mosaic/framework/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Moves all Mosaic framework runtime files from the separate bootstrap repo into the monorepo as canonical source. The @mosaic/mosaic npm package now ships the complete framework — bin scripts, runtime configs, tools, and templates — enabling standalone installation via npm install. Structure: packages/mosaic/framework/ ├── bin/ 28 CLI scripts (mosaic, mosaic-doctor, mosaic-sync-skills, etc.) ├── runtime/ Runtime adapters (claude, codex, opencode, pi, mcp) ├── tools/ Shell tooling (git, prdy, orchestrator, quality, etc.) ├── templates/ Agent and repo templates ├── defaults/ Default identity files (AGENTS.md, STANDARDS.md, SOUL.md, etc.) ├── install.sh Legacy bash installer └── remote-install.sh One-liner remote installer Key files with Pi support and recent fixes: - bin/mosaic: launch_pi() with skills-local loop - bin/mosaic-doctor: --fix auto-wiring for all 4 harnesses - bin/mosaic-sync-skills: Pi as 4th link target, symlink-aware find - bin/mosaic-link-runtime-assets: Pi settings.json patching - bin/mosaic-migrate-local-skills: Pi skill roots, symlink find - runtime/pi/RUNTIME.md + mosaic-extension.ts Package ships 251 framework files in the npm tarball (278KB compressed). --- eslint.config.mjs | 1 + packages/mosaic/framework/bin/mosaic | 849 +++ .../framework/bin/mosaic-bootstrap-repo | 126 + .../mosaic/framework/bin/mosaic-clean-runtime | 147 + packages/mosaic/framework/bin/mosaic-critical | 9 + packages/mosaic/framework/bin/mosaic-doctor | 435 ++ .../framework/bin/mosaic-ensure-excalidraw | 119 + .../bin/mosaic-ensure-sequential-thinking | 262 + packages/mosaic/framework/bin/mosaic-init | 424 ++ .../framework/bin/mosaic-link-runtime-assets | 136 + .../framework/bin/mosaic-log-limitation | 9 + .../framework/bin/mosaic-migrate-local-skills | 88 + .../framework/bin/mosaic-orchestrator-drain | 33 + .../bin/mosaic-orchestrator-matrix-consume | 12 + .../bin/mosaic-orchestrator-matrix-cycle | 19 + .../bin/mosaic-orchestrator-matrix-publish | 12 + .../framework/bin/mosaic-orchestrator-run | 12 + .../bin/mosaic-orchestrator-sync-tasks | 12 + packages/mosaic/framework/bin/mosaic-projects | 218 + .../framework/bin/mosaic-prune-legacy-runtime | 95 + .../mosaic/framework/bin/mosaic-quality-apply | 65 + .../framework/bin/mosaic-quality-verify | 52 + .../framework/bin/mosaic-release-upgrade | 124 + .../mosaic/framework/bin/mosaic-session-end | 9 + .../mosaic/framework/bin/mosaic-session-start | 9 + .../mosaic/framework/bin/mosaic-sync-skills | 183 + packages/mosaic/framework/bin/mosaic-upgrade | 218 + .../framework/bin/mosaic-upgrade-slaves | 116 + packages/mosaic/framework/bin/mosaic-wizard | 25 + packages/mosaic/framework/defaults/AGENTS.md | 175 + packages/mosaic/framework/defaults/README.md | 345 ++ packages/mosaic/framework/defaults/SOUL.md | 49 + .../mosaic/framework/defaults/STANDARDS.md | 60 + packages/mosaic/framework/defaults/TOOLS.md | 257 + packages/mosaic/framework/defaults/USER.md | 37 + packages/mosaic/framework/install.sh | 260 + packages/mosaic/framework/remote-install.sh | 63 + .../mosaic/framework/runtime/claude/CLAUDE.md | 13 + .../framework/runtime/claude/RUNTIME.md | 104 + .../runtime/claude/context7-integration.md | 301 ++ .../runtime/claude/hooks-config.json | 286 + .../claude/settings-overlays/jarvis-loop.json | 53 + .../framework/runtime/claude/settings.json | 240 + .../mosaic/framework/runtime/codex/RUNTIME.md | 40 + .../framework/runtime/codex/instructions.md | 13 + .../framework/runtime/mcp/EXCALIDRAW.json | 7 + .../runtime/mcp/SEQUENTIAL-THINKING.json | 8 + .../framework/runtime/opencode/AGENTS.md | 13 + .../framework/runtime/opencode/RUNTIME.md | 25 + .../mosaic/framework/runtime/pi/RUNTIME.md | 61 + .../framework/runtime/pi/mosaic-extension.ts | 255 + .../framework/templates/SOUL.md.template | 45 + .../framework/templates/TOOLS.md.template | 56 + .../framework/templates/USER.md.template | 30 + .../templates/agent/AGENTS.md.template | 159 + .../templates/agent/CLAUDE.md.template | 211 + .../mosaic/framework/templates/agent/SPEC.md | 75 + .../agent/fragments/campsite-rule.md | 21 + .../templates/agent/fragments/code-review.md | 15 + .../agent/fragments/commit-format.md | 11 + .../agent/fragments/conditional-loading.md | 17 + .../templates/agent/fragments/multi-agent.md | 7 + .../templates/agent/fragments/secrets.md | 10 + .../agent/projects/django/AGENTS.md.template | 166 + .../agent/projects/django/CLAUDE.md.template | 225 + .../projects/nestjs-nextjs/AGENTS.md.template | 178 + .../projects/nestjs-nextjs/CLAUDE.md.template | 258 + .../python-fastapi/AGENTS.md.template | 126 + .../python-fastapi/CLAUDE.md.template | 195 + .../python-library/AGENTS.md.template | 122 + .../python-library/CLAUDE.md.template | 180 + .../projects/typescript/AGENTS.md.template | 125 + .../projects/typescript/CLAUDE.md.template | 186 + .../templates/agent/qa-remediation-actions.md | 268 + .../templates/agent/qa-remediation-needed.md | 134 + .../templates/agent/sub-agents.md.template | 17 + .../templates/docs/DOCUMENTATION-CHECKLIST.md | 49 + .../docs/MISSION-MANIFEST.md.template | 53 + .../framework/templates/docs/PRD.md.template | 75 + .../templates/docs/TASKS.md.template | 17 + .../docs/continuation-prompt.md.template | 36 + .../docs/mission-scratchpad.md.template | 27 + .../templates/repo/.mosaic/README.md | 78 + .../repo/.mosaic/orchestrator/config.json | 18 + .../.mosaic/orchestrator/matrix_state.json | 4 + .../repo/.mosaic/orchestrator/mission.json | 14 + .../.mosaic/orchestrator/results/.gitkeep | 1 + .../repo/.mosaic/orchestrator/state.json | 4 + .../repo/.mosaic/orchestrator/tasks.json | 3 + .../templates/repo/.mosaic/quality-rails.yml | 10 + .../templates/repo/.mosaic/repo-hooks.sh | 17 + .../templates/repo/scripts/agent/common.sh | 29 + .../templates/repo/scripts/agent/critical.sh | 16 + .../repo/scripts/agent/log-limitation.sh | 44 + .../repo/scripts/agent/orchestrator-daemon.sh | 102 + .../repo/scripts/agent/orchestrator-worker.sh | 63 + .../repo/scripts/agent/session-end.sh | 48 + .../repo/scripts/agent/session-start.sh | 92 + .../framework/tools/_lib/credentials.sh | 284 + .../framework/tools/authentik/README.md | 60 + .../framework/tools/authentik/admin-status.sh | 63 + .../framework/tools/authentik/app-list.sh | 70 + .../framework/tools/authentik/auth-token.sh | 95 + .../framework/tools/authentik/flow-list.sh | 70 + .../framework/tools/authentik/group-list.sh | 69 + .../framework/tools/authentik/user-create.sh | 100 + .../framework/tools/authentik/user-list.sh | 80 + .../framework/tools/bootstrap/agent-lint.sh | 305 ++ .../tools/bootstrap/agent-upgrade.sh | 332 ++ .../framework/tools/bootstrap/init-project.sh | 493 ++ .../tools/bootstrap/init-repo-labels.sh | 123 + .../tools/cicd/generate-docker-steps.sh | 379 ++ .../mosaic/framework/tools/cloudflare/_lib.sh | 67 + .../tools/cloudflare/record-create.sh | 86 + .../tools/cloudflare/record-delete.sh | 55 + .../framework/tools/cloudflare/record-list.sh | 81 + .../tools/cloudflare/record-update.sh | 86 + .../framework/tools/cloudflare/zone-list.sh | 59 + .../mosaic/framework/tools/codex/README.md | 279 + .../tools/codex/codex-code-review.sh | 238 + .../tools/codex/codex-security-review.sh | 235 + .../mosaic/framework/tools/codex/common.sh | 191 + .../codex/schemas/code-review-schema.json | 92 + .../codex/schemas/security-review-schema.json | 106 + .../tools/codex/woodpecker/codex-review.yml | 90 + .../tools/context/mosaic-context-loader.sh | 64 + .../mosaic/framework/tools/coolify/README.md | 66 + .../mosaic/framework/tools/coolify/deploy.sh | 61 + .../mosaic/framework/tools/coolify/env-set.sh | 65 + .../framework/tools/coolify/project-list.sh | 52 + .../framework/tools/coolify/service-list.sh | 53 + .../framework/tools/coolify/service-status.sh | 62 + .../framework/tools/coolify/team-list.sh | 52 + .../framework/tools/excalidraw/.gitignore | 1 + .../framework/tools/excalidraw/launch.sh | 5 + .../framework/tools/excalidraw/loader.mjs | 76 + .../tools/excalidraw/package-lock.json | 4655 +++++++++++++++++ .../framework/tools/excalidraw/package.json | 11 + .../framework/tools/excalidraw/server.mjs | 323 ++ .../tools/excalidraw/stubs/laser-pointer.mjs | 7 + .../framework/tools/git/ci-queue-wait.ps1 | 247 + .../framework/tools/git/ci-queue-wait.sh | 273 + .../framework/tools/git/detect-platform.ps1 | 83 + .../framework/tools/git/detect-platform.sh | 149 + .../framework/tools/git/issue-assign.ps1 | 111 + .../framework/tools/git/issue-assign.sh | 135 + .../mosaic/framework/tools/git/issue-close.sh | 64 + .../framework/tools/git/issue-comment.sh | 61 + .../framework/tools/git/issue-create.ps1 | 80 + .../framework/tools/git/issue-create.sh | 139 + .../mosaic/framework/tools/git/issue-edit.sh | 84 + .../mosaic/framework/tools/git/issue-list.ps1 | 78 + .../mosaic/framework/tools/git/issue-list.sh | 96 + .../framework/tools/git/issue-reopen.sh | 62 + .../mosaic/framework/tools/git/issue-view.sh | 79 + .../framework/tools/git/milestone-close.sh | 50 + .../framework/tools/git/milestone-create.ps1 | 98 + .../framework/tools/git/milestone-create.sh | 117 + .../framework/tools/git/milestone-list.sh | 43 + .../mosaic/framework/tools/git/pr-ci-wait.sh | 239 + .../mosaic/framework/tools/git/pr-close.sh | 62 + .../mosaic/framework/tools/git/pr-create.ps1 | 130 + .../mosaic/framework/tools/git/pr-create.sh | 164 + .../mosaic/framework/tools/git/pr-diff.sh | 87 + .../mosaic/framework/tools/git/pr-list.ps1 | 76 + .../mosaic/framework/tools/git/pr-list.sh | 93 + .../mosaic/framework/tools/git/pr-merge.ps1 | 98 + .../mosaic/framework/tools/git/pr-merge.sh | 116 + .../mosaic/framework/tools/git/pr-metadata.sh | 113 + .../mosaic/framework/tools/git/pr-review.sh | 115 + .../mosaic/framework/tools/git/pr-view.sh | 48 + .../mosaic/framework/tools/glpi/README.md | 56 + .../framework/tools/glpi/computer-list.sh | 59 + .../framework/tools/glpi/session-init.sh | 85 + .../framework/tools/glpi/ticket-create.sh | 77 + .../framework/tools/glpi/ticket-list.sh | 88 + .../mosaic/framework/tools/glpi/user-list.sh | 61 + .../framework/tools/health/stack-health.sh | 194 + .../tools/orchestrator-matrix/README.md | 85 + .../orchestrator-matrix/adapters/README.md | 52 + .../orchestrator-matrix/controller/.gitignore | 2 + .../controller/mosaic_orchestrator.py | 346 ++ .../controller/tasks_md_sync.py | 195 + .../protocol/event.schema.json | 48 + .../protocol/task.schema.json | 40 + .../orchestrator-matrix/transport/.gitignore | 2 + .../transport/matrix_transport.py | 200 + .../framework/tools/orchestrator/_lib.sh | 523 ++ .../tools/orchestrator/continue-prompt.sh | 173 + .../tools/orchestrator/mission-init.sh | 286 + .../tools/orchestrator/mission-status.sh | 181 + .../tools/orchestrator/session-resume.sh | 208 + .../tools/orchestrator/session-run.sh | 91 + .../tools/orchestrator/session-status.sh | 241 + .../tools/orchestrator/smoke-test.sh | 78 + .../framework/tools/portainer/README.md | 212 + .../tools/portainer/endpoint-list.sh | 85 + .../framework/tools/portainer/stack-list.sh | 100 + .../framework/tools/portainer/stack-logs.sh | 183 + .../tools/portainer/stack-redeploy.sh | 183 + .../framework/tools/portainer/stack-start.sh | 114 + .../framework/tools/portainer/stack-status.sh | 185 + .../framework/tools/portainer/stack-stop.sh | 114 + packages/mosaic/framework/tools/prdy/_lib.sh | 283 + .../mosaic/framework/tools/prdy/prdy-init.sh | 106 + .../framework/tools/prdy/prdy-status.sh | 94 + .../framework/tools/prdy/prdy-update.sh | 94 + .../framework/tools/prdy/prdy-validate.sh | 170 + .../mosaic/framework/tools/qa/debug-hook.sh | 15 + .../tools/qa/prevent-memory-write.sh | 34 + .../framework/tools/qa/qa-hook-handler.sh | 197 + .../framework/tools/qa/qa-hook-stdin.sh | 59 + .../framework/tools/qa/qa-hook-wrapper.sh | 19 + .../framework/tools/qa/qa-queue-monitor.sh | 91 + .../tools/qa/remediation-hook-handler.sh | 66 + .../framework/tools/quality/PHILOSOPHY.md | 208 + .../mosaic/framework/tools/quality/README.md | 173 + .../framework/tools/quality/docs/CI-SETUP.md | 180 + .../tools/quality/docs/TYPESCRIPT-SETUP.md | 173 + .../tools/quality/scripts/install.ps1 | 59 + .../tools/quality/scripts/install.sh | 81 + .../tools/quality/scripts/verify.ps1 | 91 + .../framework/tools/quality/scripts/verify.sh | 104 + .../tools/quality/templates/.gitleaks.toml | 162 + .../templates/monorepo/.eslintrc.strict.js | 56 + .../templates/monorepo/.husky/pre-commit | 15 + .../templates/monorepo/.lintstagedrc.js | 29 + .../templates/monorepo/.woodpecker.yml | 76 + .../templates/monorepo/README-STRUCTURE.md | 102 + .../templates/monorepo/package.json.snippet | 30 + .../monorepo/pnpm-workspace.yaml.snippet | 3 + .../templates/monorepo/tsconfig.base.json | 39 + .../templates/monorepo/turbo.json.snippet | 23 + .../typescript-nextjs/.eslintrc.strict.js | 40 + .../typescript-nextjs/.husky/pre-commit | 15 + .../typescript-nextjs/.lintstagedrc.js | 4 + .../typescript-nextjs/.woodpecker.yml | 76 + .../typescript-nextjs/next.config.js.snippet | 50 + .../typescript-nextjs/package.json.snippet | 33 + .../typescript-nextjs/tsconfig.strict.json | 45 + .../typescript-node/.eslintrc.strict.js | 53 + .../typescript-node/.husky/pre-commit | 15 + .../typescript-node/.lintstagedrc.js | 4 + .../templates/typescript-node/.woodpecker.yml | 75 + .../typescript-node/package.json.snippet | 22 + .../typescript-node/tsconfig.strict.json | 42 + .../framework/tools/woodpecker/README.md | 58 + .../mosaic/framework/tools/woodpecker/_lib.sh | 50 + .../tools/woodpecker/pipeline-list.sh | 79 + .../tools/woodpecker/pipeline-status.sh | 118 + .../tools/woodpecker/pipeline-trigger.sh | 65 + packages/mosaic/package.json | 3 +- 252 files changed, 31477 insertions(+), 1 deletion(-) create mode 100755 packages/mosaic/framework/bin/mosaic create mode 100755 packages/mosaic/framework/bin/mosaic-bootstrap-repo create mode 100755 packages/mosaic/framework/bin/mosaic-clean-runtime create mode 100755 packages/mosaic/framework/bin/mosaic-critical create mode 100755 packages/mosaic/framework/bin/mosaic-doctor create mode 100755 packages/mosaic/framework/bin/mosaic-ensure-excalidraw create mode 100755 packages/mosaic/framework/bin/mosaic-ensure-sequential-thinking create mode 100755 packages/mosaic/framework/bin/mosaic-init create mode 100755 packages/mosaic/framework/bin/mosaic-link-runtime-assets create mode 100755 packages/mosaic/framework/bin/mosaic-log-limitation create mode 100755 packages/mosaic/framework/bin/mosaic-migrate-local-skills create mode 100755 packages/mosaic/framework/bin/mosaic-orchestrator-drain create mode 100755 packages/mosaic/framework/bin/mosaic-orchestrator-matrix-consume create mode 100755 packages/mosaic/framework/bin/mosaic-orchestrator-matrix-cycle create mode 100755 packages/mosaic/framework/bin/mosaic-orchestrator-matrix-publish create mode 100755 packages/mosaic/framework/bin/mosaic-orchestrator-run create mode 100755 packages/mosaic/framework/bin/mosaic-orchestrator-sync-tasks create mode 100755 packages/mosaic/framework/bin/mosaic-projects create mode 100755 packages/mosaic/framework/bin/mosaic-prune-legacy-runtime create mode 100755 packages/mosaic/framework/bin/mosaic-quality-apply create mode 100755 packages/mosaic/framework/bin/mosaic-quality-verify create mode 100755 packages/mosaic/framework/bin/mosaic-release-upgrade create mode 100755 packages/mosaic/framework/bin/mosaic-session-end create mode 100755 packages/mosaic/framework/bin/mosaic-session-start create mode 100755 packages/mosaic/framework/bin/mosaic-sync-skills create mode 100755 packages/mosaic/framework/bin/mosaic-upgrade create mode 100755 packages/mosaic/framework/bin/mosaic-upgrade-slaves create mode 100755 packages/mosaic/framework/bin/mosaic-wizard create mode 100755 packages/mosaic/framework/defaults/AGENTS.md create mode 100644 packages/mosaic/framework/defaults/README.md create mode 100644 packages/mosaic/framework/defaults/SOUL.md create mode 100644 packages/mosaic/framework/defaults/STANDARDS.md create mode 100644 packages/mosaic/framework/defaults/TOOLS.md create mode 100644 packages/mosaic/framework/defaults/USER.md create mode 100755 packages/mosaic/framework/install.sh create mode 100755 packages/mosaic/framework/remote-install.sh create mode 100644 packages/mosaic/framework/runtime/claude/CLAUDE.md create mode 100644 packages/mosaic/framework/runtime/claude/RUNTIME.md create mode 100644 packages/mosaic/framework/runtime/claude/context7-integration.md create mode 100644 packages/mosaic/framework/runtime/claude/hooks-config.json create mode 100644 packages/mosaic/framework/runtime/claude/settings-overlays/jarvis-loop.json create mode 100644 packages/mosaic/framework/runtime/claude/settings.json create mode 100644 packages/mosaic/framework/runtime/codex/RUNTIME.md create mode 100644 packages/mosaic/framework/runtime/codex/instructions.md create mode 100644 packages/mosaic/framework/runtime/mcp/EXCALIDRAW.json create mode 100644 packages/mosaic/framework/runtime/mcp/SEQUENTIAL-THINKING.json create mode 100644 packages/mosaic/framework/runtime/opencode/AGENTS.md create mode 100644 packages/mosaic/framework/runtime/opencode/RUNTIME.md create mode 100644 packages/mosaic/framework/runtime/pi/RUNTIME.md create mode 100644 packages/mosaic/framework/runtime/pi/mosaic-extension.ts create mode 100644 packages/mosaic/framework/templates/SOUL.md.template create mode 100644 packages/mosaic/framework/templates/TOOLS.md.template create mode 100644 packages/mosaic/framework/templates/USER.md.template create mode 100755 packages/mosaic/framework/templates/agent/AGENTS.md.template create mode 100755 packages/mosaic/framework/templates/agent/CLAUDE.md.template create mode 100644 packages/mosaic/framework/templates/agent/SPEC.md create mode 100644 packages/mosaic/framework/templates/agent/fragments/campsite-rule.md create mode 100644 packages/mosaic/framework/templates/agent/fragments/code-review.md create mode 100644 packages/mosaic/framework/templates/agent/fragments/commit-format.md create mode 100644 packages/mosaic/framework/templates/agent/fragments/conditional-loading.md create mode 100644 packages/mosaic/framework/templates/agent/fragments/multi-agent.md create mode 100644 packages/mosaic/framework/templates/agent/fragments/secrets.md create mode 100755 packages/mosaic/framework/templates/agent/projects/django/AGENTS.md.template create mode 100755 packages/mosaic/framework/templates/agent/projects/django/CLAUDE.md.template create mode 100755 packages/mosaic/framework/templates/agent/projects/nestjs-nextjs/AGENTS.md.template create mode 100755 packages/mosaic/framework/templates/agent/projects/nestjs-nextjs/CLAUDE.md.template create mode 100755 packages/mosaic/framework/templates/agent/projects/python-fastapi/AGENTS.md.template create mode 100755 packages/mosaic/framework/templates/agent/projects/python-fastapi/CLAUDE.md.template create mode 100755 packages/mosaic/framework/templates/agent/projects/python-library/AGENTS.md.template create mode 100755 packages/mosaic/framework/templates/agent/projects/python-library/CLAUDE.md.template create mode 100755 packages/mosaic/framework/templates/agent/projects/typescript/AGENTS.md.template create mode 100755 packages/mosaic/framework/templates/agent/projects/typescript/CLAUDE.md.template create mode 100644 packages/mosaic/framework/templates/agent/qa-remediation-actions.md create mode 100644 packages/mosaic/framework/templates/agent/qa-remediation-needed.md create mode 100644 packages/mosaic/framework/templates/agent/sub-agents.md.template create mode 100644 packages/mosaic/framework/templates/docs/DOCUMENTATION-CHECKLIST.md create mode 100644 packages/mosaic/framework/templates/docs/MISSION-MANIFEST.md.template create mode 100644 packages/mosaic/framework/templates/docs/PRD.md.template create mode 100644 packages/mosaic/framework/templates/docs/TASKS.md.template create mode 100644 packages/mosaic/framework/templates/docs/continuation-prompt.md.template create mode 100644 packages/mosaic/framework/templates/docs/mission-scratchpad.md.template create mode 100644 packages/mosaic/framework/templates/repo/.mosaic/README.md create mode 100644 packages/mosaic/framework/templates/repo/.mosaic/orchestrator/config.json create mode 100644 packages/mosaic/framework/templates/repo/.mosaic/orchestrator/matrix_state.json create mode 100644 packages/mosaic/framework/templates/repo/.mosaic/orchestrator/mission.json create mode 100644 packages/mosaic/framework/templates/repo/.mosaic/orchestrator/results/.gitkeep create mode 100644 packages/mosaic/framework/templates/repo/.mosaic/orchestrator/state.json create mode 100644 packages/mosaic/framework/templates/repo/.mosaic/orchestrator/tasks.json create mode 100644 packages/mosaic/framework/templates/repo/.mosaic/quality-rails.yml create mode 100755 packages/mosaic/framework/templates/repo/.mosaic/repo-hooks.sh create mode 100755 packages/mosaic/framework/templates/repo/scripts/agent/common.sh create mode 100755 packages/mosaic/framework/templates/repo/scripts/agent/critical.sh create mode 100755 packages/mosaic/framework/templates/repo/scripts/agent/log-limitation.sh create mode 100755 packages/mosaic/framework/templates/repo/scripts/agent/orchestrator-daemon.sh create mode 100755 packages/mosaic/framework/templates/repo/scripts/agent/orchestrator-worker.sh create mode 100755 packages/mosaic/framework/templates/repo/scripts/agent/session-end.sh create mode 100755 packages/mosaic/framework/templates/repo/scripts/agent/session-start.sh create mode 100755 packages/mosaic/framework/tools/_lib/credentials.sh create mode 100644 packages/mosaic/framework/tools/authentik/README.md create mode 100755 packages/mosaic/framework/tools/authentik/admin-status.sh create mode 100755 packages/mosaic/framework/tools/authentik/app-list.sh create mode 100755 packages/mosaic/framework/tools/authentik/auth-token.sh create mode 100755 packages/mosaic/framework/tools/authentik/flow-list.sh create mode 100755 packages/mosaic/framework/tools/authentik/group-list.sh create mode 100755 packages/mosaic/framework/tools/authentik/user-create.sh create mode 100755 packages/mosaic/framework/tools/authentik/user-list.sh create mode 100755 packages/mosaic/framework/tools/bootstrap/agent-lint.sh create mode 100755 packages/mosaic/framework/tools/bootstrap/agent-upgrade.sh create mode 100755 packages/mosaic/framework/tools/bootstrap/init-project.sh create mode 100755 packages/mosaic/framework/tools/bootstrap/init-repo-labels.sh create mode 100755 packages/mosaic/framework/tools/cicd/generate-docker-steps.sh create mode 100755 packages/mosaic/framework/tools/cloudflare/_lib.sh create mode 100755 packages/mosaic/framework/tools/cloudflare/record-create.sh create mode 100755 packages/mosaic/framework/tools/cloudflare/record-delete.sh create mode 100755 packages/mosaic/framework/tools/cloudflare/record-list.sh create mode 100755 packages/mosaic/framework/tools/cloudflare/record-update.sh create mode 100755 packages/mosaic/framework/tools/cloudflare/zone-list.sh create mode 100644 packages/mosaic/framework/tools/codex/README.md create mode 100755 packages/mosaic/framework/tools/codex/codex-code-review.sh create mode 100755 packages/mosaic/framework/tools/codex/codex-security-review.sh create mode 100755 packages/mosaic/framework/tools/codex/common.sh create mode 100644 packages/mosaic/framework/tools/codex/schemas/code-review-schema.json create mode 100644 packages/mosaic/framework/tools/codex/schemas/security-review-schema.json create mode 100644 packages/mosaic/framework/tools/codex/woodpecker/codex-review.yml create mode 100755 packages/mosaic/framework/tools/context/mosaic-context-loader.sh create mode 100644 packages/mosaic/framework/tools/coolify/README.md create mode 100755 packages/mosaic/framework/tools/coolify/deploy.sh create mode 100755 packages/mosaic/framework/tools/coolify/env-set.sh create mode 100755 packages/mosaic/framework/tools/coolify/project-list.sh create mode 100755 packages/mosaic/framework/tools/coolify/service-list.sh create mode 100755 packages/mosaic/framework/tools/coolify/service-status.sh create mode 100755 packages/mosaic/framework/tools/coolify/team-list.sh create mode 100644 packages/mosaic/framework/tools/excalidraw/.gitignore create mode 100755 packages/mosaic/framework/tools/excalidraw/launch.sh create mode 100644 packages/mosaic/framework/tools/excalidraw/loader.mjs create mode 100644 packages/mosaic/framework/tools/excalidraw/package-lock.json create mode 100644 packages/mosaic/framework/tools/excalidraw/package.json create mode 100644 packages/mosaic/framework/tools/excalidraw/server.mjs create mode 100644 packages/mosaic/framework/tools/excalidraw/stubs/laser-pointer.mjs create mode 100644 packages/mosaic/framework/tools/git/ci-queue-wait.ps1 create mode 100755 packages/mosaic/framework/tools/git/ci-queue-wait.sh create mode 100644 packages/mosaic/framework/tools/git/detect-platform.ps1 create mode 100755 packages/mosaic/framework/tools/git/detect-platform.sh create mode 100644 packages/mosaic/framework/tools/git/issue-assign.ps1 create mode 100755 packages/mosaic/framework/tools/git/issue-assign.sh create mode 100755 packages/mosaic/framework/tools/git/issue-close.sh create mode 100755 packages/mosaic/framework/tools/git/issue-comment.sh create mode 100644 packages/mosaic/framework/tools/git/issue-create.ps1 create mode 100755 packages/mosaic/framework/tools/git/issue-create.sh create mode 100755 packages/mosaic/framework/tools/git/issue-edit.sh create mode 100644 packages/mosaic/framework/tools/git/issue-list.ps1 create mode 100755 packages/mosaic/framework/tools/git/issue-list.sh create mode 100755 packages/mosaic/framework/tools/git/issue-reopen.sh create mode 100755 packages/mosaic/framework/tools/git/issue-view.sh create mode 100755 packages/mosaic/framework/tools/git/milestone-close.sh create mode 100644 packages/mosaic/framework/tools/git/milestone-create.ps1 create mode 100755 packages/mosaic/framework/tools/git/milestone-create.sh create mode 100755 packages/mosaic/framework/tools/git/milestone-list.sh create mode 100755 packages/mosaic/framework/tools/git/pr-ci-wait.sh create mode 100755 packages/mosaic/framework/tools/git/pr-close.sh create mode 100644 packages/mosaic/framework/tools/git/pr-create.ps1 create mode 100755 packages/mosaic/framework/tools/git/pr-create.sh create mode 100755 packages/mosaic/framework/tools/git/pr-diff.sh create mode 100644 packages/mosaic/framework/tools/git/pr-list.ps1 create mode 100755 packages/mosaic/framework/tools/git/pr-list.sh create mode 100755 packages/mosaic/framework/tools/git/pr-merge.ps1 create mode 100755 packages/mosaic/framework/tools/git/pr-merge.sh create mode 100755 packages/mosaic/framework/tools/git/pr-metadata.sh create mode 100755 packages/mosaic/framework/tools/git/pr-review.sh create mode 100755 packages/mosaic/framework/tools/git/pr-view.sh create mode 100644 packages/mosaic/framework/tools/glpi/README.md create mode 100755 packages/mosaic/framework/tools/glpi/computer-list.sh create mode 100755 packages/mosaic/framework/tools/glpi/session-init.sh create mode 100755 packages/mosaic/framework/tools/glpi/ticket-create.sh create mode 100755 packages/mosaic/framework/tools/glpi/ticket-list.sh create mode 100755 packages/mosaic/framework/tools/glpi/user-list.sh create mode 100755 packages/mosaic/framework/tools/health/stack-health.sh create mode 100644 packages/mosaic/framework/tools/orchestrator-matrix/README.md create mode 100644 packages/mosaic/framework/tools/orchestrator-matrix/adapters/README.md create mode 100644 packages/mosaic/framework/tools/orchestrator-matrix/controller/.gitignore create mode 100755 packages/mosaic/framework/tools/orchestrator-matrix/controller/mosaic_orchestrator.py create mode 100644 packages/mosaic/framework/tools/orchestrator-matrix/controller/tasks_md_sync.py create mode 100644 packages/mosaic/framework/tools/orchestrator-matrix/protocol/event.schema.json create mode 100644 packages/mosaic/framework/tools/orchestrator-matrix/protocol/task.schema.json create mode 100644 packages/mosaic/framework/tools/orchestrator-matrix/transport/.gitignore create mode 100755 packages/mosaic/framework/tools/orchestrator-matrix/transport/matrix_transport.py create mode 100755 packages/mosaic/framework/tools/orchestrator/_lib.sh create mode 100755 packages/mosaic/framework/tools/orchestrator/continue-prompt.sh create mode 100755 packages/mosaic/framework/tools/orchestrator/mission-init.sh create mode 100755 packages/mosaic/framework/tools/orchestrator/mission-status.sh create mode 100755 packages/mosaic/framework/tools/orchestrator/session-resume.sh create mode 100755 packages/mosaic/framework/tools/orchestrator/session-run.sh create mode 100755 packages/mosaic/framework/tools/orchestrator/session-status.sh create mode 100755 packages/mosaic/framework/tools/orchestrator/smoke-test.sh create mode 100644 packages/mosaic/framework/tools/portainer/README.md create mode 100755 packages/mosaic/framework/tools/portainer/endpoint-list.sh create mode 100755 packages/mosaic/framework/tools/portainer/stack-list.sh create mode 100755 packages/mosaic/framework/tools/portainer/stack-logs.sh create mode 100755 packages/mosaic/framework/tools/portainer/stack-redeploy.sh create mode 100755 packages/mosaic/framework/tools/portainer/stack-start.sh create mode 100755 packages/mosaic/framework/tools/portainer/stack-status.sh create mode 100755 packages/mosaic/framework/tools/portainer/stack-stop.sh create mode 100755 packages/mosaic/framework/tools/prdy/_lib.sh create mode 100755 packages/mosaic/framework/tools/prdy/prdy-init.sh create mode 100755 packages/mosaic/framework/tools/prdy/prdy-status.sh create mode 100755 packages/mosaic/framework/tools/prdy/prdy-update.sh create mode 100755 packages/mosaic/framework/tools/prdy/prdy-validate.sh create mode 100755 packages/mosaic/framework/tools/qa/debug-hook.sh create mode 100755 packages/mosaic/framework/tools/qa/prevent-memory-write.sh create mode 100755 packages/mosaic/framework/tools/qa/qa-hook-handler.sh create mode 100755 packages/mosaic/framework/tools/qa/qa-hook-stdin.sh create mode 100755 packages/mosaic/framework/tools/qa/qa-hook-wrapper.sh create mode 100755 packages/mosaic/framework/tools/qa/qa-queue-monitor.sh create mode 100755 packages/mosaic/framework/tools/qa/remediation-hook-handler.sh create mode 100644 packages/mosaic/framework/tools/quality/PHILOSOPHY.md create mode 100644 packages/mosaic/framework/tools/quality/README.md create mode 100644 packages/mosaic/framework/tools/quality/docs/CI-SETUP.md create mode 100644 packages/mosaic/framework/tools/quality/docs/TYPESCRIPT-SETUP.md create mode 100644 packages/mosaic/framework/tools/quality/scripts/install.ps1 create mode 100755 packages/mosaic/framework/tools/quality/scripts/install.sh create mode 100644 packages/mosaic/framework/tools/quality/scripts/verify.ps1 create mode 100755 packages/mosaic/framework/tools/quality/scripts/verify.sh create mode 100644 packages/mosaic/framework/tools/quality/templates/.gitleaks.toml create mode 100644 packages/mosaic/framework/tools/quality/templates/monorepo/.eslintrc.strict.js create mode 100644 packages/mosaic/framework/tools/quality/templates/monorepo/.husky/pre-commit create mode 100644 packages/mosaic/framework/tools/quality/templates/monorepo/.lintstagedrc.js create mode 100644 packages/mosaic/framework/tools/quality/templates/monorepo/.woodpecker.yml create mode 100644 packages/mosaic/framework/tools/quality/templates/monorepo/README-STRUCTURE.md create mode 100644 packages/mosaic/framework/tools/quality/templates/monorepo/package.json.snippet create mode 100644 packages/mosaic/framework/tools/quality/templates/monorepo/pnpm-workspace.yaml.snippet create mode 100644 packages/mosaic/framework/tools/quality/templates/monorepo/tsconfig.base.json create mode 100644 packages/mosaic/framework/tools/quality/templates/monorepo/turbo.json.snippet create mode 100644 packages/mosaic/framework/tools/quality/templates/typescript-nextjs/.eslintrc.strict.js create mode 100644 packages/mosaic/framework/tools/quality/templates/typescript-nextjs/.husky/pre-commit create mode 100644 packages/mosaic/framework/tools/quality/templates/typescript-nextjs/.lintstagedrc.js create mode 100644 packages/mosaic/framework/tools/quality/templates/typescript-nextjs/.woodpecker.yml create mode 100644 packages/mosaic/framework/tools/quality/templates/typescript-nextjs/next.config.js.snippet create mode 100644 packages/mosaic/framework/tools/quality/templates/typescript-nextjs/package.json.snippet create mode 100644 packages/mosaic/framework/tools/quality/templates/typescript-nextjs/tsconfig.strict.json create mode 100644 packages/mosaic/framework/tools/quality/templates/typescript-node/.eslintrc.strict.js create mode 100644 packages/mosaic/framework/tools/quality/templates/typescript-node/.husky/pre-commit create mode 100644 packages/mosaic/framework/tools/quality/templates/typescript-node/.lintstagedrc.js create mode 100644 packages/mosaic/framework/tools/quality/templates/typescript-node/.woodpecker.yml create mode 100644 packages/mosaic/framework/tools/quality/templates/typescript-node/package.json.snippet create mode 100644 packages/mosaic/framework/tools/quality/templates/typescript-node/tsconfig.strict.json create mode 100644 packages/mosaic/framework/tools/woodpecker/README.md create mode 100755 packages/mosaic/framework/tools/woodpecker/_lib.sh create mode 100755 packages/mosaic/framework/tools/woodpecker/pipeline-list.sh create mode 100755 packages/mosaic/framework/tools/woodpecker/pipeline-status.sh create mode 100755 packages/mosaic/framework/tools/woodpecker/pipeline-trigger.sh diff --git a/eslint.config.mjs b/eslint.config.mjs index 899221d..8c88d1c 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -10,6 +10,7 @@ export default tseslint.config( '**/.next/**', '**/coverage/**', '**/drizzle.config.ts', + '**/framework/**', ], }, { diff --git a/packages/mosaic/framework/bin/mosaic b/packages/mosaic/framework/bin/mosaic new file mode 100755 index 0000000..4cb9c55 --- /dev/null +++ b/packages/mosaic/framework/bin/mosaic @@ -0,0 +1,849 @@ +#!/usr/bin/env bash +set -euo pipefail + +# mosaic — Unified agent launcher and management CLI +# +# AGENTS.md is the global policy source for all agent sessions. +# The launcher injects a composed runtime contract (AGENTS + runtime reference). +# +# Usage: +# mosaic claude [args...] Launch Claude Code with runtime contract injected +# mosaic opencode [args...] Launch OpenCode with runtime contract injected +# mosaic codex [args...] Launch Codex with runtime contract injected +# mosaic yolo [args...] Launch runtime in dangerous-permissions mode +# mosaic --yolo [args...] Alias for yolo +# mosaic init [args...] Generate SOUL.md interactively +# mosaic doctor [args...] Health audit +# mosaic sync [args...] Sync skills +# mosaic seq [subcommand] sequential-thinking MCP management (check/fix/start) +# mosaic bootstrap Bootstrap a repo +# mosaic upgrade release Upgrade installed Mosaic release +# mosaic upgrade check Check release upgrade status (no changes) +# mosaic upgrade project [args] Upgrade project-local stale files + +MOSAIC_HOME="${MOSAIC_HOME:-$HOME/.config/mosaic}" +VERSION="0.1.0" + +usage() { + cat < [args...] + +Agent Launchers: + pi [args...] Launch Pi with runtime contract injected (recommended) + claude [args...] Launch Claude Code with runtime contract injected + opencode [args...] Launch OpenCode with runtime contract injected + codex [args...] Launch Codex with runtime contract injected + yolo [args...] Dangerous mode for claude|codex|opencode|pi + --yolo [args...] Alias for yolo + +Management: + init [args...] Generate SOUL.md (agent identity contract) + doctor [args...] Audit runtime state and detect drift + sync [args...] Sync skills from canonical source + seq [subcommand] sequential-thinking MCP management: + check [--runtime ] [--strict] + fix [--runtime ] + start + bootstrap Bootstrap a repo with Mosaic standards + upgrade [mode] [args] Upgrade release (default) or project files + upgrade check Check release upgrade status (no changes) + release-upgrade [...] Upgrade installed Mosaic release + project-upgrade [...] Clean up stale SOUL.md/CLAUDE.md in a project + +PRD: + prdy PRD creation and validation + init Create docs/PRD.md via guided runtime session + update Update existing PRD via guided runtime session + validate Check PRD completeness (bash-only) + status Quick PRD health check (one-liner) + +Coordinator (r0): + coord Manual coordinator tools + init Initialize a new mission + mission Show mission progress dashboard + status Check agent session health + continue Generate continuation prompt + run Generate context and launch selected runtime + resume Crash recovery + +Options: + -h, --help Show this help + -v, --version Show version + +All arguments after the command are forwarded to the target CLI. +USAGE +} + +# Pre-flight checks +check_mosaic_home() { + if [[ ! -d "$MOSAIC_HOME" ]]; then + echo "[mosaic] ERROR: ~/.config/mosaic not found." >&2 + echo "[mosaic] Install with: curl -sL https://git.mosaicstack.dev/mosaic/bootstrap/raw/branch/main/remote-install.sh | sh" >&2 + exit 1 + fi +} + +check_agents_md() { + if [[ ! -f "$MOSAIC_HOME/AGENTS.md" ]]; then + echo "[mosaic] ERROR: ~/.config/mosaic/AGENTS.md not found." >&2 + echo "[mosaic] Re-run the installer: cd ~/src/mosaic-bootstrap && bash install.sh" >&2 + exit 1 + fi +} + +check_soul() { + if [[ ! -f "$MOSAIC_HOME/SOUL.md" ]]; then + echo "[mosaic] SOUL.md not found. Running mosaic init..." + "$MOSAIC_HOME/bin/mosaic-init" + fi +} + +check_runtime() { + local cmd="$1" + if ! command -v "$cmd" >/dev/null 2>&1; then + echo "[mosaic] ERROR: '$cmd' not found in PATH." >&2 + echo "[mosaic] Install $cmd before launching." >&2 + exit 1 + fi +} + +check_sequential_thinking() { + local runtime="${1:-all}" + local checker="$MOSAIC_HOME/bin/mosaic-ensure-sequential-thinking" + if [[ ! -x "$checker" ]]; then + echo "[mosaic] ERROR: sequential-thinking checker missing: $checker" >&2 + exit 1 + fi + if ! "$checker" --check --runtime "$runtime" >/dev/null 2>&1; then + echo "[mosaic] ERROR: sequential-thinking MCP is required but not configured." >&2 + echo "[mosaic] Fix config: $checker --runtime $runtime" >&2 + echo "[mosaic] Or run: mosaic seq fix --runtime $runtime" >&2 + echo "[mosaic] Manual server start: mosaic seq start" >&2 + exit 1 + fi +} + +runtime_contract_path() { + local runtime="$1" + case "$runtime" in + claude) echo "$MOSAIC_HOME/runtime/claude/RUNTIME.md" ;; + codex) echo "$MOSAIC_HOME/runtime/codex/RUNTIME.md" ;; + opencode) echo "$MOSAIC_HOME/runtime/opencode/RUNTIME.md" ;; + pi) echo "$MOSAIC_HOME/runtime/pi/RUNTIME.md" ;; + *) + echo "[mosaic] ERROR: unsupported runtime '$runtime' for runtime contract." >&2 + exit 1 + ;; + esac +} + +build_runtime_prompt() { + local runtime="$1" + local runtime_file + runtime_file="$(runtime_contract_path "$runtime")" + if [[ ! -f "$runtime_file" ]]; then + echo "[mosaic] ERROR: runtime contract not found: $runtime_file" >&2 + exit 1 + fi + + # Inject active mission context FIRST so the agent sees it immediately + local mission_file=".mosaic/orchestrator/mission.json" + if [[ -f "$mission_file" ]] && command -v jq &>/dev/null; then + local m_status + m_status="$(jq -r '.status // "inactive"' "$mission_file" 2>/dev/null)" + if [[ "$m_status" == "active" || "$m_status" == "paused" ]]; then + local m_name m_id m_count m_completed + m_name="$(jq -r '.name // "unnamed"' "$mission_file")" + m_id="$(jq -r '.mission_id // ""' "$mission_file")" + m_count="$(jq '.milestones | length' "$mission_file")" + m_completed="$(jq '[.milestones[] | select(.status == "completed")] | length' "$mission_file")" + + cat </dev/null && prd_sections=$((prd_sections + 1)) + done + prd_assumptions=$(grep -c 'ASSUMPTION:' "$prd_file" 2>/dev/null || echo 0) + + local prd_status="ready" + (( prd_sections < 10 )) && prd_status="incomplete ($prd_sections/10 sections)" + + cat < "$tmp" + if ! cmp -s "$tmp" "$dst" 2>/dev/null; then + mv "$tmp" "$dst" + else + rm -f "$tmp" + fi +} + +# Detect active mission and return an initial prompt if one exists. +# Sets MOSAIC_MISSION_PROMPT as a side effect. +_detect_mission_prompt() { + MOSAIC_MISSION_PROMPT="" + local mission_file=".mosaic/orchestrator/mission.json" + if [[ -f "$mission_file" ]] && command -v jq &>/dev/null; then + local m_status + m_status="$(jq -r '.status // "inactive"' "$mission_file" 2>/dev/null)" + if [[ "$m_status" == "active" || "$m_status" == "paused" ]]; then + local m_name + m_name="$(jq -r '.name // "unnamed"' "$mission_file")" + MOSAIC_MISSION_PROMPT="Active mission detected: ${m_name}. Read the mission state files and report status." + fi + fi +} + +# Write a session lock if an active mission exists in the current directory. +# Called before exec so $$ captures the PID that will become the agent process. +_write_launcher_session_lock() { + local runtime="$1" + local mission_file=".mosaic/orchestrator/mission.json" + local lock_file=".mosaic/orchestrator/session.lock" + + # Only write lock if mission exists and is active + [[ -f "$mission_file" ]] || return 0 + command -v jq &>/dev/null || return 0 + + local m_status + m_status="$(jq -r '.status // "inactive"' "$mission_file" 2>/dev/null)" + [[ "$m_status" == "active" || "$m_status" == "paused" ]] || return 0 + + local session_id + session_id="${runtime}-$(date +%Y%m%d-%H%M%S)-$$" + + jq -n \ + --arg sid "$session_id" \ + --arg rt "$runtime" \ + --arg pid "$$" \ + --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ + --arg pp "$(pwd)" \ + --arg mid "" \ + '{ + session_id: $sid, + runtime: $rt, + pid: ($pid | tonumber), + started_at: $ts, + project_path: $pp, + milestone_id: $mid + }' > "$lock_file" +} + +# Clean up session lock on exit (covers normal exit + signals). +# Registered via trap after _write_launcher_session_lock succeeds. +_cleanup_session_lock() { + rm -f ".mosaic/orchestrator/session.lock" 2>/dev/null +} + +# Launcher functions +launch_claude() { + check_mosaic_home + check_agents_md + check_soul + check_runtime "claude" + check_sequential_thinking "claude" + + _check_resumable_session + + # Claude supports --append-system-prompt for direct injection + local runtime_prompt + runtime_prompt="$(build_runtime_prompt "claude")" + + # If active mission exists and no user prompt was given, inject initial prompt + _detect_mission_prompt + _write_launcher_session_lock "claude" + trap _cleanup_session_lock EXIT INT TERM + if [[ -n "$MOSAIC_MISSION_PROMPT" && $# -eq 0 ]]; then + echo "[mosaic] Launching Claude Code (active mission detected)..." + exec claude --append-system-prompt "$runtime_prompt" "$MOSAIC_MISSION_PROMPT" + else + echo "[mosaic] Launching Claude Code..." + exec claude --append-system-prompt "$runtime_prompt" "$@" + fi +} + +launch_opencode() { + check_mosaic_home + check_agents_md + check_soul + check_runtime "opencode" + check_sequential_thinking "opencode" + + _check_resumable_session + + # OpenCode reads from ~/.config/opencode/AGENTS.md + ensure_runtime_config "opencode" "$HOME/.config/opencode/AGENTS.md" + _write_launcher_session_lock "opencode" + trap _cleanup_session_lock EXIT INT TERM + echo "[mosaic] Launching OpenCode..." + exec opencode "$@" +} + +launch_codex() { + check_mosaic_home + check_agents_md + check_soul + check_runtime "codex" + check_sequential_thinking "codex" + + _check_resumable_session + + # Codex reads from ~/.codex/instructions.md + ensure_runtime_config "codex" "$HOME/.codex/instructions.md" + _detect_mission_prompt + _write_launcher_session_lock "codex" + trap _cleanup_session_lock EXIT INT TERM + if [[ -n "$MOSAIC_MISSION_PROMPT" && $# -eq 0 ]]; then + echo "[mosaic] Launching Codex (active mission detected)..." + exec codex "$MOSAIC_MISSION_PROMPT" + else + echo "[mosaic] Launching Codex..." + exec codex "$@" + fi +} + +launch_pi() { + check_mosaic_home + check_agents_md + check_soul + check_runtime "pi" + # Pi has native thinking levels — no sequential-thinking gate required + + _check_resumable_session + + local runtime_prompt + runtime_prompt="$(build_runtime_prompt "pi")" + + # Build skill args from Mosaic skills directories (canonical + local) + local -a skill_args=() + for skills_root in "$MOSAIC_HOME/skills" "$MOSAIC_HOME/skills-local"; do + [[ -d "$skills_root" ]] || continue + for skill_dir in "$skills_root"/*/; do + [[ -f "${skill_dir}SKILL.md" ]] && skill_args+=(--skill "$skill_dir") + done + done + + # Load Mosaic extension if present + local -a ext_args=() + local mosaic_ext="$MOSAIC_HOME/runtime/pi/mosaic-extension.ts" + [[ -f "$mosaic_ext" ]] && ext_args=(--extension "$mosaic_ext") + + _detect_mission_prompt + _write_launcher_session_lock "pi" + trap _cleanup_session_lock EXIT INT TERM + if [[ -n "$MOSAIC_MISSION_PROMPT" && $# -eq 0 ]]; then + echo "[mosaic] Launching Pi (active mission detected)..." + exec pi --append-system-prompt "$runtime_prompt" \ + "${skill_args[@]}" "${ext_args[@]}" "$MOSAIC_MISSION_PROMPT" + else + echo "[mosaic] Launching Pi..." + exec pi --append-system-prompt "$runtime_prompt" \ + "${skill_args[@]}" "${ext_args[@]}" "$@" + fi +} + +launch_yolo() { + if [[ $# -eq 0 ]]; then + echo "[mosaic] ERROR: yolo requires a runtime (claude|codex|opencode|pi)." >&2 + echo "[mosaic] Example: mosaic yolo claude" >&2 + exit 1 + fi + + local runtime="$1" + shift + + case "$runtime" in + claude) + check_mosaic_home + check_agents_md + check_soul + check_runtime "claude" + check_sequential_thinking "claude" + + # Claude uses an explicit dangerous permissions flag. + local runtime_prompt + runtime_prompt="$(build_runtime_prompt "claude")" + + _detect_mission_prompt + _write_launcher_session_lock "claude" + trap _cleanup_session_lock EXIT INT TERM + if [[ -n "$MOSAIC_MISSION_PROMPT" && $# -eq 0 ]]; then + echo "[mosaic] Launching Claude Code in YOLO mode (active mission detected)..." + exec claude --dangerously-skip-permissions --append-system-prompt "$runtime_prompt" "$MOSAIC_MISSION_PROMPT" + else + echo "[mosaic] Launching Claude Code in YOLO mode (dangerous permissions enabled)..." + exec claude --dangerously-skip-permissions --append-system-prompt "$runtime_prompt" "$@" + fi + ;; + codex) + check_mosaic_home + check_agents_md + check_soul + check_runtime "codex" + check_sequential_thinking "codex" + + # Codex reads instructions.md from ~/.codex and supports a direct dangerous flag. + ensure_runtime_config "codex" "$HOME/.codex/instructions.md" + _detect_mission_prompt + _write_launcher_session_lock "codex" + trap _cleanup_session_lock EXIT INT TERM + if [[ -n "$MOSAIC_MISSION_PROMPT" && $# -eq 0 ]]; then + echo "[mosaic] Launching Codex in YOLO mode (active mission detected)..." + exec codex --dangerously-bypass-approvals-and-sandbox "$MOSAIC_MISSION_PROMPT" + else + echo "[mosaic] Launching Codex in YOLO mode (dangerous permissions enabled)..." + exec codex --dangerously-bypass-approvals-and-sandbox "$@" + fi + ;; + opencode) + check_mosaic_home + check_agents_md + check_soul + check_runtime "opencode" + check_sequential_thinking "opencode" + + # OpenCode defaults to allow-all permissions unless user config restricts them. + ensure_runtime_config "opencode" "$HOME/.config/opencode/AGENTS.md" + _write_launcher_session_lock "opencode" + trap _cleanup_session_lock EXIT INT TERM + echo "[mosaic] Launching OpenCode in YOLO mode..." + exec opencode "$@" + ;; + pi) + # Pi has no permission restrictions — yolo is identical to normal launch + launch_pi "$@" + ;; + *) + echo "[mosaic] ERROR: Unsupported yolo runtime '$runtime'. Use claude|codex|opencode|pi." >&2 + exit 1 + ;; + esac +} + +# Delegate to existing scripts +run_init() { + # Prefer wizard if Node.js and bundle are available + local wizard_bin="$MOSAIC_HOME/dist/mosaic-wizard.mjs" + if command -v node >/dev/null 2>&1 && [[ -f "$wizard_bin" ]]; then + exec node "$wizard_bin" "$@" + fi + # Fallback to legacy bash wizard + check_mosaic_home + exec "$MOSAIC_HOME/bin/mosaic-init" "$@" +} + +run_doctor() { + check_mosaic_home + exec "$MOSAIC_HOME/bin/mosaic-doctor" "$@" +} + +run_sync() { + check_mosaic_home + exec "$MOSAIC_HOME/bin/mosaic-sync-skills" "$@" +} + +run_seq() { + check_mosaic_home + local checker="$MOSAIC_HOME/bin/mosaic-ensure-sequential-thinking" + local action="${1:-check}" + + case "$action" in + check) + shift || true + exec "$checker" --check "$@" + ;; + fix|apply) + shift || true + exec "$checker" "$@" + ;; + start) + shift || true + check_runtime "npx" + echo "[mosaic] Starting sequential-thinking MCP server..." + exec npx -y @modelcontextprotocol/server-sequential-thinking "$@" + ;; + *) + echo "[mosaic] ERROR: Unknown seq subcommand '$action'." >&2 + echo "[mosaic] Use: mosaic seq check|fix|start" >&2 + exit 1 + ;; + esac +} + +run_coord() { + check_mosaic_home + local runtime="claude" + local runtime_flag="" + local yolo_flag="" + local -a coord_args=() + + while [[ $# -gt 0 ]]; do + case "$1" in + --claude|--codex|--pi) + local selected_runtime="${1#--}" + if [[ -n "$runtime_flag" ]] && [[ "$runtime" != "$selected_runtime" ]]; then + echo "[mosaic] ERROR: --claude, --codex, and --pi are mutually exclusive for 'mosaic coord'." >&2 + exit 1 + fi + runtime="$selected_runtime" + runtime_flag="$1" + shift + ;; + --yolo) + yolo_flag="--yolo" + shift + ;; + *) + coord_args+=("$1") + shift + ;; + esac + done + + local subcmd="${coord_args[0]:-help}" + if (( ${#coord_args[@]} > 1 )); then + set -- "${coord_args[@]:1}" + else + set -- + fi + + local tool_dir="$MOSAIC_HOME/tools/orchestrator" + + case "$subcmd" in + status|session) + MOSAIC_COORD_RUNTIME="$runtime" exec bash "$tool_dir/session-status.sh" "$@" + ;; + init) + MOSAIC_COORD_RUNTIME="$runtime" exec bash "$tool_dir/mission-init.sh" "$@" + ;; + mission|progress) + MOSAIC_COORD_RUNTIME="$runtime" exec bash "$tool_dir/mission-status.sh" "$@" + ;; + continue|next) + MOSAIC_COORD_RUNTIME="$runtime" exec bash "$tool_dir/continue-prompt.sh" "$@" + ;; + run|start) + MOSAIC_COORD_RUNTIME="$runtime" exec bash "$tool_dir/session-run.sh" ${yolo_flag:+"$yolo_flag"} "$@" + ;; + smoke|test) + MOSAIC_COORD_RUNTIME="$runtime" exec bash "$tool_dir/smoke-test.sh" "$@" + ;; + resume|recover) + MOSAIC_COORD_RUNTIME="$runtime" exec bash "$tool_dir/session-resume.sh" "$@" + ;; + help|*) + cat < [opts] Initialize a new mission + mission [--project ] Show mission progress dashboard + status [--project ] Check agent session health + continue [--project ] Generate continuation prompt for next session + run [--project ] Generate context and launch selected runtime + smoke Run orchestration behavior smoke checks + resume [--project ] Crash recovery (detect dirty state, generate fix) + +Runtime: + --claude Use Claude runtime hints/prompts (default) + --codex Use Codex runtime hints/prompts + --pi Use Pi runtime hints/prompts + --yolo Launch runtime in dangerous/skip-permissions mode (run only) + +Examples: + mosaic coord init --name "Security Fix" --milestones "Critical,High,Medium" + mosaic coord mission + mosaic coord --codex mission + mosaic coord --pi run + mosaic coord continue --copy + mosaic coord run + mosaic coord run --codex + mosaic coord --yolo run + mosaic coord smoke + mosaic coord continue --codex --copy + +COORD_USAGE + ;; + esac +} + +# Resume advisory — prints warning if active mission or stale session detected +_check_resumable_session() { + local mission_file=".mosaic/orchestrator/mission.json" + local lock_file=".mosaic/orchestrator/session.lock" + + command -v jq &>/dev/null || return 0 + + if [[ -f "$lock_file" ]]; then + local pid + pid="$(jq -r '.pid // 0' "$lock_file" 2>/dev/null)" + if [[ -n "$pid" ]] && [[ "$pid" != "0" ]] && ! kill -0 "$pid" 2>/dev/null; then + # Stale lock from a dead session — clean it up + rm -f "$lock_file" + echo "[mosaic] Cleaned up stale session lock (PID $pid no longer running)." + echo "" + fi + elif [[ -f "$mission_file" ]]; then + local status + status="$(jq -r '.status // "inactive"' "$mission_file" 2>/dev/null)" + if [[ "$status" == "active" ]]; then + echo "[mosaic] Active mission detected. Generate continuation prompt with:" + echo "[mosaic] mosaic coord continue" + echo "" + fi + fi +} + +run_prdy() { + check_mosaic_home + local runtime="claude" + local runtime_flag="" + local -a prdy_args=() + + while [[ $# -gt 0 ]]; do + case "$1" in + --claude|--codex|--pi) + local selected_runtime="${1#--}" + if [[ -n "$runtime_flag" ]] && [[ "$runtime" != "$selected_runtime" ]]; then + echo "[mosaic] ERROR: --claude, --codex, and --pi are mutually exclusive for 'mosaic prdy'." >&2 + exit 1 + fi + runtime="$selected_runtime" + runtime_flag="$1" + shift + ;; + *) + prdy_args+=("$1") + shift + ;; + esac + done + + local subcmd="${prdy_args[0]:-help}" + if (( ${#prdy_args[@]} > 1 )); then + set -- "${prdy_args[@]:1}" + else + set -- + fi + + local tool_dir="$MOSAIC_HOME/tools/prdy" + + case "$subcmd" in + init) + MOSAIC_PRDY_RUNTIME="$runtime" exec bash "$tool_dir/prdy-init.sh" "$@" + ;; + update) + MOSAIC_PRDY_RUNTIME="$runtime" exec bash "$tool_dir/prdy-update.sh" "$@" + ;; + validate|check) + MOSAIC_PRDY_RUNTIME="$runtime" exec bash "$tool_dir/prdy-validate.sh" "$@" + ;; + status) + exec bash "$tool_dir/prdy-status.sh" "$@" + ;; + help|*) + cat <] [--name ] Create docs/PRD.md via guided runtime session + update [--project ] Update existing docs/PRD.md via guided runtime session + validate [--project ] Check PRD completeness against Mosaic guide (bash-only) + status [--project ] [--format short|json] Quick PRD health check (one-liner) + +Runtime: + --claude Use Claude runtime (default) + --codex Use Codex runtime + --pi Use Pi runtime + +Examples: + mosaic prdy init --name "User Authentication" + mosaic prdy update + mosaic prdy --pi init --name "User Authentication" + mosaic prdy --codex init --name "User Authentication" + mosaic prdy validate + +Output location: docs/PRD.md (per Mosaic PRD guide) + +PRDY_USAGE + ;; + esac +} + +run_bootstrap() { + check_mosaic_home + exec "$MOSAIC_HOME/bin/mosaic-bootstrap-repo" "$@" +} + +run_release_upgrade() { + check_mosaic_home + exec "$MOSAIC_HOME/bin/mosaic-release-upgrade" "$@" +} + +run_project_upgrade() { + check_mosaic_home + exec "$MOSAIC_HOME/bin/mosaic-upgrade" "$@" +} + +run_upgrade() { + check_mosaic_home + + # Default: upgrade installed release + if [[ $# -eq 0 ]]; then + run_release_upgrade + fi + + case "$1" in + release) + shift + run_release_upgrade "$@" + ;; + check) + shift + run_release_upgrade --dry-run "$@" + ;; + project) + shift + run_project_upgrade "$@" + ;; + + # Backward compatibility for historical project-upgrade usage. + --all|--root) + run_project_upgrade "$@" + ;; + --dry-run|--ref|--keep|--overwrite|-y|--yes) + run_release_upgrade "$@" + ;; + -*) + run_release_upgrade "$@" + ;; + *) + run_project_upgrade "$@" + ;; + esac +} + +# Main router +if [[ $# -eq 0 ]]; then + usage + exit 0 +fi + +command="$1" +shift + +case "$command" in + pi) launch_pi "$@" ;; + claude) launch_claude "$@" ;; + opencode) launch_opencode "$@" ;; + codex) launch_codex "$@" ;; + yolo|--yolo) launch_yolo "$@" ;; + init) run_init "$@" ;; + doctor) run_doctor "$@" ;; + sync) run_sync "$@" ;; + seq) run_seq "$@" ;; + bootstrap) run_bootstrap "$@" ;; + prdy) run_prdy "$@" ;; + coord) run_coord "$@" ;; + upgrade) run_upgrade "$@" ;; + release-upgrade) run_release_upgrade "$@" ;; + project-upgrade) run_project_upgrade "$@" ;; + help|-h|--help) usage ;; + version|-v|--version) echo "mosaic $VERSION" ;; + *) + echo "[mosaic] Unknown command: $command" >&2 + echo "[mosaic] Run 'mosaic --help' for usage." >&2 + exit 1 + ;; +esac diff --git a/packages/mosaic/framework/bin/mosaic-bootstrap-repo b/packages/mosaic/framework/bin/mosaic-bootstrap-repo new file mode 100755 index 0000000..b24b0b8 --- /dev/null +++ b/packages/mosaic/framework/bin/mosaic-bootstrap-repo @@ -0,0 +1,126 @@ +#!/usr/bin/env bash +set -euo pipefail + +TARGET_DIR="$(pwd)" +FORCE=0 +QUALITY_TEMPLATE="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --force) + FORCE=1 + shift + ;; + --quality-template) + QUALITY_TEMPLATE="${2:-}" + shift 2 + ;; + *) + TARGET_DIR="$1" + shift + ;; + esac +done + +if [[ ! -d "$TARGET_DIR" ]]; then + echo "[mosaic] Target directory does not exist: $TARGET_DIR" >&2 + exit 1 +fi + +MOSAIC_HOME="${MOSAIC_HOME:-$HOME/.config/mosaic}" +TEMPLATE_ROOT="$MOSAIC_HOME/templates/repo" + +if [[ ! -d "$TEMPLATE_ROOT" ]]; then + echo "[mosaic] Missing templates at $TEMPLATE_ROOT" >&2 + echo "[mosaic] Install or refresh framework: ~/.config/mosaic/install.sh" >&2 + exit 1 +fi + +mkdir -p "$TARGET_DIR/.mosaic" "$TARGET_DIR/scripts/agent" +mkdir -p "$TARGET_DIR/.mosaic/orchestrator" "$TARGET_DIR/.mosaic/orchestrator/logs" "$TARGET_DIR/.mosaic/orchestrator/results" + +copy_file() { + local src="$1" + local dst="$2" + + if [[ -f "$dst" && "$FORCE" -ne 1 ]]; then + echo "[mosaic] Skip existing: $dst" + return + fi + + cp "$src" "$dst" + echo "[mosaic] Wrote: $dst" +} + +copy_file "$TEMPLATE_ROOT/.mosaic/README.md" "$TARGET_DIR/.mosaic/README.md" +copy_file "$TEMPLATE_ROOT/.mosaic/repo-hooks.sh" "$TARGET_DIR/.mosaic/repo-hooks.sh" +copy_file "$TEMPLATE_ROOT/.mosaic/quality-rails.yml" "$TARGET_DIR/.mosaic/quality-rails.yml" +copy_file "$TEMPLATE_ROOT/.mosaic/orchestrator/config.json" "$TARGET_DIR/.mosaic/orchestrator/config.json" +copy_file "$TEMPLATE_ROOT/.mosaic/orchestrator/tasks.json" "$TARGET_DIR/.mosaic/orchestrator/tasks.json" +copy_file "$TEMPLATE_ROOT/.mosaic/orchestrator/state.json" "$TARGET_DIR/.mosaic/orchestrator/state.json" +copy_file "$TEMPLATE_ROOT/.mosaic/orchestrator/matrix_state.json" "$TARGET_DIR/.mosaic/orchestrator/matrix_state.json" +copy_file "$TEMPLATE_ROOT/.mosaic/orchestrator/logs/.gitkeep" "$TARGET_DIR/.mosaic/orchestrator/logs/.gitkeep" +copy_file "$TEMPLATE_ROOT/.mosaic/orchestrator/results/.gitkeep" "$TARGET_DIR/.mosaic/orchestrator/results/.gitkeep" + +for file in "$TEMPLATE_ROOT"/scripts/agent/*.sh; do + base="$(basename "$file")" + copy_file "$file" "$TARGET_DIR/scripts/agent/$base" + chmod +x "$TARGET_DIR/scripts/agent/$base" +done + +if [[ ! -f "$TARGET_DIR/AGENTS.md" ]]; then + cat > "$TARGET_DIR/AGENTS.md" <<'AGENTS_EOF' +# Agent Guidelines + +## Required Load Order + +1. `~/.config/mosaic/SOUL.md` +2. `~/.config/mosaic/STANDARDS.md` +3. `~/.config/mosaic/AGENTS.md` +4. `~/.config/mosaic/guides/E2E-DELIVERY.md` +5. `AGENTS.md` (this file) +6. Runtime-specific guide: `~/.config/mosaic/runtime//RUNTIME.md` +7. `.mosaic/repo-hooks.sh` + +## Session Lifecycle + +```bash +bash scripts/agent/session-start.sh +bash scripts/agent/critical.sh +bash scripts/agent/session-end.sh +``` + +## Shared Tools + +- Quality and orchestration guides: `~/.config/mosaic/guides/` +- Shared automation tools: `~/.config/mosaic/tools/` + +## Repo-Specific Notes + +- Add project constraints and workflows here. +- Implement hook functions in `.mosaic/repo-hooks.sh`. +- Scratchpads are mandatory for non-trivial tasks. +AGENTS_EOF + echo "[mosaic] Wrote: $TARGET_DIR/AGENTS.md" +else + echo "[mosaic] AGENTS.md exists; add standards load order if missing" +fi + +echo "[mosaic] Repo bootstrap complete: $TARGET_DIR" +echo "[mosaic] Next: edit $TARGET_DIR/.mosaic/repo-hooks.sh with project workflows" +echo "[mosaic] Optional: apply quality tools via ~/.config/mosaic/bin/mosaic-quality-apply --template