import { TemplateManifest, TemplateRegistry } from './TemplateRegistry';
export interface ScaffoldOptions {
    /** Required: name of the project being created. Used in package.json etc. */
    project_name: string;
    /** Optional one-line description for package.json + README. */
    description?: string;
    /** Extra substitution vars beyond the defaults. */
    vars?: Record<string, string>;
    /** Allow writing into a non-empty target. Default false. */
    force?: boolean;
    /** When true, don't actually write — return what would be copied. */
    dryRun?: boolean;
}
export interface ScaffoldResult {
    ok: boolean;
    templateId: string;
    targetDir: string;
    manifest: TemplateManifest;
    filesCopied: number;
    filesSubstituted: number;
    postInstallSteps: string[];
    warnings: string[];
    errors: string[];
}
export declare class ScaffoldEngine {
    private registry;
    constructor(registry?: TemplateRegistry);
    /**
     * Apply `templateId` into `targetDir`. Creates targetDir if absent.
     * Returns a ScaffoldResult with file counts + warnings + errors.
     */
    apply(templateId: string, targetDir: string, opts: ScaffoldOptions): ScaffoldResult;
    private walkAndCopy;
    /** Scan target for `{{token}}` patterns that survived. Returns ref strings. */
    private findUnresolvedTokens;
}
