/** 当前系统配置 schema 版本号(.speccore.yml) */ export declare const CURRENT_SCHEMA_VERSION = 1; /** 当前项目配置 schema 版本号(.speccore/PROJECT.yaml) */ export declare const PROJECT_CURRENT_SCHEMA_VERSION = 1; /** 单个环境的部署配置 */ export interface DeployEnvConfig { /** 部署类型 */ type: 'docker' | 'static' | 'script' | 'vercel' | 'k8s' | 'ssh' | 'helm' | 'pm2' | 'serverless' | 'sftp'; /** 构建命令(如 npm run build) */ build_cmd?: string; /** 构建输出目录(static / sftp / ssh 类型用) */ output_dir?: string; /** Dockerfile 路径(docker 类型用,默认 ./Dockerfile) */ dockerfile?: string; /** 镜像仓库地址(docker 类型用) */ registry?: string; /** 镜像名(docker 类型用) */ image?: string; /** 镜像标签(docker 类型用,默认 latest) */ tag?: string; /** 部署目标路径 / CDN 配置 / 服务器地址 / namespace / 函数名 */ target?: string; /** 自定义部署脚本路径或命令(script / k8s / helm 类型用) */ script?: string; /** SSH 服务器地址(ssh 类型用,格式 user@host:port) */ host?: string; /** SSH 私钥路径(ssh / sftp 类型用,默认 ~/.ssh/id_rsa) */ key?: string; /** SSH/SFTP 密码(ssh / sftp 类型用,优先使用密钥认证,密码认证需安装 sshpass) */ password?: string; /** 远程服务器部署目录(ssh / sftp / pm2 类型用) */ remote_dir?: string; /** PM2 配置文件路径(pm2 类型用,默认 ecosystem.config.js) */ pm2_config?: string; /** Serverless 提供商(serverless 类型用: aliyun-fc / aws-lambda / tencent-scf) */ provider?: string; /** 部署前执行的命令 */ pre_deploy?: string[]; /** 部署后执行的命令 */ post_deploy?: string[]; /** 部署前备份远端旧包(v8.3.348+,ssh / docker 类型用,默认 false) */ backup?: boolean; /** 备份保留份数(v8.3.348+,默认 5,超出自动清理最旧备份) */ backup_keep?: number; /** 部署后健康检查(v8.3.352+,部署成功后执行;失败告警不阻断,已上线不可逆) */ health_check?: { /** HTTP/HTTPS 健康检查地址(如 https://api.example.com/health,期望 2xx/3xx) */ url?: string; /** 远端健康检查命令(ssh/docker 类型用,在远端执行,退出码 0 视为健康) */ command?: string; /** 重试次数(默认 5) */ retries?: number; /** 重试间隔毫秒(默认 3000) */ interval_ms?: number; }; } export interface PlatformConfig { /** 端名/工程标识:全局唯一,用于目录名、命令参数、端识别。如: booking-service, h5-mobile, admin-web */ name: string; /** 工程类型:frontend(前端) | backend(后端) | infra(基础设施) */ type: 'frontend' | 'backend' | 'infra'; /** 工程名:人类可读的业务名称。如: 预订订单服务, H5移动端 */ description?: string; /** 项目名称:给人和 AI 看的业务名称(如"食堂后台管理") */ project_name?: string; /** 项目描述:工程的详细说明,补充信息 */ project_desc?: string; /** 工程源码路径:相对于项目根目录的代码位置。如: ./packages/backend/booking-service */ code_path?: string; /** Git 仓库地址:用于分支管理和 PR 提交 */ git_repo?: string; /** 默认分支:如 main, master, develop */ default_branch: string; /** 涉及需求端/功能单元:用于 AI 分析时自动对标需求文档中的功能模块名 */ requirement_unit?: string; /** 备注:额外信息、特殊说明 */ notes?: string; /** v8.3.104+: 端级 Git 分支前缀(覆盖全局 git.branch_prefix) */ branch_prefix?: string; /** v8.3.104+: 端级受保护分支(覆盖全局 git.protected_branches) */ protected_branches?: string[]; /** v8.3.113+: 端级分支类型定义(覆盖全局 git.branch_types)。prefix=任务前前缀, suffix=任务后后缀, 均可选 */ branch_types?: Record; /** v8.3.60+: 按环境部署配置 */ deploy?: { /** 测试环境 */ staging?: DeployEnvConfig; /** 生产环境 */ production?: DeployEnvConfig; /** 自定义环境(如 preview, qa) */ [env: string]: DeployEnvConfig | undefined; }; } export interface LlmProviderConfig { name: string; enabled: boolean; type: 'ollama' | 'openai' | 'anthropic' | 'custom'; endpoint: string; model: string; apiKey?: string; priority: number; } /** 系统配置 — .speccore.yml(CLI 运行时行为开关) */ export interface SpecConfig { schema_version: number; /** v8.3.253+: 本地文件日志开关(写入 .speccore/local/logs/,默认关) */ logging?: { /** true → 所有命令的 logger 输出落盘到本地日志文件 */ enabled?: boolean; }; quality_gates: { enforce_testing: boolean; enforce_review: boolean; require_pr: boolean; /** v8.3.197+: 阻塞级别——standard(默认)=编译+单测+契约阻塞;compile=仅编译阻塞 */ block_level?: 'compile' | 'standard'; /** v8.3.399+: 用例核对闸——execute 后按 TEST.md 的 TC-XXX 用例逐条核对实现 * (AI 交棒判定,CLI 只判卷完整性)。block(默认)=未实现阻塞修复环;report=仅报告不阻塞;off=关闭 */ case_gate?: 'off' | 'report' | 'block'; verify_ui?: { enabled: boolean; smoke_test: boolean; visual_check: boolean; threshold: 'strict' | 'normal' | 'loose'; devices: string[]; browsers: string[]; timeout: number; /** 有头模式:显示浏览器窗口(调试用,默认 false) */ headed?: boolean; /** 视觉模型配置 */ visual_model?: { /** 提供商: qwen-vl(默认) | openai | anthropic | local */ provider: 'qwen-vl' | 'openai' | 'anthropic' | 'local'; /** 模型名称 */ model?: string; /** API Key(可选,默认从环境变量读取) */ apiKey?: string; /** 自定义端点(可选) */ endpoint?: string; /** 请求超时(毫秒,默认 60000) */ timeout?: number; }; }; }; arbitration: { enabled: boolean; mode: 'full' | 'l1-only' | 'report-only'; }; settings: { assignee: { enabled: boolean; mode: 'strict' | 'loose' | 'off'; }; trace: { enabled: boolean; auto_annotate: boolean; }; archive: { auto_cleanup: boolean; }; plan: { parallel_suggest: boolean; }; validation: { strict_mode: boolean; }; sync: { auto_check: boolean; }; patterns: { auto_save: 'off' | 'smart' | 'aggressive'; }; review: { check_assignee: boolean; }; /** v8.3.351+: 测试验证双线开关与剧本分层(缺省全开) */ tests?: { /** 配置式冒烟线(质量门禁自动启用的 UI 验证);关闭后自动触发被跳过,显式 --ui/--config/--stage 仍执行 */ smoke?: { enabled?: boolean; }; /** AI 宿主验证线(verify --ai);关闭后自动触发被跳过,显式 --ai 仍执行 */ ai_verify?: { enabled?: boolean; }; /** AI 剧本分层:common=公共能力层(入口/登录/导航)| modules=模块层(逐单元场景) */ layered?: { common?: boolean; modules?: boolean; }; }; /** v8.3.174+: 模式参数收敛 — CLI 模式默认配置 */ pipeline?: boolean; with_code?: boolean; /** v8.3.190+: 非必要流水线步骤的三态开关(默认 auto=智能判定 / on=强制 / off=跳过) */ optional_steps?: { clarify?: 'auto' | 'on' | 'off'; verify?: 'auto' | 'on' | 'off'; pipeline?: 'auto' | 'on' | 'off'; pr?: 'auto' | 'on' | 'off'; done?: 'auto' | 'on' | 'off'; spec2doc?: 'auto' | 'on' | 'off'; }; /** v8.3.190+: 命名流水线(preset + 用户自定义 + 默认) */ pipelines?: { /** 默认流水线名(内置 preset 或 custom 名,默认 full) */ default?: string; /** 用户自定义命名流水线:名称 → 逗号分隔的阶段串(如 "analyze,validate,split,execute") */ custom?: Record; }; /** v8.3.195+: 流水线 review 闸口模式(A=Spec定稿 / B=代码review / C=部署确认) */ gates?: { /** manual = 三闸口都软停人工确认(默认,最安全)| auto = 三闸口都跳过(含 C 部署) */ mode?: 'manual' | 'auto'; }; /** v8.3.196+: AI 内容生成来源(analyze/taskify/execute 等 AI 步骤) */ ai?: { /** host = 宿主 AI(Qoder SDK / Headless,默认)| llm = 自配 LLM(callLlm)| auto = 宿主优先,失败回退自配 LLM */ provider?: 'host' | 'llm' | 'auto'; /** 自配 LLM provider 池(定义一次,各功能按 name 引用;支持 ollama 本地/openai/anthropic/custom) */ providers?: LlmProviderConfig[]; /** 各功能的默认 provider name(如 analyze: gpt4o、taskify: local、split: local) */ defaults?: Record; /** 兜底 provider name(defaults 未指定或指定不可用时用) */ fallback?: string; }; /** v8.3.301+: 子 Agent SDK 派单控制(第七层「窗口物理隔离」增强通道) */ agent_dispatch?: { /** auto=Qoder 宿主 + token 可用时走 SDK(默认)| on=强制尝试 SDK(失败回退标记模式)| off=禁用,永远标记模式 */ mode?: 'auto' | 'on' | 'off'; }; /** v8.3.94+: 视觉模型配置(用于 specs 图片理解、UI 验证截图分析) */ vision?: { enabled: boolean; provider: 'qwen-vl' | 'openai' | 'anthropic' | 'local'; model?: string; apiKey?: string; endpoint?: string; timeout?: number; /** 每个 prompt 最多处理多少张图片(默认 10) */ maxImagesPerPrompt?: number; /** 图片最大尺寸(KB),超过则跳过(默认 2048) */ imageMaxSizeKb?: number; }; /** v8.3.217+: 冒烟测试统一配置(三时机开关 + 范围 + 按环境差异化) */ smoke?: { /** 三个冒烟点开关(auto=智能判定 / on=强制 / off=跳过) */ points?: { /** ①本地冒烟:execute 完成后、commit 前(默认 auto) */ local?: 'auto' | 'on' | 'off'; /** ②部署前冒烟:pipeline build 后、deploy 前(默认 auto,critical 阻断) */ 'pre-deploy'?: 'auto' | 'on' | 'off'; /** ③环境冒烟:deploy 后(默认 auto,只报告) */ 'post-deploy'?: 'auto' | 'on' | 'off'; }; /** 默认冒烟范围(full=全量 / module=当前功能模块;diff 变更级后续) */ scope?: 'full' | 'module'; /** 按环境差异化范围(键为环境名,值同 scope) */ scope_by_env?: Record; }; }; ask: { routing: { mode: 'hybrid' | 'cli-only' | 'host-ai-only'; high_threshold: number; low_threshold: number; auto_host_ai: boolean; cache_enabled: boolean; cache_min_hits: number; }; rules: { force_host_ai: boolean; }; llm_providers: LlmProviderConfig[]; }; config_history: { date: string; change: string; changed_by?: string; }[]; /** v8.3.70+: 外部工具自定义路径 */ tools?: { /** pandoc 可执行文件路径(用于 doc2spec / spec2doc) */ pandoc?: string; /** LibreOffice 可执行文件路径(用于 .doc 格式转换) */ libreoffice?: string; }; } /** 项目配置 — .speccore/PROJECT.yaml(工程映射) */ export interface ProjectConfig { schema_version: number; project: { name: string; description?: string; version?: string; }; platforms: PlatformConfig[]; git: { default_base: string; branch_prefix: string; protected_branches: string[]; /** v8.3.113+: 分支类型定义。prefix=任务前前缀, suffix=任务后后缀, 均可选。 如 hotfix: { source: 'main', prefix: 'api-', suffix: '-urgent' } */ branch_types?: Record; /** v8.3.336+: 分支名格式模板(全局兜底),支持变量 {type} {prefix} {taskId} {name} {date} {hash4}。迭代/子任务未配置时从这里取 */ branch_format?: string; /** v8.3.339+: PR 默认目标分支(与 default_base 解耦,按部署环境区分时可配;pr 命令回退链:--base > branch_types[{type}].pr_target > 本值 > default_base > main) */ pr_target?: string; }; code_scope: string[]; /** v8.3.58+: 验证相关配置 */ verify?: { /** 显式指定前端路由配置文件路径(覆盖自动发现) */ router_file?: string; }; } export declare const DEFAULT_CONFIG: SpecConfig; export declare const DEFAULT_PROJECT_CONFIG: ProjectConfig; export interface ConfigLoadResult { config: SpecConfig; warnings: string[]; migrated: boolean; } export interface ProjectConfigLoadResult { config: ProjectConfig; warnings: string[]; migrated: boolean; } export declare function loadConfig(): Promise; /** 获取配置 + 元信息(warnings、是否迁移过) */ export declare function loadConfigWithMeta(): Promise; /** 加载项目配置(简化版) */ export declare function loadProjectConfig(): Promise; /** * 读取磁盘上的原始 PROJECT.yaml(不做默认值合并/迁移,环境变量原样保留) * v8.3.304+: 供「只认用户显式配置」的场景使用——merge 后的配置无法区分 * 「用户显式声明」与「DEFAULT_PROJECT_CONFIG 出厂预置」(如 branch_types 预置表), * 拉分支等需要严格遵循用户声明语义的消费方应使用本函数。 */ export declare function loadRawProjectConfig(): Promise; /** 获取项目配置 + 元信息 */ export declare function loadProjectConfigWithMeta(): Promise; /** * 加载项目配置并叠加环境配置覆盖 * v8.3.60+: 支持 .speccore/environments/*.yaml 覆盖 */ export declare function loadProjectConfigWithEnv(envFileOrName?: string): Promise; /** 别名:getConfig = loadConfig */ export declare function getConfig(): Promise; export declare function saveConfig(config: SpecConfig): Promise; export declare function saveProjectConfig(config: ProjectConfig): Promise; /** * 初始化时生成 .speccore.yml(系统配置) */ export declare function initConfig(): Promise; /** * 初始化时生成 .speccore/PROJECT.yaml(项目配置) */ export declare function initProjectConfig(projectName?: string): Promise; export interface ConfigDiff { /** 新增字段路径列表 */ added: string[]; /** 删除字段路径列表 */ removed: string[]; /** 类型变更:字段存在但类型不同 */ typeChanged: { path: string; current: string; expected: string; }[]; /** 枚举值变更:合法值集合变化 */ enumChanged: { path: string; current: string[]; expected: string[]; }[]; /** 结构变更:对象↔数组、嵌套结构变化等 */ structureChanged: { path: string; description: string; }[]; } /** * 递归比较当前配置与目标配置(DEFAULT_CONFIG),检测所有差异 */ export declare function detectConfigDiff(current: unknown, target: unknown, path?: string): ConfigDiff; /** * 判断差异是否需要用户确认(新增字段除外,可自动处理) */ export declare function requiresUserConfirmation(diff: ConfigDiff): boolean; /** * 检测磁盘 .speccore.yml 与默认配置的差异(直接读原始文件,不做深度合并) * * 背景:loadConfigWithMeta 会 deepMerge 默认值补全缺失字段,导致 * detectConfigDiff(config, DEFAULT_CONFIG) 永远看不到磁盘文件缺失的新字段。 * update 需要用本函数才能检测到「升级后配置文件缺了哪些新字段」并补全。 * * 返回 null 表示文件不存在或解析失败。 */ export declare function detectConfigDiffFromFile(): Promise; /** * 检测磁盘 .speccore/PROJECT.yaml 与默认项目配置的差异(直接读原始文件) */ export declare function detectProjectConfigDiffFromFile(): Promise; /** * 格式化差异为可读文本 */ export declare function formatConfigDiff(diff: ConfigDiff): string[]; export declare const LEGACY_MAIN_CONFIG_KEYS: Set; export declare const LEGACY_DROP_PATHS: Set; /** v8.3.303: 过滤已知废弃/迁移字段,避免旧字段触发人工确认截停升级 */ export declare function filterLegacyRemoved(diff: ConfigDiff): ConfigDiff; /** v8.3.303: 按点路径删除嵌套键(路径不存在时静默跳过) */ export declare function deleteNestedKey(obj: unknown, path: string): void; export declare function upgradeConfig(): Promise; export declare const PROJECT_OPTIONAL_PATHS: Set; export declare function upgradeProjectConfig(): Promise; /** 获取生效的 Git 配置(统一配置 + 端级覆盖) */ export interface EffectiveGitConfig { default_base: string; branch_prefix: string; protected_branches: string[]; /** v8.3.113+: 分支类型定义。prefix=任务前前缀, suffix=任务后后缀 */ branch_types: Record; } /** * 获取指定端的生效 Git 配置。 * 优先级:端级配置 > 全局统一配置 * branch_types 采用合并策略:端级覆盖同名类型,新增类型追加 */ export declare function getEffectiveGitConfig(platformName: string): Promise; /** * 解析 YAML 配置(v8.3.190+:改用 js-yaml 根治「回读不对称」) * 之前的行级手写解析器只认块级数组,不认 flow 写法([a,b]/[]/{}), * 且把「- # 注释」误当元素值,已 3 次踩坑。js-yaml 是标准解析器,彻底根治。 */ export declare function parseYaml(content: string): unknown; export declare function toYaml(config: SpecConfig): string; export declare function toProjectYaml(config: ProjectConfig): string; export interface EnvResolutionResult { value: unknown; /** 成功解析的环境变量名 */ resolved: string[]; /** 未找到的环境变量名 */ unresolved: string[]; } /** * 递归遍历对象/数组,将所有字符串中的 ${ENV_VAR} 替换为环境变量值。 * 支持默认值语法: ${VAR:-default} */ export declare function resolveEnvVars(obj: unknown): EnvResolutionResult; //# sourceMappingURL=unified-config.d.ts.map