Patch release closing two CR-39 violations discovered via end-to-end fixture verification of npx massu init against all six Phase 7 frameworks. Phoenix and ASP.NET projects could not previously install Massu (error: no languages detected); Rails / Spring / Go-chi installed but emitted generic configs missing the framework-specific variant template's framework.router, paths.source, and verification.<lang>.lint fields.
Daemon code unchanged from 1.5.0 — the in-flight 1.5.0 48 h soak verdict (started 2026-05-08T15:21:23Z) applies to 1.5.1.
Added
- Canonical manifest registry (
packages/core/src/detect/manifest-registry.ts) — single source-of-truth for every recognized manifest file. Bothpackage-detector.ts(init's framework-detection layer) andrunner.ts:buildDetectionSignals(AST adapter signal layer) consume from this registry. Adding a new manifest type now requires exactly one entry; both consumers automatically pick it up. Replaces the two parallel hand-rolled lists that diverged during Phase 7. - Elixir + C# manifest support —
mix.exsand*.csprojnow recognized by package-detector. Closes the CR-39 gap where Phoenix and ASP.NET projects failednpx massu initeven though their AST adapters worked correctly. Includes newparseMixExsandparseCsprojparser functions; the csproj parser also extracts the<Project Sdk="...">attribute for SDK-style detection. - Variant template merge (
applyVariantTemplateincommands/init.ts) — whenframework.languages.<lang>.frameworkresolves to a known id, init now reads the matchingpackages/core/templates/<id>/massu.config.yamland selectively merges itsframework.router,framework.orm,framework.ui,paths.source, andverification.<lang>.{lint,syntax,test,type,build}fields. Closes the gap where rails/spring/go-chi/phoenix init succeeded but the resulting config lacked the framework's canonical lint command (rubocop / credo / golangci-lint / etc.) and routing identifier. - Framework-detector rules for elixir + csharp —
phoenix({:phoenix, ...}in mix.exs),aspnet-core(Microsoft.AspNetCore.App/.MvcPackageReference,Microsoft.NET.Sdk.WebSdk attribute),ex-unittest framework,xunit,ecto,ef-coreORM. go-chi rules expanded to cover all major-versioned import paths (github.com/go-chi/chi/v2through/v5). - Strict gate
manifest-registry-drift.test.ts— 10 assertions: every entry has a callable parse function, unique pattern, well-formed shape; theMANIFEST_FILESconst is permanently retired; every Phase 7 framework adapter language has a registry entry; every non-nullsignalKeycorresponds to a realDetectionSignalsfield. - Strict gate
init-end-to-end.test.ts— 5 fixture-based end-to-end tests (rails, phoenix, aspnet, spring, go-chi) that runrunInitagainst minimal projects in tmpdir() and assert the emittedmassu.config.yamlcarries the variant-template-definedframework.router,paths.source, andverification.<lang>.lint. The class of bug "init succeeded but variant template missing" is now structurally impossible to merge.
Fixed
- CR-39 violation: Phoenix + ASP.NET fixtures fail
npx massu init— root cause:package-detector.ts:122-132had aMANIFEST_FILESlist missingmix.exsand*.csproj. Closed by manifest registry + new parsers. - Variant template
paths.sourcefor ASP.NET — wassrc(which doesn't exist by ASP.NET Core convention); now.(project root). ASP.NET projects placeControllers/,Pages/,Program.csetc. at the project root. source-dir-detector.tsextension map missing elixir / csharp — added.ex/.exsand.csextensions plus their respective test-file regex patterns (_test.exs,Tests?.cs,.Tests?/).
Verification
npx tsc --noEmit: 0 errorsnpm test: 2079/2079 pass (+15 new structural tests, zero regressions)bash scripts/massu-pattern-scanner.sh: PASSbash scripts/massu-generalization-scanner.sh: PASS- 5-fixture re-verification: all six Phase 7 frameworks (rails, phoenix, aspnet, spring, go-chi, python-flask covered transitively via SUPPORTED_LANGUAGE) produce valid
massu.config.yamlwith variant-template-merged fields.
Known follow-on
- AST adapter introspect output (
detected.<adapter-id>:block in emitted config) is still NOT piped through to init. The blocker iscodebase-introspector.ts:160-180sampleFilesreturning[]— adapters run but see zero source files. Closing this requires a real file-sampling layer; see follow-on plan to come.