.claude/skills/freebox-init/SKILL.md
Bootstrap l'autorisation d'une app Freebox : app_token acquisition (1x), persistance sécurisée, vérification de session. Déclenché pour tout nouveau projet Freebox ou token révoqué.
npx skillsauth add malikkaraoui/claude-atelier freebox-initInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Un bouton LCD. Une seule pression. Un token permanent. Xavier appelle ça de la confiance. Toi, tu appelleras ça de l'auth. — HMAC-SHA1 is the new handshake.
Bootstrap complet de l'autorisation Freebox pour un nouveau projet ou token révoqué.
invalid_token ou auth_required persistant après retry session/freebox-init expliciteRécupérer auprès de l'utilisateur :
app_id — identifiant stable (ex: com.monapp, fr.malik.tom-gateway). Jamais changer après première auth.app_name — nom affiché sur l'écran LCD Freebox (ex: Mon Application)app_version — version de l'app (ex: 1.0.0)device_name — hostname de la machine (ex: mac-malik)freebox_url — défaut http://mafreebox.freebox.fr, ou IP LAN directe si hors réseau Freeboxtoken_file — chemin de persistance (ex: ~/.config/monapp/freebox_token.json)GET {freebox_url}/api_version
Extraire et valider :
api_base_url (ex: /api/)api_version (ex: 14.0)Construire api_base :
major = api_version.split('.')[0]
api_base = api_base_url + "v" + major // "/api/v14"
base = freebox_url + api_base
Si la requête échoue (timeout, DNS) → demander l'IP LAN directe. mafreebox.freebox.fr ne résout que depuis le LAN.
POST {base}/login/authorize/
Content-Type: application/json
{
"app_id": "{app_id}",
"app_name": "{app_name}",
"app_version": "{app_version}",
"device_name": "{device_name}"
}
Réponse attendue :
{ "success": true, "result": { "app_token": "xxx", "track_id": 42 } }
Sauvegarder app_token et track_id en mémoire.
Informer l'utilisateur : "Appuyez sur ✔ sur l'écran LCD de votre Freebox maintenant."
GET {base}/login/authorize/{track_id}
Algorithme : poll toutes les 2 secondes, timeout 60 secondes.
| status | Action |
|---|---|
| pending | Continuer à poller, afficher ⏳ En attente... |
| granted | Continuer à l'étape 4 |
| denied | Stopper — "L'utilisateur a refusé sur l'écran LCD." |
| timeout | Stopper — "Pas de réponse. Relancer /freebox-init." |
Créer le répertoire parent si nécessaire, puis écrire :
{
"app_id": "{app_id}",
"app_token": "{app_token}",
"freebox_url": "{freebox_url}"
}
Permissions obligatoires :
chmod 0600 {token_file}
Vérifier avec stat que les permissions sont bien 600. Si impossible → avertir et stopper.
Ouvrir une session complète pour valider le token :
# 5a. Challenge
GET {base}/login/
# 5b. Password
password = HMAC-SHA1(key=app_token, message=challenge) → hex lowercase
# 5c. Session
POST {base}/login/session/
{ "app_id": "{app_id}", "password": "{password}" }
Si success: true → récupérer session_token.
Valider avec un appel réel :
GET {base}/connection/
X-Fbx-App-Auth: {session_token}
Afficher l'IP publique en confirmation : "✅ Autorisation réussie. IP publique : {ipv4}"
Vérifier/ajouter dans .gitignore et .claudeignore :
# Freebox token (contient app_token permanent)
**/freebox_token.json
*.freebox_token.json
✅ Freebox init terminé
app_id : {app_id}
token_file : {token_file} (0600)
api_base : {base}
IP publique : {ipv4}
Prochaine étape : utiliser le stack `freebox` pour les appels API.
app_id doit être identique à chaque exécution — c'est l'identifiant côté Freeboxapp_token sans raison (chaque auth demande une validation LCD)invalid_token → répéter depuis l'étape 2 (pas besoin de refaire discovery)| Symptôme | Cause | Fix |
|---|---|---|
| DNS timeout | Hors réseau Freebox | Utiliser l'IP LAN directe |
| status: denied | Utilisateur a appuyé ✗ | Relancer étape 2 |
| status: timeout | LCD non surveillé | Relancer étape 2 |
| invalid_token au login | Token corrompu/révoqué | Répéter étapes 2-4 |
| Permissions refusées sur token_file | Répertoire inexistant ou ~ non résolu | Créer le répertoire, utiliser chemin absolu |
tools
Loop autonome PR → Copilot review → handoff JSON → fixes → merge. Lance le polling automatique après un git push sur une branche feature. Zéro intervention utilisateur.
data-ai
Tableau de contrôle des features claude-atelier (on/off, paramètres). Affiche l'état de chaque rail et permet de les activer/désactiver interactivement.
tools
Génère un handoff review structuré pour Copilot/GPT. Utiliser après une feature, un bug fix, ou quand > 100 lignes ont changé. Aussi déclenché automatiquement par §25.
testing
Ferme la boucle d'un handoff inter-LLM. Si response.content est null, va chercher les inline Copilot sur la PR GitHub associée et les retranscrit automatiquement. Puis classe les points, applique les fixes, génère l'intégration. Utiliser quand Copilot a reviewé une PR portant un handoff.