gstack/browse/src/project-slug.ts

37 lines
1.0 KiB
TypeScript

/**
* Project slug resolution for the browse daemon.
*
* Used by domain-skills (per-project storage) and sidebar prompt-context
* injection. Cached after first call — slug is derived from the daemon's
* git remote (or env override) and doesn't change between commands.
*/
import * as path from 'path';
import * as os from 'os';
import { execSync } from 'child_process';
let cachedSlug: string | null = null;
export function getCurrentProjectSlug(): string {
if (cachedSlug) return cachedSlug;
const explicit = process.env.GSTACK_PROJECT_SLUG;
if (explicit) {
cachedSlug = explicit;
return explicit;
}
try {
const slugBin = path.join(os.homedir(), '.claude/skills/gstack/bin/gstack-slug');
const out = execSync(slugBin, { encoding: 'utf8', timeout: 2000 }).trim();
const m = out.match(/SLUG="?([^"\n]+)"?/);
cachedSlug = m ? m[1]! : (out || 'unknown');
} catch {
cachedSlug = 'unknown';
}
return cachedSlug;
}
/** Reset cache; for tests only. */
export function _resetProjectSlugCache(): void {
cachedSlug = null;
}