// Réglages liés au CLI Claude, persistés dans la table `settings` (clé/valeur), modifiables via // l'onglet Réglages. Frontière de sécurité identique à scan-settings : clés NON sensibles, écrites // uniquement via l'allow-list du PATCH /api/v1/settings et les validateurs ci-dessous. // // Motivation : un service systemd/launchd démarre avec un PATH minimal qui n'inclut pas ~/.local/bin // (où vit le binaire `claude`) → `which claude` échoue. Plutôt que de bricoler le PATH du service, // l'utilisateur peut pointer explicitement le binaire ici (effet : prochaine session, sans redémarrage). import { accessSync, constants, statSync } from 'node:fs'; import { getSetting } from '../db/index.js'; import type { Db } from '../db/index.js'; import { isSafeAbsolutePath } from './git.js'; /** Chemin explicite du binaire `claude` (override de la résolution via PATH). */ export const CLAUDE_BIN_PATH_KEY = 'claude_bin_path'; /** Override de la racine ~/.claude (transcripts + registre des sessions). */ export const CLAUDE_HOME_KEY = 'claude_home'; /** Chemin configuré du binaire `claude`, ou null si non défini (⇒ auto-détection via PATH). */ export function readClaudeBinPath(db: Db): string | null { const raw = getSetting(db, CLAUDE_BIN_PATH_KEY)?.trim(); return raw ? raw : null; } /** Racine ~/.claude configurée, ou null si non défini (⇒ défaut/flag). */ export function readClaudeHome(db: Db): string | null { const raw = getSetting(db, CLAUDE_HOME_KEY)?.trim(); return raw ? raw : null; } /** * Valide un chemin de binaire `claude`. Retourne `''` pour réinitialiser (auto-détection), le chemin * normalisé s'il est absolu ET pointe vers un fichier exécutable, ou `null` si invalide (⇒ 400). */ export function normalizeClaudeBinPath(raw: unknown): string | null { if (typeof raw !== 'string') return null; const p = raw.trim(); if (p === '') return ''; if (!isSafeAbsolutePath(p)) return null; try { if (!statSync(p).isFile()) return null; accessSync(p, constants.X_OK); } catch { return null; } return p; } /** * Valide une racine ~/.claude. Retourne `''` pour réinitialiser (défaut), le chemin normalisé s'il * est absolu ET pointe vers un répertoire existant, ou `null` si invalide (⇒ 400). */ export function normalizeClaudeHome(raw: unknown): string | null { if (typeof raw !== 'string') return null; const p = raw.trim(); if (p === '') return ''; if (!isSafeAbsolutePath(p)) return null; try { if (!statSync(p).isDirectory()) return null; } catch { return null; } return p; }