Skip to content

Latest commit

 

History

History
129 lines (99 loc) · 3.78 KB

File metadata and controls

129 lines (99 loc) · 3.78 KB

CLAUDE.md

Instructions pour Claude Code (claude.ai/code) pour ce projet.

Aperçu

LinkDown - Extension Chrome (Manifest V3) pour capturer les posts LinkedIn en Markdown avec front matter YAML.

Version : 1.5.0 (Production Ready - Score Council 8.8/10)

Architecture

/
├── manifest.json       # Manifest V3 avec CSP
├── content.js          # Script d'extraction DOM (v6)
├── popup.html          # Interface popup
├── popup.js            # Logique popup
├── popup.css           # Styles popup
├── icons/              # Icônes (16, 48, 128px)
├── PRD/                # Documents de spécifications
│   ├── PRD-plugin-chrome.md
│   ├── PRD-v2-fixes.md
│   ├── PRD-v3-context-fix.md
│   ├── PRD-phase1.md   # Filtrage sponsorisé, CSP
│   ├── PRD-phase2.md   # i18n, URN/URL
│   └── PRD-phase3.md   # CJK, self-tests
├── council_trails/     # Logs des évaluations Council
├── CLAUDE.md           # Ce fichier
├── README.md           # Documentation GitHub
└── LICENSE             # MIT

Fonctionnalités clés (content.js v6)

Détection de contexte

  • getPageContext() - URL-based : /posts/, /feed/update/, /activity/
  • Feed principal = erreur (plusieurs posts)

Extraction DOM

  • Sélecteurs scopés : requêtes dans le container du post
  • Fallback global : authorNameGlobal, postDateGlobal pour pages single-post
  • MutationObserver : debounce 150ms pour "voir plus"

Filtrage sponsorisé (5 directions)

  1. Ancêtres (closest())
  2. Élément lui-même (matches())
  3. Descendants (querySelector())
  4. Texte actor/meta
  5. Siblings (éléments frères)

i18n (20+ langues)

  • SPONSORED_INDICATORS_ALPHABETIC : word boundaries (\b)
  • SPONSORED_INDICATORS_CJK : includes() (pas de word boundaries)
  • matchesSponsoredIndicator() : détection auto du type de script

Ciblage précis

  • extractActivityIdFromUrl() : extrait ID de l'URL
  • findPostContainerByActivityId() : ciblage exact du container

Stratégie des sélecteurs

Priorité Méthode Exemple
1 Attribut datetime time[datetime]
2 Data-URN [data-urn*="urn:li:activity"]
3 Classes composants .feed-shared-*
4 ARIA Labels et rôles
5 CSS générique Dernier recours

Format de sortie

---
date: YYYY-MM-DD
auteur: Nom Auteur
origine: LinkedIn
url: https://www.linkedin.com/feed/update/xxxxx/
---

Contenu du post...

Données manquantes : [Auteur non trouvé], [Date inconnue]

Tests de validation

Console DevTools sur une page LinkedIn :

window.__linkdownSelfTest()

15+ tests couverts : CJK, scripts complexes, word boundaries, matching

Sécurité

  • CSP : script-src 'self'; object-src 'none'
  • Permissions minimales : activeTab, scripting, clipboardWrite, downloads
  • Pas d'exposition globale : fonctions internes non accessibles
  • textContent : pas de risque XSS

Installation développeur

1. chrome://extensions/
2. Mode développeur → ON
3. Charger l'extension non empaquetée → ce dossier

Maintenance

Quand l'extraction casse (DOM LinkedIn modifié) :

  1. Inspecter avec DevTools
  2. Mettre à jour SELECTORS dans content.js
  3. Nouveaux sélecteurs = début des tableaux
  4. Tester /posts/ et /feed/update/
  5. Vérifier debounce MutationObserver

Historique des versions

Version Changements
1.5.0 CJK-aware matching, self-tests (Phase 3)
1.4.0 i18n 20+ langues, URN/URL correlation (Phase 2)
1.3.0 Filtrage sponsorisé, CSP, sécurité (Phase 1)
1.2.0 Fallback document-wide auteur/date
1.1.0 Détection contexte URL-based
1.0.0 Version initiale