fix(install): scanDir() aplatit les sous-dossiers, liens générés cassés
Contexte
scripts/install-guidelines.js → buildDocsCategoryIndex() → fonction interne scanDir() (lignes 676-730) scanne récursivement guidelines/docs/shared/ et guidelines/technos/ pour indexer les .md par leur frontmatter categories:. Cet index alimente les liens injectés dans CLAUDE.md et les agents générés.
Bug
function scanDir(dir, guidelinePrefix, fileFilter = null) {
...
if (entry.isDirectory()) {
scanDir(fullPath, guidelinePrefix, fileFilter); // dir devient le sous-dossier courant
} else if (entry.name.endsWith('.md')) {
const relPathFromDir = path.relative(dir, fullPath); // dir = parent immédiat, pas la racine du scan
À chaque appel récursif, dir devient le sous-dossier courant. path.relative(dir, fullPath) ne renvoie donc jamais que le nom du fichier, quel que soit le niveau de profondeur — tout segment de sous-dossier intermédiaire est silencieusement perdu.
Impact
Actuellement dormant (guidelines/docs/shared/ est vide chez nous), mais dès qu'un contenu imbriqué sur 2+ niveaux y est ajouté (ex: ticket-templates/functional/feature.md), les liens générés dans CLAUDE.md et les agents seront cassés sans erreur ni warning au build.
Piste de correctif
Déjà implémentée côté oxa-guidelines via une fonction walk() interne : garder la racine du scan initial dans une variable séparée (fermeture) et calculer path.relative(scanRoot, fullPath) au lieu de path.relative(dir, fullPath).
Dépendances
Si #7 (closed) (déplacement guidelines/technos/ → guidelines/docs/shared/technos/) est traité avant, adapter les chemins scannés en conséquence.
Critères d'acceptation
-
Un fichier .mdnesté sur 2+ niveaux sousguidelines/docs/shared/génère un lien correct incluant tous les segments intermédiaires -
Comportement inchangé pour les fichiers à plat (cas actuel)