Autonomous polyglot monorepo bootstrap meta-prompt. TRIGGERS - new monorepo, polyglot setup, scaffold Python+Rust+Bun, monorepo from scratch.
Canonical reference lives in THIS skill:
ā See: references/bootstrap-monorepo.md ā Cross-language boundaries: references/cross-language-interop.md ā boundary decision ladder + verified tool status (research-verified 2026-06)
Self-Evolving Skill: This skill improves through use. If instructions are wrong, parameters drifted, or a workaround was needed ā fix this file immediately, don't defer. Only update for real, reproducible issues.
Use this skill when:
nx init is mechanical, not a restructure)| Tool | Responsibility |
|---|---|
| proto | Toolchain versions (bun, python, rust, node, ā¦) pinned in repo-local .prototools |
| moon | Project graph + task orchestration + caching + affected detection (moon ci) |
| Bun | TS runtime for every script, CLI, glue tool, and test; root workspaces |
| uv / cargo | Python / Rust engines invoked natively from moon script: tasks |
| TypeScript | Type-safe control plane (7.0.2+); see TypeScript Configuration below |
TypeScript is the control plane; other languages are engines behind language-neutral contracts (JSON Schema 2020-12 / proto) with drift gates and parity tests.
This skill scaffolds tsconfig.base.json as the canonical reference implementation for all new repositories. Boilerplate path: [templates/tsconfig.base.json](templates/tsconfig.base.json) ā the single source of truth for TS7 config shape.
Each new monorepo receives a root tsconfig.base.json with:
moduleResolution: bundler, target: ESNext, strict: true, noEmit, skipLibCheckallowImportingTsExtensions, lib: ["ESNext"], verbatimModuleSyntax, noUncheckedIndexedAccess, noImplicitOverride, exactOptionalPropertyTypestypes is deliberately omitted from the base ā TS7 defaults it to [] (stopping resolution of @types/*, process, JSX globals). Every package declares its own via "types": ["bun"] or ["node"] etc. ā bare name only, never @types/bun or bun-types.Package-level tsconfig.json files extend the base and add their own types array + any legitimate package-specific overrides.
Reference: ~/.claude/typescript-latest-CLAUDE.md (applies estate-wide). Package.json declares "typescript": "latest" (TS7.0.2+).
For TS 7 migration details and per-repo adoption: consult the bootstrapped skill docstrings and the upstream reference.
Choose which language owns the code before choosing how to cross between them. This is a tiebreaker, not a mandate ā a SOTA-native ecosystem and existing repo convention override it.
When work must cross languages, climb from cheapest to most coupled ā stop at the first rung that satisfies the need (full doctrine + verified tool status: references/cross-language-interop.md):
script: task). Default.Pattern B gate amendment: after the 8-float-op test selects Pattern B, ask "does the kernel need threads?" ā if yes, native core (cdylib/PyO3), not WASM.
TypeScript ā Python (the most common pair) verified picks, June 2026: rung 1 = Bun.spawn/child_process running Python via uv run --python 3.14 (NOT bun:ffi ā C-ABI only); rung 2 = FastAPI + @hey-api/openapi-ts (HTTP) or buf-generated protobuf-es + protocolbuffers/python stubs (RPC); schema SSoT = Pydantic v2 ā JSON Schema 2020-12 ā TS, with a CI drift gate. Full table in the reference.
# After bootstrap:
moon ci # affected quality pipeline
moon run <project>:check # one project's full gate (lint+test+drift)
moon query projects # machine-readable project graph (agents read this)
moon query tasks # machine-readable task surface
proto use # install all .prototools pins on a fresh machine
Pre-2026-06 repos on Pants + mise: the old reference remains at ../mise-tasks/references/bootstrap-monorepo.md. Migrate per-repo (parity-first, cut tasks over one at a time), never big-bang.
Two cases (full recipes in references/bootstrap-monorepo.md Phase 9):
semantic-release, one .releaserc.yml, tag v${version}.<project>/v${version}) via @rimac-technology/semantic-release-monorepo (stock semantic-release ignores
commitPaths ā upstream #1279/#1212), selected by a RELEASE_PROFILE-keyed .releaserc.cjs dispatcher that
derives each stream's processCommits from its commitPaths, plus a repo-wide umbrella on stock semantic-release.
Install the fork with npm i -D --ignore-scripts. Reference impl: claude-sys.itp:semantic-release - Release automation (local-first; Actions only for release/CodeQL/Dependabot/deploy)itp:mise-tasks / itp:mise-configuration - legacy mise-era orchestration (still valid for unmigrated repos)| Issue | Cause | Solution |
|---|---|---|
proto::detect::failed for moon |
tool installed but no version pinned | proto pin --to global moon <version> (or add to .prototools) |
moon not found over ssh |
shims not on non-interactive PATH | export PROTO_HOME + shims PATH in ~/.zshenv (NOT only .zshrc) |
| Python tests "No module named pytest" | uv run prunes dev extras |
uv run --extra dev -p <version> pytest <path> from repo root |
PyO3 crate cargo test link errors (_PyBool_Type) |
tests reference #[pyfunction] under extension-module |
keep logic in pure-Rust core fns; tests call the core, wrapper stays thin |
| Task runs in wrong cwd | script assumes repo root | options: { runFromWorkspaceRoot: true } in the task |
| Guard task wrongly cached | moon caches by default | options: { cache: false } on guards/parity/network tasks |
| Commit "passed" but didn't land | a hook auto-fixed files and aborted | re-stage and retry; ALWAYS verify git log --oneline -1 after commit |
After this skill completes, check before closing:
Only update if the issue is real and reproducible ā not speculative.