/** * Git Integration — 任务与 Git 工作流深度整合 * * 功能: * - 任务 ↔ 分支关联 * - Commit 消息自动生成 * - PR 描述自动生成 * - Git Hook 安装 * - 保护分支拦截 */ /** * Git 配置 — 三级回退:子任务级 > 迭代级 > 全局级 > 默认值 * * 继承链:命令行参数 > 子任务 .meta/git-config > 迭代级 PROJECT_GRAPH.md * > 全局 PROJECT.yaml git 段(机器事实源,v8.3.322+)> CONSTITUTION.md(AI 契约回退)> 默认值 */ export interface GitConfig { /** 默认基础分支(如 main/master) */ defaultBranch: string; /** 分支类型(feature/bugfix/hotfix/release),由任务 type 决定或子任务覆盖 */ branchType: string; /** 分支前缀(如 2060708),三级回退 */ branchPrefix: string; /** v8.3.114+: 任务名前的前缀(如 api-、backend-),可选 */ taskPrefix?: string; /** v8.3.114+: 任务名后的后缀(如 urgent、review),可选 */ taskSuffix?: string; /** 分支命名格式模板 */ branchFormat: string; /** 创建分支前是否自动 git pull */ autoPull: boolean; /** 远程仓库名称 */ remoteName: string; /** 保护分支列表 */ protectedBranches: string[]; /** 依赖分支合并策略:auto=自动合并 / manual=交互确认 / off=不合并 */ mergeDependencies: 'auto' | 'manual' | 'off'; /** 只合并白名单中的依赖分支(任务 ID,空数组表示不限) */ mergeWhitelist: string[]; /** 排除黑名单中的依赖分支(任务 ID) */ mergeBlacklist: string[]; } /** 任务类型 → 分支类型映射 */ export declare const TASK_TYPE_TO_BRANCH_TYPE: Record; /** 标准分支类型名集合(v8.3.306: 用于区分「任务分支: X/」中 X 是类型段还是自定义前缀) */ export declare const STANDARD_BRANCH_TYPES: Set; /** * 从分支名第一段提取分支类型(feature/xxx → feature),非任务分支(无类型段)返回 undefined。 * v8.3.339+: PR 目标分支按类型区分的前提——从哪类分支发起 PR,就查该类分支的 pr_target。 * v8.3.341+: 从 pr.ts 提升至此统一(纯函数,便于测试与多处复用)。 */ export declare function extractBranchTypeFromBranchName(branch: string): string | undefined; export declare function createTaskBranch(taskId: string, taskName: string, baseBranch?: string, iteration?: string, taskDir?: string, taskType?: string, cwd?: string, platform?: string): string | null; /** * 按配置组装分支名(纯函数,v8.3.306 抽取自 createTaskBranch) * * v8.3.120+: 用户完全控制 prefix/suffix(包含分隔符),代码只负责拼接 * v8.3.293+: 分支名主体统一为 taskId(子任务全局唯一 ID,与 git-config 文档示例 * 「前缀=api- → hotfix/api-Task-001-urgent」一致);此前用中文任务名会导致 * findBranchByTaskId 的 taskId 正则匹配失联、CI 平台对中文分支名兼容性差。 * 示例: prefix='api-' suffix='-urgent' → hotfix/api-Task-001-urgent * prefix='api_' suffix='_urgent' → hotfix/api_Task-001_urgent */ export declare function composeBranchName(gitConfig: GitConfig, branchType: string, taskId: string, safeName: string): string; /** * 读取子任务级 Git 配置 * * 从任务 .meta/git-config 文件读取,格式(每行 key-value): * 分支前缀: 2060708 * 源分支: develop * 分支格式: {type}/{prefix}{taskId}(v8.3.10+ 默认,支持 {name}/{hash4} 自定义) * 自动拉取: true */ export declare function loadSubtaskGitConfig(taskDir: string): Partial; /** * 加载完整 Git 配置 — 子任务级 > 迭代级 > 全局 > 默认值 * * 配置来源优先级: * 1. 子任务级 .meta/git-config 任务自身配置 * 2. 迭代级 PROJECT_GRAPH.md frontmatter 字段 * 3. 全局 PROJECT.yaml git 段 机器事实源(v8.3.322+) * 4. 全局 CONSTITUTION.md 「Git 分支策略」章节(AI 契约回退) * 5. 默认值 * * 每个字段独立回退:子任务只配了 branchPrefix,defaultBranch 仍从迭代/全局继承 */ export declare function loadGitConfig(iteration?: string, taskDir?: string, branchType?: string): GitConfig; /** 检测默认分支 — 内部调用 loadGitConfig * v8.3.87+: 增加 cwd 参数,支持 speccore 与工程代码分离 */ export declare function detectDefaultBranch(iteration?: string, cwd?: string): string | undefined; /** * 解析任务分支的创建源分支(v8.3.304+) * * 优先级:任务级 .meta/git-config「源分支」 > 迭代级 PROJECT_GRAPH「默认分支」 * > PROJECT.yaml branch_types[{taskType}].source > PROJECT.yaml git.default_base * > 回退 detectDefaultBranch(CONSTITUTION「默认分支」/ 默认 main / git remote HEAD / 本地分支) * * 背景:此前 execute 拉分支只走 loadGitConfig(CONSTITUTION/任务级 git-config), * PROJECT.yaml 的 git.default_base 与 branch_types[].source 从未参与判定, * 用户在主配置里声明的 source 不生效。 */ export declare function resolveTaskBaseBranch(taskType?: string, iteration?: string, taskDir?: string, cwd?: string): Promise; /** * 获取当前分支关联的任务 * v8.3.88+: 支持 cwd 参数,工程目录分离场景下使用正确的 git 仓库 */ export declare function getCurrentTaskMapping(cwd?: string): { taskId: string; taskName: string; } | null; /** * v8.3.390+: 切换分支前把工作区未提交变更快照提交到当前任务分支。 * * execute 接力中宿主 AI 落盘代码后未必 commit;不提交就切分支,未提交变更会 * 随 checkout 漂移到 base/下一任务分支(代码串扰),或让 checkout 失败、 * 进而触发宿主确认中断自动化。CLI 在切换前兜底快照提交,保证零摩擦、零询问。 * * 仅当当前分支是任务分支(git-mapping 有记录)时提交——避免误提交用户在 * base/main 等非任务分支上的手动 WIP。返回是否执行了提交; * 非 git 仓库/无变更/提交失败均静默返回 false(不阻断主流程)。 */ export declare function snapshotUncommittedChanges(cwd?: string): boolean; /** * 生成 Commit 消息 * v8.3.88+: 支持 cwd 参数 * v8.3.293+: 增加 taskType 参数,按任务类型生成符合语义的提交前缀(feature→feat/bugfix→fix/refactor→refactor/research→chore) */ export declare function generateCommitMessage(taskId: string, taskName: string, specs?: string[], cwd?: string, taskType?: string): string; /** * 生成 PR 描述 * v8.3.88+: 支持 cwd 参数 */ export declare function generatePRDescription(taskId: string, taskName: string, cwd?: string): string; /** * 读取保护分支列表 * v8.3.323: 严格收敛——PROJECT.yaml 声明了(含显式清空 [])就以其为准; * 未声明则回退 CONSTITUTION「保护分支」;两处都无则兜底默认 main/master。 */ export declare function getProtectedBranches(): string[]; /** * 检查分支是否为保护分支 * 支持精确匹配和通配符(如 release/*) * 数据源:CONSTITUTION.md 的「保护分支」字段(AI 契约文件) */ export declare function isProtectedBranch(branchName: string): boolean; /** * 获取拦截用保护分支(v8.3.323: 严格收敛,与同步版 getProtectedBranches 同口径) * PROJECT.yaml 声明即准(含显式清空);未声明回退 CONSTITUTION;两处都无兜底默认。 * 此前为「CONSTITUTION + PROJECT.yaml 合并」——PROJECT.yaml 已声明时残留的 * CONSTITUTION 旧值仍会拦截,用户删改 PROJECT.yaml 无法解除保护,与唯一事实源矛盾。 */ export declare function getProtectedBranchesMerged(): Promise; /** isProtectedBranch 的异步合并版(含 PROJECT.yaml 全局/端级配置) */ export declare function isProtectedBranchAsync(branchName: string): Promise; /** * 安装 Git Hooks * v8.3.88+: 支持 cwd 参数,工程目录分离场景下在正确的 git 仓库安装 */ export declare function installGitHooks(cwd?: string): { preCommit: boolean; prePush: boolean; }; /** * v8.3.7+: 根据 taskId 查找已创建的分支名 * 查找顺序:1. git-mapping.json 2. git branch 列表 * v8.3.88+: 支持 cwd 参数,工程目录分离场景下使用正确的 git 仓库 */ export declare function findBranchByTaskId(taskId: string, cwd?: string, taskDir?: string): string | null; /** * v8.3.207+: 根据功能模块名(feature)查找对应任务分支 * bugfix 任务关联功能模块时,从其开发分支拉取 * 查找顺序:1. git-mapping.json(taskName/taskId 含 feature 名) 2. git branch 列表(feature/ 分支名含 feature) */ export declare function findBranchByFeature(feature: string, cwd?: string): string | null; /** 清理过期代码索引缓存(超过24小时自动清理) */ export declare function cleanStaleCache(): boolean; //# sourceMappingURL=git-integration.d.ts.map