/** * AGENTS.md 같은 사용자 소유 문서에 우리 블록만 안전하게 심고 빼기 위한 마커 처리. * 블록 밖의 내용은 절대 건드리지 않는다. */ export function startTag(marker: string): string { return ``; } export function endTag(marker: string): string { return ``; } export function hasBlock(doc: string, marker: string): boolean { return doc.includes(startTag(marker)) && doc.includes(endTag(marker)); } /** 블록이 있으면 내용만 교체, 없으면 문서 끝에 덧붙인다 */ export function upsertBlock(doc: string, marker: string, content: string): string { const s = startTag(marker); const e = endTag(marker); const block = `${s}\n${content.trim()}\n${e}`; const si = doc.indexOf(s); const ei = doc.indexOf(e); if (si !== -1 && ei !== -1 && ei > si) { return doc.slice(0, si) + block + doc.slice(ei + e.length); } const base = doc.trimEnd(); return base.length > 0 ? `${base}\n\n${block}\n` : `${block}\n`; } /** 블록만 제거하고 나머지 문서는 보존한다 */ export function removeBlock(doc: string, marker: string): string { const s = startTag(marker); const e = endTag(marker); const si = doc.indexOf(s); const ei = doc.indexOf(e); if (si === -1 || ei === -1 || ei < si) return doc; const out = doc.slice(0, si) + doc.slice(ei + e.length); return out.replace(/\n{3,}/g, "\n\n").trimEnd() + "\n"; } /** 블록 내부 내용만 뽑아낸다 (드리프트 판정용) */ export function extractBlock(doc: string, marker: string): string | null { const s = startTag(marker); const e = endTag(marker); const si = doc.indexOf(s); const ei = doc.indexOf(e); if (si === -1 || ei === -1 || ei < si) return null; return doc.slice(si + s.length, ei).trim(); }