forked from FroSteel/Planification
Distribution: firefox-updates.json + CLAUDE.md (workflow Claude) + nettoyage secrets
- firefox-updates.json à la racine : manifest auto-update Firefox avec entrées v2026.5.40 et v2026.5.41 (sha256 NON SIGNÉ pour le moment, à remplacer par celui des .xpi signés AMO). - build.sh : maintient firefox-updates.json automatiquement à chaque build (ajoute ou met à jour l'entrée de la version courante avec son sha256 calculé sur le .xpi produit). - CLAUDE.md : workflow complet pour Claude Code (build → test → push → wiki → signature AMO). Token Gitea jamais dans le fichier (stocké hors repo en mémoire Claude .claude/projects/.../memory/gitea_token.md). - .gitignore : ajout _archives/, .claude/, .env, *.token, secrets.json. - README.md / CHANGELOG.md : retrait email auteur en clair (renvoi vers page wiki Contact, email obfusqué en entités HTML).
This commit is contained in:
+16
@@ -38,3 +38,19 @@ tmp/
|
||||
|
||||
# Tests
|
||||
test-output/
|
||||
|
||||
# Archives historiques locales (jamais sur Gitea)
|
||||
_archives/
|
||||
Old.zip
|
||||
Old/
|
||||
|
||||
# Mémoire / config Claude Code (ne jamais commit, contient potentiellement
|
||||
# des tokens, des notes user, etc.)
|
||||
.claude/
|
||||
CLAUDE.local.md
|
||||
|
||||
# Variables d'environnement / secrets
|
||||
.env
|
||||
.env.*
|
||||
*.token
|
||||
secrets.json
|
||||
|
||||
+1
-1
@@ -352,4 +352,4 @@
|
||||
|
||||
**Quentin Rouiller** (QRO)
|
||||
Technicien DGNSI — Canton de Vaud
|
||||
Contact : `quentin.rouiller@vd.ch`
|
||||
Contact : voir [page wiki Contact](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Contact)
|
||||
|
||||
@@ -0,0 +1,184 @@
|
||||
# CLAUDE.md — Workflow de développement Planification
|
||||
|
||||
> **À lire avant toute modification.** Ce fichier décrit le processus complet
|
||||
> que Claude doit suivre quand Quentin demande une modification de l'extension.
|
||||
|
||||
---
|
||||
|
||||
## Stack du projet
|
||||
|
||||
- **Type** : extension navigateur Manifest V3 (Chrome / Edge / Firefox 140+)
|
||||
- **Fonction** : viewer du planning des techniciens DGNSI dans EasyVista
|
||||
- **Cible utilisateurs** : techniciens DGNSI (Canton de Vaud)
|
||||
- **Auteur** : Quentin Rouiller (email dans la mémoire Claude `user_role.md`)
|
||||
- **Repo Gitea** : https://gitea.netaplaid.ch/FroSteel/Planification
|
||||
- **Config runtime** : `chrome.storage.local["admin_config"]` (persiste entre updates)
|
||||
|
||||
## Structure du repo
|
||||
|
||||
```
|
||||
src/ # Sources de l'extension (chargées par le navigateur)
|
||||
├── manifest.json # Manifest V3 — version YYYY.M.PATCH
|
||||
├── background.js # Service worker
|
||||
├── viewer.{html,js,css}
|
||||
└── icons/
|
||||
|
||||
Autres/ # Méta + build
|
||||
├── build.sh # Génère dist/{chromium,firefox}/, .zip, .xpi, met à jour firefox-updates.json
|
||||
├── CHANGELOG.md # Synchronisé avec le CHANGELOG.md à la racine
|
||||
├── README.md # Synchronisé avec le README.md à la racine
|
||||
└── LICENSE
|
||||
|
||||
Builds/ # Artefacts distribués (Chromium/, Firefox/, .zip, .xpi)
|
||||
dist/ # Sortie de build (gitignoré)
|
||||
firefox-updates.json # Manifest d'auto-update Firefox (servi via update_url)
|
||||
CLAUDE.md # Ce fichier
|
||||
CHANGELOG.md # Source de vérité du changelog (lu par AMO + GitHub-style)
|
||||
README.md # Source de vérité du README
|
||||
```
|
||||
|
||||
> **NB** : le repo Gitea utilise un **layout flat à la racine** pour le code
|
||||
> source historique (`build.sh`, `README.md`, `CHANGELOG.md`, `LICENSE`,
|
||||
> `firefox-updates.json` à la racine, et `src/` pour le code). En local,
|
||||
> le dossier `Autres/` contient une copie de ces fichiers — tu peux éditer
|
||||
> l'un ou l'autre, mais quand tu pousses sur Gitea c'est la racine qui doit
|
||||
> être mise à jour.
|
||||
|
||||
---
|
||||
|
||||
## Workflow standard d'une demande de modification
|
||||
|
||||
Quand Quentin demande une nouvelle fonctionnalité ou un bugfix :
|
||||
|
||||
### Phase 1 — Code + build local (toi seul, pas encore de push)
|
||||
|
||||
1. **Comprendre la demande**, poser des questions si nécessaire avant d'écrire du code.
|
||||
2. **Coder les modifications** dans `src/` (jamais directement dans `dist/` ou `Builds/`).
|
||||
3. **Bumper la version** : incrémenter le 3e chiffre dans `src/manifest.json`
|
||||
(ex: `2026.5.41` → `2026.5.42`). Bump majeur (2e chiffre) seulement pour
|
||||
les refontes ; année (1er chiffre) au passage à 2027.
|
||||
4. **Mettre à jour le CHANGELOG** (`Autres/CHANGELOG.md` ET la copie racine
|
||||
`CHANGELOG.md`) en ajoutant une nouvelle entrée en haut.
|
||||
5. **Mettre à jour le README** (`Autres/README.md` ET racine `README.md`)
|
||||
si la nouvelle version touche aux fonctionnalités principales.
|
||||
6. **Builder** : `./Autres/build.sh` — ça produit `dist/chromium/`,
|
||||
`dist/firefox/`, le `.zip` et le `.xpi` avec la nouvelle version.
|
||||
7. **Annoncer à Quentin** : "v2026.5.X buildée, recharge l'extension dans
|
||||
ton navigateur et teste". Décrire brièvement ce qui a changé visuellement.
|
||||
8. **Attendre son retour**. Tant qu'il n'a pas dit "OK", ne pas pousser sur
|
||||
Gitea. Si correction demandée, retourner à l'étape 2.
|
||||
|
||||
### Phase 2 — Push sur Gitea (uniquement après validation explicite)
|
||||
|
||||
Quand Quentin dit "OK push" / "valide" / équivalent :
|
||||
|
||||
1. **Préparer un clone Gitea à jour** dans `/tmp/planif-push/` (clone si pas
|
||||
présent, sinon `git fetch origin && git reset --hard origin/main`).
|
||||
2. **Synchroniser** :
|
||||
- `rsync -a --delete /Users/quentin/Documents/Planning/src/ /tmp/planif-push/src/`
|
||||
- Copier les versions racine de `CHANGELOG.md`, `README.md`, `LICENSE`,
|
||||
`build.sh` (les versions racine sur Gitea, pas celles de `Autres/`)
|
||||
3. **Régénérer `firefox-updates.json`** : ajouter l'entrée de la nouvelle
|
||||
version en haut de la liste `updates`. Le `update_link` pointe vers la
|
||||
release Gitea : `https://gitea.netaplaid.ch/FroSteel/Planification/releases/download/vYYYY.M.PATCH/planification-vYYYY.M.PATCH-firefox.xpi`.
|
||||
Le `update_hash` est calculé après signature AMO (cf. Phase 3).
|
||||
4. **Commit + push** :
|
||||
```bash
|
||||
cd /tmp/planif-push
|
||||
git add -A
|
||||
git commit -m "vYYYY.M.PATCH — <description courte>"
|
||||
git push origin main
|
||||
git tag -a vYYYY.M.PATCH -m "vYYYY.M.PATCH"
|
||||
git push origin vYYYY.M.PATCH
|
||||
```
|
||||
5. **Créer la release Gitea** via l'API (POST
|
||||
`/repos/FroSteel/Planification/releases`) avec :
|
||||
- `tag_name`: `vYYYY.M.PATCH`
|
||||
- `name`: `vYYYY.M.PATCH`
|
||||
- `body`: extrait du CHANGELOG (la section de cette version)
|
||||
6. **Uploader les binaires** comme assets de la release :
|
||||
- `dist/planification-vYYYY.M.PATCH-chromium.zip`
|
||||
- `dist/planification-vYYYY.M.PATCH-firefox.xpi` (NON signé pour le moment)
|
||||
7. **Mettre à jour le wiki Gitea** :
|
||||
- Page **Versions** : ajouter une entrée détaillée en haut (dérivée du CHANGELOG)
|
||||
- Page **Utilisation** : si le changement modifie l'UX (ajout d'un bouton,
|
||||
d'une section admin, d'un comportement) → documenter
|
||||
- Page **Architecture** : si nouvelles fonctions clés / nouvelle config
|
||||
persistée → documenter
|
||||
|
||||
### Phase 3 — Signature Firefox (manuel, fait par Quentin)
|
||||
|
||||
C'est la seule étape que Claude ne peut pas automatiser :
|
||||
|
||||
1. Quentin va sur https://addons.mozilla.org/developers/
|
||||
2. Submit New Version → uploade le `.xpi` non signé de la release Gitea
|
||||
3. Choisit **"On your own"** (Unlisted, self-distributed)
|
||||
4. Mozilla signe → Quentin télécharge le `.xpi` signé
|
||||
|
||||
Quentin revient ensuite avec le `.xpi` signé et demande "remplace par le signé".
|
||||
À ce moment Claude fait :
|
||||
1. Remplacer l'asset `.xpi` de la release Gitea (delete + upload)
|
||||
2. Calculer le `sha256` du `.xpi` signé
|
||||
3. Mettre à jour `firefox-updates.json` : ajouter `"update_hash": "sha256:<hash>"`
|
||||
4. Commit + push le JSON mis à jour
|
||||
|
||||
À partir de ce moment, l'auto-update Firefox fonctionne pour cette version.
|
||||
|
||||
---
|
||||
|
||||
## Token Gitea
|
||||
|
||||
⚠️ **Le token API Gitea ne doit JAMAIS apparaître dans ce fichier ni dans le
|
||||
repo Gitea**. Il est stocké uniquement dans la mémoire Claude locale
|
||||
(`~/.claude/projects/-Users-quentin-Documents-Planning/memory/gitea_token.md`,
|
||||
hors repo). Si Claude perd la mémoire (nouvelle session non héritée),
|
||||
demander à Quentin de redonner le token.
|
||||
|
||||
Header API à utiliser : `Authorization: token <TOKEN>` + `User-Agent: curl/8.4.0`
|
||||
(le User-Agent évite que Cloudflare bloque les requêtes Python urllib).
|
||||
|
||||
---
|
||||
|
||||
## Règles importantes
|
||||
|
||||
- **Ne jamais hardcoder** dans `src/` : groupe EV, équipe, domaines, absences
|
||||
récurrentes. Tout passe par `admin_config`. Les seuls hardcodes acceptables
|
||||
sont les **filets de sécurité** (DEFAULT_GROUP_ID, DEFAULT_EV_ORIGINS pour
|
||||
le 1er install). Cf. v2026.5.41 pour la migration complète.
|
||||
- **Ne jamais pousser sur Gitea sans validation explicite** de Quentin.
|
||||
- **Toujours bumper la version** avant un push qui modifie le code.
|
||||
- **Toujours mettre à jour le CHANGELOG** avant un push.
|
||||
- **Tags non touchés** sur Gitea : `v1.0.0`-`v3.3.0`, `v4.1.x`-`v4.3.0`,
|
||||
`v5.0.0`, `v2026.5.27`-`v2026.5.32` (ceux-là pointent vers du code
|
||||
reconstitué historique, ne jamais les bouger).
|
||||
- **Force-push uniquement si Quentin le demande explicitement.**
|
||||
- **L'email de l'auteur** ne doit apparaître nulle part dans `src/` ni dans
|
||||
les fichiers Markdown du repo (CLAUDE.md, README.md inclus). Il est stocké
|
||||
uniquement en mémoire Claude (`user_role.md` / `gitea_token.md`) et exposé
|
||||
obfusqué (entités HTML) sur la page wiki Contact.
|
||||
|
||||
---
|
||||
|
||||
## Pages wiki Gitea
|
||||
|
||||
| Page | Contenu | Quand mettre à jour |
|
||||
|---|---|---|
|
||||
| **Home** | Pitch, contexte, démarrage rapide | Rarement |
|
||||
| **Utilisation** | Guide complet pour l'utilisateur | À chaque changement UX |
|
||||
| **Versions** | Historique détaillé des versions | À chaque release |
|
||||
| **Architecture** | Doc technique (fonctions, config, structure) | À chaque ajout d'helper / changement structurel |
|
||||
| **Contact** | Email obfusqué + lien Issue Gitea | Rarement |
|
||||
|
||||
URL de base wiki : `https://gitea.netaplaid.ch/FroSteel/Planification/wiki/<NOM>`
|
||||
Endpoint API : `/api/v1/repos/FroSteel/Planification/wiki/page/<NOM>` (PATCH avec
|
||||
`content_base64`).
|
||||
|
||||
---
|
||||
|
||||
## Pour résumer ton rôle, Claude
|
||||
|
||||
Quentin demande une modif → tu codes → tu builds → il teste → il valide →
|
||||
tu push tout (Gitea + wiki + firefox-updates.json). Plus tard il revient avec
|
||||
le `.xpi` signé d'AMO → tu mets à jour la release et le `update_hash` du JSON.
|
||||
|
||||
Si tu hésites sur quoi faire à un moment, **demande**. Ne suppose pas.
|
||||
@@ -8,7 +8,7 @@ Extension Chrome / Firefox pour visualiser de manière claire et rapide le plann
|
||||
- **Cible** : techniciens DGNSI (Canton de Vaud), EasyVista (`itsma.etat-de-vaud.ch` / `itsma.vd.ch`)
|
||||
- **Démarrage projet** : jeudi 16 avril 2026
|
||||
- **Version actuelle** : `v2026.5.41`
|
||||
- **Contact** : `quentin.rouiller@vd.ch`
|
||||
- **Contact** : voir [page wiki Contact](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Contact)
|
||||
- **Manifest** : V3 (Chrome/Edge/Firefox)
|
||||
- **Format** : `.zip` (Chromium) + `.xpi` signé (Firefox)
|
||||
|
||||
@@ -254,4 +254,4 @@ git push --tags
|
||||
|
||||
**Quentin Rouiller** (QRO)
|
||||
Technicien DGNSI — Canton de Vaud
|
||||
Contact : `quentin.rouiller@vd.ch`
|
||||
Contact : voir [page wiki Contact](https://gitea.netaplaid.ch/FroSteel/Planification/wiki/Contact)
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
# Usage : ./build.sh
|
||||
###############################################################################
|
||||
set -e
|
||||
# Le script est dans Autres/ — on remonte d'un cran pour se placer à la
|
||||
# racine du projet, où se trouvent src/ et dist/.
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
VERSION=$(python3 -c "import json; print(json.load(open('src/manifest.json'))['version'])")
|
||||
@@ -44,6 +46,44 @@ cd dist/firefox && zip -rq "../planification-v${VERSION}-firefox.xpi" . && cd .
|
||||
echo ""
|
||||
echo "==> Builds prêts dans dist/"
|
||||
ls -la dist/*.zip dist/*.xpi 2>/dev/null
|
||||
|
||||
# ---- firefox-updates.json : ajout/mise à jour de l'entrée pour cette version
|
||||
# (sha256 du .xpi NON SIGNÉ — sera remplacé par celui du .xpi signé après AMO).
|
||||
python3 - <<EOF
|
||||
import json, hashlib, os
|
||||
xpi = f"dist/planification-v${VERSION}-firefox.xpi"
|
||||
with open(xpi, 'rb') as f: sha = hashlib.sha256(f.read()).hexdigest()
|
||||
|
||||
JSON_PATH = "firefox-updates.json"
|
||||
ADDON_ID = "planification@netaplaid.ch"
|
||||
update_link = f"https://gitea.netaplaid.ch/FroSteel/Planification/releases/download/v${VERSION}/planification-v${VERSION}-firefox.xpi"
|
||||
|
||||
if os.path.exists(JSON_PATH):
|
||||
with open(JSON_PATH) as f: data = json.load(f)
|
||||
else:
|
||||
data = {"addons": {ADDON_ID: {"updates": []}}}
|
||||
|
||||
addon = data.setdefault("addons", {}).setdefault(ADDON_ID, {"updates": []})
|
||||
updates = addon.setdefault("updates", [])
|
||||
|
||||
# Retirer toute entrée existante pour cette version (idempotent)
|
||||
updates = [u for u in updates if u.get("version") != "${VERSION}"]
|
||||
# Ajouter en tête
|
||||
updates.insert(0, {
|
||||
"version": "${VERSION}",
|
||||
"update_link": update_link,
|
||||
"update_hash": "sha256:" + sha,
|
||||
})
|
||||
addon["updates"] = updates
|
||||
|
||||
with open(JSON_PATH, 'w') as f:
|
||||
json.dump(data, f, indent=2, ensure_ascii=False)
|
||||
f.write('\n')
|
||||
|
||||
print(f" ✓ firefox-updates.json mis à jour (sha256 NON SIGNÉ : {sha[:16]}…)")
|
||||
EOF
|
||||
|
||||
echo ""
|
||||
echo "Pour Chrome : charger dist/chromium/ en mode développeur"
|
||||
echo "Pour Firefox : signer dist/planification-v${VERSION}-firefox.xpi sur AMO"
|
||||
echo " Après signature, remplacer le sha256 dans firefox-updates.json par celui du .xpi signé."
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"addons": {
|
||||
"planification@netaplaid.ch": {
|
||||
"updates": [
|
||||
{
|
||||
"version": "2026.5.41",
|
||||
"update_link": "https://gitea.netaplaid.ch/FroSteel/Planification/releases/download/v2026.5.41/planification-v2026.5.41-firefox.xpi",
|
||||
"update_hash": "sha256:9d92ef930e4d5f8da06817b04ea449f0091e413377a72390fa191d05849bf336"
|
||||
},
|
||||
{
|
||||
"version": "2026.5.40",
|
||||
"update_link": "https://gitea.netaplaid.ch/FroSteel/Planification/releases/download/v2026.5.40/planification-v2026.5.40-firefox.xpi",
|
||||
"update_hash": "sha256:2ba0758960b931f4211c613c75bbf21b3a250572dddc70d854ff1ecca3220421"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user