export interface SkillRegistrationDriftDefect { accountId: string; /** Bare sub-plugin name as it appears in account.json enabledPlugins. */ plugin: string; /** The qualified key the three surfaces are checked against. */ expected: string; /** Which registration surfaces lack the entry, in surface order. */ missingSurfaces: Array<'known_marketplaces' | 'installed_plugins' | 'settings.enabledPlugins'>; } export interface SkillRegistrationDriftResult { ok: boolean; defects: SkillRegistrationDriftDefect[]; /** Count of (account, premium-sub) pairs checked. */ inspected: number; } export interface CcRegistrationSurfaces { /** Marketplace names present in known_marketplaces.json. */ knownMarketplaces: ReadonlySet; /** `name@marketplace` keys with a scope:"user" row in installed_plugins.json. */ installedUserPlugins: ReadonlySet; /** `name@marketplace` keys enabled in settings.json enabledPlugins. */ enabledSettingsPlugins: ReadonlySet; } /** Cross-check each account's premium-sub intent against the three Claude Code * registration surfaces. An `enabledPlugins` entry not present in * `subToMarketplace` (platform plugins, leaked foreign subs) is out of scope * and ignored — leaked-sub cleanup is `cleanupLeakedPremiumSubs`' concern. */ export declare function assertSkillRegistrationDrift(accounts: ReadonlyArray<{ accountId: string; enabledPlugins: readonly string[]; }>, subToMarketplace: ReadonlyMap, cc: CcRegistrationSurfaces): SkillRegistrationDriftResult; /** Bundle-descent over the brand-filtered premium tree, mirroring the bundler's * marketplace naming and reconcileEnabledPlugins' descent. A nested sub at * `//plugins//PLUGIN.md` maps `` → * `maxy-premium-`; a standalone bundle at `//PLUGIN.md` * with no `plugins/` subdir maps `` → `maxy-premium`. These are exactly * the names reconcileEnabledPlugins stamps into account.json enabledPlugins. */ export declare function buildSubToMarketplace(premiumRoot: string): Map; /** Read the three Claude Code registration surfaces under a config dir. Each * read is independent and tolerant: an absent or unparseable file yields an * empty set for that surface, so a missing registry reads as "nothing * registered" (a defect the caller reports) rather than a crash. */ export declare function readCcRegistrationSurfaces(claudeConfigDir: string): CcRegistrationSurfaces; /** Task 1962 — boot-time census of operator-authored account plugin skills. * Operator skills live under `//plugins//skills//SKILL.md` * and are loaded directly from that root (never a platform mirror). This makes * the per-account operator-skill population visible at manager boot — the * signal that was absent when a canonical account copy loaded nowhere. For * each account holding a `plugins/` dir it returns the plugin count, skill * count, and any skill slug owned by more than one of that account's plugins * (which the resolvers surface as ambiguous). Accounts with no `plugins/` dir * are omitted. Two-level, non-recursive walk mirroring the resolver shape. */ export declare function auditAccountPluginSkills(accountsRoot: string): Array<{ accountId: string; plugins: number; skills: number; collisions: string[]; }>; /** Enumerate `//account.json` and return each account's * enabledPlugins (empty array when the field is absent or the file is * unparseable). A dir with no account.json is skipped entirely. */ export declare function readAccountEnabledPlugins(accountsRoot: string): Array<{ accountId: string; enabledPlugins: string[]; }>; //# sourceMappingURL=skill-registration-drift.d.ts.map