/** * 文件位置表填充探测(domain 层)。 * * 职责边界: * - 负责:探测项目既有文件在非默认位置(brownfield 偏离),生成 project_map override 候选 * - 不负责:EvidenceView 影响面计算(core 层 apply 时算,避免 domain→core 反向依赖)、 * override 持久化(saveIntent,core 层)、项目工程目录声明(由 intent.projects 或设计文档负责) * * 被谁调用:升级流程 plan/probe 动作(core 层) * 调用谁:project_map(deriveDefaultPath/resolveFilePath)、node:fs/node:path * * 数据流:projectRoot + 当前 overrides → glob 探测既有文件 → ProbeResult[](候选 + 推荐) * 持久化:无(纯只读探测) * * 设计: * - 只探测 brownfield 高频子集(deployment:docker_compose + companion:api_spec)——这些是 brownfield 最常偏离默认值的;artifact 主文档几乎都遵循 * 默认路径(SoloForge 产出),探测收益 < 噪音 * - 默认路径已存在 → 跳过(不制造 override,greenfield 零负担) * - 当前已 override 且 override 路径存在 → 跳过(尊重用户已声明) * - 项目里无此文件 → 跳过(candidatePaths=[],无文件可 override) * - 多候选 → 全列出 + 按目录优先级排序推荐,标记 needsDisambiguation(不静默取首个——确定性原则) * - 排除 node_modules/.git/dist/.soloforge/coverage */ import { type ProjectMapOverrideValue } from "./project_map.js"; /** 单个 key 的探测结果(不含 EvidenceView 影响面——core 层 apply 时算,避免 domain→core 反向依赖) */ interface ProbeResult { key: string; defaultPath: string; candidatePaths: string[]; recommended: string; needsDisambiguation: boolean; source: "brownfield_probe"; } /** 探测输出 */ export interface ProjectMapProbeOutput { results: ProbeResult[]; hasFindings: boolean; } /** 全项目搜索单文件名(basename 精确匹配),返回相对 projectRoot 路径(正斜杠)。 * 排除 PROBE_EXCLUDED_DIRS。根目录也含(basename 字面匹配,非 glob)。 */ export declare function findFileAnywhere(projectRoot: string, fileName: string): string[]; /** * 探测 brownfield 项目的文件位置偏离(纯只读)。 * * 遍历高频探测目标,对默认路径不存在的 key 搜索既有文件, * 返回 override 候选清单(供重新生成升级计划展示 + apply 确认)。 * * - greenfield 项目(文件都在默认路径)→ results=[] → 零负担 * - brownfield 项目(文件在别处)→ results 含偏离项 + 推荐路径 * - EvidenceView 影响面由 core 层 apply 时算(listByArtifact(currentPath)),此处不依赖 core * * @param projectRoot 项目根 * @param currentOverrides 当前已生效的 override(来自 config.project_map?.overrides) * @returns 探测输出(results + hasFindings) */ export declare function probeProjectMap(projectRoot: string, currentOverrides?: Record): ProjectMapProbeOutput; export {};