initnow writes.webikon/project.json(schema v2) and deletes.webentor/project.json. The new file carries four required fields —schema_version,slug,stack,theme_path— plus the optionalsetup_cli_version, and nothing else. Every version and feature flag the old file cached is now derived by the maintenance reporter (≥ 2.5.0) from the artefact that owns it: the theme's Composer lock forwebentor-core, the rootcomposer.jsonversionfor the starter release, the theme's pnpm lock forwebentor-configs,scripts/setup-core/composer.jsonfor this CLI, andscripts/.env.setupfor the toggles. Those cached values drifted on every project that re-raninit, or that updated a package without re-running it.initis now merge-aware and never clobbers a hand-setstack. A hybrid project — one consumingwebentor-corewithout starter lineage — is indistinguishable from a full stack at init time, so a declared value wins over thewebentor-v2default.--stackoverrides it explicitly and is validated against the closed setwebentor-v2,webentor-v2-hybrid,webentor-v1,sage,classic. Layout (bedrock vs classic) is deliberately not part of that set: the reporter derives it, so a project cannot declare one thing and be another.theme_pathresolves asWP_THEMES∩ themes that actually declarewebentor-core.WP_THEMESlists every theme the setup builds deps for, so on a multi-theme project it is a superset and propagating it verbatim would name the wrong theme. Where more than one member consumes core,initprompts. Where none does, the field is omitted with a loud warning rather than guessed.setup_cli_versionis declared, not derived — anddoctornow fails on drift. It is the one version the file carries, because its artefact (scripts/setup-core/composer.json) lives underscripts/, which is deploy-excluded: without the declaration a production host cannot report a setup CLI version at all.initmirrors the artefact and never substitutes the running CLI's own version, so a project with noscripts/setup-coregets no field. Because agit subtree pullmoves the artefact without re-runninginit, this is the one field that can rot —doctorcompares the two and exits 1 on mismatch, printing the exact fix. Always correct the declaration to match the artefact, never the reverse.- Removed
--starter-version: it only ever fed the metadata file, and itslatestdefault was being persisted as though it were a version number. - Removed the now-dead
detectCoreVersion,detectConfigsVersion,detectPhpConstraint,detectNodeConstraint,detectSetupCliVersionandscanThemeFileshelpers. doctorchecks for.webikon/project.json.
- Remove the
upgrade-startercommand and its manifest-based file transforms (replace_text,remove_path,ensure_directory) along with theupgrades/recipe directory. The mechanism was unused (no manifests ever shipped) and is superseded by@webikon/webentor-codemods, which handles consumer code transforms acrosswebentor-coreupdates.initanddoctorare unchanged; syncingscripts/setup-corefrom tagged releases viagit subtree pullis unaffected.
- Add configurable
WP_THEMES_DIRfor non-Bedrock project support
- Improve init UX
- Add basic project files scaffolding
- Fix migratedb command
- Remove unused init script
- Fix error handling
- Improve multisite handling
- Extracted setup runtime from starter into standalone repository.
- Added hook runner with project-owned extension points.
- Added feature toggles in
.env.setupcontract. - Added thin
webentor-setupCLI (init,upgrade-starter,doctor). - Added upgrade manifest support with dry-run markdown reporting.