SPB Git forge

spb/groupe-ka

Public

Groupe KA — site du holding + KA ID (compte unique & SSO des 7 plateformes). Next.js 16, SQLite, Google & Apple login.

81commits 1branches 0releases
89.2 MBsize
maindefault branch
22 days agolast push
TypeScript 70.4% HTML 18.4% JavaScript 4% Python 3.8% CSS 3.4%

page 1

  1. Fri, Sep 4, 2026 1

  2. Fri, Aug 28, 2026 3

    1. Simon-Pierre Boucher committed 29 days ago · 11 files +180 −41
    2. fix(accueil): intégrer House·Ka et Rent·Ka partout sur la page d accueil
      …
      - Compteurs à jour : « treize plateformes » (héros, CTA, kicker, équation
        ·Ka, sablier SVG, signes vitaux), « quatorze » au socle (avec Trouve·Ka)
      - Rent·Ka ajouté aux totaux globaux (connecteurs + fiches) de live.ts —
        House·Ka y était déjà, Rent·Ka avait été oublié
      - Inventaire vivant + flotte de connecteurs : barres/points House·Ka et
        Rent·Ka avec métriques live
      - Santé des syncs : lignes House·Ka et Rent·Ka
      - Définition ·Ka du héros et lead de l index : mention du Canada
      - Métadonnées SEO/OG (layout) : Rent·Ka listé, compte corrigé
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 4 files +27 −17
    3. feat(accueil): banderole carrousel des marques du groupe sous le héros
      …
      Wordmarks typographiques des 14 plateformes (Trouve·Ka + PRODUCTS) qui
      défilent en boucle, cliquables, pause au survol, prefers-reduced-motion
      respecté (défilement manuel).
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 2 files +108 −1
  3. Thu, Aug 27, 2026 3

    1. feat(house-ka): 2e passe hub — layout JSON-LD + footers, alerts, ka-agent
      …
      - layout.tsx : description JSON-LD, phrase footer et les DEUX listes de
        plateformes (PLATEFORMES + footer)
      - alerts.ts : ADAPTERS (sonde /api/listings total) + APP_LABELS
      - ka-agent.js : registre ECO (accent pin #0f6b4f)
      Simon-Pierre Boucher committed 1 mo ago · 3 files +7 −3
    2. feat(rent-ka): Rent-Ka dans l ecosysteme + client KA ID + surfaces marketing
      …
      - ecosystem.json + SSO_CLIENTS (KA_SSO_SECRET_RENT_KA) + ka-agent.js ECO
      - mon-ka/compte accents & URLs, alerts (ADAPTERS/APP_LABELS), live.ts rentka
      - homepage carte num 13 + socle + liveChips, layout (JSON-LD + footer),
        recherche, figures, marque (Cobalt continental), loi-25, agents (ka6)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 14 files +86 −2
    3. feat(house-ka): House-Ka dans l ecosysteme + client KA ID
      …
      - sso.ts : client house-ka (redirect https://www.house-ka.com/, secret env
        KA_SSO_SECRET_HOUSE_KA ajoute a .env.local — backup fait)
      - ecosystem.json : 15e site (accent pin #0f6b4f, tagline Canada hors Quebec)
        -> footer, page statut et listes de sites l incluent automatiquement
      - portail : carte plateforme House-Ka (apres Immo-Ka, cartes renumerotees),
        ligne du tableau, chips live, figures marquee
      - live.ts : metriques houseka (total/sources/villes/prix moyen) + totaux
      - mon-ka / compte / recherche : accents, URLs et domaine house-ka
      Simon-Pierre Boucher committed 1 mo ago · 9 files +82 −13
  4. Wed, Aug 26, 2026 11

    1. fix(courriel): corps des messages entrants — hydratation via l API Resend
      …
      Constat (payload réel journalisé) : l événement email.received ne livre
      QUE les métadonnées (from/to/subject/email_id) — ni text, ni html, ni
      contenu de pièces jointes. Le corps se lit via l API Resend, qui exige
      une clé avec accès lecture (la clé du repo est send-only).
      
      Correctif (src/lib/comms/resend-fetch.ts) :
      - fetchInboundContent(email_id) : lit corps + pièces jointes via l API
        (RESEND_READ_API_KEY prioritaire, sinon RESEND_API_KEY), deux endpoints
        tentés, null si clé insuffisante.
      - Webhook : hydrate AVANT insertion — le corps alimente aussi la
        conversation du hub et le snippet ; pièces jointes payload + API
        fusionnées.
      - hydrateInboundMail : rattrapage à l OUVERTURE d un message vide
        (self-healing, ne réécrit jamais un corps existant, range les pièces
        jointes) — les anciens messages se réparent seuls dès qu une clé
        lisante est posée.
      - Vue message : encart explicite tant que la clé lecture manque
        (créer une clé Full access → RESEND_READ_API_KEY → restart).
      
      Vérifié : encart affiché sur message vide (200), build ok.
      Simon-Pierre Boucher committed 1 mo ago · 3 files +191 −8
    2. feat(courriel v3): pièces jointes + gabarits Groupe KA signés
      …
      Gabarits (src/lib/comms/mail-templates.ts) : six habillages éditorial
      sharp — Simple, Officiel, Bienvenue, Suivi de dossier, Merci, Annonce
      (bande encre + titre lime) — qui enveloppent le texte de l admin et le
      signent (nom, Groupe KA · Québec, adresse, marque). Fichier pur chaînes :
      le sélecteur client importe la liste, le serveur rend l HTML — le client
      n envoie JAMAIS d HTML, seulement le texte et l id du gabarit.
      
      Composeur : sélecteur visuel à mini-aperçus CSS, aperçu FIDÈLE en modal
      (iframe sandbox, rendu par /api/admin/mail/preview avec la vraie
      signature du compte), pièces jointes 3 × 8 Mo (15 Mo total, liste blanche
      PDF/Office/CSV/image/TXT/ZIP) avec liste et retrait.
      
      Envoi : /api/admin/mail/send passe en multipart — attachments Resend en
      base64 + copie locale des fichiers (mail_attachments, data/mail-uploads,
      servis par la route admin authentifiée). Toujours : from = adresse du
      compte, écriture en base avant envoi.
      
      Testé en réel : aperçu signé, envoi gabarit annonce + PDF accepté par
      Resend et revenu par le webhook dans la réception (boucle complète),
      .exe refusé 415, 9 Mo refusé 413, preview sans session 401. Limite
      connue : le webhook email.received ne fournit pas le contenu base64 des
      pièces jointes ENTRANTES (métadonnées seulement — géré défensivement).
      Simon-Pierre Boucher committed 1 mo ago · 4 files +625 −104
    3. design(admin v2): refonte visuelle — connexion, boîte courriel, inbox
      …
      Connexion : écran scindé signature — mur encre avec filigrane KA géant,
      manchette, lignes « ce que le panel contient » (pulse-dot), carte à ombre
      dure ; champs généreux, bouton afficher/masquer le mot de passe, erreur
      avec secousse, état de vérification animé.
      
      Courriel : version client-mail moderne — en-tête identité avec avatar à
      teinte stable, dossiers en pilules avec compteurs (total + non-lus),
      recherche plein champ (expéditeur/sujet/extrait/destinataire), rangées
      riches (avatar, sujet + extrait, heure relative fr, pièces jointes, chips
      non-routé/demande liée), actions rapides lu/archiver sans ouvrir le
      message ; vue message rehaussée (en-tête correspondant, sujet, corps
      typographié 68ch, barre d actions, réponse inline).
      
      Inbox : recherche toujours visible + filtres avancés repliables sur
      mobile (patron checkbox, zéro JS), chips de statut avec compteurs
      (statusCounts), rangées riches (pastille catégorie à teinte stable,
      priorité/statut, site, suivi, référence, pièces jointes, heure relative,
      point non-lu).
      
      Nouvelles primitives CSS (adm-avatar, hscroll, adm-filter-form,
      login-wall/watermark/card) ; utilitaires format.ts (timeAgo fr,
      initiales, teinte stable) ; listMail(q, folderCounts, att_count),
      listSubmissions.att_count. Vérifié par captures Playwright desktop
      (1440) et mobile (390) en prod https.
      Simon-Pierre Boucher committed 1 mo ago · 10 files +752 −243
    4. feat(communication hub): boîtes courriel admin — erikabc@ et spboucher@groupe-ka.com via Resend
      …
      /admin/courriel : chaque compte admin possède sa boîte @groupe-ka.com
      (admin_users.email) — dossiers réception/envoyés/archives/corbeille,
      lecture (HTML entrant réduit en texte, jamais rendu brut), composition et
      réponse (from = adresse du compte connecté, décidé serveur), pièces
      jointes entrantes bornées 10 Mo hors public, badge non-lus dans la nav.
      Isolation stricte : jamais la boîte d un autre admin ; les messages non
      routés du domaine sont visibles des super admins (attribuables en un clic).
      
      Réception : webhook Resend email.received sur /api/mail/inbound —
      signature Svix vérifiée sur le corps brut (RESEND_WEBHOOK_SECRET),
      fenêtre anti-rejeu 5 min, dédup des retries par email_id. Routage par
      adresse ; un sujet portant une référence KA-XXX-AAAA-NNNN verse AUSSI le
      message dans la conversation de la demande du hub (les courriels du hub
      partent maintenant avec reply-to hub@groupe-ka.com pour boucler le fil).
      
      Tables mail_messages + mail_attachments (ka-comms.db) ; sendEmail étendu
      (from/replyTo/cc personnalisés, id Resend retourné).
      
      Testé : signature invalide 401, routage, dédup, rattachement hub,
      isolation inter-boîtes 404, envoi réel Resend accepté depuis
      spboucher@groupe-ka.com, UI vérifiée en prod https.
      
      Reste côté dashboard Resend (clé API send-only, pas d accès ici) :
      MX groupe-ka.com → mx.resend.com (remplace inbound-smtp AWS SES actuel),
      webhook email.received → https://www.groupe-ka.com/api/mail/inbound,
      coller le whsec_ réel dans .env.local (placeholder généré).
      Simon-Pierre Boucher committed 1 mo ago · 13 files +1,215 −18
    5. feat(communication hub): centre de communication interne — fini les courriels publics
      …
      Public : /contact (hub 10 catégories : partenariats, données/API,
      investisseurs, carrières, fournisseurs, médias, questions, légal/Loi 25,
      sécurité anonyme, autre) + formulaires spécialisés pilotés par le registre
      (src/lib/comms/categories.ts), préremplissage KA ID, honeypot + rate-limit
      + uploads contrôlés, référence publique KA-XXX-2026-NNNN, accusé de
      réception Resend. contact@/info@/admin@groupe-ka.com retirés de toute
      l interface publique (footer, accueil, loi-25, retrait, conditions,
      confidentialité, bots, compte, marque, investisseurs, carte Wallet).
      
      Admin : /admin protégé serveur (comptes admin_users distincts des KA ID,
      scrypt + JWT 12 h invalidé au changement de mot de passe), RBAC 8 rôles
      (super_admin, admin, support, legal, investor_relations, hr, media,
      security) appliqué DANS les requêtes SQL + par demande (anti-IDOR, 404),
      dashboard KPIs, inbox filtres/recherche/pagination, vue demande complète
      (workflow, notes internes, conversation email via Resend, historique,
      pièces jointes servies hors public), pipeline candidatures, gestion
      équipe + mots de passe. DB data/ka-comms.db (WAL) : contact_submissions,
      contact_messages, contact_notes, contact_events, contact_attachments,
      contact_counters, admin_users ; priorité intelligente backend ; champs
      ai_* prêts pour la classification future.
      
      Testé : 18 scénarios curl (validation, uploads, spam, RBAC, IDOR,
      rate-limit, comptes) + parcours Playwright https en prod.
      Simon-Pierre Boucher committed 1 mo ago · 47 files +5,047 −88
    6. design(ka-id): courriels et page de connexion à l'identité « éditorial sharp »
      …
      - gabarits Resend refaits en tables HTML compatibles clients courriel : manchette « Groupe [Ka] » à puce lime, carte blanche à bordure encre + ombre décalée dure, bouton pilule encre/lime, panneau code 2FA encre/lime façon carte de membre, micro-étiquettes mono uppercase, pied écosystème
      - /connexion recomposée en éditorial HQ : héros display géant à gauche (« Un seul ·Ka pour tout »), points de confiance en filets (lien magique, 2FA, Loi 25), carte d'auth à droite avec en-tête d'inventaire, index des 12 plateformes en filets sous la pliure
      - vérifié par captures Chromium headless (courriels + page desktop 1440 et mobile 390) et envoi Resend réel
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 3 files +280 −60
    7. feat(ka-id): courriels transactionnels Resend — vérification d'adresse à l'inscription, lien magique sans mot de passe, code 2FA au login mot de passe
      …
      - lib email zéro dépendance (API REST Resend, domaine groupe-ka.com), gabarits encre/lime
      - table auth_tokens (SHA-256 seulement, usage unique, TTL, max 5 essais) + colonne users.email_verified (comptes existants réputés vérifiés)
      - register : compte créé mais session ouverte seulement au clic du lien (24 h) ; envoi échoué → compte retiré pour permettre la reprise
      - login : mot de passe exact → code 6 chiffres (10 min) validé par /api/auth/2fa ; adresse non confirmée → lien renvoyé
      - /api/auth/magic (+ /magic/verify) : connexion sans mot de passe, réponse identique compte ou non (anti-énumération)
      - callbacks Google/Apple marquent email_verified ; AuthForm : étapes code/courriel envoyé + bouton « lien de connexion sans mot de passe »
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 11 files +699 −44
  5. Tue, Aug 25, 2026 7

    1. Simon-Pierre Boucher committed 1 mo ago · 1 file +374 −671
    2. Accueil v2 « HQ » : recomposition éditoriale majeure — héros géant, bandes d'encre pleine largeur, index des plateformes en filets, figures redessinées, nav épurée
      …
      Upgrade visuel sans toucher à la logique ni aux données live :
      - primitives éditoriales (bleed/band-ink, rule-ink, sec-head, stat-huge, cta-link, nav-link, idx-row, ibar) — moins de boîtes, plus de typo et d'espace
      - héros pleine largeur (clamp 44-118px) + bande « signes vitaux » sombre à 6 chiffres géants
      - plateformes : cartes remplacées par un index éditorial (ProductRow sur filets)
      - « salle des machines » et « boucle de garde » : bandes sombres data-storytelling
      - figures SVG affinées (captions sur filet, barres hairline, chips de marque)
      - header : soulignements animés + burger 2 barres ; menu mobile plein écran numéroté
      - table socle en variante ouverte (src-wrap--open), CTA finaux en liens-flèches
      Simon-Pierre Boucher committed 1 mo ago · 5 files +825 −494
  6. Mon, Aug 24, 2026 5

    1. Simon-Pierre Boucher committed 1 mo ago · 2 files +12
    2. Simon-Pierre Boucher committed 1 mo ago · 1 file +127 −38
    3. Simon-Pierre Boucher committed 1 mo ago · 1 file +91 −39
    4. feat(doc): page documentation /doc (guide + captures) + lien footer + PDF téléchargeable
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 7 files +161
    5. Simon-Pierre Boucher committed 1 mo ago · 3 files +86 −117
  7. Sun, Aug 23, 2026 10

    1. Jeton API personnel (API·Ka) par KA ID
      …
      - db: colonnes api_token/api_token_created + ensureApiToken/rotateApiToken/findUserByApiToken (kapi_ + 48 hex)
      - /api/account/token (GET crée/lit, POST régénère — session requise)
      - /api/sso/token-verify (HMAC client, même schéma que /api/sso/profile) pour api-ka
      - /compte: section « API·Ka — jeton d accès personnel » (masqué/copier/régénérer) + plateformes manquantes (resto/sorti/crea/job/trouve/api)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 5 files +230
    2. stats v3 : rapports PDF personnalisés (catalogue, rendu au choix, ReportBuilder)
      …
      - moteur pdfkit local src/lib/report-stats.ts (gabarit Groupe-KA, palette lime/vert du hub) : catalogFromDashboard() sur EcoPayload + buildCustomReport() — primitives line/area/bar/donut/hbars/stacked/multi/gauges/kpi/heatmap quotidienne ET horaire/tables/records, sommaire, couverture à libellé libre
      - routes GET /api/stats/catalog et POST /api/stats/report/custom (filename groupe-ka_groupe-ka_stats_<periode>_personnalise_<date>.pdf) ; rapport écosystème v2 (proxy API-KA) intact
      - kit src/ka/stats (kacharts.tsx v3 avec ReportBuilder dans PdfButton, SPEC.md §3bis, kapdf.py) synchronisé depuis /tmp/ka-stats-v3
      - pdfkit ^0.19.1 (+types) en serverExternalPackages, polices du gabarit sous assets/fonts/
      Simon-Pierre Boucher committed 1 mo ago · 13 files +1,844 −11
    3. statut : les 3 agents ·Ka (ka2.bot, ka4.bot, ka6.bot) surveillés sur /status
      …
      - src/lib/status.ts : liste AGENTS (hors ecosystem.json — les agents ne sont
        pas des plateformes) incluse dans checkAll() : les ticks aux 5 min couvrent
        maintenant 16 cibles
      - /status : carte factorisée en StatusCard, section « Les agents ·Ka »
        (Guardian) avec les mêmes barres 24 h / 90 j et uptimes 24 h / 7 j / 30 j ;
        le compte des plateformes en ligne ne mélange plus agents et sites
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 2 files +143 −68
    4. Marque : page /marque — logos des 13 plateformes + palettes documentées
      …
      - src/app/marque/page.tsx : logos SVG/PNG telechargeables (7 variantes par
        marque : SVG source, PNG 512/1024 transparents, fonds papier/encre 1280,
        icone iOS 180, banniere OG 1200x630) + ZIP complet
      - palettes lues dans ecosystem.json (source canonique) : hex, RGB, HSL et
        contrastes WCAG calcules au build ; palette commune tokens.css decrite
        role par role (papier, encre, verts, ambre, brique, ombres, typo, geometrie)
      - recits de couleur des 13 accents + regles d usage (on fait / on ne fait pas)
      - public/marque/ : 92 fichiers collectes depuis les sites en prod (2026-08-23)
      - nav : onglet Marque ; sitemap : /marque
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 95 files +618
    5. Simon-Pierre Boucher committed 1 mo ago · 4 files +649 −40
    6. rapport-quotidien: cadences de sync dans le prompt (Resto·Ka hebdo)
      …
      Évite les fausses alertes « cache figé » : Resto·Ka se synchronise une fois
      par semaine, un volume identique 4 jours de suite y est normal.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +2