/** * Team composition loader (v1.1). * * Per v1.1 PRD §4.3, team membership is data — not folder structure. * `teams//composition.yaml` declares which specialists belong to * which team, plus shared skills the team's main bot can leader-tier call * directly. Specialists themselves live flat at `agents/specialists//`. * * Workspace layout: * teams//composition.yaml (bundled default) * /teams//composition.yaml (optional override) * * Resolution order: org override > workspace bundle. If neither exists, * returns null so callers can decide whether to error or fall back. */ export declare const KNOWN_TEAMS: readonly ["core", "product", "engineering", "business", "brand"]; export type TeamName = (typeof KNOWN_TEAMS)[number]; export interface Composition { /** Main bot name (e.g. "pm", "engineer", "designer", "marketer"). */ main: string; /** Specialist names that belong to this team. */ members: string[]; /** Skill names the team's main bot can call directly (leader tier). */ shared_skills: string[]; /** Specialists from other teams allowed for cross-team collaboration. */ cross_team_members?: string[]; } export interface LoadOptions { /** Workspace bundle root (where `teams/` lives). */ workspaceRoot: string; /** Optional org root (where `/teams/` lives for overrides). */ orgRoot?: string; } /** * Load a single team's composition. Org override beats workspace bundle. * Returns null if neither file exists or content is malformed. */ export declare function loadComposition(team: TeamName, opts: LoadOptions): Composition | null; /** * Load all four known teams. Returns a partial map — teams missing from * disk are simply absent. Callers needing strict presence should iterate * KNOWN_TEAMS and check. */ export declare function loadAllCompositions(opts: LoadOptions): Partial>; /** * Reverse lookup: given a specialist name, return the team it belongs to. * Returns null if no team claims this specialist (orphan or unknown). * Resolution order: explicit `members` first, then `cross_team_members`. */ export declare function findTeamForMember(specialistName: string, opts: LoadOptions): TeamName | null; /** True if `skill` is listed as a shared skill of any loaded team. */ export declare function isSharedSkill(skillName: string, opts: LoadOptions): boolean;