Instructions pour Claude Code (claude.ai/code) pour ce projet.
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)
/
├── 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
getPageContext()- URL-based :/posts/,/feed/update/,/activity/- Feed principal = erreur (plusieurs posts)
- Sélecteurs scopés : requêtes dans le container du post
- Fallback global :
authorNameGlobal,postDateGlobalpour pages single-post - MutationObserver : debounce 150ms pour "voir plus"
- Ancêtres (
closest()) - Élément lui-même (
matches()) - Descendants (
querySelector()) - Texte actor/meta
- Siblings (éléments frères)
SPONSORED_INDICATORS_ALPHABETIC: word boundaries (\b)SPONSORED_INDICATORS_CJK:includes()(pas de word boundaries)matchesSponsoredIndicator(): détection auto du type de script
extractActivityIdFromUrl(): extrait ID de l'URLfindPostContainerByActivityId(): ciblage exact du container
| 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 |
---
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]
Console DevTools sur une page LinkedIn :
window.__linkdownSelfTest()15+ tests couverts : CJK, scripts complexes, word boundaries, matching
- 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
1. chrome://extensions/
2. Mode développeur → ON
3. Charger l'extension non empaquetée → ce dossierQuand l'extraction casse (DOM LinkedIn modifié) :
- Inspecter avec DevTools
- Mettre à jour
SELECTORSdans content.js - Nouveaux sélecteurs = début des tableaux
- Tester
/posts/et/feed/update/ - Vérifier debounce MutationObserver
| 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 |