/** * BSO M9 v0.3 — Layer 3 共用工具:JSON 文件 idempotent merge + backup * * 抽出原 writers.ts mergeClaudeSettings 中的通用模式,让 hook-file / * deny-pipeline / mcp-only 三个 kernel 共享一套逻辑。 * * 行为: * - 文件不存在 → 创建,action='created' * - 文件存在 → backup 到 ~/.skillfm/backups//,深度合并 patch * - 已注册(marker 命中)→ skip,action='already-registered' * - 文件不是合法 JSON → 抛 SKILLFM.HARNESS.PARSE_FAILED */ import type { InstalledFile } from './types.js'; export interface JsonMergeOptions { /** 目标文件绝对路径 */ filePath: string; /** * 已注册检测器:返回 true 表示该 patch 已经在 data 内,跳过写入。 * 例如 hook-file 检查 hooks.PreToolUse 数组里 command 是否含 SKILLFM_GUARD_COMMAND。 */ isAlreadyRegistered: (data: unknown) => boolean; /** * 合并函数:把 patch 内容深度合并到 data。原地修改 data,返回 void。 * 调用方负责保证语义(数组 append vs object merge)。 */ mergePatch: (data: Record) => void; /** 默认空对象时的初始 JSON(如某些文件需要 `{ "version": 1 }`) */ emptyJson?: () => Record; /** 是否 dry-run(不落盘,仅返回预期 action) */ dryRun?: boolean; } export declare function mergeJsonFile(opts: JsonMergeOptions): InstalledFile; /** * 检查 array 中是否已有任何 entry 的 stringify 含 marker(粗粒度去重)。 */ export declare function arrayHasMarker(array: unknown, marker: string): boolean; /** * Ensure path `data[k1][k2]...` exists as object, return innermost ref. */ export declare function ensureObjectPath(data: Record, ...keys: string[]): Record; /** * Ensure path `data[k1][k2]...` exists as array, return ref. */ export declare function ensureArrayPath(data: Record, ...keys: string[]): unknown[]; //# sourceMappingURL=json-merge.d.ts.map