/** STAFFING.md 单行成员 */ export interface StaffingMember { name: string; /** 平台方向(可多个,如 APP / H5 / admin / 小程序) */ directions: string[]; /** 投入比例(%) */ capacity: number; /** * 成员状态(v8.3.337+ 口径升级):「是否在项目」—— * active 在项目 / inactive 不在项目(不看在职与否,只看是否在项目)。 * undefined = 未声明(基座缺省视为在项目;迭代覆盖层缺省继承基座) */ status?: 'active' | 'inactive'; /** 岗位(v8.3.337+,可多个:web / 后端 / 移动端 / 测试 / 产品 等) */ roles: string[]; /** Git 用户名(TEAM.md 列,v8.3.337+ 消费) */ gitUser?: string; /** 分支代号(v8.3.337+,可选声明;未声明自动拼音首字母,重名场景用它区分) */ initials?: string; } /** _matrix.md owners 段单条声明 */ export interface UnitOwnerDecl { /** 标准端名(与 CONSTITUTION 端列表一致) */ platform: string; /** 负责人姓名 */ name: string; /** pending=候选待人工拍板 / confirmed=已确认 */ status: 'pending' | 'confirmed'; } /** 从起始目录向上查找 .speccore/ 所在项目根(迭代目录可能位于任意深度) */ export declare function findSpeccoreRoot(startDir: string): string | null; /** * 解析含「成员 / 平台方向 / 投入比例」列的 Markdown 人员表格(按表头定位列,兼容列序差异)。 * TEAM.md(全员基座,多列)与 STAFFING.md(迭代覆盖,三/四列)共用此解析器; * 表头缺「平台方向」列(旧版 TEAM.md 仅 5 列)时返回空数组(基座不可用,回退仅迭代级)。 * 「状态」列(v8.3.321+):出/离/停/inactive 归一为 inactive,其余为 active; * 无此列或该行留空 → undefined(基座缺省在职,迭代层缺省不覆盖)。 */ export declare function parseStaffingTable(content: string): StaffingMember[]; /** * 两级合并(v8.3.319+):全局基座(TEAM.md 全员名册)为底,迭代覆盖层(STAFFING.md) * 同名成员整体覆盖方向/比例(含方向留空 = 本迭代不做该方向),迭代独有成员追加末尾; * 未在迭代列出的基座成员默认保留(全员名册一次维护,已建迭代即时继承)。 * 状态(v8.3.321+):迭代层未声明状态时继承基座状态(写「在职」可复活出项目成员,写「出项目」可局部停用)。 */ export declare function mergeStaffing(globalMembers: StaffingMember[], iterationMembers: StaffingMember[]): StaffingMember[]; /** * 读取人员排期(两级合并):全局 .speccore/PROJECT/TEAM.md 全员基座 * + 迭代 STAFFING.md 差异覆盖(v8.3.319+)。任一文件缺失均不阻塞。 * v8.3.337+ 口径升级:「不在项目」成员统一剔除(不看在职与否,只看是否在项目)—— * analyze 候选推导、taskify 负荷均衡自动跳过;已拍板/已固化的 .meta/owner 不受影响。 */ export declare function loadStaffing(iterationDir: string): StaffingMember[]; /** * 通配语义(v8.3.339+):成员「岗位/平台方向」写 `*` / all / 全部 / 所有 / 全栈 * 表示「全部」(全栈开发、所有端方向)。解析时归一为 WILDCARD 单元素数组, * 匹配时恒命中;候选推导时不参与「唯一」判定(防全栈成员被误推为各端唯一负责人)。 */ export declare const WILDCARD = "*"; /** 通配词归一:列表含通配词时整体归一为 [WILDCARD](通配与具体值并列时以通配为准) */ export declare function normalizeWildcard(list: string[]): string[]; /** 是否通配声明(归一后恰为 [WILDCARD]) */ export declare function isWildcard(list: string[]): boolean; export declare function matchDirection(platform: string, direction: string): boolean; /** 解析 _matrix.md 的 owners 段 → 声明数组 */ export declare function parseOwnerDecls(matrixContent: string): UnitOwnerDecl[]; /** 渲染 owners 段(保持 _matrix.md 既有格式风格) */ export declare function renderOwnersBlock(decls: UnitOwnerDecl[]): string; /** * 按 STAFFING 推导候选负责人:方向唯一成员 → pending 候选; * 多人或无人 → 不推导(报缺不脑补,人工在 _matrix.md 声明) */ export declare function deriveOwnerCandidates(platforms: string[], staffing: StaffingMember[]): UnitOwnerDecl[]; /** * 合并写回 _matrix.md owners 段: * - confirmed 声明(人工拍板)原样保留 * - 新候选写入 pending(该端已有 confirmed 时跳过,不覆盖人工结论) * - 无端候选的旧 pending 丢弃(端声明已收敛) */ export declare function updateMatrixOwners(matrixPath: string, candidates: UnitOwnerDecl[]): Promise; /** 读取单元已拍板(confirmed)的某端负责人;无 → undefined */ export declare function resolveDeclaredOwner(matrixContent: string, platform: string): string | undefined; /** * 渲染单元负责人视图 OWNERS.md(CLI 确定性产物,非 AI 产物): * 反映 _matrix.md owners 段的当前状态(pending 候选 / confirmed 已拍板 / 缺失报缺), * 供 SpecTest gen 阶段读取(第三事实源)与人类审阅。 */ export declare function renderOwnersView(feature: string, platforms: string[], decls: UnitOwnerDecl[]): string; /** * 刷新全部单元的 OWNERS.md 视图(020-specs/{单元}/overview/OWNERS.md)。 * 返回写入的单元数;无 _matrix.md(老单元)时跳过,不阻塞分析。 */ export declare function refreshUnitOwnerViews(specDir: string, featuresDir: string, features: string[], featurePlatforms: Map): Promise; //# sourceMappingURL=unit-staffing.d.ts.map