mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-10-09 16:59:43 +02:00
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:
@@ -1,6 +1,23 @@
|
|||||||
export function generateClaudeMd(caseName: string, description: string = ''): string {
|
import { existsSync, readFileSync } from 'node:fs';
|
||||||
|
|
||||||
|
export function generateClaudeMd(caseName: string, description: string = '', templatePath?: string): string {
|
||||||
const date = new Date().toISOString().split('T')[0];
|
const date = new Date().toISOString().split('T')[0];
|
||||||
|
|
||||||
|
// If a custom template path is provided and exists, use it
|
||||||
|
if (templatePath && existsSync(templatePath)) {
|
||||||
|
try {
|
||||||
|
let template = readFileSync(templatePath, 'utf-8');
|
||||||
|
// Replace placeholders with actual values
|
||||||
|
template = template.replace(/\[PROJECT_NAME\]/g, caseName);
|
||||||
|
template = template.replace(/\[PROJECT_DESCRIPTION\]/g, description || 'A new project');
|
||||||
|
template = template.replace(/\[DATE\]/g, date);
|
||||||
|
return template;
|
||||||
|
} catch (err) {
|
||||||
|
console.error(`Failed to read template from ${templatePath}:`, err);
|
||||||
|
// Fall through to default template
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return `# CLAUDE.md - Project Configuration
|
return `# CLAUDE.md - Project Configuration
|
||||||
|
|
||||||
## Project Overview
|
## Project Overview
|
||||||
|
|||||||
+21
-2
@@ -577,7 +577,9 @@ export class WebServer extends EventEmitter {
|
|||||||
mkdirSync(casePath, { recursive: true });
|
mkdirSync(casePath, { recursive: true });
|
||||||
mkdirSync(join(casePath, 'src'), { 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);
|
writeFileSync(join(casePath, 'CLAUDE.md'), claudeMd);
|
||||||
|
|
||||||
this.broadcast('case:created', { name, path: casePath });
|
this.broadcast('case:created', { name, path: casePath });
|
||||||
@@ -620,7 +622,9 @@ export class WebServer extends EventEmitter {
|
|||||||
mkdirSync(casePath, { recursive: true });
|
mkdirSync(casePath, { recursive: true });
|
||||||
mkdirSync(join(casePath, 'src'), { 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);
|
writeFileSync(join(casePath, 'CLAUDE.md'), claudeMd);
|
||||||
|
|
||||||
this.broadcast('case:created', { name: caseName, path: casePath });
|
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 });
|
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> {
|
private async startScheduledRun(prompt: string, workingDir: string, durationMinutes: number): Promise<ScheduledRun> {
|
||||||
const id = uuidv4();
|
const id = uuidv4();
|
||||||
const now = Date.now();
|
const now = Date.now();
|
||||||
|
|||||||
Reference in New Issue
Block a user