From f5f8b9e5961210ab26bd104544a3956e95c46099 Mon Sep 17 00:00:00 2001 From: Nikita Tenishev Date: Mon, 6 Apr 2026 14:11:50 +0300 Subject: [PATCH] fix: match Claude Code's project key encoding for underscores and special chars MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Claude Code encodes project directory paths by replacing ALL non-alphanumeric characters (except hyphens) with '-'. CodeDash was only replacing '/' and '.', leaving underscores and other special characters as-is. This caused session detail files to not be found for any project path containing underscores (e.g. personal_projects → expected -personal-projects but searched -personal_projects). Changed regex from /[\/\.]/g to /[^a-zA-Z0-9-]/g in 4 locations: - loadSessions() enrichment - deleteSession() - exportSessionMarkdown() - findSessionFile() --- src/data.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/data.js b/src/data.js index 83b08af..02ddcf7 100644 --- a/src/data.js +++ b/src/data.js @@ -709,7 +709,7 @@ function loadSessions() { // Enrich Claude sessions with detail file info for (const [sid, s] of Object.entries(sessions)) { if (s.tool !== 'claude') continue; - const projectKey = s.project.replace(/[\/\.]/g, '-'); + const projectKey = s.project.replace(/[^a-zA-Z0-9-]/g, '-'); const sessionFile = path.join(PROJECTS_DIR, projectKey, `${sid}.jsonl`); if (fs.existsSync(sessionFile)) { s.has_detail = true; @@ -866,7 +866,7 @@ function deleteSession(sessionId, project) { const deleted = []; // 1. Remove session JSONL file from project dir - const projectKey = project.replace(/[\/\.]/g, '-'); + const projectKey = project.replace(/[^a-zA-Z0-9-]/g, '-'); const sessionFile = path.join(PROJECTS_DIR, projectKey, `${sessionId}.jsonl`); if (fs.existsSync(sessionFile)) { fs.unlinkSync(sessionFile); @@ -935,7 +935,7 @@ function getGitCommits(projectDir, fromTs, toTs) { } function exportSessionMarkdown(sessionId, project) { - const projectKey = project.replace(/[\/\.]/g, '-'); + const projectKey = project.replace(/[^a-zA-Z0-9-]/g, '-'); const sessionFile = path.join(PROJECTS_DIR, projectKey, `${sessionId}.jsonl`); if (!fs.existsSync(sessionFile)) { @@ -971,7 +971,7 @@ function exportSessionMarkdown(sessionId, project) { function findSessionFile(sessionId, project) { // Try Claude projects dir if (project) { - const projectKey = project.replace(/[\/\.]/g, '-'); + const projectKey = project.replace(/[^a-zA-Z0-9-]/g, '-'); const claudeFile = path.join(PROJECTS_DIR, projectKey, `${sessionId}.jsonl`); if (fs.existsSync(claudeFile)) return { file: claudeFile, format: 'claude' }; }