/**
 * Project-Local Bundle Promotion (Graduate)
 *
 * Operationalizes the identical-form portability invariant from
 * @.aiwg/architecture/adr-identical-form-portability.md (#1038): a
 * project-local bundle should graduate to upstream (or to a private
 * corpus path) by byte-identical copy.
 *
 * Per the design at @.aiwg/architecture/design-doctor-log-promote.md
 * (#1049), promote performs:
 *   1. Pre-flight checks (bundle exists, manifest valid, no project-
 *      local @-refs, destination doesn't exist, identical-form layout)
 *   2. Hash snapshot of source files
 *   3. Recursive copy to destination
 *   4. Re-hash destination — roll back (delete) on any mismatch
 *   5. Update registry source: project-local → bundled (or corpus)
 *   6. Optional --cleanup: remove .aiwg/<type>/<name>/ source
 *   7. Activity log entry
 *
 * @design @.aiwg/architecture/design-doctor-log-promote.md
 * @implements #1037
 */
import type { AiwgConfig } from '../config/aiwg-config.js';
import type { ProjectLocalType } from './manifest.js';
export type PromoteDestinationKind = 'upstream' | 'corpus';
export interface PromoteOptions {
    /** Where to copy: upstream tree or corpus path. Default: 'upstream'. */
    to?: PromoteDestinationKind;
    /** Required when to === 'corpus'. */
    corpusPath?: string;
    /** Print plan; no filesystem writes, no registry mutation. */
    dryRun?: boolean;
    /** Remove .aiwg/<type>/<name>/ source after a successful copy. */
    cleanup?: boolean;
    /**
     * Bypass the safety-critical shadow / @-reference refusals.
     * Does not bypass: destination-already-exists, hash-mismatch rollback.
     */
    force?: boolean;
    /** Override frameworkRoot for the upstream destination. */
    frameworkRoot?: string;
}
export type PromoteFailureReason = 'bundle-not-found' | 'destination-required' | 'destination-exists' | 'project-local-references' | 'hash-mismatch' | 'copy-failed';
export interface PromotePlan {
    bundleId: string;
    type: ProjectLocalType;
    source: string;
    destination: string;
    /** Source-relative file paths that would be copied. */
    files: string[];
    totalBytes: number;
}
export interface PromoteResult {
    /** True when promotion (or its dry-run plan) succeeded. */
    ok: boolean;
    plan?: PromotePlan;
    failureReason?: PromoteFailureReason;
    message?: string;
    /** Files actually copied (empty in dry-run / failure). */
    copied?: string[];
}
/**
 * Promote a project-local bundle to its upstream home or a corpus path.
 *
 * Pure function over (config, projectDir, bundleId, opts). Mutates
 * config.installed when the operation succeeds (caller persists).
 */
export declare function promoteProjectLocalBundle(config: AiwgConfig, projectDir: string, bundleId: string, opts?: PromoteOptions): Promise<PromoteResult>;
//# sourceMappingURL=project-local-promote.d.ts.map