No description
  • PHP 76.3%
  • Twig 13.9%
  • JavaScript 5.6%
  • CSS 3.1%
  • Shell 0.8%
  • Other 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-11-06 22:45:22 +01:00
assets Fix: the footer's install block has no PWA link, app.js crashed on every page without a game install menu (the online editor and the sandbox never started) 2026-11-06 22:08:50 +01:00
bin Download the IDE, the engines and the extension list from the site's forge (git.jumphp.net); GitHub stays supported 2026-11-06 21:14:10 +01:00
config Sign in with the site's own forge (Forgejo, git.jumphp.net) next to GitHub; accounts can have both; admin = duchnoun 2026-11-06 21:12:18 +01:00
content/docs Every link to JumPHP's own projects points to git.jumphp.net (templates, docs of 14 languages, translations, news) 2026-11-06 22:27:49 +01:00
deploy git.jumphp.net accounts made from a GitHub sign-in join the playground's GitHub account (id checked by the forge) 2026-11-06 21:54:04 +01:00
docker Administration redone (sections, live bridge, crash reports with detail), UDP / ICMP rights, per-address and per-account quotas, install button fixes (game manifest on every game page, installed site window), bridge log without admin calls, migrations 2026-11-06 16:30:07 +01:00
lib/jumphp2installer/src lib/jumphp2installer: 0.2.8 (the command step) 2026-11-02 22:26:50 +01:00
public Web IDE read only for read members; the CLI terminal hides hidden answers 2026-11-04 00:35:56 +01:00
resources/fonts Descriptions per language (game.yaml descriptions:), share cards, SEO in both languages 2026-10-29 09:01:44 +01:00
shooter Screenshots: the shooter reaches the app directly, a failed shot is tried again 2026-10-29 00:53:25 +01:00
src Service worker: pass-through only (never answers a request), replaces every older worker and drops their caches 2026-11-06 22:45:22 +01:00
templates Repository button says git for projects on the site's forge 2026-11-06 22:41:52 +01:00
tests Cache decided by the server: public s-maxage=60 only for anonymous pages with no cookie/session/CSRF, private no-store for everything else (Cloudflare rule now respects the origin) 2026-11-06 22:20:03 +01:00
tools Every link to JumPHP's own projects points to git.jumphp.net (templates, docs of 14 languages, translations, news) 2026-11-06 22:27:49 +01:00
translations Every link to JumPHP's own projects points to git.jumphp.net (templates, docs of 14 languages, translations, news) 2026-11-06 22:27:49 +01:00
.dockerignore JumPHP playground: games directory, shared engine, online editor, MCP server, GitHub publishing 2026-10-29 00:04:48 +01:00
.editorconfig JumPHP playground: games directory, shared engine, online editor, MCP server, GitHub publishing 2026-10-29 00:04:48 +01:00
.env Download the IDE, the engines and the extension list from the site's forge (git.jumphp.net); GitHub stays supported 2026-11-06 21:14:10 +01:00
.env.dev JumPHP playground: games directory, shared engine, online editor, MCP server, GitHub publishing 2026-10-29 00:04:48 +01:00
.env.test Sign in with the site's own forge (Forgejo, git.jumphp.net) next to GitHub; accounts can have both; admin = duchnoun 2026-11-06 21:12:18 +01:00
.gitignore Web IDE: the engine's classes and SDL functions resolve in a game 2026-11-01 12:38:15 +01:00
compose.yaml compose.yaml (dev): the app and the database restart unless stopped 2026-11-05 10:42:30 +01:00
composer.json Studio: installers (jumphp2installer): a YAML install script edited online, native installers for Windows, macOS, Linux 2026-11-01 17:34:45 +01:00
composer.lock The JumPHP IDE on jumphp.net: /ide/<project> (the IDE's interface on the published game with the owner's drafts: commit and push, preview, tests), desktop sign-in (/ide/connect, revocable tokens in /studio/ide) and the desktop IDE's API (/api/ide/*, Bearer jpi_) 2026-11-01 12:22:43 +01:00
Dockerfile The JumPHP IDE on jumphp.net: /ide/<project> (the IDE's interface on the published game with the owner's drafts: commit and push, preview, tests), desktop sign-in (/ide/connect, revocable tokens in /studio/ide) and the desktop IDE's API (/api/ide/*, Bearer jpi_) 2026-11-01 12:22:43 +01:00
importmap.php Studio: installers (jumphp2installer): a YAML install script edited online, native installers for Windows, macOS, Linux 2026-11-01 17:34:45 +01:00
phpstan.dist.neon JumPHP playground: games directory, shared engine, online editor, MCP server, GitHub publishing 2026-10-29 00:04:48 +01:00
phpunit.dist.xml English is the language of the address without one (jumphp.net), French moves to /fr/; noindex on pages without content, a canonical per page of a list; the language subdomains use Caddy's own certificate 2026-11-05 16:22:33 +01:00
README.md Every link to JumPHP's own projects points to git.jumphp.net (templates, docs of 14 languages, translations, news) 2026-11-06 22:27:49 +01:00
symfony.lock The site in English too: the browser's language, a flag to switch (FR / EN, top right) 2026-10-29 08:53:18 +01:00

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 (MCP run_tests), dans le service tester (docker/tester) : pas de réseau, PHPUnit sous nobody, temps et mémoire limités ; il ne voit que le volume tests (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 avec window.JUMPHP_IDE ; ses commandes passent par POST /api/ide/<slug>/invoke {name, payload} -> {result} / {error} (session + jeton CSRF editor). 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 jeton jpi_... (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.