export interface ProposalRoots {
    agentDir: string;
    proposalsRoot: string;
    liveSkillsRoot: string;
    skillBackupsRoot: string;
}
export interface CopyFromSkillInput {
    targetSkillName: string;
    sourceSkillName: string;
    sourceRelativePath: string;
    destinationRelativePath?: string;
}
/** Resolve the proposal/live-skill/backup roots under the configured agent dir. */
export declare function getSkillProposalRoots(agentDir?: string): ProposalRoots;
/** Create the proposal and live-skill directories on disk if they do not already exist. */
export declare function initializeSkillProposalRoots(roots: ProposalRoots): void;
/** Throw unless `name` matches the canonical skill-id pattern (lowercase, digits, hyphens). */
export declare function validateSkillName(name: string): void;
/** Throw unless `name` is a valid skill-id, optionally with a `_<N>` version suffix. */
export declare function validateLiveSkillName(name: string): void;
/** Return the absolute path of the proposal folder for `name` after validating the name. */
export declare function proposalDir(roots: ProposalRoots, name: string): string;
/** Return the absolute path of the live-skill folder for `name` after validating the name. */
export declare function liveSkillDir(roots: ProposalRoots, name: string): string;
/** True if `candidate` resolves to `root` or a descendant, with no `..` escape. */
export declare function isPathInside(root: string, candidate: string): boolean;
/** Return the first root that contains `candidate`, or undefined if none does. */
export declare function findAllowedRoot(roots: readonly string[], candidate: string): string | undefined;
/** Throw if `candidate` is not inside `root`, using `label` in the error message. */
export declare function assertInside(root: string, candidate: string, label: string): void;
/** Return the proposal-folder name for a path inside the proposals root, validating the segment. */
export declare function getProposalNameForPath(roots: ProposalRoots, candidate: string): string;
/** Copy a file or directory from a live-skill folder into a proposal, rejecting symlinks at the source. */
export declare function copyFromSkillIntoProposal(roots: ProposalRoots, input: CopyFromSkillInput): Promise<{
    copiedTo: string;
}>;
//# sourceMappingURL=proposal-fs.d.ts.map