websenso / prestashop-module-devtools
Tools & script to automatically fix code for PrestaShop modules.
Package info
gitlab.com/JeffWebsenso/ws-module-devtools
pkg:composer/websenso/prestashop-module-devtools
Requires
- php: >=8
- friendsofphp/php-cs-fixer: ^3.94.2
- guzzlehttp/guzzle: ^7.0
- phpstan/phpstan: ^1.12.13
- prestashop/autoindex: ^2.1
- prestashop/header-stamp: ^2.3
- prestashop/php-dev-tools: 5.0
- spaze/phpstan-disallowed-calls: ^2.10.0
- squizlabs/php_codesniffer: 3.7.2
- stancer/php-stubs-prestashop: ^8.1
- symfony/console: ^4.4|^5.0|^6.0
- symfony/finder: ^4.4|^5.0|^6.0
- symfony/yaml: ^5.0|^6.0|^7.0
README
The ultimate PrestaShop developer tool to test and fix module source code to best fit the PrestaShop Online Module Validator standards.
Support
Built for PrestaShop 8.x & 9.x
Installation
1. Add as a Composer dev dependency
From your module root, run:
composer require-dev websenso/prestashop-module-devtools:^1
Or add it manually to your composer.json:
"require-dev": {
"websenso/prestashop-module-devtools": "^1"
}
Then run composer install.
2. Run the setup command
After installation, run the setup command from your module root to:
- Create the validator-api config file and optionally save your API key
- Download and install the
prestashop-module-developmentskill (vianpx skills addif available, or a sparse git clone fallback fromjeffsenso/prestashop-skills) - Download the PrestaShop 9 core AI context into
skills/<skill-path>/ps9-core-ai/(sparse clone of the.ai/folder fromPrestaShop/PrestaShop@develop) - Write
.instructions.md(AI coding assistant instructions) to your project root, pointing to the installed skill path - Copy
.gitlab-ci.yml(example CI pipeline) to your project root
php vendor/bin/lotr --install
.instructions.mdis always overwritten with the correct skill path. The skill andps9-core-ai/prompt to update if already present. All other files are only created if they do not already exist.
Re-run
lotr --installat any time to update the skill andps9-core-ai/to the latest version.
3. Configure the licence header stamp
Edit vendor/websenso/prestashop-module-devtools/header-stamp/license_header.txt to set your licence header.
Optionally edit license_header_phpDocs.txt as well.
4. Validator API key (online validation only)
If you skipped the API key during --install, edit:
vendor/websenso/prestashop-module-devtools/validator-api/config/config.yaml
Get a free API key from https://validator.prestashop.com/.
5. GitLab pipeline
An example CI pipeline for PHP 8 / PrestaShop 8 is available at:
vendor/websenso/prestashop-module-devtools/gitlab/.gitlab-ci.yml
It is automatically copied to your project root by --install.
Usage
Run from your module root:
php vendor/bin/lotr
php vendor/bin/lotr --dry-run
LOTR Options
| Flag | Effect |
|---|---|
| (none) | Apply all fixes |
--dry-run | Preview changes without writing anything |
--install | Set up config and copy example files to project root |
--release | Create a release ZIP after all tools pass |
--validate-online | Submit the ZIP to validator.prestashop.com |
--release --validate-online | Full release workflow |
What LOTR Runs
AutoIndex
vendor/bin/autoindex prestashop:add:index --exclude=vendor,tests,.devtools,_devHeader Stamp
php vendor/websenso/prestashop-module-devtools/header-stamp/bin/smart-header-stamp [--dry-run]PS Version Checker
php vendor/websenso/prestashop-module-devtools/psversion-checker/bin/psversion-checker fix [--dry-run]PS Validator
php vendor/websenso/prestashop-module-devtools/homemade-ps-validator/bin/homemade-ps-validator validate [--dry-run]PHPStan
_PS_ROOT_DIR_=<prestashop_root> vendor/bin/phpstan analyse --configuration=vendor/websenso/prestashop-module-devtools/phpstan/phpstan.neonPHP-CS-Fixer
vendor/bin/php-cs-fixer fix --config=vendor/websenso/prestashop-module-devtools/.php-cs-fixer.dist.php [--dry-run]
After all steps pass, optional post-processing runs:
Release ZIP creator (with
--release)php vendor/websenso/prestashop-module-devtools/release-zip-creator/bin/create-releaseOnline validation (with
--validate-online)php vendor/websenso/prestashop-module-devtools/validator-api/bin/validate-online
AI Assistant integration
Quick start — add your naming conventions: Edit
vendor/websenso/prestashop-module-devtools/steering/frameworks/prestashop/custom-patterns.mdto set your table prefix, admin tab group, and namespace. The AI assistant loads this file automatically on every task.
The package ships a steering layer (always available in vendor/) and --install downloads two more context layers. Together they write a .instructions.md to your project root that tells the AI assistant to load all three before starting any task.
Note:
skills/is intentionally empty in the Composer package. Skills are never bundled — they are always downloaded fresh bylotr --install.
Layer 0 — Steering (shipped with the package)
Included in the Composer package at vendor/websenso/prestashop-module-devtools/steering/. No download required.
| File | Topic |
|---|---|
steering/resolver.md | Load order and conflict resolution rules |
steering/frameworks/prestashop/architecture.md | Module layout, DI, Doctrine ORM, FixturesInstaller, theme template injection, translations, Grid gotchas |
steering/frameworks/prestashop/coding-standards.md | PHPCS, Symfony patterns, SQL rules, forbidden list |
steering/frameworks/prestashop/custom-patterns.md | Company-specific conventions: table prefix, admin tab group, namespace, validation, service guard patterns |
custom-patterns.md ships with Websenso defaults. To apply your own team's naming conventions, edit the file directly at:
vendor/websenso/prestashop-module-devtools/steering/frameworks/prestashop/custom-patterns.md
For per-module overrides (e.g. a specific module that deviates from the team standard), use layer 4: create .ai/projects/<module-slug>/project-context.md at your project root. Rules defined there win over custom-patterns.md.
Layer 1 — prestashop-module-development skill
Downloaded from jeffsenso/prestashop-skills:
- Primary:
npx skills add→ installs toskills/.agents/skills/prestashop-module-development/ - Fallback: sparse
git clone→ installs toskills/prestashop-module-development/
The .instructions.md written to your project root is automatically updated to point to whichever path was used.
Layer 2 — PrestaShop 9 core AI context (ps9-core-ai/)
Sparse-cloned from PrestaShop/PrestaShop@develop (.ai/ sub-tree only). Placed at skills/<skill-path>/ps9-core-ai/. Provides domain and component contexts for the entire PS9 codebase (~50 domains: CQRS commands, Grid, Forms, Customer, Product, Order, …). Re-run lotr --install at any time to update it.
The installed skill (SKILL.md) is a lean index that delegates to topic-specific reference files under references/:
| File | Topic |
|---|---|
module-structure.md | Folder layout, namespace, autoloading |
module-class-and-installer.md | Main class, hooks, installTabs() / uninstallTabs() |
database-and-entities.md | ObjectModel vs Doctrine overview |
entity-doctrine.md | Doctrine ORM pattern: entity naming, ws_ prefix, Repository, Manager |
grid-system.md | Grid definition, QueryBuilder, filters, position |
configuration-page.md | Symfony form-based config page |
services-and-di.md | services.yml, common.yml, factory registration |
translations.md | Trans domains, catalogue extraction |
hooks-and-front-office.md | Hook registration, front-office rendering |
security.md | CSRF, SQL injection, input validation |
legacy-conversion.md | Migrating from ObjectModel / legacy controllers |
debugging.md | PHPStan, cache clearing, Symfony debug tools |
validation.md | lotr pipeline, PS validator rules |
Key rules enforced by the skill
- No raw SQL outside Repository, Manager, or
SqlQueries.php(CREATE/DROP only) — applies to FixturesInstaller, Installer, hooks, and widget methods too. - Services split —
config/common.ymlfor Doctrine-only dependencies (both kernels);config/admin/services.ymlfor admin-only services;config/front/services.ymlfor front-office services. Do NOT create a root-levelconfig/services.yml. - Service guard — admin:
$this->has()ternary + early return; front-office: plain$this->get()+ null check. Never useContainerFinder. - FixturesInstaller must use
Db::getInstance()raw SQL —SymfonyContainer::getInstance()returnsnullin thepr:moconsole context, making all Doctrine ORM calls silently no-ops.Db::getValue()appendsLIMIT 1internally — never add it manually. - Theme template injection — PS8 does not support theme overrides from modules; use marker-based file patching. Two-class design:
ThemeTemplateInjector(service) +ThemeTemplateInstaller(orchestrator). Never useTheme::getThemes()— usescandir(_PS_ALL_THEMES_DIR_)instead. - No
getTabs()in the main module class — manage tabs viaInstaller::installTabs()/uninstallTabs(). - Entity class name = table name without
_DB_PREFIX_— Doctrine derives the table name from the class name. Table prefix convention is defined insteering/frameworks/prestashop/custom-patterns.md. FrameworkBundleAdminController::trans()parameter order is($id, $domain, $parameters)— NOT Symfony's standard order. Never pass[]as domain.
Contributing
Contributions are welcome! This project is a work in progress and new features, fixes, and improvements are continuously being added.
To report a bug, request a feature, or track ongoing work, please visit the issue tracker: https://gitlab.com/JeffWebsenso/ws-module-devtools/-/work_items