feat: use custom CLAUDE.md template path when creating cases

When creating new cases via /api/cases or /api/quick-start, the
server now checks ~/.claudeman/settings.json for a defaultClaudeMdPath.
If found and the file exists, it uses that template with placeholder
substitution ([PROJECT_NAME], [PROJECT_DESCRIPTION], [DATE]).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
arkon
2026-01-19 02:12:32 +01:00
co-authored by Claude Opus 4.5
parent 885e9dc729
commit b30657a36f
2 changed files with 39 additions and 3 deletions
+21 -2
View File
@@ -577,7 +577,9 @@ export class WebServer extends EventEmitter {
mkdirSync(casePath, { recursive: true });
mkdirSync(join(casePath, 'src'), { recursive: true });
const claudeMd = generateClaudeMd(name, description || '');
// Read settings to get custom template path
const templatePath = this.getDefaultClaudeMdPath();
const claudeMd = generateClaudeMd(name, description || '', templatePath);
writeFileSync(join(casePath, 'CLAUDE.md'), claudeMd);
this.broadcast('case:created', { name, path: casePath });
@@ -620,7 +622,9 @@ export class WebServer extends EventEmitter {
mkdirSync(casePath, { recursive: true });
mkdirSync(join(casePath, 'src'), { recursive: true });
const claudeMd = generateClaudeMd(caseName, '');
// Read settings to get custom template path
const templatePath = this.getDefaultClaudeMdPath();
const claudeMd = generateClaudeMd(caseName, '', templatePath);
writeFileSync(join(casePath, 'CLAUDE.md'), claudeMd);
this.broadcast('case:created', { name: caseName, path: casePath });
@@ -806,6 +810,21 @@ export class WebServer extends EventEmitter {
this.broadcast('respawn:timerStarted', { sessionId, durationMinutes, endAt, startedAt: now });
}
// Helper to get custom CLAUDE.md template path from settings
private getDefaultClaudeMdPath(): string | undefined {
const settingsPath = join(homedir(), '.claudeman', 'settings.json');
try {
if (existsSync(settingsPath)) {
const content = readFileSync(settingsPath, 'utf-8');
const settings = JSON.parse(content);
return settings.defaultClaudeMdPath || undefined;
}
} catch (err) {
console.error('Failed to read settings:', err);
}
return undefined;
}
private async startScheduledRun(prompt: string, workingDir: string, durationMinutes: number): Promise<ScheduledRun> {
const id = uuidv4();
const now = Date.now();