fix(ck): preserve display names and harden git helpers

This commit is contained in:
Affaan Mustafa
2026-03-28 23:23:54 -04:00
parent 17f6f95090
commit 00787d68e4
3 changed files with 18 additions and 12 deletions

View File

@@ -79,7 +79,7 @@ if (isInit) {
// Update projects.json // Update projects.json
projects[projectPath] = { projects[projectPath] = {
name: contextDir, name,
contextDir, contextDir,
lastUpdated: today(), lastUpdated: today(),
}; };

View File

@@ -8,7 +8,7 @@
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'fs'; import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'fs';
import { resolve, basename } from 'path'; import { resolve, basename } from 'path';
import { homedir } from 'os'; import { homedir } from 'os';
import { execSync } from 'child_process'; import { spawnSync } from 'child_process';
import { randomBytes } from 'crypto'; import { randomBytes } from 'crypto';
// ─── Paths ──────────────────────────────────────────────────────────────────── // ─── Paths ────────────────────────────────────────────────────────────────────
@@ -144,11 +144,13 @@ export function shortId() {
function runGit(args, cwd) { function runGit(args, cwd) {
try { try {
return execSync(`git -C "${cwd}" ${args}`, { const result = spawnSync('git', ['-C', cwd, ...args], {
timeout: 3000, timeout: 3000,
stdio: 'pipe', stdio: 'pipe',
encoding: 'utf8', encoding: 'utf8',
}).trim(); });
if (result.status !== 0) return null;
return result.stdout.trim();
} catch { } catch {
return null; return null;
} }
@@ -156,7 +158,7 @@ function runGit(args, cwd) {
export function gitLogSince(projectPath, sinceDate) { export function gitLogSince(projectPath, sinceDate) {
if (!sinceDate) return null; if (!sinceDate) return null;
return runGit(`log --oneline --since="${sinceDate}"`, projectPath); return runGit(['log', '--oneline', `--since=${sinceDate}`], projectPath);
} }
export function gitSummary(projectPath, sinceDate) { export function gitSummary(projectPath, sinceDate) {
@@ -166,9 +168,9 @@ export function gitSummary(projectPath, sinceDate) {
if (commits === 0) return null; if (commits === 0) return null;
// Count unique files changed: use a separate runGit call to avoid nested shell substitution // Count unique files changed: use a separate runGit call to avoid nested shell substitution
const countStr = runGit(`rev-list --count HEAD --since="${sinceDate}"`, projectPath); const countStr = runGit(['rev-list', '--count', 'HEAD', `--since=${sinceDate}`], projectPath);
const revCount = countStr ? parseInt(countStr, 10) : commits; const revCount = countStr ? parseInt(countStr, 10) : commits;
const diff = runGit(`diff --shortstat HEAD~${Math.min(revCount, 50)}..HEAD`, projectPath); const diff = runGit(['diff', '--shortstat', `HEAD~${Math.min(revCount, 50)}..HEAD`], projectPath);
if (diff) { if (diff) {
const filesMatch = diff.match(/(\d+) file/); const filesMatch = diff.match(/(\d+) file/);

View File

@@ -17,7 +17,7 @@
import { readFileSync, writeFileSync, existsSync } from 'fs'; import { readFileSync, writeFileSync, existsSync } from 'fs';
import { resolve } from 'path'; import { resolve } from 'path';
import { homedir } from 'os'; import { homedir } from 'os';
import { execSync } from 'child_process'; import { spawnSync } from 'child_process';
const CK_HOME = resolve(homedir(), '.claude', 'ck'); const CK_HOME = resolve(homedir(), '.claude', 'ck');
const PROJECTS_FILE = resolve(CK_HOME, 'projects.json'); const PROJECTS_FILE = resolve(CK_HOME, 'projects.json');
@@ -47,10 +47,14 @@ function stalenessIcon(dateStr) {
function gitLogSince(projectPath, sinceDate) { function gitLogSince(projectPath, sinceDate) {
if (!sinceDate || !existsSync(resolve(projectPath, '.git'))) return null; if (!sinceDate || !existsSync(resolve(projectPath, '.git'))) return null;
try { try {
const result = execSync(`git -C "${projectPath}" log --oneline --since="${sinceDate}"`, { const result = spawnSync(
timeout: 3000, stdio: 'pipe', encoding: 'utf8', 'git',
}).trim(); ['-C', projectPath, 'log', '--oneline', `--since=${sinceDate}`],
const commits = result.split('\n').filter(Boolean).length; { timeout: 3000, stdio: 'pipe', encoding: 'utf8' },
);
if (result.status !== 0) return null;
const output = result.stdout.trim();
const commits = output.split('\n').filter(Boolean).length;
return commits > 0 ? `${commits} commit${commits !== 1 ? 's' : ''} since last session` : null; return commits > 0 ? `${commits} commit${commits !== 1 ? 's' : ''} since last session` : null;
} catch { return null; } } catch { return null; }
} }