typo3-fractor
Automates non-PHP TYPO3 upgrade migrations with Fractor for FlexForms, TypoScript, Fluid, YAML, Htaccess, and composer.json changes. Use when running or configuring Fractor, upgrading non-PHP TYPO3 files, migrating FlexForms or TypoScript, modernizing Fluid templates, or combining Rector and Fractor for v14 work.
What this skill does
# TYPO3 Fractor Skill
> Source: https://github.com/dirnbauer/webconsulting-skills
Fractor is a generic file refactoring tool that automates non-PHP migrations for TYPO3 upgrades. It complements [Rector](https://github.com/sabbelasichon/typo3-rector) (which handles PHP) by migrating FlexForms, TypoScript, Fluid templates, YAML, Htaccess files, and composer.json.
**Target:** TYPO3 **v14.x** for this skill collection. Upstream Fractor sets may still be named `TYPO3_12`, `TYPO3_13`, etc. — those are historical bundle identifiers for rules you apply while moving code **toward** a v14 codebase.
> **TYPO3 API First:** Always use TYPO3's built-in APIs, core features, and established conventions before creating custom implementations. Always verify that the APIs and methods you use exist and are not deprecated in TYPO3 v14 by checking the official TYPO3 documentation.
> **Safety:** Never run Fractor on production. Always run on a development environment with version control. Review and test changes before releasing.
## Fractor vs Rector
| Tool | Handles | Package |
|------|---------|---------|
| **Rector** | PHP code (classes, TCA PHP, ext_localconf, etc.) | `ssch/typo3-rector` |
| **Fractor** | Non-PHP files (FlexForms, TypoScript, Fluid, YAML, Htaccess, composer.json) | `a9f/typo3-fractor` |
Use both together for complete TYPO3 upgrades. See the `typo3-extension-upgrade` skill for the full workflow.
## 1. Installation
```bash
composer require --dev a9f/typo3-fractor
# or with DDEV:
ddev composer require --dev a9f/typo3-fractor
```
> **Important:** Like Rector, Fractor loads the project autoloader and requires a PHP version
> that can parse the installed TYPO3 packages. For TYPO3 v14 targets, run Fractor with
> PHP 8.2+. Use DDEV or a container if your local PHP is older.
> **Always run Fractor, never skip it.** Non-PHP files (FlexForms, TypoScript, Fluid) contain
> version-specific patterns that are easy to miss in manual review. Fractor rules are
> maintained by the TYPO3 community and cover edge cases.
This meta-package installs all TYPO3-specific file processors:
- `a9f/fractor` (core engine)
- `a9f/fractor-xml` (FlexForm/XML processing)
- `a9f/fractor-fluid` (Fluid template processing)
- `a9f/fractor-typoscript` (TypoScript/TSconfig processing)
- `a9f/fractor-yaml` (YAML processing)
- `a9f/fractor-htaccess` (Htaccess processing)
- `a9f/fractor-composer-json` (composer.json processing — **not installed as a dependency** of `a9f/typo3-fractor`; add `composer require --dev a9f/fractor-composer-json` if you need it)
## 2. Configuration
### Quick Start
Generate a default config:
```bash
vendor/bin/typo3-fractor-init
```
### Manual Configuration
Create `fractor.php` in your project root:
```php
<?php
declare(strict_types=1);
use a9f\Fractor\Configuration\FractorConfiguration;
use a9f\Typo3Fractor\Set\Typo3LevelSetList;
return FractorConfiguration::configure()
->withPaths([
__DIR__ . '/packages/',
])
->withSets([
Typo3LevelSetList::UP_TO_TYPO3_14,
]);
```
### Configuration for v14
```php
<?php
declare(strict_types=1);
use a9f\Fractor\Configuration\FractorConfiguration;
use a9f\Typo3Fractor\Set\Typo3LevelSetList;
return FractorConfiguration::configure()
->withPaths([
__DIR__ . '/Configuration/',
__DIR__ . '/Resources/',
])
->withSets([
Typo3LevelSetList::UP_TO_TYPO3_14,
]);
```
### Skip Rules or Files
```php
<?php
declare(strict_types=1);
use a9f\Fractor\Configuration\FractorConfiguration;
use a9f\Typo3Fractor\Set\Typo3LevelSetList;
use a9f\Typo3Fractor\TYPO3v12\FlexForm\MigrateRequiredFlagFlexFormFractor;
return FractorConfiguration::configure()
->withPaths([__DIR__ . '/packages/'])
->withSkip([
MigrateRequiredFlagFlexFormFractor::class,
__DIR__ . '/packages/legacy_ext/',
__DIR__ . '/packages/my_ext/Resources/Private/Templates/Old.html' => [
\a9f\Typo3Fractor\TYPO3v14\Fluid\ChangeLogoutHandlingInFeLoginFractor::class,
],
])
->withSets([
Typo3LevelSetList::UP_TO_TYPO3_14,
]);
```
### Apply Single Rules
```php
<?php
declare(strict_types=1);
use a9f\Fractor\Configuration\FractorConfiguration;
use a9f\Typo3Fractor\TYPO3v12\FlexForm\MigrateItemsIndexedKeysToAssociativeFractor;
return FractorConfiguration::configure()
->withPaths([__DIR__ . '/packages/'])
->withRules([
MigrateItemsIndexedKeysToAssociativeFractor::class,
]);
```
## 3. Running Fractor
### Dry Run (Preview)
```bash
vendor/bin/fractor process --dry-run
```
### Apply Changes
```bash
vendor/bin/fractor process
```
### Run Single Rule from Set
```bash
vendor/bin/fractor process --only="a9f\Typo3Fractor\TYPO3v14\TypoScript\RemoveExternalOptionFromTypoScriptFractor"
```
### With DDEV
```bash
ddev exec vendor/bin/fractor process --dry-run
ddev exec vendor/bin/fractor process
```
## 4. Available Set Lists
### Level Sets (Cumulative)
Apply all rules up to a target version:
| Set List | Includes |
|----------|----------|
| `Typo3LevelSetList::UP_TO_TYPO3_10` | Imports `UP_TO_TYPO3_9` plus `TYPO3_10` rules only (see package `config/level/up-to-typo3-10.php`) |
| `Typo3LevelSetList::UP_TO_TYPO3_11` | ... + v11 |
| `Typo3LevelSetList::UP_TO_TYPO3_12` | ... + v12 |
| `Typo3LevelSetList::UP_TO_TYPO3_13` | ... + v13 |
| `Typo3LevelSetList::UP_TO_TYPO3_14` | ... + v14 |
### Version-Specific Sets
Apply rules for a single version only:
| Set List | Description |
|----------|-------------|
| `Typo3SetList::TYPO3_12` | v12 rules only |
| `Typo3SetList::TYPO3_13` | v13 rules only |
| `Typo3SetList::TYPO3_14` | v14 rules only |
## 5. Rules by File Type and Version
### FlexForm Rules (v12)
| Rule | Migration |
|------|-----------|
| `MigrateEmailFlagToEmailTypeFlexFormFractor` | `eval=email` → `type=email` |
| `MigrateEvalIntAndDouble2ToTypeNumberFlexFormFractor` | `eval=int/double2` → `type=number` |
| `MigrateInternalTypeFolderToTypeFolderFlexFormFractor` | `internalType=folder` → `type=folder` |
| `MigrateItemsIndexedKeysToAssociativeFractor` | Indexed items → `label`/`value` keys |
| `MigrateNullFlagFlexFormFractor` | `eval=null` → `nullable=true` |
| `MigratePasswordAndSaltedPasswordToPasswordTypeFlexFormFractor` | Password eval → `type=password` |
| `MigrateRenderTypeColorpickerToTypeColorFlexFormFractor` | `renderType=colorPicker` → `type=color` |
| `MigrateRequiredFlagFlexFormFractor` | `eval=required` → `required=1` |
| `MigrateTypeNoneColsToSizeFlexFormFractor` | `cols` → `size` for type=none |
| `RemoveTceFormsDomElementFlexFormFractor` | Remove `<TCEforms>` wrapper |
### TypoScript Rules (v12)
| Rule | Migration |
|------|-----------|
| `MigrateTypoScriptLoginUserAndUsergroupConditionsFractor` | Legacy conditions → Symfony expressions |
| `MigrateDeprecatedTypoScriptConditionsFractor` | Deprecated TypoScript `[compatVersion]` / old condition syntax → supported forms |
| `RemoveConfigDisablePageExternalUrlFractor` | Remove `config.disablePageExternalUrl` |
| `RemoveConfigDoctypeSwitchFractor` | Remove `config.doctypeSwitch` |
| `RemoveConfigMetaCharsetFractor` | Remove `config.metaCharset` |
| `RemoveConfigSendCacheHeadersOnlyWhenLoginDeniedInBranchFractor` | Remove deprecated cache header config |
| `RemoveConfigSpamProtectEmailAddressesAsciiOptionFractor` | Remove `ascii` option |
| `RemoveNewContentElementWizardOptionsFractor` | Remove legacy CE wizard TSconfig |
| `RemoveWorkspaceModeOptionsFractor` | Remove workspace mode options |
| `RenameConfigXhtmlDoctypeToDoctypeFractor` | `xhtmlDoctype` → `doctype` |
| `RenameTcemainLinkHandlerMailKeyFractor` | Rename mail link handler key |
| `UseConfigArrayForTSFEPropertiesFractor` | TSFE properties → config array |
### Fluid Rules (v12)
| Rule | Migration |
|------|-----------|
| `AbstractMessageGetSeverityFluidFractor` | Migrate severity constants in Fluid |
### TypoScript rules (bundle id `TYPO3_13`)
These rules are published under the historicaRelated in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.