Greenfield starter for Webware packages: the shared tooling config, the organization's required CI workflow contract, and a containerized dev environment — so a new component starts aligned instead of being retrofitted.
The badges are fenced deliberately. Un-fence the block below, replace every placeholder with the derived repository's own coordinates, and delete this note. Nothing should advertise a workflow, a package or a report that does not exist yet.
[](https://packagist.org/packages/OWNER/PACKAGE)
[](https://packagist.org/packages/OWNER/PACKAGE)
[](LICENSE)
[](https://github.com/ORG/REPO/actions/workflows/required/webinertia/.github/.github/workflows/continuous-integration.yml)
[](https://codecov.io/gh/ORG/REPO)
[](https://dashboard.stryker-mutator.io/reports/github.com/ORG/REPO/DEFAULT_BRANCH)Placeholders: OWNER/PACKAGE is the Packagist name, ORG/REPO the GitHub
coordinates, DEFAULT_BRANCH the default branch.
Everything in this repository is either a package of record consumed from
webware/webware-tools, or the thin per-repo wiring that cannot live in a shared
config:
| Path | Role |
|---|---|
mago.toml |
Extends the centre (vendor/webware/webware-tools/mago.toml) and overrides php-version only. Never re-add general rules locally. |
webware-ci.json |
The required CI workflow's parameter contract — read from the repository root by webinertia/.github. |
phpunit.xml.dist |
PHPUnit 13 strict mode: requireCoverageMetadata, failOnNotice, failOnWarning, failOnDeprecation. |
compose.yml / Dockerfile / .devcontainer/ |
The containerized toolchain (Composer, PHPUnit, Mago, Infection, PHPBench, roave BC-check). |
src/ConfigProvider.php |
The package wiring entry point, declared under extra.laminas.config-provider. |
mago.toml, phpunit.xml.dist, .gitattributes, codecov.yml, Dockerfile,
.dockerignore, infection.json5.dist, phpbench.json.dist and devcontainer config are
byte-identical to the canonical artifacts in
webware-tools/presets/webware-alignment/artifacts/ — copy updates from there rather than
editing them here.
Work the list top to bottom; the namespace rename is the one that bites, because
extra.laminas.config-provider is a plain string that no tool validates for you.
-
composer.json—name,description,keywords -
composer.json—extra.laminas.config-provider→ the new FQCN -
composer.json— both PSR-4 roots:Webware\Skeleton\→src/and the twoWebwareTest*roots -
src/,test/unit/,test/integration/— namespaces andusestatements - Every new file's header block — "This file is part of the Webware Skeleton package"
-
.github/copilot-instructions.md— the title line -
README.md— this title, the description, and the fenced badge block (un-fence it, replace the placeholders) -
LICENSE— copyright holder and year -
webware-ci.json—min_msi/min_covered_msi(see below), and uncomment thedb_*keys for a package whose tests need a database - Default branch — a new repo starts on an
N.N.xbranch (this one is1.0.x)
The full badge block sits at the top of this file, fenced. Un-fence it and replace the
OWNER/PACKAGE, ORG/REPO and DEFAULT_BRANCH placeholders there rather than adding a
second copy here.
The Stryker badge embeds the branch segment — update it in both the badge URL and the dashboard link whenever the default branch changes.
Do not point the CI badge at continuous-integration.yml. A consumer repository has no
such file, so that URL 404s. The required-route URL above is the one GitHub's own "Create
status badge" dialog produces, because the workflow file lives in the config repository.
Both MSI gates are set to 95 — the ecosystem standard, not a starting point. Lower them only with a deliberate decision, and never silently:
"min_msi": "95",
"min_covered_msi": "95"Four Mago gates run in CI and must be clean: format --check, lint, analyze, guard.
Run mago fmt first when making changes, and fix findings at source rather than adding
@mago-expect — a suppression needs to be a decision, not a reflex.
The toolchain runs in a container, so the host needs no PHP install. With VS Code, reopen in the container; without it:
docker compose up -d
docker compose exec tooling composer install
docker compose exec tooling composer test
docker compose exec tooling composer test-integration
docker compose exec tooling mago lint
docker compose downPackages whose tests need MySQL uncomment the mysql service in compose.yml, mirroring the
db_image / db_env_json / db_port values they declare in webware-ci.json.