diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a5e92f5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# Artefacts de build +/build/ + +# Éditeurs et système +*.swp +*~ +.DS_Store +.vscode/ +.idea/ + +# Android (pour plus tard) +.gradle/ +local.properties +*.apk +*.aab + +# Web (pour plus tard) +node_modules/ diff --git a/CREDITS.md b/CREDITS.md new file mode 100644 index 0000000..6c344f0 --- /dev/null +++ b/CREDITS.md @@ -0,0 +1,27 @@ +# Crédits + +Ustagammon est un logiciel libre sous licence GPLv3 (voir `LICENSE`). +Les contenus pédagogiques (leçons, textes) sont sous licence CC BY-SA 4.0. + +## Moteur + +- **GNU Backgammon** — https://www.gnu.org/software/gnubg/ + Copyright © les auteurs de GNU Backgammon. Licence GPLv3 ou ultérieure. + Ustagammon s'appuie entièrement sur son moteur pour les règles, les coups, + le videau et les évaluations. + +Les projets suivants sont étudiés comme points de départ ; ils seront crédités +précisément ici dès que du code en sera repris : + +- **gnubg-nn**, bibliothèque d'évaluation de GNU Backgammon — + https://git.savannah.gnu.org/cgit/gnubg/gnubg-nn.git +- **CBG**, portage Android de GNU Backgammon (GPLv3) — + https://github.com/clavierhaus/gnubg-android + +## Outils de développement + +- **ShellCheck** (GPLv3), analyse des scripts shell, utilisé via Docker. + +## Remerciements + +À l'Atelier du Huit, café associatif de Cugnaux, et à Philippe, qui y transmet le jeu. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9c51577 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# Makefile d'Ustagammon : toutes les opérations du projet passent par ici. +# Chaque cible documentée par « ## » apparaît dans `make help`. + +SHELL := /bin/bash +.DEFAULT_GOAL := help + +# Machine de développement modeste : jamais plus de deux tâches en parallèle. +MAKEFLAGS += -j2 --no-print-directory + +BUILD_DIR := build + +# Outils lancés dans Docker (aucune installation sur le PC). +SHELLCHECK_IMAGE := koalaman/shellcheck-alpine:v0.10.0 + +export SHELLCHECK_IMAGE + +.PHONY: help setup build test lint deploy clean + +help: ## Liste les commandes disponibles + @echo "Ustagammon : commandes disponibles" + @grep -E '^[a-zA-Z0-9_-]+:.*## ' $(MAKEFILE_LIST) \ + | awk 'BEGIN { FS = ":.*## " } { printf " make %-12s %s\n", $$1, $$2 }' + +setup: ## Installe la chaîne d'outils (images Docker) ; sans effet si déjà fait + @command -v docker >/dev/null || { echo "Docker est requis : sudo apt install docker.io"; exit 1; } + @docker image inspect $(SHELLCHECK_IMAGE) >/dev/null 2>&1 \ + || docker pull $(SHELLCHECK_IMAGE) + @echo "Chaîne d'outils prête." + +build: ## Compile le moteur (si nécessaire) puis l'application + @echo "Rien à compiler pour l'instant : le moteur arrive à l'étape 0a." + +test: ## Lance tous les tests + @tests/run.sh + +lint: ## Vérifie le style et les erreurs courantes + @tests/lint.sh + +deploy: ## Installe l'application sur le téléphone (pas encore disponible) + @echo "Pas encore disponible : le socle (PWA ou Android) sera choisi à la fin de l'étape 0." + @exit 1 + +clean: ## Supprime les artefacts de build (garde les images Docker) + rm -rf $(BUILD_DIR) diff --git a/README.md b/README.md index 7e6d5fd..e8f85e6 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,27 @@ # Ustagammon -Ustagammon est une application mobile de backgammon, gratuite, libre (GPLv3) et entièrement hors ligne, qui apprend le jeu du premier lancer de dés jusqu'au niveau expert. \ No newline at end of file +<<<<<<< HEAD +Ustagammon est une application mobile de backgammon, gratuite, libre (GPLv3) et entièrement hors ligne, qui apprend le jeu du premier lancer de dés jusqu'au niveau expert. +======= +Application de backgammon libre et hors ligne pour apprendre le jeu, du premier +lancer de dés jusqu'au niveau expert, avec le moteur GNU Backgammon. + +Projet en cours : étape 0, prototype technique. Le cadrage est dans +`docs/cadrage.md`, les décisions dans `docs/decisions.md`. + +## Démarrer + +Prérequis : `git`, `make`, `docker` (et `adb` pour le téléphone). + +``` +make setup # une fois : prépare les outils +make help # liste des commandes +make lint +make test +``` + +## Licence + +Code sous GPLv3 (`LICENSE`), contenus pédagogiques sous CC BY-SA 4.0. +Crédits dans `CREDITS.md`. +>>>>>>> 8398f29 (Squelette du dépôt : Makefile, tests, lint, crédits, journal) diff --git a/docs/decisions.md b/docs/decisions.md new file mode 100644 index 0000000..d841ecf --- /dev/null +++ b/docs/decisions.md @@ -0,0 +1,18 @@ +# Décisions + +Les décisions structurantes du projet, la plus récente en bas. Chacune donne son +contexte, le choix, les raisons et ce qu'elle implique. + +## 2026-11-01 — Nom de l'application : Ustagammon + +**Contexte** : le nom était une question ouverte du cadrage. +**Choix** : Ustagammon (« usta », le maître artisan en turc, et « gammon »). +**Référence** : le brief créatif, https://claude.ai/artifact/36WMwZWqvMxXvSSVBJTgwd + +## 2026-11-02 — Outils de lint dans Docker + +**Contexte** : la machine de développement doit rester légère ; rien n'est +installé en dehors de Docker, git, make et adb. +**Choix** : ShellCheck (GPLv3) tourne dans l'image `koalaman/shellcheck-alpine`, +version figée, récupérée par `make setup`. +**Conséquence** : `make lint` demande d'avoir lancé `make setup` une fois. diff --git a/docs/journal.md b/docs/journal.md new file mode 100644 index 0000000..f0a22ba --- /dev/null +++ b/docs/journal.md @@ -0,0 +1,25 @@ +# Journal + +Une entrée datée par session : ce qui a été fait, décidé, et la suite. + +## 2026-11-02 + +**Fait** +- Dépôt initialisé (branche `main`) avec le kit de démarrage : `CLAUDE.md`, + `docs/cadrage.md`, `docs/etape-0.md`, `PROMPTS.md`. +- Nom de l'application reporté partout : Ustagammon (lien vers le brief créatif + dans `CLAUDE.md` et `docs/cadrage.md`). +- Squelette : `Makefile` (help, setup, build, test, lint, deploy, clean), + `LICENSE` (GPLv3), `CREDITS.md`, `README.md`, `.gitignore`, ce journal, + `docs/decisions.md`. +- Premiers tests : contrat du Makefile (`tests/test_makefile.sh`) ; lint du dépôt + (`tests/lint.sh`, avec ShellCheck dans Docker). + +**Décidé** +- Les outils de lint tournent dans Docker, comme les autres chaînes d'outils. + +**Reste à faire** +- Ajouter le dépôt Gitea comme `origin` et pousser `main`. +- Étape 0a : choisir la source du moteur (gnubg, gnubg-nn ou CBG), à valider. +- `adb` n'est pas installé sur le PC : `sudo apt install adb` avant les tests sur + le téléphone. diff --git a/tests/lint.sh b/tests/lint.sh new file mode 100755 index 0000000..8a244a5 --- /dev/null +++ b/tests/lint.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +# Vérifications de style communes à tout le dépôt : +# - fichiers texte en UTF-8, fins de ligne Unix, sans espaces en fin de ligne, +# terminés par un saut de ligne ; +# - scripts shell analysés par ShellCheck (dans Docker). + +set -euo pipefail +cd "$(dirname "$0")/.." + +erreurs=0 +signaler() { + echo "$1" + erreurs=$((erreurs + 1)) +} + +# Fichiers suivis par git, plus les nouveaux fichiers non ignorés. +mapfile -t fichiers < <(git ls-files --cached --others --exclude-standard | grep -v '^LICENSE$') + +for f in "${fichiers[@]}"; do + [ -f "$f" ] || continue + case "$(file --brief --mime-encoding "$f")" in + binary) continue ;; + us-ascii | utf-8) ;; + *) signaler "$f : encodage autre que UTF-8" ;; + esac + if grep -q $'\r' "$f"; then + signaler "$f : fins de ligne Windows (CRLF)" + fi + if grep -nE '[[:blank:]]+$' "$f" >/dev/null; then + signaler "$f : espaces en fin de ligne (lignes $(grep -nE '[[:blank:]]+$' "$f" | cut -d: -f1 | paste -sd, -))" + fi + if [ -s "$f" ] && [ -n "$(tail -c1 "$f")" ]; then + signaler "$f : pas de saut de ligne final" + fi +done + +mapfile -t scripts < <(printf '%s\n' "${fichiers[@]}" | grep -E '\.sh$' || true) +if [ "${#scripts[@]}" -gt 0 ]; then + if ! docker image inspect "${SHELLCHECK_IMAGE:?lancer via make lint}" >/dev/null 2>&1; then + signaler "ShellCheck absent : lancer d'abord make setup" + elif ! docker run --rm -v "$PWD:/src:ro" -w /src "$SHELLCHECK_IMAGE" shellcheck "${scripts[@]}"; then + signaler "ShellCheck a trouvé des problèmes (voir ci-dessus)" + fi +fi + +if [ "$erreurs" -gt 0 ]; then + echo "Lint : $erreurs problème(s)." + exit 1 +fi +echo "Lint : aucun problème." diff --git a/tests/run.sh b/tests/run.sh new file mode 100755 index 0000000..a154f18 --- /dev/null +++ b/tests/run.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# Lance tous les tests du projet : chaque fichier tests/test_*.sh est un test. +# Sort en erreur si au moins un test échoue. + +set -euo pipefail +cd "$(dirname "$0")/.." + +echecs=0 +total=0 +for t in tests/test_*.sh; do + total=$((total + 1)) + if bash "$t"; then + echo "OK $t" + else + echo "ÉCHEC $t" + echecs=$((echecs + 1)) + fi +done + +echo "$((total - echecs))/$total tests réussis." +[ "$echecs" -eq 0 ] diff --git a/tests/test_makefile.sh b/tests/test_makefile.sh new file mode 100755 index 0000000..7451454 --- /dev/null +++ b/tests/test_makefile.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +# Vérifie le contrat du Makefile décrit dans CLAUDE.md : +# toutes les commandes obligatoires existent et apparaissent dans `make help`, +# et `make clean` peut être relancé sans erreur. + +set -euo pipefail +cd "$(dirname "$0")/.." + +# Lancé depuis `make test` : repartir d'un make indépendant du make parent. +unset MAKEFLAGS MFLAGS MAKELEVEL + +aide="$(make help)" +for cible in setup build test lint deploy clean help; do + if ! grep -qE "^ make $cible " <<<"$aide"; then + echo "make help ne mentionne pas « $cible »" + exit 1 + fi +done + +make clean >/dev/null +make clean >/dev/null +[ ! -e build ] || { echo "make clean n'a pas supprimé build/"; exit 1; }