Skip to main content

Verify Recipes Matrix

Auto-generated from muonroi-cli/src/verify/recipes.ts and muonroi-cli/src/types/index.ts (VerifyRecipe). Run node scripts/check-cli-docs-drift.mjs to detect drift between source and docs.

VerifyAppKind values

VerifyAppKind is the discriminator on each VerifyRecipe.appKind. The full union (src/verify/recipes.ts:9-25):

astro, cra, django, dotnet, go, gradle, make, maven, nextjs, node, python, remix, rust, sveltekit, unknown, vite.

Matrix

Rows sorted alphabetically by App kind. Cell content reflects the literal commands returned by each detector. = empty / not set.

App kindDetection marker(s)Install cmdBuild cmdTest cmdSmoke kindDefault port
astropackage.json with astro dep (src/verify/recipes.ts:222)pnpm install / bun install / yarn install / npm install (per lockfile)scripts.build, scripts.typecheck (via package runner)scripts.test, scripts.check, scripts.linthttp (when start command + port resolvable)4321
crapackage.json with react-scripts dep (src/verify/recipes.ts:230)per-lockfile package manager installscripts.build, scripts.typecheckscripts.test, scripts.check, scripts.linthttp3000
djangomanage.py present OR django in pyproject/requirements (src/verify/recipes.ts:286,295)pip install -r requirements.txt (or uv sync / poetry install / pipenv install / pip install -e . per lockfile)python manage.py testhttp8000
dotnetAny *.sln, *.csproj, or Directory.Build.props within 2 levels (src/verify/recipes.ts:423-487)dotnet restore <target>dotnet build <target> --no-restoredotnet test <target> --no-build --nologonone
gogo.mod (src/verify/recipes.ts:347-362)go build ./...go test ./...none
gradlebuild.gradle or build.gradle.kts (src/verify/recipes.ts:400)./gradlew build or gradle build./gradlew test or gradle testnone
makeMakefile (src/verify/recipes.ts:181-204)make <install|setup|bootstrap> (if target exists)make <build|compile> (if target exists)make <test|check> (if target exists)none
mavenpom.xml (src/verify/recipes.ts:384)mvn packagemvn testnone
nextjspackage.json with next dep (src/verify/recipes.ts:214)per-lockfile package manager installscripts.build, scripts.typecheckscripts.test, scripts.check, scripts.linthttp3000
nodepackage.json present, no web-framework dep matched (src/verify/recipes.ts:207-274)per-lockfile package manager installscripts.build, scripts.typecheckscripts.test, scripts.check, scripts.linthttp if scripts.dev/scripts.start and port resolvable; otherwise noneinferred from --port/-p/PORT= in start command
pythonpyproject.toml, requirements.txt, setup.py, or manage.py (src/verify/recipes.ts:276-280) — FastAPI-flavoured when fastapi/uvicorn in depspip install -r requirements.txt (or uv sync / poetry install / pipenv install / pip install -e .)pytest if tests/ else python -m unittest discoverhttp for FastAPI, otherwise none8000 (FastAPI)
remixpackage.json with @remix-run/dev or @remix-run/react (src/verify/recipes.ts:226)per-lockfile package manager installscripts.build, scripts.typecheckscripts.test, scripts.check, scripts.linthttp3000
rustCargo.toml (src/verify/recipes.ts:365-380)cargo buildcargo testnone
sveltekitpackage.json with @sveltejs/kit dep (src/verify/recipes.ts:218)per-lockfile package manager installscripts.build, scripts.typecheckscripts.test, scripts.check, scripts.linthttp5173
unknownNo matchers fired (src/verify/recipes.ts:489-505)none
vitepackage.json with vite dep (src/verify/recipes.ts:234)per-lockfile package manager installscripts.build, scripts.typecheckscripts.test, scripts.check, scripts.linthttp5173

Notes per row

  • dotnet: scanner descends two directory levels (skipping dotfiles, node_modules, bin, obj) — covers root and src/-nested layouts produced by Muonroi.BaseTemplate / Muonroi.Microservices.Template / Muonroi.Modular.Template. When Directory.Build.props is present, appLabel becomes .NET (Muonroi BB) and a note is added: "run pwsh scripts/check-modular-boundaries.ps1 after build if the script is present" (src/verify/recipes.ts:466-472).
  • Node-family (nextjs, vite, astro, sveltekit, remix, cra): also emit bootstrap commands (apt-get install nodejs npm, optional Bun installer) and shell init (DEBIAN_FRONTEND=noninteractive, optional BUN_INSTALL/PATH exports) — see getNodeWebShellInitCommands / getNodeWebBootstrapCommands (src/verify/recipes.ts:88-119).
  • Package manager is detected via lockfile presence in detectPackageManager (src/verify/recipes.ts:65-82): pnpm-lock.yamlpnpm, bun.lock/bun.lockbbun, yarn.lockyarn, package-lock.jsonnpm, uv.lockuv, poetry.lockpoetry, Pipfile.lockpipenv.

Fallback behavior

inferFallbackRecipe (src/verify/recipes.ts:507-517) tries detectors in this order:

  1. If package.json parsed: detectNodeRecipe (always wins for JS/TS).
  2. Otherwise: detectPythonRecipedetectGoRecipedetectRustRecipedetectJavaRecipedetectDotnetRecipedetectFallbackRecipe.

detectFallbackRecipe itself tries detectMakeRecipe first; only if no Makefile exists does it return the unknown recipe (appLabel: "Unknown project type", empty commands, evidence ["No known app metadata detected"], note instructing the verify sub-agent to derive commands by inspecting the repo). When unknown reaches CB-3 (verify gate), the sprint halts and asks the user to provide a manifest.

How to extend

To add a new ecosystem (e.g. Elixir/Mix):

  1. Detector: export detectMixRecipe(cwd: string): VerifyRecipe | null in src/verify/recipes.ts. Return null when markers (mix.exs) are absent; otherwise return a fully populated VerifyRecipe with ecosystem: "elixir", appKind: "mix", install/build/test commands, and evidence strings.
  2. Wire-in: add detectMixRecipe(cwd) ?? into the inferFallbackRecipe chain (src/verify/recipes.ts:507-517) in the priority slot you want.
  3. Union: add "mix" to the VerifyAppKind union (src/verify/recipes.ts:9-25) AND to the literal array inside normalizeVerifyAppKind (src/verify/recipes.ts:142-165). Both edits are required — the union gives compile-time safety, the array gates runtime normalization.

Run bunx tsc --noEmit after — TypeScript will flag any switch/match expressions that need updating for the new variant. Add a row to this matrix and re-run node scripts/check-cli-docs-drift.mjs.