/**
 * Discover and load bundle-form skills from the three priority locations:
 *
 *   1. project   `<projectRoot>/.nanocoder/skills/`
 *   2. personal  `<getConfigPath()>/skills/`
 *   3. built-in  `source/skills/built-in/` (if shipped)
 *
 * Within a layer, duplicate skill names are an error. Across layers, project
 * shadows personal shadows built-in by `Skill.name` (silently - matches
 * `SubagentLoader`).
 *
 * Each bundle is a subdirectory containing a `skill.yaml` plus optional
 * `commands/`, `agents/`, `tools/` subdirs. Member files use the existing
 * per-kind parsers; the bundle's tools_visibility defaults to `scoped`
 * (only its own subagent sees them) unless the manifest sets `global`.
 *
 * Subscription resolution merges manifest-declared and
 * frontmatter-declared entries into one list, rejecting duplicates by
 * `(kind, target)` pair.
 */
import type { Skill } from '../types/skills.js';
export interface SkillLoadError {
    bundlePath: string;
    filePath?: string;
    message: string;
}
export interface BundleLoadResult {
    skills: Skill[];
    errors: SkillLoadError[];
}
export declare class BundleLoader {
    private readonly projectRoot;
    private readonly builtInRoot?;
    constructor(projectRoot: string, builtInRoot?: string | undefined);
    load(): Promise<BundleLoadResult>;
    /**
     * Parse and validate a single bundle directory without scanning the
     * priority layers. Used by the skill linter (`/skills check`, the
     * `check_skill` tool) to validate a bundle straight from disk - including
     * files written in the current session that the boot-time registry hasn't
     * picked up yet. Returns the same `{skill, errors}` shape `loadBundle`
     * produces; `skill` is null only when `skill.yaml` is missing or its
     * manifest fails to parse.
     */
    checkBundle(bundlePath: string): Promise<{
        skill: Skill | null;
        errors: SkillLoadError[];
    }>;
    private scanLayer;
    private loadBundle;
}
//# sourceMappingURL=bundle-loader.d.ts.map