Agent Skills: TYPO3 Extension Conformance Checker

Use when assessing TYPO3 extension quality, conformance checking, standards compliance, modernization to v12/v13/v14 (v14.3 LTS is the default/gold standard), TER readiness, or best practices review. Also triggers on: extension audit, quality score, full assessment, fix all findings, conformance audit, Fluid 5 strict ViewHelpers, ext_tables.php removal, Extbase attributes (Authorize/RateLimit), HashService removal, Bootstrap 5 migration, CSP compliance, ViewHelper security, XLIFF hygiene, PHP 8.4/8.5 compat.

UncategorizedID: netresearch/typo3-conformance-skill/typo3-conformance

Install this agent skill to your local

pnpm dlx add-skill https://github.com/netresearch/typo3-conformance-skill/tree/HEAD/skills/typo3-conformance

Skill Files

Browse the full folder contents for typo3-conformance.

Download Skill

Loading file tree…

skills/typo3-conformance/SKILL.md

Skill Metadata

Name
typo3-conformance
Description
"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."

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.

When the request is only to check the version statements and they already agree, say so and stop. Name the range in both notations and the places you compared, and change nothing. Leave out any "minor observations" or "notes, not errors" section: an unrequested remark in a check reads as a finding, and a check that found nothing has nothing else to report.

When composer.json and ext_emconf.php disagree, establish which one is right before making them match. The newest LTS is not the answer by default. Collect the evidence first, then decide:

  1. The repository's own rule -- AGENTS.md, CONTRIBUTING.md or a README may name one file as authoritative. Quote it.
  2. What is tested -- the TYPO3 versions in the CI matrix (.github/workflows/, Build/, runTests.sh defaults).
  3. What the code needs -- APIs that exist in only one of the two lines (references/v14-deprecations.md, references/v13-deprecations.md).
  4. How the disagreement arose -- git log -p -- composer.json ext_emconf.php, where history exists.

Where the rule and the evidence agree, align both files to that line. Where they conflict -- the authoritative file names a line the CI matrix does not test -- follow the rule, and report the untested line as a finding rather than widening CI or code to match. Change only version statements: the two declarations, and documentation that repeats them. Write each file in its own notation (^13.4 in composer.json, 13.4.0-13.4.99 in ext_emconf.php -- never a caret in ext_emconf.php; a Composer gap such as ^13.4 || ^14.3 maps to one range, see references/ext-emconf-validation.md), and name the evidence that decided it in the answer.

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

  1. Metadata -- key, TYPO3 version, type; one title and description across TER, docs.typo3.org, README and GitHub (references/extension-naming.md)
  2. Structure -- composer.json, ext_emconf.php, Classes/, Configuration/, Resources/
  3. Coding -- strict_types, PSR-12, PHP 8.4 explicit nullable, PHP 8.5 float-to-int
  4. Prohibited -- no $GLOBALS, no GeneralUtility::makeInstance() for services
  5. Architecture -- constructor DI, Services.yaml, PSR-14 events (try/catch), PSR-3 logging (constructor-injected LoggerInterface in a container-built service, or LoggerAware+NullLogger), factory fallback
  6. Backend -- ES6, Modal API, CSRF, CSP (v13+)
  7. Testing -- PHPUnit, Playwright E2E, coverage >70%
  8. Practices -- DDEV, runTests.sh, CI/CD
  9. TER -- publish workflow, upload comment
  10. Audit -- PHPStan baseline, TCA searchFields, XLIFF, cache has()+get(), query properties, multi-version adapters
  11. 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, extension-naming.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.