import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from 'fs'; import { dirname, resolve } from 'path'; import { replaceTaggedContent } from './claude-md-utils.js'; import { logger } from './logger.js'; /** * Write AGENTS.md with claude-mem context, preserving user content outside tags. * Uses atomic write to prevent partial writes. */ export function writeAgentsMd(agentsPath: string, context: string): void { if (!agentsPath) return; // Never write inside .git directories — corrupts refs (#1165) const resolvedPath = resolve(agentsPath); if (resolvedPath.includes('/.git/') || resolvedPath.includes('\\.git\\') || resolvedPath.endsWith('/.git') || resolvedPath.endsWith('\\.git')) return; const dir = dirname(agentsPath); if (!existsSync(dir)) { mkdirSync(dir, { recursive: true }); } let existingContent = ''; if (existsSync(agentsPath)) { existingContent = readFileSync(agentsPath, 'utf-8'); } const contentBlock = `# Memory Context\n\n${context}`; const finalContent = replaceTaggedContent(existingContent, contentBlock); const tempFile = `${agentsPath}.tmp`; try { writeFileSync(tempFile, finalContent); renameSync(tempFile, agentsPath); } catch (error: unknown) { logger.error('AGENTS_MD', 'Failed to write AGENTS.md', { agentsPath }, error instanceof Error ? error : new Error(String(error))); } }