Install
openclaw skills install @anjasta-tarigan/monorepo-scaffoldInitialize a brand-new monorepo project in an empty (or near-empty) folder. Use when the user wants to "set up a monorepo", "scaffold a project", or "bootstrap a repo with multiple packages/apps".
openclaw skills install @anjasta-tarigan/monorepo-scaffoldA monorepo is a long-lived piece of infrastructure. The workspace tool, package manager, folder layout, and shared config choices made on day one are expensive to change later — teams live with them for years. Because of that, this skill treats scaffolding as a design decision that deserves a real interview, not a quick default. Guessing the stack and generating something generic is worse than useless here: it produces a skeleton the user has to tear apart and redo, which is slower than if Claude had just asked.
So the rule is simple: never scaffold before the interview is genuinely complete. A partial answer ("just use TypeScript") is not complete — dig into the specifics (which package manager, which orchestrator, which apps). It is fine, and expected, for the interview to feel thorough. That's the point.
ask_user_input_v0 tool where available (single-select/multi-select buttons are much faster for the user than typing), and adapt follow-ups to earlier answers.references/stack-recipes.md, using references/config-templates.md for boilerplate config file contents.turbo run build --dry, nx show projects, pnpm -r list).apps/web", "set up secrets in CI").Before touching the filesystem:
.git directory, including in parent directories) — don't run git init inside an existing repo without asking.Treat this as a structured but human conversation. Group questions into rounds so the user isn't overwhelmed by twenty questions at once — three or four short rounds work better than one wall of text. Skip a question only if the user has already answered it earlier in the conversation. Never silently assume an answer to a question in the "always ask" list below.
Read references/interview-guide.md for the full question bank, good follow-up probes, and rationale for why each topic matters. At minimum, the following must be resolved by the end of the interview — treat these as required, not optional:
apps/web, apps/api, packages/ui, packages/config). Push for specifics; "a frontend and a backend" is a start, not an answer — get names and what each one is responsible for.go.work. For Rust: Cargo workspace. For polyglot repos: how the pieces coexist (often plain folder convention plus a task runner like just, make, or Turborepo's generic task pipeline). Explain trade-offs briefly rather than just listing options — the user may not know these tools.tsconfig.json with per-package extends), testing framework(s), pre-commit hooks (Husky+lint-staged, pre-commit, lefthook)..env files vs. a root-level shared one, whether to add runtime env validation (e.g. zod-based env schemas, envsafe), and whether .env.example files are wanted.docker-compose.yml for local dev, or skip entirely for now.Also worth surfacing, but fine to default sensibly if the user has no opinion (say what you're defaulting to, don't just silently pick): Node/runtime version pinning (.nvmrc, engines field, or Volta/mise), commit message convention (Conventional Commits + commitlint), and editor consistency (.editorconfig).
Do not let the interview become a stalling tactic — once the required items above are resolved, move to confirmation and scaffolding. Overkill means thorough, not endless.
Once the plan is confirmed:
references/stack-recipes.md and find the recipe matching the chosen package manager/orchestrator combination. If the combination isn't covered exactly (e.g. an unusual polyglot mix), use the closest recipe as a base and adapt — explain the adaptation to the user.references/config-templates.md for the actual contents of common files (root package.json, turbo.json/nx.json, base tsconfig.json, .eslintrc/biome.json, .gitignore, GitHub Actions workflow, .editorconfig, .nvmrc, Changesets config, Dockerfiles, docker-compose.yml) so output is consistent and doesn't need to be reinvented per run.apps/web/ with no package.json isn't a scaffold, it's a TODO..gitignore that actually matches the stack (not a generic catch-all).Before declaring done, actually prove it works rather than assuming the generated config is correct:
If the sandbox's network access can't reach the package registry needed (npm, PyPI, crates.io, etc.), say so plainly, still generate every file, and tell the user exactly which command to run locally to finish installing.
Close with, in this order:
If a file-delivery tool is available in the current environment (e.g. present_files), zip the generated project and present it; otherwise the files are already on disk in the working directory and the report should say where.