- PHP 76.3%
- Twig 13.9%
- JavaScript 5.6%
- CSS 3.1%
- Shell 0.8%
- Other 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| assets | ||
| bin | ||
| config | ||
| content/docs | ||
| deploy | ||
| docker | ||
| lib/jumphp2installer/src | ||
| public | ||
| resources/fonts | ||
| shooter | ||
| src | ||
| templates | ||
| tests | ||
| tools | ||
| translations | ||
| .dockerignore | ||
| .editorconfig | ||
| .env | ||
| .env.dev | ||
| .env.test | ||
| .gitignore | ||
| compose.yaml | ||
| composer.json | ||
| composer.lock | ||
| Dockerfile | ||
| importmap.php | ||
| phpstan.dist.neon | ||
| phpunit.dist.xml | ||
| README.md | ||
| symfony.lock | ||
JumPHP playground
Le site des jeux JumPHP : des jeux rétro écrits en PHP, joués dans le navigateur.
- Annuaire par catégorie, recherche, une page par jeu (le site du jeu,
games/<id>/site/, s'il en a un). - Les jeux tournent dans le navigateur avec le moteur JumPHP partagé (
/engine/<version>/, téléchargé une fois pour tous les jeux) et les fichiers du jeu chargés un par un (mode distant de JumPHP,docs/remote.md). Ils sont servis par une origine à part (PLAY_URL) sans session ni cookie du portail. - Sources navigables, éditeur en ligne (CodeMirror) : brouillons enregistrés au fil de la frappe, aperçu du jeu avec les brouillons, push sur GitHub en un commit, ou fork.
- Connexion GitHub uniquement. Un projet = un dépôt GitHub public de l'utilisateur (un projet JumPHP avec un jeu), publié à chaque push (webhook) ; catégorie choisie à la création.
- Avis des joueurs sur chaque jeu : commentaires, boîte à idées, problèmes. Tout le monde peut écrire ; un message anonyme n'est visible (de tous) qu'une fois validé par l'auteur du jeu, celui d'un connecté paraît tout de suite avec sa photo et un lien vers son profil.
- Tests PHPUnit des jeux (le dossier
tests/d'un jeu) lancés depuis le Studio ou par le Claude du créateur (MCPrun_tests), dans le servicetester(docker/tester) : pas de réseau, PHPUnit sousnobody, temps et mémoire limités ; il ne voit que le volumetests(pas de secret ni de fichier privé). Résultats test par test. - Pages développeur (
/dev/<login>) : ses jeux, ses chiffres, les derniers messages écrits et reçus. - Bac à sable (
/bac-a-sable) : l'éditeur sans compte, sur hello-world ou n'importe quel jeu (brouillons liés à un cookie signé, gardés 30 jours, pas de push). - Documentation et tutoriels (
/docs,content/docs/*.md). - API publique en lecture seule (API Platform,
/api/games,/api/categories, OpenAPI sur/api/docs, CORS ouvert) :src/ApiResource,src/State. - Serveur MCP (
/mcp, jeton fait dans/studio/mcp) : le Claude local de l'utilisateur crée le projet, clone le dépôt, fait le jeu et son site, pousse et publie (AGENTS.md§14 de JumPHP) ; il garde des notes et une todo list privées par projet (état d'avancement, aussi visibles dans le studio) et lit / modère les avis.
Symfony 7.4, FrankenPHP, MariaDB, Messenger (création des dépôts et publications en tâche de fond).
Développement
docker compose up -d
docker compose exec app php bin/console app:runtime:install # le moteur JumPHP partagé
docker compose exec app php bin/console app:project:import davidnurdin/jumPhp pong arcade --game-dir games/pong
Portail : http://jumphp.localhost:8000, jeux : http://play.jumphp.localhost:8000. Pour se connecter, une
OAuth App GitHub (callback http://jumphp.localhost:8000/connect/github/check) dans .env.local :
GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET.
Tests (base MariaDB playground_test) :
docker compose exec db mariadb -uroot -proot -e "CREATE DATABASE IF NOT EXISTS playground_test"
docker compose exec app sh -c 'APP_ENV=test php bin/console doctrine:migrations:migrate -n && php bin/phpunit'
docker compose exec app vendor/bin/phpstan analyse
Le JumPHP IDE (/ide)
L'IDE de JumPHP (ide/ du dépôt JumPHP : un cœur PHP et une interface HTML partagés avec l'application de bureau)
est installé à part, comme les moteurs : bin/ide-install copie son cœur dans lib/jumphp-ide/src (autoloadé en
JumPHP\Ide\) et son interface, avec Monaco, dans public/ide-ui/ (aucun des deux dans git).
bin/ide-install --from ../JumPHP # depuis un checkout local de JumPHP (sur l'hôte)
docker compose exec app php bin/console app:ide:install # depuis GitHub (JUMPHP_IDE_REF, défaut main)
docker compose exec app composer dump-autoload
L'image de prod le fait à la construction (--build-arg JUMPHP_IDE_REF=<branche ou tag>).
- Web IDE :
/ide(les jeux de l'utilisateur),/ide/<slug>(le propriétaire) : la page de l'interface avecwindow.JUMPHP_IDE; ses commandes passent parPOST /api/ide/<slug>/invoke{name, payload}->{result}/{error}(session + jeton CSRFeditor).App\Ide\WebIde: le cœur sur le jeu publié avec les brouillons de l'auteur par-dessus (les mêmes que l'éditeur en ligne) ; git = les brouillons (commit = un push), aperçu, tests. - Application de bureau : connexion par
/ide/connect?redirect=http://127.0.0.1:<port>/callback&state=...&device=...(adresse de bouclage uniquement), qui donne un jetonjpi_...(IdeToken, révocable dans/studio/ide). API (Authorization: Bearer jpi_...seulement) :GET /api/ide/me,GET|POST /api/ide/projects,GET /api/ide/categories,GET /api/ide/projects/<slug>,POST /api/ide/projects/<slug>/sync,POST /api/ide/projects/<slug>/tests,GET /api/ide/projects/<slug>/tests/<id>,GET /api/ide/github-token(le jeton GitHub de l'utilisateur, pour cloner / pousser ses dépôts).
Passer à une nouvelle version de PHP
bin/php-upgrade <version> (par exemple bin/php-upgrade 8.6) migre tout, le playground et JumPHP
(JUMPHP_DIR, par défaut ../JumPHP) : les images (site FrankenPHP, banc de test, runtime bureau, relais, moteur
WebAssembly à la dernière version corrective), la doc, et le code que la nouvelle version déprécie (casts
(boolean)…, setAccessible(), imagedestroy()…). Puis il reconstruit les images et lance tous les contrôles :
php -l de tout le code, PHPUnit et PHPStan du playground, les tests du moteur et bin/jumphp test de chaque jeu
(une dépréciation = un échec), et le moteur WebAssembly. Il ne touche pas à la prod et ne publie rien : la fin dit
ce qui reste à faire (release JumPHP, déploiement). --skip-wasm : sans le moteur WebAssembly (~25 min) ;
--check : seulement les contrôles.
Production
Derrière un Traefik déjà en place qui laisse passer le TLS (FrankenPHP prend ses certificats lui-même pour les
deux noms) : deploy/compose.yaml.
cp deploy/.env.example deploy/.env # noms, secrets, OAuth App GitHub (callback https://<APP_HOST>/connect/github/check)
docker compose -f deploy/compose.yaml --env-file deploy/.env up -d --build
docker compose -f deploy/compose.yaml --env-file deploy/.env exec app php bin/console app:project:import ...
Au démarrage : migrations, puis installation des moteurs JUMPHP_RUNTIMES depuis les releases de JumPHP.