TYPO3 Extension Conformance Checker
Evaluate TYPO3 extensions against TYPO3 coding standards, architecture patterns, and best practices.
When to Use
- Extension quality / TER readiness
- Scored conformance reports
- Modernization to v12/v13/v14 (v14.3 LTS is default/gold standard)
Delegation
Testing -> typo3-testing | Docs -> typo3-docs | OpenSSF -> enterprise-readiness | Release/TER -> github-release
Raising the extension onto a newer TYPO3 version -> typo3-extension-upgrade, and stop here. Measured: asked to make an extension work with the current LTS, agents loaded this skill instead and delivered a conformance pass — ext_tables.php removed, deprecated calls searched, strict_types counted — then reported done. The manifest still named the old versions and nothing had been installed or tested against the new one. An audit of the current state is not an upgrade, and a widened constraint is not one either. If the request is a version raise, hand it over rather than auditing what is in front of you.
Scope: extensions only. Site/project repos (type: project + Compose) — score with the gold checker typo3-14-gold/tools/conformance.
Workflow
Step 0: Context
Read ext_emconf.php + composer.json for version, type, scope.
Steps 1-11: Checks
- Metadata -- key, TYPO3 version, type
- Structure -- composer.json, ext_emconf.php, Classes/, Configuration/, Resources/
- Coding -- strict_types, PSR-12, PHP 8.4 explicit nullable, PHP 8.5 float-to-int
- Prohibited -- no
$GLOBALS, no GeneralUtility::makeInstance() for services
- Architecture -- constructor DI, Services.yaml, PSR-14 events (try/catch), PSR-3 logging (LoggerAware+NullLogger), factory fallback
- Backend -- ES6, Modal API, CSRF, CSP (v13+)
- Testing -- PHPUnit, Playwright E2E, coverage >70%
- Practices -- DDEV, runTests.sh, CI/CD
- TER -- publish workflow, upload comment
- Audit -- PHPStan baseline, TCA searchFields, XLIFF, cache has()+get(), query properties, multi-version adapters
- v14 readiness -- no
ext_tables.php/HashService/magic finders; Fluid VHs strict; XLF 2-space. See references/v14-deprecations.md.
Step 12: Verify
Re-run after fixes. Document score delta.
Quick Grep Recipes
grep -rL 'strict_types' Classes/ --include='*.php'
grep -rn '\$GLOBALS' Classes/ --include='*.php'
grep -rn 'GeneralUtility::makeInstance' Classes/ --include='*.php'
grep -rPn '\(\s*[A-Za-z\\]+\s+\$\w+\s*=\s*null' Classes/ --include='*.php' | grep -v '?' # PHP 8.4 implicit nullable
grep -rn '->has(' Classes/ --include='*.php' # cache has()+get() anti-pattern
grep -l 'strict_types' ext_emconf.php # ext_emconf must NOT have strict_types
grep -rn '(int)\s*\$' Classes/ --include='*.php' # PHP 8.5 implicit float-to-int
grep -rn 'data-toggle\|data-dismiss\|data-ride' Resources/ --include='*.html' # Bootstrap 4 in Fluid
grep -rn 'HashService\|GeneralUtility::hmac(\|->findBy[A-Z]\|->findOneBy[A-Z]\|->countBy[A-Z]' Classes/ --include='*.php' # v14 removals
[ -f ext_tables.php ] && echo "WARN: ext_tables.php deprecated (#109438)" # v14.3 deprecation
Scoring
Base (0-100): Architecture(20) + Guidelines(20) + PHP(20) + Testing(20) + Practices(20). Excellence bonus up to 22. Critical issues block regardless.
| Range |
Level |
Action |
| 90+ |
Excellent |
Production/TER ready |
| 80-89 |
Good |
Minor fixes |
| 70-79 |
Acceptable |
Fix before release |
| 50-69 |
Needs Work |
Significant effort |
| <50 |
Critical |
Block deployment |
References
See references/:
- Architecture & code:
extension-architecture.md, directory-structure.md, php-architecture.md, coding-guidelines.md, best-practices.md, hooks-and-events.md
- Validation:
composer-validation.md, ext-emconf-validation.md, ext-files-validation.md, runtests-validation.md, version-requirements.md, testing-standards.md
- Multi-version:
dual-version-compatibility.md, v13-v14-dual-compatibility.md, multi-version-dependency-compatibility.md, v13-deprecations.md, v14-deprecations.md
- Practices & backend:
development-environment.md, backend-module-v13.md, ter-publishing.md, report-template.md, excellence-indicators.md, localization-coverage.md, crowdin-integration.md
Asset templates in assets/Build/: PHPStan, PHP-CS-Fixer, Rector, ESLint, Stylelint, TypoScript lint.
1---2name: typo3-conformance3description: Use when checking which TYPO3 versions an extension says it supports, when composer.json and ext_emconf.php disagree, when a version bump has left some of the files that state it behind, when reviewing a TYPO3 extension for what needs attention, or when auditing coding standards, TER readiness, deprecations and modernization to v12/v13/v14 (v14.3 LTS is the default). Raising an extension to a newer TYPO3 version is not this skill: that belongs to typo3-extension-upgrade.4---56# TYPO3 Extension Conformance Checker78Evaluate TYPO3 extensions against TYPO3 coding standards, architecture patterns, and best practices.910## When to Use1112- Extension quality / TER readiness13- Scored conformance reports14- Modernization to v12/v13/v14 (**v14.3 LTS is default/gold standard**)1516## Delegation1718Testing -> `typo3-testing` | Docs -> `typo3-docs` | OpenSSF -> `enterprise-readiness` | Release/TER -> `github-release`1920**Raising the extension onto a newer TYPO3 version -> `typo3-extension-upgrade`, and stop here.** Measured: asked to make an extension work with the current LTS, agents loaded this skill instead and delivered a conformance pass — `ext_tables.php` removed, deprecated calls searched, `strict_types` counted — then reported done. The manifest still named the old versions and nothing had been installed or tested against the new one. An audit of the current state is not an upgrade, and a widened constraint is not one either. If the request is a version raise, hand it over rather than auditing what is in front of you.2122**Scope:** extensions only. **Site/project** repos (`type: project` + Compose) — score with the gold checker [`typo3-14-gold`](https://git.netresearch.de/typo3/typo3-14-gold)`/tools/conformance`.2324## Workflow2526### Step 0: Context2728Read ext_emconf.php + composer.json for version, type, scope.2930### Steps 1-11: Checks31321. **Metadata** -- key, TYPO3 version, type332. **Structure** -- composer.json, ext_emconf.php, Classes/, Configuration/, Resources/343. **Coding** -- strict_types, PSR-12, PHP 8.4 explicit nullable, PHP 8.5 float-to-int354. **Prohibited** -- no `$GLOBALS`, no `GeneralUtility::makeInstance()` for services365. **Architecture** -- constructor DI, Services.yaml, PSR-14 events (try/catch), PSR-3 logging (LoggerAware+NullLogger), factory fallback376. **Backend** -- ES6, Modal API, CSRF, CSP (v13+)387. **Testing** -- PHPUnit, Playwright E2E, coverage >70%398. **Practices** -- DDEV, runTests.sh, CI/CD409. **TER** -- publish workflow, upload comment4110. **Audit** -- PHPStan baseline, TCA searchFields, XLIFF, cache has()+get(), query properties, multi-version adapters4211. **v14 readiness** -- no `ext_tables.php`/`HashService`/magic finders; Fluid VHs strict; XLF 2-space. See `references/v14-deprecations.md`.4344### Step 12: Verify4546Re-run after fixes. Document score delta.4748## Quick Grep Recipes4950```bash51grep -rL 'strict_types' Classes/ --include='*.php'52grep -rn '\$GLOBALS' Classes/ --include='*.php'53grep -rn 'GeneralUtility::makeInstance' Classes/ --include='*.php'54grep -rPn '\(\s*[A-Za-z\\]+\s+\$\w+\s*=\s*null' Classes/ --include='*.php' | grep -v '?' # PHP 8.4 implicit nullable55grep -rn '->has(' Classes/ --include='*.php' # cache has()+get() anti-pattern56grep -l 'strict_types' ext_emconf.php # ext_emconf must NOT have strict_types57grep -rn '(int)\s*\$' Classes/ --include='*.php' # PHP 8.5 implicit float-to-int58grep -rn 'data-toggle\|data-dismiss\|data-ride' Resources/ --include='*.html' # Bootstrap 4 in Fluid59grep -rn 'HashService\|GeneralUtility::hmac(\|->findBy[A-Z]\|->findOneBy[A-Z]\|->countBy[A-Z]' Classes/ --include='*.php' # v14 removals60[ -f ext_tables.php ] && echo "WARN: ext_tables.php deprecated (#109438)" # v14.3 deprecation61```6263## Scoring6465**Base (0-100):** Architecture(20) + Guidelines(20) + PHP(20) + Testing(20) + Practices(20). Excellence bonus up to 22. Critical issues block regardless.6667| Range | Level | Action |68|-------|-------|--------|69| 90+ | Excellent | Production/TER ready |70| 80-89 | Good | Minor fixes |71| 70-79 | Acceptable | Fix before release |72| 50-69 | Needs Work | Significant effort |73| <50 | Critical | Block deployment |7475## References7677See `references/`:7879- **Architecture & code:** `extension-architecture.md`, `directory-structure.md`, `php-architecture.md`, `coding-guidelines.md`, `best-practices.md`, `hooks-and-events.md`80- **Validation:** `composer-validation.md`, `ext-emconf-validation.md`, `ext-files-validation.md`, `runtests-validation.md`, `version-requirements.md`, `testing-standards.md`81- **Multi-version:** `dual-version-compatibility.md`, `v13-v14-dual-compatibility.md`, `multi-version-dependency-compatibility.md`, `v13-deprecations.md`, `v14-deprecations.md`82- **Practices & backend:** `development-environment.md`, `backend-module-v13.md`, `ter-publishing.md`, `report-template.md`, `excellence-indicators.md`, `localization-coverage.md`, `crowdin-integration.md`8384Asset templates in `assets/Build/`: PHPStan, PHP-CS-Fixer, Rector, ESLint, Stylelint, TypoScript lint.