/** * BSO M9-2 — 配置写入器(idempotent + backup) * * Refs: docs/prd/PRD-BSO-M9-HARNESS-HOOKS.md §3.3 + §7.3 回滚 * * 职责: * - 写 LLM priming block 到 CLAUDE.md / AGENTS.md(追加在尾部,用 SKILLFM-BEGIN/END 边界, * 复用 soul.ts 的 block 机制,已存在则先撤再写 → 唯一) * - 合并(不覆盖)Claude Code settings.json 的 hooks * - 合并 Aider .aider.conf.yml 的 commands_pre/post * - 所有写入前都 backup 原文件到 ~/.skillfm/backups// * - 所有操作 idempotent — 已注册则 skip * * 不实现: * - PR #7 已落的 soul 文件写入(writeSkillfmBlock 在 soul.ts)— priming 和 soul block * 是同一个 BEGIN/END 边界块,共用一套基础设施 * - MCP stdio bridge(需要另做,M9 范围外) */ import { type AiderConfigPatch, type ClaudeSettingsPatch, type HarnessPaths } from './templates.js'; import type { Harness } from './detector.js'; import { type PrimingLang } from './priming.js'; export type HarnessWriterErrorCode = 'SKILLFM.HARNESS.UNSUPPORTED' | 'SKILLFM.HARNESS.WRITE_FAILED' | 'SKILLFM.HARNESS.PARSE_FAILED'; export declare class HarnessWriterError extends Error { code: HarnessWriterErrorCode; constructor(code: HarnessWriterErrorCode, message: string); } export interface InitReport { harness: Harness; paths: HarnessPaths; llm_priming: { file: string; action: 'created' | 'appended' | 'replaced' | 'already-present'; }; harness_config: { file: string | null; action: 'created' | 'merged' | 'already-registered' | 'skipped-no-hook-support' | 'skipped-no-config-file'; details?: string; }; warnings: string[]; } /** * 把 priming block 写入目标文件。BEGIN/END 边界。 * 已存在 → 先移除旧的再追加新的(upgrade-safe)。 */ export declare function writePrimingBlock(filePath: string, lang?: PrimingLang): { action: InitReport['llm_priming']['action']; bytesWritten: number; }; /** * additive merge: * - 已有 hooks.SessionStart / PreToolUse / PostToolUse 保留 * - 我们的 hooks(identified by command startsWith(SKILLFM_GUARD_COMMAND))已在则 skip * - 否则 append */ export declare function mergeClaudeSettings(filePath: string, patch: ClaudeSettingsPatch): { action: InitReport['harness_config']['action']; details?: string; }; /** * Aider 配置用 YAML,但我们只需要设置 `commands_pre` / `commands_post` 两个 list。 * 避免引入 `js-yaml` 依赖(@skillfm/local 坚持 zero-dep)— 手写 minimal YAML writer。 * * 策略: * - 文件不存在 → 创建只含我们的两个 key * - 文件存在 → 读为字符串,grep `commands_pre:` / `commands_post:` 是否已含我们的命令; * 已含则 skip,否则追加 * * 不尝试全解析 YAML(复杂度高、易出错),只做 append-safe 操作。 */ export declare function mergeAiderConfig(filePath: string, patch: AiderConfigPatch): { action: InitReport['harness_config']['action']; details?: string; }; export interface InitHarnessOptions { harness: Harness; cwd: string; lang?: PrimingLang; /** 若为 true,跳过 harness 层写入(只写 LLM 层 priming)*/ llmOnly?: boolean; } export declare function initHarness(opts: InitHarnessOptions): InitReport; //# sourceMappingURL=writers.d.ts.map