SPFx teams do not only need to know whether a project builds. They need to know whether the project on disk still matches the release intent recorded by the team.
That is the problem behind m365-extension-control.
It is a small, offline, deterministic CLI for SPFx and Microsoft 365 extension estates. An estate.json file records the declared owner, lifecycle status, release channel, expected solution version, expected SPFx version, and project path. The CLI compares that declaration with bounded facts read from the project directory.
Commands:
m365-extension-control scan <project-dir>
m365-extension-control inventory --manifest estate.json
m365-extension-control evidence --manifest estate.json
m365-extension-control preflight --manifest estate.json --id <solution-id>
The MVP reports:
- solution and component identity;
- solution-version drift;
- SPFx-version drift;
- lifecycle/channel inconsistencies;
- ownership gaps;
- malformed or missing project metadata;
- explicit
verified,warning,blocked, andnot-testedstatuses; - deterministic JSON and Markdown evidence;
- local preflight decisions with exit codes suitable for CI.
The repository includes a four-solution acceptance estate covering verified, warning, blocked, and not-tested states. The implementation has 20 deterministic tests, TypeScript checks, a compiled CLI, package dry-run validation, and GitHub Actions CI.
The important boundary is deliberate: this tool does not validate a SharePoint tenant, approve an App Catalog submission, verify permissions, deploy anything, or claim production readiness. It reports local file evidence only.
This is the next layer in my SPFx tooling work:
-
spfx-factorycreates governed projects; -
spfx-assurancechecks one project internally; -
spfx-estate-doctorinventories projects on disk; -
m365-extension-controlcompares declared intent with on-disk facts and produces a local release gate.
Repository: https://github.com/vystartasv/m365-extension-control
Feedback and real-world estate examples are welcome, especially cases where a release or upgrade failed because the declared state and deployed state diverged.
Tags: #opensource #typescript #sharepoint #devtools
This article was originally published by DEV Community and written by Vilius.
Read original article on DEV Community