/** * v0.7 — Class A* extraction. * Per docs/plan/v0.7-uninstall-lifecycle.md §10 #8a + §4 (class A*). * * For each repo registered under `//repositories//`, * read `/.solosquad/repo.yaml` (and only that — the rest of the repo * is class A, never enumerated). The archive writer will store these at * `orgs//repos//repo.yaml`. After extraction, cleanup * may surgically remove the repo's `.solosquad/` container. * * Whitelist length = 1 — this module reads exactly one file per repo and * touches no other path inside `/`. */ export interface RepoMetaExtraction { orgSlug: string; repoSlug: string; /** Absolute path on disk. */ srcPath: string; /** Path inside archive zip (forward slashes). */ archivePath: string; /** Raw file contents (UTF-8). */ contents: string; /** Size of the source file in bytes. */ size: number; } export interface ExtractReport { extractions: RepoMetaExtraction[]; /** Repos where `.solosquad/` exists but `repo.yaml` is missing — caller may warn but should NOT auto-delete that `.solosquad/`. */ reposMissingRepoYaml: { orgSlug: string; repoSlug: string; solosquadDir: string; }[]; } export declare function extractRepoMeta(workspace: string): ExtractReport; /** * Path of the surgical-removal target for a successfully extracted repo — * `//repositories//.solosquad/`. Caller must verify * extraction landed in the archive before invoking removal. */ export declare function repoSolosquadDir(workspace: string, orgSlug: string, repoSlug: string): string;