SPB Git forge

spb/job-ka

Public
227commits 1branches 0releases
37.7 MBsize
maindefault branch
2 h agolast push
HTML 82.1% Python 14.6% TypeScript 1.9% CSS 1% JavaScript 0.5%
7.5 KB · 160 lines markdown
Rendered Raw Blame History
1# CLAUDE.md — Job·Ka23> Agrégateur d'offres d'emploi québécoises du **Groupe KA** (groupe-ka.com).4> Fichier d'instructions pour Claude Code. Lis-le en entier avant toute action.56---78## Règle nº 1 — En-tête d'auteur OBLIGATOIRE910**Chaque fichier créé ou modifié** (code, script, config, doc, migration, test — sans exception) doit commencer par l'en-tête d'auteur suivant, adapté à la syntaxe de commentaire du langage :1112```python13# =============================================================================14# Job·Ka — Groupe KA15# Auteur  : Simon-Pierre Boucher16# Contact : contact@spboucher.ai17# Fichier : <chemin/nom_du_fichier>18# Rôle    : <description en une ligne>19# Créé    : <YYYY-MM-DD>   Modifié : <YYYY-MM-DD>20# =============================================================================21```2223```javascript24/**25 * =============================================================================26 * Job·Ka — Groupe KA27 * Auteur  : Simon-Pierre Boucher28 * Contact : contact@spboucher.ai29 * Fichier : <chemin/nom_du_fichier>30 * Rôle    : <description en une ligne>31 * Créé    : <YYYY-MM-DD>   Modifié : <YYYY-MM-DD>32 * =============================================================================33 */34```3536- Aucun fichier sans cet en-tête ne doit être commité. Point final.37- Si tu modifies un fichier existant sans en-tête : ajoute-le.38- Si tu modifies un fichier avec en-tête : mets à jour la date `Modifié`.39- Voir la **section 17** pour la politique complète d'attribution.4041---4243## 2. Contexte du projet4445**Job·Ka** agrège les offres d'emploi **directement depuis les pages carrières des employeurs québécois** (pas depuis Indeed/Jobillico). Même philosophie que les autres plateformes du Groupe KA (Lou·Ka, Immo·Ka, Vrai-Prix, ValoPlex, Auto·Ka, Fabri·Ka, Food·Ka) :46471. **Zéro boîte noire** — chaque offre est traçable à sa source, avec URL originale.482. **Données réelles à la source** — connecteurs automatisés, aucune saisie manuelle.493. **Indépendance** — aucun employeur ne paie pour être mis en avant.5051Architecture cible : **un connecteur = un employeur** (ou une plateforme ATS partagée : Workday, Lever, Greenhouse, SmartRecruiters, BambooHR, etc.), un scheduler qui resynchronise jour et nuit, une normalisation vers un schéma unifié.5253---5455## 3. Règle nº 2 — Étudier le dépôt Lou·Ka AVANT tout connecteur5657**Avant d'écrire ou de modifier le moindre connecteur**, tu dois explorer le dépôt Lou·Ka et produire un résumé de ce que tu as compris. Job·Ka doit réutiliser les patterns éprouvés de Lou·Ka, pas les réinventer.5859À étudier obligatoirement dans Lou·Ka :6061- [ ] Structure d'un connecteur : interface commune, classe de base, conventions de nommage62- [ ] Schéma de données normalisé et pipeline de normalisation63- [ ] Gestion des erreurs, retries, timeouts, rate limiting par source64- [ ] Scheduler / orchestration des resynchronisations65- [ ] Déduplication des annonces entre sources66- [ ] Détection et retrait des annonces expirées67- [ ] Stockage (BD, index, cache) et exposition API/frontend68- [ ] Logging et monitoring des connecteurs (taux de succès, fraîcheur)6970**Livrable avant de coder :** un rapport `docs/audit-louka.md` (avec en-tête d'auteur, règle nº 1) résumant l'architecture de Lou·Ka et le plan d'adaptation pour Job·Ka. Attends la validation de Simon-Pierre avant d'implémenter.7172---7374## 4. Schéma de données cible (offre d'emploi)7576Adapte les noms au style hérité de Lou·Ka, mais chaque connecteur doit tenter d'extraire :7778- `id_source` — identifiant unique chez l'employeur/ATS79- `employeur` — nom de l'entreprise80- `url_offre` — lien direct vers l'offre originale (obligatoire, zéro boîte noire)81- `titre` — titre du poste82- `description` — texte complet (HTML nettoyé)83- `lieu` — ville, région, code postal si dispo84- `mode_travail` — présentiel / hybride / télétravail85- `type_emploi` — temps plein / partiel / contractuel / stage / saisonnier86- `salaire_min`, `salaire_max`, `salaire_unite` — nombres, pas des strings (transparence salariale = différenciateur clé)87- `avantages` — liste si disponible88- `exigences` — scolarité, années d'expérience, langues89- `date_publication`, `date_limite` — dates ISO normalisées90- `categorie` — taxonomie interne (TI, santé, construction, etc.)91- `ats` — plateforme source (workday, lever, custom, etc.)92- `scrape_timestamp` — horodatage de la collecte9394Règles de normalisation : dates en ISO 8601, salaires convertis en $/h et $/an, géocodage adresse → lat/lng (réutiliser le pipeline Nominatim + cache de Lou·Ka, 1 req/s max).9596---9798## 5. Conventions de développement99100- Langue du code : anglais pour les identifiants, français pour la doc et les commentaires métier.101- Un connecteur = un module isolé, testable seul (`make test-connector NAME=x`).102- Jamais de scraping agressif : respecter robots.txt quand raisonnable, throttling par domaine, User-Agent identifiable `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)`.103- Aucun secret en dur dans le code : `.env` uniquement, jamais commité.104- Chaque PR/commit : message clair en français, en-tête d'auteur vérifié (règle nº 1).105- Avant de coder une fonctionnalité : présenter le plan et attendre validation.106107---108109## 6. Déploiement — node m3u96a + ngrok110111**Environnement de déploiement :**112113- Nœud cible : **`m3u96a`**114- Exposition publique : **ngrok** avec le domaine réservé **`www.job-ka.com`**115116Procédure attendue :117118```bash119# 1. Sur le node m3u96a — build et démarrage du service120#    (adapter au stack hérité de Lou·Ka : pm2, systemd, docker compose…)121122# 2. Tunnel ngrok vers le port de l'app (ex. 3000)123ngrok http --domain=www.job-ka.com 3000124```125126Règles :127128- Le tunnel ngrok doit être supervisé (pm2/systemd) pour redémarrer seul.129- Vérifier après chaque déploiement : `https://www.job-ka.com` répond, healthcheck OK, connecteurs planifiés actifs.130- Documenter toute variation dans `docs/deploiement.md` (avec en-tête, règle nº 1).131- Ne jamais exposer d'interface d'admin ou de BD via le tunnel public.132133---134135## 7–16. Sections réservées136137Réservées pour les futures politiques (monitoring, SEO, alertes courriel, API publique, etc.). Ne pas supprimer la numérotation : la **section 17** doit rester la section 17.138139---140141## 17. Politique d'attribution d'auteur1421431. **Auteur unique du projet : Simon-Pierre Boucher** (`contact@spboucher.ai`). Toute contribution générée par Claude est réputée réalisée pour le compte de l'auteur.1442. L'en-tête d'auteur (règle nº 1) est **non négociable** : il s'applique aux fichiers de code, scripts, configs, docs, tests, migrations, workflows CI, Dockerfiles et Makefiles.1453. Les métadonnées de projet doivent refléter l'auteur :146   - `package.json` → `"author": "Simon-Pierre Boucher <contact@spboucher.ai>"`147   - `pyproject.toml` → `authors = [{name = "Simon-Pierre Boucher", email = "contact@spboucher.ai"}]`148   - `LICENSE` et `README.md` → copyright « © Groupe KA — Simon-Pierre Boucher »1494. Configuration git du dépôt :150   ```bash151   git config user.name "Simon-Pierre Boucher"152   git config user.email "contact@spboucher.ai"153   ```1545. Toute page publique de Job·Ka affiche dans le pied de page : « Une plateforme du Groupe KA » avec le contact `contact@spboucher.ai`.1556. **Vérification automatique** : ajouter un hook pre-commit (ou étape CI) qui rejette tout fichier sans l'en-tête d'auteur. Ce hook porte lui-même l'en-tête.156157---158159*Dernière mise à jour : 2026-08-17 — Simon-Pierre Boucher (contact@spboucher.ai)*160