Some checks failed
CI / Build & test (Node 24) (push) Has been cancelled
CI / Pack & boot smoke (Node 22) (push) Has been cancelled
CI / No em/en dashes (push) Has been cancelled
CI / Build & test (Node 22) (push) Has been cancelled
Deploy site (production) / build-and-deploy (push) Successful in 20s
Remplace les 547 tirets cadratins (U+2014) et demi-cadratins (U+2013) des fichiers versionnés par la ponctuation contextuelle adaptée (point médian, deux-points, virgule, parenthèses ; tiret simple pour les plages), sur 122 fichiers (appli, vitrine, doc, tests, workflows, scripts). Ajoute le job CI « lint-dashes » (git grep -P) qui échoue si un tiret cadratin/demi-cadratin réapparaît, hors logo binaire et captures brutes du terminal (fidélité des fixtures de détection de dialogue).
38 lines
1.8 KiB
TypeScript
38 lines
1.8 KiB
TypeScript
import { parse, resolve, sep } from 'node:path';
|
|
|
|
/**
|
|
* Plus long ancêtre commun d'un ensemble de chemins absolus (par segments, jamais par préfixe
|
|
* de chaîne : `/a/bc` n'est PAS un ancêtre de `/a/bcd`). Pour un seul chemin, renvoie ce chemin.
|
|
*/
|
|
export function commonAncestorDir(paths: string[]): string {
|
|
const first = paths[0];
|
|
if (first === undefined) throw new Error('commonAncestorDir: empty input');
|
|
const firstSegs = resolve(first).split(sep);
|
|
let common = firstSegs.length;
|
|
for (let i = 1; i < paths.length; i++) {
|
|
const segs = resolve(paths[i]!).split(sep);
|
|
let k = 0;
|
|
while (k < common && k < segs.length && segs[k] === firstSegs[k]) k++;
|
|
common = k;
|
|
}
|
|
const joined = firstSegs.slice(0, common).join(sep);
|
|
// `['', 'a', 'b'].slice(0,1).join('/')` === '' → racine POSIX ; rétablir le séparateur racine.
|
|
return joined === '' ? parse(resolve(first)).root : joined;
|
|
}
|
|
|
|
/**
|
|
* Politique de répertoire de travail d'une session de groupe (P6) : le `cwd` est le PARENT COMMUN
|
|
* des répertoires couverts (racine neutre, chemins relatifs cross-repo naturels), chaque répertoire
|
|
* étant ensuite relié via `--add-dir` (le dédoublonnage + filtrage du cwd est fait par `PtyManager`).
|
|
* Garde-fou : si le parent commun est la racine du FS (repos éparpillés sur des racines différentes),
|
|
* on retombe sur le premier répertoire pour ne pas accorder à Claude la permission sur tout le disque.
|
|
*/
|
|
export function resolveGroupCwd(dirs: string[]): { cwd: string; addDirs: string[] } {
|
|
const first = dirs[0];
|
|
if (first === undefined) throw new Error('resolveGroupCwd: empty input');
|
|
const ancestor = commonAncestorDir(dirs);
|
|
const root = parse(resolve(first)).root;
|
|
const cwd = ancestor === root ? first : ancestor;
|
|
return { cwd, addDirs: dirs };
|
|
}
|