/**
 * 产物过程规则 — 为每种产物类型定义按操作类型区分的执行规则。
 *
 * 四种操作类型：
 * - extract  — 首次提取/生成（从源材料创建产物）
 * - review   — 审查/分析（对比源材料与产物，标记偏差）
 * - fix      — 修复（修正偏差项，保持正确内容不变）
 * - iterate  — 迭代（增量修改，保持结构）
 *
 * 设计决策：
 * - ProcessRules 是"护栏"（按场景选择），不是"契约"（强制）
 * - 与 Schema 解耦：Schema 定义"是什么"，ProcessRules 定义"怎么做"
 * - 按 OperationType 选择规则，注入到 prompt 中指导 AI 行为
 */
// ── 通用规则模板 ──
/** 通用提取规则 — 适用于大多数产物类型 */
function genericExtractRules(sourceName) {
    return {
        instructions: [
            `从${sourceName}中提取信息，按 Schema 定义的章节结构组织输出`,
            "每个章节必须有实质性内容，不得留空或使用占位符",
            "表格数据必须与源材料对应，不得编造",
        ],
        constraints: [
            "不得删除 Schema 要求的任何章节",
            "所有数据必须有源材料依据",
        ],
        input_materials: [sourceName],
    };
}
/** 通用审查规则 */
function genericReviewRules(sourceName) {
    return {
        instructions: [
            `逐章节与${sourceName}对比，标记偏差项（❌）和遗漏项（⚠️）`,
            "偏差判定依据：章节缺失、数据不一致、流程不符",
            "输出必须保持 Schema 定义的章节结构，仅标注问题",
        ],
        constraints: [
            "不得删除 Schema 要求的任何章节",
            "审查时不得修改正确内容",
            "每个偏差项必须给出具体位置和原因",
        ],
        input_materials: [sourceName, "当前产物文档"],
    };
}
/** 通用修复规则 */
function genericFixRules(sourceName) {
    return {
        instructions: [
            "仅修改已标注的偏差项，保持已正确内容不变",
            "修复后每个章节必须与源材料内容对应",
            "修复处标记 [已修复] 便于追踪",
        ],
        constraints: [
            "不得删除 Schema 要求的任何章节",
            "不得引入与源材料无关的新内容",
            "已正确的章节不得被修改",
        ],
        input_materials: [sourceName, "偏差项清单", "当前产物文档"],
    };
}
/** 通用迭代规则 */
function genericIterateRules() {
    return {
        instructions: [
            "在现有产物基础上增量修改",
            "保持 Schema 定义的章节结构不变",
            "新增或修改的内容必须标注变更原因",
        ],
        constraints: [
            "不得删除 Schema 要求的任何章节",
            "变更后的内容必须保持一致性",
        ],
        input_materials: ["当前产物文档", "变更需求"],
    };
}
// ── 过程规则注册表 ──
const PROCESS_RULES = new Map();
/** 注册过程规则（内部函数） */
function registerRules(kind, extract, review, fix, iterate) {
    PROCESS_RULES.set(kind, { kind, extract, review, fix, iterate });
}
// ── P0 产物类型的定制规则 ──
registerRules("prototype_spec", {
    instructions: [
        "从原型源码包（Figma Make 导出）中提取页面结构、设计令牌、交互逻辑",
        "按 Schema 定义的 10 个章节组织输出",
        "设计令牌（色彩/间距/字体）必须从源码 CSS 变量中提取",
        "组件数据绑定必须映射到源码中的实际字段名",
        "交互流转必须反映源码中的事件处理器逻辑",
    ],
    constraints: [
        "只能从源码包提取，不得凭空编造",
        "每个组件必须有源码文件对应",
        "色彩值必须为实际 hex/hsl 值，不得用'主色'等模糊描述",
    ],
    input_materials: ["原型源码包（Figma Make 导出）"],
}, {
    instructions: [
        "逐章节与原型源码包对比，标记偏差项（❌）和遗漏项（⚠️）",
        "偏差判定依据：章节缺失、表格数据与源码不一致、交互流程与源码行为不符",
        "输出必须保持 Schema 定义的 10 个章节结构，仅标注问题",
    ],
    constraints: [
        "不得删除 Schema 要求的任何章节",
        "审查时不得修改正确内容",
        "每个偏差项必须指出具体位置和源码参照",
    ],
    input_materials: ["原型源码包", "当前原型说明文档"],
}, {
    instructions: [
        "仅修改已标注的偏差项，保持已正确内容不变",
        "修复后每个章节必须与源码包内容对应",
        "修复处标记 [已修复] 便于追踪",
    ],
    constraints: [
        "不得删除 Schema 要求的任何章节",
        "不得引入源码包中不存在的内容",
    ],
    input_materials: ["原型源码包", "偏差项清单", "当前原型说明文档"],
}, {
    instructions: [
        "在现有原型说明基础上增量修改",
        "保持 Schema 定义的 10 个章节结构",
        "新增或修改的内容必须标注变更原因",
    ],
    constraints: [
        "不得删除 Schema 要求的任何章节",
        "变更后的内容必须与最新源码保持一致",
    ],
    input_materials: ["当前原型说明文档", "变更需求"],
});
registerRules("design_doc", {
    instructions: [
        "从架构决策记录和需求文档中提取信息，按 Schema 定义的 12 个章节组织",
        "架构决策状态总表必须包含所有已确认决策",
        "技术选型表必须列出候选方案和选择理由",
        "Mermaid 图必须反映实际的模块关系和数据流向",
    ],
    constraints: [
        "所有架构决策必须有决策记录引用",
        "技术选型必须有对比依据",
        "模块划分不得遗漏需求中的功能点",
    ],
    input_materials: ["决策记录", "需求文档", "架构决策研讨闭合确认"],
}, {
    instructions: [
        "逐章节与决策记录和需求对比，标记偏差项和遗漏项",
        "重点检查：架构决策是否全部落实、技术选型是否与实际一致",
        "Mermaid 图是否与文字描述一致",
    ],
    constraints: [
        "不得删除 Schema 要求的任何章节",
        "每个偏差项必须指出与哪个决策/需求矛盾",
    ],
    input_materials: ["决策记录", "需求文档", "当前架构设计文档"],
}, genericFixRules("决策记录"), genericIterateRules());
registerRules("api_spec", {
    instructions: [
        "从后端架构决策和需求文档中提取 API 接口信息",
        "每个 Endpoint 必须包含完整的请求/响应字段表",
        "字段表必须包含 Schema 要求的所有列（类型、必填、格式、映射等）",
        "错误码必须覆盖所有业务异常场景",
    ],
    constraints: [
        "每个 Endpoint 必须有验收场景",
        "字段类型必须与后端实际 DTO 一致",
        "OpenAPI 文件必须同步生成",
    ],
    input_materials: ["后端架构决策", "需求文档", "OpenAPI 规范"],
}, {
    instructions: [
        "逐 Endpoint 与后端实现对比，标记偏差项",
        "重点检查：字段是否遗漏、类型是否一致、错误码是否完整",
        "页面交互映射是否与前端实际调用一致",
    ],
    constraints: [
        "不得删除 Schema 要求的任何章节",
        "每个偏差项必须指出与哪个接口/字段矛盾",
    ],
    input_materials: ["后端架构决策", "OpenAPI 规范", "当前 API 接口规格文档"],
}, genericFixRules("后端架构决策"), genericIterateRules());
registerRules("verification_report", {
    instructions: [
        "收集所有设计产物的 Hash 和验证结果",
        "跨产物追踪矩阵必须覆盖所有引用关系",
        "Implementation Readiness 结论必须基于证据",
    ],
    constraints: [
        "每个产物的 Hash 必须可验证",
        "冲突清单不得遗漏已知冲突",
    ],
    input_materials: ["架构设计文档", "数据库设计文档", "API 接口规格", "OpenAPI", "SQL/migration"],
}, {
    instructions: [
        "验证设计产物是否与当前代码一致",
        "跨产物追踪矩阵是否完整",
        "残余风险是否已被评估",
    ],
    constraints: [
        "验证结论必须有证据支撑",
        "不得跳过任何产物类型",
    ],
    input_materials: ["所有设计产物", "当前代码实现"],
}, genericFixRules("设计产物"), genericIterateRules());
// ── P1 产物类型的规则 ──
registerRules("detailed_design", genericExtractRules("架构设计文档和需求"), genericReviewRules("架构设计文档"), genericFixRules("架构设计文档"), genericIterateRules());
registerRules("api_design", {
    instructions: [
        "从第三方服务文档中提取接口信息",
        "数据映射表必须覆盖所有字段转换",
        "容错策略必须包含超时、重试、降级方案",
    ],
    constraints: [
        "接口清单必须完整",
        "错误码映射必须双向覆盖",
    ],
    input_materials: ["第三方服务文档", "后端架构设计"],
}, genericReviewRules("第三方服务文档"), genericFixRules("第三方服务文档"), genericIterateRules());
registerRules("requirement_analysis", {
    instructions: [
        "从需求来源中提取功能点，按 Schema 定义的章节组织",
        "功能点清单必须包含验收标准",
        "写操作失败反馈必须覆盖所有用户可触发的失败场景",
        "冲突与越界项必须标注处理方式",
    ],
    constraints: [
        "每个功能点必须有明确的验收标准",
        "未确认项必须标注阻塞程度",
    ],
    input_materials: ["需求来源文档", "原型材料"],
}, genericReviewRules("需求来源"), genericFixRules("需求来源"), genericIterateRules());
registerRules("test_plan", genericExtractRules("需求文档和功能点清单"), genericReviewRules("需求文档"), genericFixRules("需求文档"), genericIterateRules());
registerRules("task_breakdown", {
    instructions: [
        "根据架构设计和需求文档拆分开发切片",
        "每个切片必须可独立验证",
        "执行顺序必须考虑依赖关系",
    ],
    constraints: [
        "切片粒度不宜过大（单切片不超过 3 天工作量）",
        "缓冲安排必须标注",
    ],
    input_materials: ["架构设计文档", "需求文档"],
}, genericReviewRules("架构设计文档"), genericFixRules("架构设计文档"), genericIterateRules());
registerRules("task_plan", {
    instructions: [
        "根据切片计划安排执行时间线",
        "标注里程碑和关键路径",
        "预留缓冲时间",
    ],
    constraints: [
        "时间线必须与切片依赖关系一致",
    ],
    input_materials: ["切片计划", "资源信息"],
}, genericReviewRules("切片计划"), genericFixRules("切片计划"), genericIterateRules());
registerRules("root_cause", {
    instructions: [
        "按时间线复现问题，记录复现步骤",
        "使用假设-验证法逐步排除",
        "根因分析必须定位到代码级原因",
        "修复方案必须包含预防措施",
    ],
    constraints: [
        "每个假设必须有验证结果",
        "根因不得使用模糊描述（如'系统不稳定'）",
    ],
    input_materials: ["报错日志", "相关代码", "复现环境"],
}, genericReviewRules("报错日志"), genericFixRules("报错日志"), genericIterateRules());
registerRules("incident_review", {
    instructions: [
        "按时间线记录故障全过程",
        "根因分析必须定位到代码/配置/流程层面",
        "后续改进项必须指定责任人和计划时间",
    ],
    constraints: [
        "时间线不得有空白时段",
        "监控盲区必须标注改进方案",
    ],
    input_materials: ["故障日志", "监控数据", "处理记录"],
}, genericReviewRules("故障日志"), genericFixRules("故障日志"), genericIterateRules());
registerRules("review_report", {
    instructions: [
        "按维度（功能、性能、安全、可维护性）逐项审查",
        "发现项必须标注严重程度和具体文件位置",
        "审查清单必须全部校验",
    ],
    constraints: [
        "每个发现项必须有具体建议",
        "严重程度不得降级",
    ],
    input_materials: ["待审查代码", "需求文档", "架构设计文档"],
}, genericReviewRules("待审查代码"), genericFixRules("待审查代码"), genericIterateRules());
registerRules("tech_decision_record", {
    instructions: [
        "记录决策背景、候选选项和选择理由",
        "结论必须明确，不得模棱两可",
        "原因必须包含定量依据",
    ],
    constraints: [
        "每个选项必须有优劣分析",
        "结论不得与已有决策矛盾",
    ],
    input_materials: ["技术调研资料", "项目约束"],
}, genericReviewRules("技术调研资料"), genericFixRules("技术调研资料"), genericIterateRules());
registerRules("migration_plan", {
    instructions: [
        "评估迁移范围和兼容性影响",
        "迁移阶段必须包含回滚方案",
        "风险评估必须覆盖数据丢失和业务中断",
    ],
    constraints: [
        "每个迁移阶段必须有回滚方案",
        "兼容性分析必须覆盖前后端",
    ],
    input_materials: ["当前系统文档", "目标系统文档"],
}, genericReviewRules("系统文档"), genericFixRules("系统文档"), genericIterateRules());
// ── P2 产物类型的规则 ──
registerRules("acceptance_checklist", genericExtractRules("验收标准"), {
    instructions: [
        "逐项检查验收标准是否满足",
        "每项必须给出通过/不通过结论",
    ],
    constraints: [
        "不得跳过任何验收项",
    ],
    input_materials: ["验收标准", "当前实现"],
}, genericFixRules("验收标准"), genericIterateRules());
registerRules("interaction_spec", {
    instructions: [
        "从原型源码包中提取交互逻辑",
        "交互流转必须反映完整的状态机",
        "动效规范必须包含时长和缓动函数",
    ],
    constraints: [
        "交互流转不得遗漏异常分支",
        "响应式断点必须覆盖主流设备",
    ],
    input_materials: ["原型源码包"],
}, genericReviewRules("原型源码包"), genericFixRules("原型源码包"), genericIterateRules());
registerRules("domain_model", {
    instructions: [
        "识别核心业务对象及其职责",
        "按 SOLID 原则验证对象划分合理性",
        "接口与依赖方向必须符合 DIP",
    ],
    constraints: [
        "每个对象必须有单一职责",
        "变化点分析必须覆盖已知扩展需求",
    ],
    input_materials: ["需求文档", "架构设计文档"],
}, genericReviewRules("架构设计文档"), genericFixRules("架构设计文档"), genericIterateRules());
// ── 查询函数 ──
/**
 * 获取指定产物类型的过程规则。
 */
export function getProcessRules(kind) {
    return PROCESS_RULES.get(kind);
}
/**
 * 获取指定产物类型在特定操作类型下的规则。
 */
export function getOperationRules(kind, operationType) {
    const ruleSet = PROCESS_RULES.get(kind);
    if (!ruleSet)
        return undefined;
    return ruleSet[operationType];
}
/**
 * 将过程规则格式化为可注入 prompt 的文本。
 */
export function formatProcessRulesForPrompt(ruleSet, operationType) {
    const rules = ruleSet[operationType];
    if (!rules)
        return "";
    const lines = [];
    lines.push(`## 执行规则（${ruleSet.kind} / ${operationType}）`);
    if (rules.instructions.length > 0) {
        lines.push("执行指令：");
        for (const inst of rules.instructions) {
            lines.push(`- ${inst}`);
        }
    }
    if (rules.constraints.length > 0) {
        lines.push("约束：");
        for (const c of rules.constraints) {
            lines.push(`- ${c}`);
        }
    }
    if (rules.input_materials.length > 0) {
        lines.push(`参考材料：${rules.input_materials.join("、")}`);
    }
    return lines.join("\n");
}
//# sourceMappingURL=artifact_process_rules.js.map