/** * Knowledge Announce — 知识层模块(拍板索引段生成)。 * * 职责边界: * - 负责:向项目根 CLAUDE.md 的边界标记生成段追加知识条目索引行(字节级只动标记内区域) * - 不负责:知识条目写入(knowledge_writer)、摘要提取(调用方提供)、宿主适配器全量生成(adapter_writers) * * 被谁调用:core/knowledge_service(sf_knowledge add --announce) * 调用谁:node:fs/promises、node:path、write_file_atomic * * 数据流:条目名/日期/相对路径/摘要 → CLAUDE.md 边界标记内追加索引行 * 持久化:改写项目根 CLAUDE.md(条目文件是权威,索引行是派生物——写入失败不回滚条目,只显式报错) * * 设计约束(比 adapter_writers.writeClaudeMd 更保守):CLAUDE.md 含用户手写内容, * 绝不全量覆盖——只允许在 BEGIN/END 标记内追加或文件末尾新增标记段,标记外字节一律不碰。 * 跨进程不串行(与 atomicWriteFile 既有约束同源):同项目两个 MCP 会话并发 add --announce 时 * 后写者覆盖前写者可丢一行索引;丢失可重跑 announce 恢复(行不在则不幂等跳过),不引入锁。 */ /** 生成段边界标记(标记内整段可安全重写,标记外为用户手写区) */ export declare const KNOWLEDGE_INDEX_BEGIN_MARKER = ""; export declare const KNOWLEDGE_INDEX_END_MARKER = ""; /** announce 输入 */ export interface KnowledgeAnnounceInput { /** 条目名(索引行展示用) */ entryName: string; /** 日期(YYYY-MM-DD) */ date: string; /** 知识文件相对项目根路径(如 .soloforge/knowledge/patterns/x.md;索引行指向与幂等判重均用它) */ knowledgeRelPath: string; /** 一句话摘要(调用方从正文提取;空则索引行不含摘要段) */ summary?: string; } /** announce 结果状态:written=已写入 / idempotent_skip=重复 announce 幂等跳过 / degraded=无 CLAUDE.md 降级 / failed=失败(须手工补索引) */ export type KnowledgeAnnounceStatus = "written" | "idempotent_skip" | "degraded" | "failed"; export interface KnowledgeAnnounceResult { status: KnowledgeAnnounceStatus; message: string; } /** * 向项目根 CLAUDE.md 生成段追加索引行。 * 幂等:生成段内已有指向同一知识文件路径的索引行时不重复追加、不写盘。 * 降级:CLAUDE.md 不存在时提示跳过(不创建文件、不报错阻断 add 本体)。 * 失败:标记形态异常或读写失败时显式报错提示手工补索引(不回滚知识条目——条目是权威,索引行是派生物)。 * @param projectPath 项目根路径 * @param input 索引行要素 */ export declare function announceKnowledgeIndex(projectPath: string, input: KnowledgeAnnounceInput): Promise; /** * 检测项目根 CLAUDE.md 是否存在唯一的生成段(supersede 索引段联动的触发条件: * 段在=A5 通道已被使用→联动;段不在→A5 未实施,跳过不创建)。 * 标记数量异常(0 或 >1)一律视为"无可用生成段",联动降级提示。 */ export declare function hasKnowledgeIndexSection(projectPath: string): boolean; /** * 从生成段移除指向指定知识文件的索引行(supersede 联动:旧条目行退出索引段)。 * 与 announceKnowledgeIndex 同款边界纪律:标记外字节一律不碰;无 CLAUDE.md/无生成段→degraded 跳过; * 行不存在→幂等跳过;标记形态异常→failed 提示手工处理。 * @param projectPath 项目根路径 * @param knowledgeRelPath 知识文件相对项目根路径(行级严格匹配,同 hasIndexLineFor) */ export declare function removeKnowledgeIndexLine(projectPath: string, knowledgeRelPath: string): Promise;