docs: README ultra détaillé + visite guidée en 10 captures
11 changed files +305 −17
modified
README.md
+305 −17
@@ -1,31 +1,291 @@ | ||
| 1 | −# admin-ka — administration-ka.com | |
| 1 | +<p align="center"> | |
| 2 | + <img src="docs/screenshots/01-accueil.jpg" alt="Admin-Ka — écran de connexion" width="720"> | |
| 3 | +</p> | |
| 2 | 4 | |
| 3 | −Console chat mobile-first pour piloter **Claude Code** sur le nœud **M3U96a** et gérer l'écosystème Groupe KA à distance. | |
| 5 | +<h1 align="center">Admin-Ka — administration-ka.com</h1> | |
| 6 | + | |
| 7 | +<p align="center"> | |
| 8 | + <strong>Le Control Center du Groupe Ka.</strong><br> | |
| 9 | + Console d'administration privée qui pilote le <em>vrai</em> Claude Code CLI sur le cluster MacLustr,<br> | |
| 10 | + surveille les 19 sites de l'écosystème en temps réel et mesure le trafic humain de toutes les plateformes. | |
| 11 | +</p> | |
| 12 | + | |
| 13 | +<p align="center"> | |
| 14 | + <a href="https://www.administration-ka.com">www.administration-ka.com</a> · nœud <strong>M3U96a</strong> · port <strong>3300</strong> · launchd + ngrok | |
| 15 | +</p> | |
| 16 | + | |
| 17 | +--- | |
| 18 | + | |
| 19 | +> **Console privée.** L'accès est protégé par un mot de passe d'application (haché scrypt, cookie de session HttpOnly/Secure). Il n'y a pas d'inscription : c'est l'outil interne d'exploitation du Groupe Ka. Aucun secret n'est présent dans ce dépôt — la configuration sensible vit dans `data/config.json` (non versionné) et la clé Anthropic est lue depuis `~/.claude/.env` sur le nœud. | |
| 20 | + | |
| 21 | +--- | |
| 22 | + | |
| 23 | +## Sommaire | |
| 24 | + | |
| 25 | +1. [C'est quoi, Admin-Ka ?](#cest-quoi-admin-ka-) | |
| 26 | +2. [Visite guidée en 10 captures](#visite-guidée-en-10-captures) | |
| 27 | +3. [Les modules, en détail](#les-modules-en-détail) | |
| 28 | + - [Claude Code — pilotage du vrai CLI](#1-claude-code--pilotage-du-vrai-cli) | |
| 29 | + - [Sessions — détachées, reprenables, rejouables](#2-sessions--détachées-reprenables-rejouables) | |
| 30 | + - [Prompts — bibliothèque + upgradeur](#3-prompts--bibliothèque--upgradeur-de-prompts) | |
| 31 | + - [Écosystème — monitoring 19 sites](#4-écosystème--monitoring-des-19-sites) | |
| 32 | + - [Visiteurs — analytics v2 « humains d'abord »](#5-visiteurs--analytics-v2--trafic-humain) | |
| 33 | + - [Vue d'ensemble — le cockpit](#6-vue-densemble--le-cockpit) | |
| 34 | + - [Studio — module Social](#7-studio--module-social-facebook--reels) | |
| 35 | + - [Gardiens KA Guardian (ka2 / ka4 / ka6)](#8-gardiens-ka-guardian-ka2--ka4--ka6) | |
| 36 | + - [Écran du nœud (noVNC)](#9-écran-du-nœud-novnc) | |
| 37 | +4. [Identité visuelle](#identité-visuelle) | |
| 38 | +5. [Architecture](#architecture) | |
| 39 | +6. [Modes de permission](#modes-de-permission) | |
| 40 | +7. [Auth & sécurité](#auth--sécurité) | |
| 41 | +8. [Structure du dépôt](#structure-du-dépôt) | |
| 42 | +9. [Déploiement & exploitation](#déploiement--exploitation-sur-m3u96a) | |
| 43 | +10. [Apps natives compagnes](#apps-natives-compagnes) | |
| 44 | +11. [Contact](#contact) | |
| 45 | + | |
| 46 | +--- | |
| 47 | + | |
| 48 | +## C'est quoi, Admin-Ka ? | |
| 49 | + | |
| 50 | +Admin-Ka est né comme une console chat mobile-first pour lancer **Claude Code** sur le nœud M3U96a depuis un iPhone. C'est devenu, au fil des versions (v2 puis **v3 « Control Center »**), le poste de commandement complet du Groupe Ka : | |
| 51 | + | |
| 52 | +``` | |
| 53 | +iPhone / Mac ⇄ https://www.administration-ka.com (ngrok) ⇄ backend :3300 (M3U96a) | |
| 54 | + ├── claude CLI local (apps M3U96a) | |
| 55 | + ├── ssh <nœud> → claude CLI (apps distantes, repo de prod) | |
| 56 | + ├── monitor.js → health checks 19 sites, sweep nœuds | |
| 57 | + ├── analytics.js → trafic humain des plateformes Ka | |
| 58 | + └── social.js → Studio (posts FB, Reels, musique) | |
| 59 | +``` | |
| 60 | + | |
| 61 | +**Principe fondateur — rien de simulé** : le chat parle au vrai binaire `claude` (jamais à l'API Messages pour coder), le monitoring frappe les vrais sites en HTTPS, les analytics comptent les vrais visiteurs, les actions d'admin exécutent de vrais `pm2 restart` / `git log` sur les nœuds. | |
| 62 | + | |
| 63 | +Un seul opérateur, dix-neuf sites, vingt nœuds : tout se pilote depuis cette page. | |
| 64 | + | |
| 65 | +--- | |
| 66 | + | |
| 67 | +## Visite guidée en 10 captures | |
| 68 | + | |
| 69 | +> Les captures 03 à 10 montrent la console **connectée** (après authentification) ; les captures 01, 02 et le login mobile montrent ce que voit un visiteur non authentifié : un simple mot de passe, rien d'autre. | |
| 70 | + | |
| 71 | +### 01 — Écran de connexion (desktop) | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | +La porte d'entrée : pastille « Ka » orange, un champ mot de passe, un bouton. Aucune information n'est exposée avant l'authentification — la mention discrète `M3U96a · MacLustr` rappelle seulement sur quel nœud la console tourne. | |
| 76 | + | |
| 77 | +### 02 — Écran de connexion (mobile) | |
| 78 | + | |
| 79 | +<img src="docs/screenshots/02-accueil-mobile.jpg" alt="Connexion mobile" width="390"> | |
| 80 | + | |
| 81 | +Le même login, pensé iPhone d'abord : carte centrée, safe-areas respectées, champ à 16 px (anti-zoom iOS). | |
| 82 | + | |
| 83 | +### 03 — Console connectée : la Vue d'ensemble | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | +Premier écran après connexion : le **cockpit**. Sidebar de navigation à gauche (Vue d'ensemble, Claude Code, Sessions, Prompts, Écosystème, Visiteurs, Studio, Réglages), KPIs en tuiles (humains en ligne / aujourd'hui, sessions, pages vues, **19/19 sites en ligne**, incidents, uptime 24 h, latence moyenne, sessions Claude actives, **coût Claude cumulé**), graphique « Visiteurs humains — 30 jours » avec l'ancienne série v1 en pointillé, chips d'état des 19 sites avec leur latence live, et le journal des incidents récents. | |
| 88 | + | |
| 89 | +### 04 — Onglet Sessions | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | +Toutes les conversations Claude Code, filtrables par recherche, application et statut. Chaque ligne affiche le premier prompt, l'app cible (ou « Orchestrateur multi-sites »), le modèle, la taille de contexte (`ctx`), le **coût en dollars** et l'ancienneté — avec un bouton **Reprendre** (le `--resume` du CLI, transcript rejoué) et une suppression. | |
| 94 | + | |
| 95 | +### 05 — Onglet Écosystème | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | +Le monitoring temps réel : bandeau global (19/19 en ligne, uptime 24 h, latence moyenne, 36,5 k checks/24 h, échecs, incidents), puis une carte par site — sparkline de latence, barre d'uptime, p95/p99, nombre de checks, et la ligne d'infrastructure : **nœud, état du process (pm2/launchd), âge du dernier commit, jours restants sur le certificat SSL**. | |
| 100 | + | |
| 101 | +### 06 — Console mobile | |
| 102 | + | |
| 103 | +<img src="docs/screenshots/06-console-mobile.jpg" alt="Console mobile" width="390"> | |
| 104 | + | |
| 105 | +La même console sur iPhone : bottom nav 5 entrées (Vue d'ensemble, Claude Code, Écosystème, Visiteurs, Plus), cartes empilées, tout le contenu de l'Écosystème accessible au pouce. C'est l'usage d'origine d'Admin-Ka : administrer le groupe depuis n'importe où. | |
| 106 | + | |
| 107 | +### 07 — Vue d'ensemble (rafraîchie) | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | +Le cockpit se met à jour en continu (horodatage `maj` en haut à droite) : latences recalculées à chaque cycle de checks, ligne de synthèse du filtrage de trafic du jour (ex. « 92 humains · trafic filtré : 51 149 crawler + 36 datacenter + 274 automation »), anomalies de la dernière heure. | |
| 112 | + | |
| 113 | +### 08 — Onglet Claude Code | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | +Le cœur historique : « **Le vrai Claude Code, lancé sur le nœud de chaque app du Groupe KA** ». Picker de cible (une app précise, ou **Tous les sites KA (20)** = mode orchestrateur multi-sites), choix du modèle et du mode de permissions, suggestions de démarrage, reprise en un tap des dernières sessions, et le champ « Demander à Claude Code… » avec son bouton d'envoi orange. | |
| 118 | + | |
| 119 | +### 09 — Onglet Prompts | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | +La bibliothèque de prompts réutilisables : chaque prompt a un titre, une app cible (ou « app au choix »), un aperçu, et quatre actions — **Lancer** (démarre une session Claude Code avec ce prompt), **✨ Améliorer** (l'upgradeur de prompts réécrit la demande via l'API Anthropic avec la connaissance du Groupe Ka injectée), **Éditer**, **Dupliquer**, plus favoris ★ et compteur d'usage. | |
| 124 | + | |
| 125 | +### 10 — Onglet Visiteurs | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | +Les analytics v2 : bascule **Humains / Tout le trafic**, KPIs (en ligne < 2 min, humains du jour avec variation vs hier, sessions, pages vues, uniques 7 j / 30 j), **barre de répartition par classe** (humains / crawlers / datacenter / automation / interne — ici 900 humains pour 51 153 hits de crawlers filtrés), temps réel, panneau d'anomalies avec inspecteur d'IP/visiteur, puis les cartes **par application** (humains, sessions, pages, 7 j, tendance vs hier). | |
| 130 | + | |
| 131 | +--- | |
| 132 | + | |
| 133 | +## Les modules, en détail | |
| 134 | + | |
| 135 | +### 1) Claude Code — pilotage du vrai CLI | |
| 136 | + | |
| 137 | +L'exigence non négociable du projet : **jamais l'API Messages pour coder, toujours le binaire `claude`**, en mode headless : | |
| 4 | 138 | |
| 5 | 139 | ``` |
| 6 | −iPhone ⇄ https://www.administration-ka.com (ngrok) ⇄ backend :3300 (M3U96a) ⇄ claude -p --output-format stream-json | |
| 140 | +claude -p --output-format stream-json --verbose --include-partial-messages | |
| 7 | 141 | ``` |
| 8 | 142 | |
| 9 | −## Composants | |
| 143 | +- **`cwd` = le repo de prod de l'app choisie**, sur son nœud de déploiement. Les apps de M3U96a tournent en local ; les autres (lou-ka sur M3U96b, immo-ka sur M4M64a, house-ka sur M4M64b, trouve-ka sur M2M32…) sont pilotées **via SSH sur leur nœud** — le repo de prod est la seule source de vérité, aucun clone. | |
| 144 | +- **Streaming intégral** : chaque événement du stream (texte, thinking, `tool_use`, `tool_result`, result) est relayé au navigateur et rendu comme dans le terminal — diffs colorés pour Edit/Write, blocs outils repliables, TodoWrite en checklist, Markdown (marked) + coloration syntaxique (highlight.js), copie des blocs de code. | |
| 145 | +- **Options exposées dans l'UI** : modèle par session (Fable 5 par défaut, Opus, Sonnet, Haiku — `--model` toujours passé explicitement, sinon les nœuds retombent sur leur défaut local), mode de permissions, choix du projet, `/clear` `/compact` `/cost` `/resume`, modèle actif, session ID, **coût cumulé en direct**, tokens de contexte (+ %), file d'attente de messages, chrono d'exécution. | |
| 146 | +- **Mode orchestrateur multi-sites** : la cible « Tous les sites KA » lance une session qui coordonne des changements sur l'ensemble du parc (c'est le mode utilisé pour les campagnes transverses — mobile, stats, README…). | |
| 147 | +- Chaque run reçoit un `--append-system-prompt` maison : après toute modification → rebuild + `pm2 restart` + healthcheck + commit/push **spbgit** (origin, jamais GitHub). | |
| 148 | + | |
| 149 | +### 2) Sessions — détachées, reprenables, rejouables | |
| 150 | + | |
| 151 | +Le process `claude` **ne dépend jamais du WebSocket** : | |
| 152 | + | |
| 153 | +- On peut fermer l'onglet, verrouiller l'iPhone, perdre le réseau — la tâche continue sur le nœud. | |
| 154 | +- Le transcript est persisté en JSONL (`data/transcripts/*.jsonl`) ; à la reconnexion, l'app **rejoue l'historique manqué puis reprend le live**. | |
| 155 | +- **Reprise auto durcie** : la console rouvre la dernière conversation au lancement (`lastChatId`) et force reconnexion + resync au retour au premier plan (`visibilitychange` / `online` — iOS coupe le WS à l'écran verrouillé). Reconnexion avec backoff + indicateur d'état. | |
| 156 | +- États clairs : en cours / en attente de permission / inactive ; notifications in-app en fin de tâche ou quand une permission attend. | |
| 157 | +- `--resume <session-id>` pour continuer une session CLI existante, coût et contexte conservés. | |
| 158 | + | |
| 159 | +### 3) Prompts — bibliothèque + upgradeur de prompts | |
| 160 | + | |
| 161 | +- Prompts réutilisables associés à une app (ou « app au choix »), avec favoris ★, duplication, compteur d'usage, recherche et filtre par app. | |
| 162 | +- **Upgradeur de prompts** : le bouton ✨ Améliorer envoie la demande brute à l'API Anthropic (modèle configurable, Opus par défaut) avec un système de connaissance du Groupe Ka injecté (les 19 sites, leurs nœuds, leurs process managers, les conventions remote-first) — et renvoie un prompt excellent, prêt pour Claude Code. L'upgradeur ne répond jamais lui-même : il ne fait que réécrire. | |
| 163 | + | |
| 164 | +### 4) Écosystème — monitoring des 19 sites | |
| 165 | + | |
| 166 | +`server/monitor.js`, zéro dépendance native (`node:sqlite` intégré) : | |
| 167 | + | |
| 168 | +- **Health checks HTTPS toutes les 45 s** de chacun des 19 sites du groupe depuis M3U96a : latence, code HTTP, jours restants sur le certificat SSL. | |
| 169 | +- **Sweep des nœuds toutes les 5 min** : charge / RAM / disque + statut, CPU et mémoire des process PM2 + âge du dernier commit git. Les sites sous launchd (KA Guardian sur M4M36) sont gérés spécifiquement — pas de pm2 sur ce nœud. | |
| 170 | +- **Historique SQLite** (`data/eco.sqlite`, rétention 35 j) : uptime 24 h / 7 j / 30 j, latence moyenne et p95/p99, sparklines, graphique 24 h, barres d'uptime 14 j. | |
| 171 | +- **Incidents** : 2 échecs consécutifs → alerte ; rétablissement → alerte verte ; vue Incidents globale avec durées. | |
| 172 | +- **Actions d'admin par site**, exécutées localement ou via ssh sur le nœud du site : redémarrer PM2 (`/api/admin/action`), logs récents (`/api/admin/logs`), git & derniers commits (`/api/admin/commits`). | |
| 173 | +- Push temps réel vers l'UI via le même WebSocket que le chat. | |
| 174 | + | |
| 175 | +### 5) Visiteurs — analytics v2 « trafic humain » | |
| 176 | + | |
| 177 | +`server/analytics.js` + le beacon `public/ka-a.js`, déployé sur les sites du groupe. Définitions officielles : | |
| 178 | + | |
| 179 | +- **Visiteur humain** : identifiant classé `human` = UA navigateur + JS réellement exécuté + réseau non-datacenter/non-proxy + pas interne + pas de flood. | |
| 180 | +- **Session** : trou > 30 min = nouvelle session. **Page vue** : événement `pv` réel (navigation, SPA incluse) — un heartbeat n'est **jamais** une page vue. **En ligne** : dernier événement humain < 120 s, expire tout seul. | |
| 181 | +- **5 classes** : `human / crawler / datacenter / automation / internal`, classées à l'insertion (regex UA + cache IP-intelligence avec hosting/proxy/ASN, reclassement rétroactif, anti-flood). Les métriques principales n'affichent **que les humains** ; le reste vit dans la barre de répartition et le toggle « Tout le trafic ». | |
| 182 | +- **Beacon v2** (`ka-a.js`) : vid/sid en localStorage, pv SPA via `pushState`, heartbeat 25 s seulement onglet visible + interaction récente. Le beacon v1 reste supporté (dé-duplication côté serveur) et l'ancienne série s'affiche en pointillé « ancien comptage v1 (non filtré) » — jamais comparée directement. | |
| 183 | +- Tables SQLite : `events` (brut, 45 j), `ipinfo` (cache), `daily2` (rollup quotidien par classe, long terme). Anomalies de trafic + **inspecteur d'IP / de visiteur** intégré. | |
| 184 | +- Suite de tests : `node server/test-analytics.mjs` — 28 scénarios (humain/refresh/SPA, Googlebot, bot d'uptime, IP AWS, curl, interne, dédup v1, invariants uniques ≤ sessions ≤ pv, expiration en ligne). À lancer depuis une **copie** du dépôt (écrit dans `data/`). | |
| 185 | + | |
| 186 | +### 6) Vue d'ensemble — le cockpit | |
| 187 | + | |
| 188 | +La page d'accueil de la v3 « Control Center » : elle agrège tout ce qui précède en un écran — KPIs humains + écosystème + Claude (dont le coût cumulé), graphique 30 jours, chips des 19 sites, incidents récents, anomalies de la dernière heure, raccourcis vers les sessions Claude. | |
| 189 | + | |
| 190 | +### 7) Studio — module Social (Facebook & Reels) | |
| 191 | + | |
| 192 | +`server/social.js` + `server/social/*.py` : | |
| 193 | + | |
| 194 | +- **Auto-post Facebook** : cartes statistiques et carrousels générés aux couleurs de chaque site du groupe (rendu HTML → image), publiés sur la page Facebook Groupe Ka. | |
| 195 | +- **Reels multi-scènes** : `make_reel.py` assemble des vidéos verticales multi-scènes à partir des données live des plateformes. | |
| 196 | +- **Moteur musical numpy** : `music_engine.py` synthétise les pistes audio des Reels (pas de banque de sons externe). | |
| 197 | +- Galerie des rendus dans l'onglet Studio, insights de page (`insights.py`). | |
| 198 | +- Les rendus vivent dans `data/social/` (non versionné). | |
| 199 | + | |
| 200 | +### 8) Gardiens KA Guardian (ka2 / ka4 / ka6) | |
| 201 | + | |
| 202 | +Les trois agents gardiens autonomes des connecteurs (ka2.bot / ka4.bot / ka6.bot — un seul repo FastAPI sur **M4M36**, sous launchd) sont intégrés à la console : | |
| 203 | + | |
| 204 | +- **Chat direct avec chaque gardien** depuis Admin-Ka. | |
| 205 | +- Cartes dédiées dans l'Écosystème (health checks, latence, uptime comme les autres sites). | |
| 206 | +- **Actions launchd** sur M4M36 (redémarrage des gardiens) depuis l'interface. | |
| 207 | + | |
| 208 | +### 9) Écran du nœud (noVNC) | |
| 10 | 209 | |
| 11 | −- `server/server.js` — HTTP + WebSocket `/ws` (port 3300, loopback). Lance `claude -p … --output-format stream-json --verbose --include-partial-messages` dans le répertoire du projet choisi, relaie chaque événement du stream au client, persiste les transcripts (`data/transcripts/*.jsonl`), gère `--resume <session-id>` pour la continuité. | |
| 12 | −- `server/perm-mcp.js` — serveur MCP stdio (`--permission-prompt-tool mcp__adminka__approve`) : chaque demande de permission devient une carte **Autoriser / Refuser** dans le chat (long-poll via `/internal/perm`, timeout 10 min → refus). | |
| 13 | −- `public/` — frontend une page : Markdown (marked) + code highlighté (highlight.js), blocs outils repliables, diffs colorés (Edit/Write), TodoWrite en checklist, streaming temps réel, safe-areas iPhone. | |
| 14 | −- `deploy/*.plist` — services launchd `io.adminka.backend` + `io.adminka.ngrok`. | |
| 210 | +Un pont WebSocket intégré (`/vncws`) relie le client **noVNC embarqué** au Partage d'écran du nœud (127.0.0.1:5900) : on voit et contrôle l'écran de M3U96a directement dans le navigateur, sans exposer VNC sur le réseau — utile notamment pour le module Social (automatisation d'interface). | |
| 211 | + | |
| 212 | +--- | |
| 213 | + | |
| 214 | +## Identité visuelle | |
| 215 | + | |
| 216 | +L'identité Groupe Ka, déclinée « console » : | |
| 217 | + | |
| 218 | +- **Crème** `#F2F1EC` en fond, **orange** `#F97316` en accent (traits de graphe `#e05f00`), encre `#1a1611`. | |
| 219 | +- Héritage néo-brutaliste (cartes à bords francs, pills, pastille « Ka », typo ronde) modernisé en v3.1 : hairlines + ombres douces, rayons contenus, segmented controls nets — esprit Linear/Vercel, identité crème + orange conservée. | |
| 220 | +- **Dark mode réel** (`ka_theme` auto / clair / sombre) via variables CSS. | |
| 221 | +- Desktop-first depuis la v3 : sidebar ≥ 1020 px + topbar ; mobile : bottom nav 5 entrées avec safe-areas iPhone. | |
| 222 | +- Statuts jamais en couleur seule (● ▲ ■ + libellé). | |
| 223 | + | |
| 224 | +--- | |
| 225 | + | |
| 226 | +## Architecture | |
| 227 | + | |
| 228 | +``` | |
| 229 | +iPhone / Mac ⇄ wss://www.administration-ka.com (ngrok) ⇄ backend :3300 (M3U96a, loopback) | |
| 230 | + backend ⇄ claude CLI (local — apps M3U96a) | |
| 231 | + backend ⇄ ssh <nœud> claude CLI (apps distantes, repo de prod) | |
| 232 | + └ tunnel SSH inverse -R : cartes de permission (perm-mcp MCP) | |
| 233 | + backend ⇄ monitor.js : health checks 45 s + sweep nœuds 5 min + SQLite + push WS | |
| 234 | + backend ⇄ analytics.js: beacon ka-a.js → events/ipinfo/daily2 (SQLite) | |
| 235 | + backend ⇄ social.js : Studio (Python : cartes, Reels, musique) | |
| 236 | + backend ⇄ /vncws : pont noVNC → Partage d'écran 127.0.0.1:5900 | |
| 237 | +``` | |
| 238 | + | |
| 239 | +- **Node.js pur** (modules ES), serveur HTTP + WebSocket maison — deux seules dépendances npm : `ws` et `@novnc/novnc`. SQLite via `node:sqlite` intégré (aucune dépendance native). | |
| 240 | +- **Frontend une page, aucun framework** : `public/index.html` + `app.js` + `style.css`, vendors locaux (marked, highlight.js, noVNC). | |
| 241 | +- **Permissions distantes** : `server/perm-mcp.js` est un serveur MCP stdio (`--permission-prompt-tool mcp__adminka__approve`), déployé aussi sur M3U96b / M4M64a / M4M64b / M2M32 dans `~/.adminka/`. Chaque demande de permission devient une carte **Autoriser / Refuser** dans le chat (long-poll, timeout 10 min → refus). Comme l'IPv4 LAN n'est pas routée entre tous les nœuds et que Tailscale inter-nœuds est bloqué, les réponses transitent par un **tunnel SSH inverse (`-R`)**. | |
| 242 | +- **Persistance** (`data/`, non versionné) : `config.json` (secrets et réglages), `sessions.json`, `chats.json`, `transcripts/*.jsonl`, `eco.sqlite`, `analytics.sqlite`, `audit.jsonl`, logs. | |
| 15 | 243 | |
| 16 | 244 | ## Modes de permission |
| 17 | 245 | |
| 18 | −- **Sûr** (défaut) : lecture libre (`Read, Glob, Grep, LS, WebFetch, WebSearch, TodoWrite, NotebookRead, Task`), tout le reste (Bash, Edit, Write…) demande une permission dans le chat. | |
| 19 | −- **Auto** : `--dangerously-skip-permissions` (confirmation requise dans l'UI). | |
| 246 | +- **Sûr** (défaut) : lecture libre (`Read, Glob, Grep, LS, WebFetch, WebSearch, TodoWrite, NotebookRead, Task`) ; tout le reste (Bash, Edit, Write…) déclenche une carte dans le chat : **Autoriser / Toujours (cet outil) / Tout autoriser / Refuser**. | |
| 247 | +- **« Tout autoriser »** : le serveur approuve toutes les permissions suivantes jusqu'à la fin de la conversation — la tâche va au bout sans jamais réattendre l'utilisateur. | |
| 248 | +- Modes CLI également exposés : `acceptEdits`, `plan`, et bypass (`--dangerously-skip-permissions`) derrière une confirmation explicite dans l'UI. | |
| 20 | 249 | |
| 21 | 250 | ## Auth & sécurité |
| 22 | 251 | |
| 23 | −- Mot de passe (scrypt) → cookie `akid` HttpOnly/Secure, 7 j d'inactivité / 30 j max. | |
| 24 | −- Rate-limit login : 8 échecs / 15 min / IP. Backend lié à 127.0.0.1 (seul ngrok y accède). | |
| 25 | −- Audit complet : `data/audit.jsonl` (logins, prompts, tool_use, permissions, coûts). | |
| 26 | −- Changer le mot de passe : `node server/set-password.js '<nouveau>'` puis `launchctl kickstart -k gui/501/io.adminka.backend`. | |
| 252 | +- Mot de passe d'application haché **scrypt** → cookie `akid` HttpOnly/Secure, 7 j d'inactivité / 30 j max. | |
| 253 | +- **Rate-limit login** : 8 échecs / 15 min / IP. | |
| 254 | +- Backend lié à **127.0.0.1** — seul le tunnel ngrok y accède. | |
| 255 | +- **Audit complet** : `data/audit.jsonl` (logins, prompts, tool_use, permissions, coûts). | |
| 256 | +- Changement de mot de passe : `node server/set-password.js '<nouveau>'` puis redémarrage du backend. | |
| 257 | +- Aucun secret dans le dépôt : `data/` est hors git (config, bases, transcripts), la clé Anthropic vient de `~/.claude/.env` du nœud. | |
| 258 | + | |
| 259 | +## Structure du dépôt | |
| 260 | + | |
| 261 | +``` | |
| 262 | +admin-ka/ | |
| 263 | +├── server/ | |
| 264 | +│ ├── server.js # HTTP + WS :3300, orchestration claude (local + ssh), upgradeur de prompts, pont /vncws | |
| 265 | +│ ├── monitor.js # Écosystème : checks 45 s, sweep nœuds, eco.sqlite, incidents, push WS | |
| 266 | +│ ├── analytics.js # Analytics v2 : classification humain/crawler/…, sessions, rollups, API | |
| 267 | +│ ├── perm-mcp.js # Serveur MCP stdio (permission-prompt-tool) — aussi déployé sur les nœuds distants | |
| 268 | +│ ├── social.js # Studio : posts FB, Reels, galerie, insights | |
| 269 | +│ ├── social/ # Python : make_reel.py, music_engine.py (numpy), render_card_html.py, insights.py | |
| 270 | +│ ├── set-password.js # Changement du mot de passe d'app (scrypt) | |
| 271 | +│ └── test-analytics.mjs # 28 tests analytics | |
| 272 | +├── public/ | |
| 273 | +│ ├── index.html # SPA sans framework — 8 vues | |
| 274 | +│ ├── app.js # logique complète du front (WS, replay, rendu stream-json, thème…) | |
| 275 | +│ ├── style.css # design system crème/orange, dark mode, mobile | |
| 276 | +│ ├── ka-a.js # beacon analytics v2 embarqué par les sites Ka | |
| 277 | +│ └── vendor/ # marked, highlight.js, noVNC (locaux) | |
| 278 | +├── deploy/ | |
| 279 | +│ ├── io.adminka.backend.plist # launchd : node server/server.js (KeepAlive) | |
| 280 | +│ └── io.adminka.ngrok.plist # launchd : ngrok http --url=www.administration-ka.com 3300 | |
| 281 | +├── docs/screenshots/ # les 10 captures de la visite guidée | |
| 282 | +├── CLAUDE.md # exigences + pièges connus (à lire avant toute modif) | |
| 283 | +└── data/ # NON VERSIONNÉ : config.json, SQLite, transcripts, audit, logs | |
| 284 | +``` | |
| 285 | + | |
| 286 | +## Déploiement & exploitation (sur M3U96a) | |
| 27 | 287 | |
| 28 | −## Exploitation (sur M3U96a) | |
| 288 | +Le service tourne sous **launchd** (`KeepAlive`) sur le nœud M3U96a, exposé par **ngrok** sur le domaine réservé : | |
| 29 | 289 | |
| 30 | 290 | ```bash |
| 31 | 291 | # statut |
@@ -38,8 +298,36 @@ launchctl kickstart -k gui/501/io.adminka.ngrok | ||
| 38 | 298 | |
| 39 | 299 | # logs |
| 40 | 300 | tail -f ~/apps/admin-ka/data/backend.err.log ~/apps/admin-ka/data/ngrok.log |
| 301 | + | |
| 302 | +# changer le mot de passe d'app | |
| 303 | +node server/set-password.js '<nouveau>' && launchctl kickstart -k gui/501/io.adminka.backend | |
| 41 | 304 | ``` |
| 42 | 305 | |
| 43 | −Clé API : lue depuis `~/.claude/.env` (`ANTHROPIC_API_KEY`) au démarrage du backend. | |
| 306 | +- Clé API : lue depuis `~/.claude/.env` (`ANTHROPIC_API_KEY`) au démarrage du backend (pas de login OAuth sur les nœuds). | |
| 307 | +- Projets proposés dans le sélecteur : `~/groupe-ka/*` (clones des repos spbgit), `~/apps/*` (apps déployées sur ce nœud), et `~` (home). | |
| 308 | +- Registre des déploiements du cluster : `cluster-deployments.json` (laptop, source de vérité). | |
| 309 | +- **Repo git** : spbgit (git perso) — `~/srv/git/admin-ka.git` sur M3U96a, remote `origin`. Pas GitHub. | |
| 310 | + | |
| 311 | +### Pièges connus (ne pas re-découvrir) | |
| 312 | + | |
| 313 | +- Tailscale inter-nœuds **bloqué** (ACL) : depuis M3U96a, joindre les nœuds via les noms Bonjour `.local` ; M2U64 = sous-réseau 192.168.0.x. | |
| 314 | +- IPv4 LAN non routée entre certains nœuds (EHOSTUNREACH) : les permissions distantes passent par le tunnel SSH inverse. | |
| 315 | +- `ControlPath` ssh trop long avec les hostnames `.local` → `%C`. | |
| 316 | +- Sans `--model`, un nœud retombe sur son défaut local → toujours le passer explicitement. | |
| 317 | + | |
| 318 | +## Apps natives compagnes | |
| 319 | + | |
| 320 | +La console a deux enveloppes natives (WKWebView + identité Ka), distribuées hors de ce dépôt : | |
| 321 | + | |
| 322 | +- **Admin-Ka iOS** — app SwiftUI (repo spbgit `admin-ka-ios.git`), distribuée via **TestFlight** ; panneaux JS natifs (WKUIDelegate), icône et splash Ka. | |
| 323 | +- **Admin-Ka macOS** — app SwiftUI **notarisée** (Developer ID, repo spbgit `admin-ka-macos.git`), livrée en DMG. | |
| 324 | + | |
| 325 | +## Contact | |
| 326 | + | |
| 327 | +- **Groupe Ka** — [www.groupe-ka.com](https://www.groupe-ka.com) · [groupe-ka.com/contact](https://www.groupe-ka.com/contact) | |
| 328 | +- Console : [www.administration-ka.com](https://www.administration-ka.com) (accès privé) | |
| 329 | +- Infra : cluster MacLustr — nœud M3U96a | |
| 330 | + | |
| 331 | +--- | |
| 44 | 332 | |
| 45 | −Projets proposés dans le sélecteur : `~/groupe-ka/*` (clones des repos spbgit), `~/apps/*` (apps déployées sur ce nœud), et `~` (home). | |
| 333 | +<p align="center">© Groupe Ka — Admin-Ka v3 « Control Center ». Console privée d'exploitation ; tout est branché sur le vrai CLI et les vrais sites, rien n'est simulé.</p> | |
added
docs/screenshots/01-accueil.jpg
+0 −0
Binary file not shown.
added
docs/screenshots/02-accueil-mobile.jpg
+0 −0
Binary file not shown.
added
docs/screenshots/03-console-connectee.jpg
+0 −0
Binary file not shown.
added
docs/screenshots/04-onglet-sessions.jpg
+0 −0
Binary file not shown.
added
docs/screenshots/05-onglet-ecosysteme.jpg
+0 −0
Binary file not shown.
added
docs/screenshots/06-console-mobile.jpg
+0 −0
Binary file not shown.
added
docs/screenshots/07-onglet-vue-d-ensemble.jpg
+0 −0
Binary file not shown.
added
docs/screenshots/08-onglet-claude-code.jpg
+0 −0
Binary file not shown.
added
docs/screenshots/09-onglet-prompts.jpg
+0 −0
Binary file not shown.
added
docs/screenshots/10-onglet-visiteurs.jpg
+0 −0
Binary file not shown.