{"version":3,"file":"copy-from-github-CpWpGViE.mjs","names":[],"sources":["../src/logger.ts","../src/parse-source-spec.ts","../src/safe-write.ts","../src/dest-relative.ts","../src/github/contents-walk.ts","../src/run-cmd.ts","../src/strategy-result.ts","../src/strategies/gh-api.ts","../src/strategies/git-sparse.ts","../src/strategies/https-api.ts","../src/copy-from-github.ts"],"sourcesContent":["export interface Logger {\n  verbose: (msg: string) => void\n  info: (msg: string) => void\n}\n\nexport function createLogger (verboseEnabled: boolean): Logger {\n  return {\n    verbose: (msg: string) => {\n      if (verboseEnabled) {\n        process.stderr.write(`${msg}\\n`)\n      }\n    },\n    info: (msg: string) => {\n      process.stderr.write(`${msg}\\n`)\n    }\n  }\n}\n","/**\n * Parse `owner/repo[/path][#ref]` and GitHub web path variants\n * (`owner/repo/blob/ref/path` and `owner/repo/tree/ref/path`).\n * Ref from `#` is overridden by CLI `--ref` when set.\n */\nexport interface ParsedSourceSpec {\n  owner: string\n  repo: string\n  repoPath: string\n  refFromHash: string | undefined\n}\n\nfunction normalizeGithubPrefix (value: string): string {\n  const lowered = value.toLowerCase()\n  if (lowered.startsWith('https://github.com/')) {\n    return value.slice('https://github.com/'.length)\n  }\n  if (lowered.startsWith('http://github.com/')) {\n    return value.slice('http://github.com/'.length)\n  }\n  if (lowered.startsWith('github.com/')) {\n    return value.slice('github.com/'.length)\n  }\n  return value\n}\n\nfunction isValidGithubName (name: string, maxLen: number): boolean {\n  if (name.length === 0 || name.length > maxLen) {\n    return false\n  }\n  if (!/^[a-zA-Z0-9]/.test(name) || !/[a-zA-Z0-9]$/.test(name)) {\n    return false\n  }\n  return /^[a-zA-Z0-9._-]+$/.test(name)\n}\n\nexport function parseSourceSpec (raw: string): ParsedSourceSpec {\n  const trimmed = raw.trim()\n  if (trimmed.length === 0) {\n    throw new Error('Source spec is empty')\n  }\n\n  let remainder = normalizeGithubPrefix(trimmed)\n  let refFromHash: string | undefined\n  const hashIdx = remainder.lastIndexOf('#')\n  if (hashIdx >= 0) {\n    refFromHash = remainder.slice(hashIdx + 1).trim()\n    remainder = remainder.slice(0, hashIdx).trim()\n    if (refFromHash.length === 0) {\n      refFromHash = undefined\n    }\n  }\n\n  const segments = remainder.split('/').filter((s) => s.length > 0)\n  if (segments.length < 2) {\n    throw new Error(\n      `Invalid source spec \"${raw}\": expected owner/repo[/path][#ref]`\n    )\n  }\n\n  const owner = segments[0] ?? ''\n  const repo = segments[1] ?? ''\n  let rest = segments.slice(2)\n  const webMode = (rest[0] ?? '').toLowerCase()\n  if (webMode === 'blob' || webMode === 'tree') {\n    const inferredRef = rest[1]\n    if (inferredRef === undefined || inferredRef.length === 0) {\n      throw new Error(\n        `Invalid source spec \"${raw}\": expected owner/repo/${webMode}/<ref>[/path]`\n      )\n    }\n    if (refFromHash === undefined) {\n      refFromHash = inferredRef\n    }\n    rest = rest.slice(2)\n  }\n\n  let repoPath = rest.join('/')\n  repoPath = repoPath.replace(/^\\.\\/+/, '').replace(/\\/+$/, '')\n\n  if (!isValidGithubName(owner, 39)) {\n    throw new Error(`Invalid GitHub owner \"${owner}\"`)\n  }\n  if (!isValidGithubName(repo, 100)) {\n    throw new Error(`Invalid GitHub repository name \"${repo}\"`)\n  }\n\n  return { owner, repo, repoPath, refFromHash }\n}\n\nexport function encodeRepoContentPath (repoPath: string): string {\n  if (repoPath.length === 0) {\n    return ''\n  }\n  return repoPath\n    .split('/')\n    .map((seg) => encodeURIComponent(seg))\n    .join('/')\n}\n","import { chmod, mkdir, stat, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\nimport type { Logger } from './logger.ts'\n\nexport function assertSafeUnderDest (destRoot: string, relativePath: string): string {\n  const normalized = path.normalize(relativePath)\n  if (normalized.startsWith('..') || path.isAbsolute(normalized)) {\n    throw new Error(`Unsafe path in repository content: ${relativePath}`)\n  }\n  const resolved = path.resolve(destRoot, normalized)\n  const rootResolved = path.resolve(destRoot)\n  const prefix = rootResolved.endsWith(path.sep)\n    ? rootResolved\n    : rootResolved + path.sep\n  if (resolved !== rootResolved && !resolved.startsWith(prefix)) {\n    throw new Error(`Path escapes destination: ${relativePath}`)\n  }\n  return resolved\n}\n\nexport interface WritePlan {\n  relativePath: string\n  content: Buffer\n  mode?: number\n}\n\nexport async function applyWritePlan (\n  destRoot: string,\n  plans: WritePlan[],\n  opts: { force: boolean; dryRun: boolean; log: Logger }\n): Promise<string[]> {\n  const written: string[] = []\n\n  for (const plan of plans) {\n    const abs = assertSafeUnderDest(destRoot, plan.relativePath)\n    if (opts.dryRun) {\n      opts.log.verbose(`dry-run: would write ${plan.relativePath}`)\n      written.push(plan.relativePath)\n      continue\n    }\n\n    const dir = path.dirname(abs)\n    await mkdir(dir, { recursive: true })\n\n    try {\n      const st = await stat(abs)\n      if (st.isDirectory()) {\n        throw new Error(`Refusing to overwrite directory with file: ${plan.relativePath}`)\n      }\n      if (!opts.force) {\n        throw new Error(`File already exists (use --force): ${plan.relativePath}`)\n      }\n    } catch (e) {\n      if (e instanceof Error && 'code' in e && (e as NodeJS.ErrnoException).code === 'ENOENT') {\n        // ok\n      } else {\n        throw e\n      }\n    }\n\n    await writeFile(abs, plan.content)\n    if (plan.mode !== undefined) {\n      await chmod(abs, plan.mode)\n    }\n    written.push(plan.relativePath)\n  }\n\n  return written\n}\n","import path from 'node:path'\n\n/**\n * Map a repository file path to a path relative to the user's destination directory,\n * mirroring `cp -r owner/repo/.devcontainer .` → `./.devcontainer/...`.\n */\nexport function destRelativeFromRepoPath (\n  repoFilePath: string,\n  sourceRootInRepo: string\n): string {\n  const norm = (s: string): string =>\n    s.replace(/\\/+/g, '/').replace(/^\\/+/, '').replace(/\\/+$/, '')\n  const rf = norm(repoFilePath)\n  const root = norm(sourceRootInRepo)\n  if (root.length === 0) {\n    return rf\n  }\n  if (rf === root) {\n    return path.posix.basename(rf)\n  }\n  const prefix = root + '/'\n  if (rf.startsWith(prefix)) {\n    return path.posix.join(path.posix.basename(root), rf.slice(prefix.length))\n  }\n  throw new Error(`Path \"${repoFilePath}\" is not under source root \"${sourceRootInRepo}\"`)\n}\n","import type { WritePlan } from '../safe-write.ts'\nimport { destRelativeFromRepoPath } from '../dest-relative.ts'\nimport { encodeRepoContentPath } from '../parse-source-spec.ts'\nimport type { Logger } from '../logger.ts'\n\nexport interface ContentDirEntry {\n  type: 'file' | 'dir' | 'symlink' | 'submodule'\n  path: string\n  name: string\n  size?: number\n  download_url: string | null\n  url: string\n  content?: string\n  encoding?: string\n}\n\nexport function gitFileModeToFsMode (mode: string): number | undefined {\n  if (mode === '100755') {\n    return 0o755\n  }\n  if (mode === '100644') {\n    return 0o644\n  }\n  return undefined\n}\n\nexport function treeFileModesFromResponse (data: unknown): Map<string, number> {\n  const modes = new Map<string, number>()\n  if (!isRecord(data) || data.truncated === true || !Array.isArray(data.tree)) {\n    return modes\n  }\n  for (const entry of data.tree) {\n    if (!isRecord(entry)) {\n      continue\n    }\n    if (entry.type !== 'blob') {\n      continue\n    }\n    if (typeof entry.path !== 'string' || typeof entry.mode !== 'string') {\n      continue\n    }\n    const mode = gitFileModeToFsMode(entry.mode)\n    if (mode !== undefined) {\n      modes.set(entry.path, mode)\n    }\n  }\n  return modes\n}\n\nfunction isRecord (v: unknown): v is Record<string, unknown> {\n  return typeof v === 'object' && v !== null\n}\n\nfunction asDirEntries (data: unknown): ContentDirEntry[] {\n  if (!Array.isArray(data)) {\n    return []\n  }\n  return data.filter((x): x is ContentDirEntry => {\n    if (!isRecord(x)) {\n      return false\n    }\n    const t = x.type\n    return t === 'file' || t === 'dir' || t === 'symlink' || t === 'submodule'\n  }) as ContentDirEntry[]\n}\n\nfunction buildContentsApiPath (\n  owner: string,\n  repo: string,\n  pathInRepo: string,\n  ref: string | undefined\n): string {\n  const base = `repos/${owner}/${repo}/contents`\n  const suffix =\n    pathInRepo.length === 0 ? '' : `/${encodeRepoContentPath(pathInRepo)}`\n  const q = ref !== undefined && ref.length > 0 ? `?ref=${encodeURIComponent(ref)}` : ''\n  return `${base}${suffix}${q}`\n}\n\nfunction buildGitTreeApiPath (\n  owner: string,\n  repo: string,\n  ref: string\n): string {\n  return `repos/${owner}/${repo}/git/trees/${encodeURIComponent(ref)}?recursive=1`\n}\n\nfunction defaultBranchFromRepoResponse (data: unknown): string | undefined {\n  if (!isRecord(data)) {\n    return undefined\n  }\n  return typeof data.default_branch === 'string' ? data.default_branch : undefined\n}\n\nexport interface ContentsWalkDeps {\n  owner: string\n  repo: string\n  ref: string | undefined\n  sourceRootInRepo: string\n  log: Logger\n  getJson: (apiPath: string) => Promise<unknown>\n  getFileBuffer: (apiPathForFile: string) => Promise<Buffer>\n}\n\nexport async function walkGithubContents (deps: ContentsWalkDeps): Promise<WritePlan[]> {\n  const plans: WritePlan[] = []\n  const rootPath = deps.sourceRootInRepo\n  let fileModesPromise: Promise<Map<string, number>> | undefined\n\n  async function fileModes (): Promise<Map<string, number>> {\n    fileModesPromise ??= (async () => {\n      let treeRef = deps.ref\n      if (treeRef === undefined || treeRef.length === 0) {\n        const repoData = await deps.getJson(`repos/${deps.owner}/${deps.repo}`)\n        treeRef = defaultBranchFromRepoResponse(repoData)\n      }\n      if (treeRef === undefined || treeRef.length === 0) {\n        return new Map()\n      }\n      const data = await deps.getJson(buildGitTreeApiPath(deps.owner, deps.repo, treeRef))\n      return treeFileModesFromResponse(data)\n    })()\n    return await fileModesPromise\n  }\n\n  async function visit (pathInRepo: string): Promise<void> {\n    const apiPath = buildContentsApiPath(deps.owner, deps.repo, pathInRepo, deps.ref)\n    const data = await deps.getJson(apiPath)\n    if (data === null || data === undefined) {\n      throw new Error(`Empty GitHub API response for ${pathInRepo || '(root)'}`)\n    }\n\n    if (Array.isArray(data)) {\n      const entries = asDirEntries(data)\n      for (const e of entries) {\n        if (e.type === 'submodule' || e.type === 'symlink') {\n          deps.log.verbose(`skip ${e.type}: ${e.path}`)\n          continue\n        }\n        if (e.type === 'dir') {\n          await visit(e.path)\n        } else {\n          await addFile(e.path)\n        }\n      }\n      return\n    }\n\n    if (!isRecord(data)) {\n      throw new Error('Unexpected GitHub API response')\n    }\n    const t = data.type\n    if (t === 'file') {\n      const p = typeof data.path === 'string' ? data.path : pathInRepo\n      await addFile(p, data)\n      return\n    }\n    deps.log.verbose(`skip unexpected content type ${String(t)} at ${pathInRepo}`)\n  }\n\n  async function addFile (filePathInRepo: string, fileObj?: Record<string, unknown>): Promise<void> {\n    const rel = destRelativeFromRepoPath(filePathInRepo, rootPath)\n    let buf: Buffer\n    if (\n      fileObj !== undefined &&\n      typeof fileObj.content === 'string' &&\n      fileObj.encoding === 'base64'\n    ) {\n      buf = Buffer.from(fileObj.content, 'base64')\n    } else {\n      const fileApi = buildContentsApiPath(deps.owner, deps.repo, filePathInRepo, deps.ref)\n      buf = await deps.getFileBuffer(fileApi)\n    }\n    const modes = await fileModes()\n    plans.push({ relativePath: rel, content: buf, mode: modes.get(filePathInRepo) })\n  }\n\n  await visit(rootPath)\n  return plans\n}\n","import { spawn } from 'node:child_process'\n\nexport interface RunResult {\n  code: number | null\n  stdout: string\n  stderr: string\n}\n\nexport function runCmd (\n  command: string,\n  args: string[],\n  options: { cwd?: string } = {}\n): Promise<RunResult> {\n  return new Promise((resolve, reject) => {\n    const child = spawn(command, args, {\n      cwd: options.cwd,\n      windowsHide: true,\n      stdio: ['ignore', 'pipe', 'pipe']\n    })\n    let stdout = ''\n    let stderr = ''\n    child.stdout?.setEncoding('utf8')\n    child.stderr?.setEncoding('utf8')\n    child.stdout?.on('data', (c: string) => {\n      stdout += c\n    })\n    child.stderr?.on('data', (c: string) => {\n      stderr += c\n    })\n    child.on('error', reject)\n    child.on('close', (code) => {\n      resolve({ code, stdout, stderr })\n    })\n  })\n}\n\nexport function runCmdRaw (\n  command: string,\n  args: string[],\n  options: { cwd?: string } = {}\n): Promise<{ code: number | null; stdout: Buffer; stderr: string }> {\n  return new Promise((resolve, reject) => {\n    const child = spawn(command, args, {\n      cwd: options.cwd,\n      windowsHide: true,\n      stdio: ['ignore', 'pipe', 'pipe']\n    })\n    const chunks: Buffer[] = []\n    let stderr = ''\n    child.stdout?.on('data', (c: Buffer) => {\n      chunks.push(c)\n    })\n    child.stderr?.setEncoding('utf8')\n    child.stderr?.on('data', (c: string) => {\n      stderr += c\n    })\n    child.on('error', reject)\n    child.on('close', (code) => {\n      resolve({ code, stdout: Buffer.concat(chunks), stderr })\n    })\n  })\n}\n","import type { WritePlan } from './safe-write.ts'\n\nexport type FailureKind = 'not-found' | 'auth' | 'missing-tool' | 'generic'\n\nexport type StrategyName = 'gh-api' | 'git' | 'https'\n\nexport interface StrategyFailure {\n  strategy: StrategyName\n  kind: FailureKind\n  message: string\n}\n\nexport type StrategyResult =\n  | { ok: true; plans: WritePlan[] }\n  | { ok: false; failure: StrategyFailure }\n\nconst KIND_TO_CODE: Record<FailureKind, string> = {\n  'not-found': 'E2001',\n  auth: 'E2002',\n  'missing-tool': 'E2003',\n  generic: 'E2004'\n}\n\nexport function okPlans (plans: WritePlan[]): StrategyResult {\n  return { ok: true, plans }\n}\n\nexport function strategyFail (\n  strategy: StrategyName,\n  kind: FailureKind,\n  message: string\n): StrategyResult {\n  return { ok: false, failure: { strategy, kind, message } }\n}\n\n/** Classify free-text errors from gh, git, or API messages. */\nexport function failureKindFromMessage (msg: string): FailureKind {\n  const m = msg.toLowerCase()\n  if (/\\bgh\\b not found|\\bgit\\b not found|command not found/.test(m)) {\n    return 'missing-tool'\n  }\n  if (\n    /(^|[^\\d])404([^\\d]|$)/.test(m) ||\n    /\\bnot found\\b/.test(m) ||\n    /repository.*not found/.test(m) ||\n    /unknown revision/.test(m) ||\n    /no such file/.test(m) ||\n    /path not found/.test(m) ||\n    /did not match any file/.test(m) ||\n    /pathspec.*did not match/.test(m) ||\n    /could not find remote branch/.test(m) ||\n    /invalid refspec/.test(m) ||\n    /is not a commit/.test(m)\n  ) {\n    return 'not-found'\n  }\n  if (\n    /\\b401\\b/.test(m) ||\n    /\\b403\\b/.test(m) ||\n    /unauthorized/.test(m) ||\n    /forbidden/.test(m) ||\n    /authentication/.test(m) ||\n    /bad credentials/.test(m) ||\n    /rate limit/.test(m)\n  ) {\n    return 'auth'\n  }\n  return 'generic'\n}\n\nexport function isEnoent (e: unknown): boolean {\n  return (\n    typeof e === 'object' &&\n    e !== null &&\n    'code' in e &&\n    (e as NodeJS.ErrnoException).code === 'ENOENT'\n  )\n}\n\nexport function selectBestFailure (failures: StrategyFailure[]): StrategyFailure {\n  if (failures.length === 0) {\n    return {\n      strategy: 'https',\n      kind: 'generic',\n      message: 'No strategy produced a result.'\n    }\n  }\n  const order: FailureKind[] = ['not-found', 'auth', 'missing-tool', 'generic']\n  for (const kind of order) {\n    const hit = failures.find(f => f.kind === kind)\n    if (hit !== undefined) {\n      return hit\n    }\n  }\n  return failures[0] as StrategyFailure\n}\n\nexport interface AggregateFailureContext {\n  owner: string\n  repo: string\n  repoPath: string\n  ref: string | undefined\n}\n\nexport function formatAllStrategiesFailed (\n  best: StrategyFailure,\n  ctx: AggregateFailureContext\n): string {\n  const tried = 'Tried gh api, git, and HTTPS API.'\n  const refBit =\n    ctx.ref !== undefined && ctx.ref.length > 0 ? ` (ref: ${ctx.ref})` : ''\n  const pathDisp =\n    ctx.repoPath.length === 0 ? '.' : ctx.repoPath.replace(/^\\/+/, '')\n\n  if (best.kind === 'not-found') {\n    return `Path or ref not found on GitHub: ${ctx.owner}/${ctx.repo} — ${pathDisp}${refBit}. ${tried}`\n  }\n  if (best.kind === 'auth') {\n    return `${best.message} ${tried} For private repos or rate limits, use gh auth login, git over SSH/HTTPS, or set GITHUB_TOKEN.`\n  }\n  if (best.kind === 'missing-tool') {\n    return `${best.message} ${tried} Install gh and/or git, or set GITHUB_TOKEN to use the HTTPS API.`\n  }\n  return `Could not copy from GitHub: ${best.message} ${tried} Install gh or git, or set GITHUB_TOKEN for private repos and rate limits.`\n}\n\nexport class CopyFromGithubError extends Error {\n  readonly code: string\n  readonly exitCode: 2\n\n  /** formattedMessage is user-facing body (code prefix added automatically). */\n  constructor (best: StrategyFailure, formattedMessage: string) {\n    const code = KIND_TO_CODE[best.kind]\n    super(`Error (${code}): ${formattedMessage}`)\n    this.name = 'CopyFromGithubError'\n    this.code = code\n    this.exitCode = 2\n  }\n}\n","import { walkGithubContents } from '../github/contents-walk.ts'\nimport type { Logger } from '../logger.ts'\nimport { runCmd, runCmdRaw } from '../run-cmd.ts'\nimport {\n  failureKindFromMessage,\n  isEnoent,\n  okPlans,\n  strategyFail,\n  type StrategyResult\n} from '../strategy-result.ts'\n\nexport async function copyViaGhApi (opts: {\n  owner: string\n  repo: string\n  repoPath: string\n  ref: string | undefined\n  log: Logger\n}): Promise<StrategyResult> {\n  const getJson = async (apiPath: string): Promise<unknown> => {\n    let r\n    try {\n      r = await runCmd('gh', [\n        'api',\n        '-H',\n        'Accept: application/vnd.github+json',\n        apiPath\n      ])\n    } catch (e) {\n      if (isEnoent(e)) {\n        throw Object.assign(new Error('gh not found'), { code: 'ENOENT' })\n      }\n      throw e\n    }\n    if (r.code !== 0) {\n      const msg = r.stderr.trim() || `gh api failed (${String(r.code)})`\n      throw new Error(msg)\n    }\n    if (r.stdout.trim().length === 0) {\n      return null\n    }\n    return JSON.parse(r.stdout) as unknown\n  }\n\n  const getFileBuffer = async (fileApiPath: string): Promise<Buffer> => {\n    let r\n    try {\n      r = await runCmdRaw('gh', [\n        'api',\n        '-H',\n        'Accept: application/vnd.github.raw',\n        fileApiPath\n      ])\n    } catch (e) {\n      if (isEnoent(e)) {\n        throw Object.assign(new Error('gh not found'), { code: 'ENOENT' })\n      }\n      throw e\n    }\n    if (r.code !== 0) {\n      const msg = r.stderr.trim() || `gh api raw failed (${String(r.code)})`\n      throw new Error(msg)\n    }\n    return r.stdout\n  }\n\n  try {\n    const plans = await walkGithubContents({\n      owner: opts.owner,\n      repo: opts.repo,\n      ref: opts.ref,\n      sourceRootInRepo: opts.repoPath,\n      log: opts.log,\n      getJson,\n      getFileBuffer\n    })\n    return okPlans(plans)\n  } catch (e) {\n    if (isEnoent(e)) {\n      return strategyFail(\n        'gh-api',\n        'missing-tool',\n        'gh is not installed or not on PATH.'\n      )\n    }\n    const msg = e instanceof Error ? e.message : String(e)\n    opts.log.verbose(`gh api strategy failed: ${msg}`)\n    const kind = failureKindFromMessage(msg)\n    return strategyFail('gh-api', kind, msg)\n  }\n}\n","import { mkdtemp, readdir, readFile, rm, stat } from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { destRelativeFromRepoPath } from '../dest-relative.ts'\nimport type { Logger } from '../logger.ts'\nimport { runCmd } from '../run-cmd.ts'\nimport type { WritePlan } from '../safe-write.ts'\nimport {\n  failureKindFromMessage,\n  isEnoent,\n  okPlans,\n  strategyFail,\n  type StrategyResult\n} from '../strategy-result.ts'\n\nfunction looksLikeSha (ref: string): boolean {\n  return /^[0-9a-f]{7,40}$/i.test(ref)\n}\n\nfunction fileModeFromStat (mode: number): number {\n  return (mode & 0o111) !== 0 ? 0o755 : 0o644\n}\n\nasync function collectFilesRecursive (\n  absDir: string,\n  baseRel: string,\n  out: { abs: string; relPosix: string }[]\n): Promise<void> {\n  const entries = await readdir(absDir, { withFileTypes: true })\n  for (const ent of entries) {\n    if (ent.name === '.git') {\n      continue\n    }\n    const abs = path.join(absDir, ent.name)\n    const rel = baseRel.length === 0 ? ent.name : `${baseRel}/${ent.name}`\n    if (ent.isDirectory()) {\n      await collectFilesRecursive(abs, rel, out)\n    } else if (ent.isFile()) {\n      out.push({ abs, relPosix: rel.split(path.sep).join('/') })\n    }\n  }\n}\n\nasync function runGit (\n  args: string[]\n): Promise<{ code: number | null; stderr: string; stdout: string }> {\n  try {\n    return await runCmd('git', args)\n  } catch (e) {\n    if (isEnoent(e)) {\n      throw Object.assign(new Error('git not found on PATH'), {\n        code: 'ENOENT'\n      })\n    }\n    throw e\n  }\n}\n\nexport async function copyViaGitSparse (opts: {\n  owner: string\n  repo: string\n  repoPath: string\n  ref: string | undefined\n  log: Logger\n}): Promise<StrategyResult> {\n  const url = `https://github.com/${opts.owner}/${opts.repo}.git`\n  const tmpBase = await mkdtemp(path.join(os.tmpdir(), 'gh-cp-'))\n  const repoDir = path.join(tmpBase, 'repo')\n\n  try {\n    if (opts.repoPath.length === 0) {\n      const cloneArgs = ['clone', '--depth', '1']\n      if (opts.ref !== undefined && opts.ref.length > 0) {\n        if (looksLikeSha(opts.ref)) {\n          const r = await runGit([\n            'clone',\n            '--filter=blob:none',\n            url,\n            repoDir\n          ])\n          if (r.code !== 0) {\n            throw new Error(r.stderr.trim() || 'git clone failed')\n          }\n          const f = await runGit([\n            '-C',\n            repoDir,\n            'fetch',\n            '--depth',\n            '1',\n            'origin',\n            opts.ref\n          ])\n          if (f.code !== 0) {\n            throw new Error(f.stderr.trim() || 'git fetch failed')\n          }\n          const co = await runGit(['-C', repoDir, 'checkout', opts.ref])\n          if (co.code !== 0) {\n            throw new Error(co.stderr.trim() || 'git checkout failed')\n          }\n        } else {\n          cloneArgs.push('-b', opts.ref)\n          cloneArgs.push(url, repoDir)\n          const r = await runGit(cloneArgs)\n          if (r.code !== 0) {\n            throw new Error(r.stderr.trim() || 'git clone failed')\n          }\n        }\n      } else {\n        cloneArgs.push(url, repoDir)\n        const r = await runGit(cloneArgs)\n        if (r.code !== 0) {\n          throw new Error(r.stderr.trim() || 'git clone failed')\n        }\n      }\n    } else {\n      const r = await runGit([\n        'clone',\n        '--filter=blob:none',\n        '--sparse',\n        '--depth',\n        '1',\n        ...(opts.ref !== undefined && opts.ref.length > 0 && !looksLikeSha(opts.ref)\n          ? ['-b', opts.ref]\n          : []),\n        url,\n        repoDir\n      ])\n      if (r.code !== 0) {\n        throw new Error(r.stderr.trim() || 'git sparse clone failed')\n      }\n      if (opts.ref !== undefined && opts.ref.length > 0 && looksLikeSha(opts.ref)) {\n        const f = await runGit([\n          '-C',\n          repoDir,\n          'fetch',\n          '--depth',\n          '1',\n          'origin',\n          opts.ref\n        ])\n        if (f.code !== 0) {\n          throw new Error(f.stderr.trim() || 'git fetch failed')\n        }\n        const co = await runGit(['-C', repoDir, 'checkout', opts.ref])\n        if (co.code !== 0) {\n          throw new Error(co.stderr.trim() || 'git checkout failed')\n        }\n      }\n      const sparsePath = opts.repoPath.startsWith('/')\n        ? opts.repoPath\n        : `/${opts.repoPath.replace(/\\/+$/, '')}`\n      const sp = await runGit([\n        '-C',\n        repoDir,\n        'sparse-checkout',\n        'set',\n        '--no-cone',\n        sparsePath\n      ])\n      if (sp.code !== 0) {\n        throw new Error(sp.stderr.trim() || 'git sparse-checkout set failed')\n      }\n    }\n\n    const sourceFsRoot =\n      opts.repoPath.length === 0 ? repoDir : path.join(repoDir, opts.repoPath)\n    let st\n    try {\n      st = await stat(sourceFsRoot)\n    } catch {\n      throw new Error(`Path not found in clone: ${opts.repoPath || '(root)'}`)\n    }\n\n    const plans: WritePlan[] = []\n\n    if (st.isFile()) {\n      const buf = await readFile(sourceFsRoot)\n      const rel = destRelativeFromRepoPath(opts.repoPath, opts.repoPath)\n      plans.push({ relativePath: rel, content: buf, mode: fileModeFromStat(st.mode) })\n      return okPlans(plans)\n    }\n\n    if (!st.isDirectory()) {\n      throw new Error(`Unsupported filesystem node at ${opts.repoPath}`)\n    }\n\n    const files: { abs: string; relPosix: string }[] = []\n    await collectFilesRecursive(sourceFsRoot, '', files)\n\n    for (const f of files) {\n      const fullRepoPath =\n        opts.repoPath.length === 0\n          ? f.relPosix\n          : `${opts.repoPath.replace(/\\/+$/, '')}/${f.relPosix}`\n      const rel = destRelativeFromRepoPath(fullRepoPath, opts.repoPath)\n      const buf = await readFile(f.abs)\n      const st = await stat(f.abs)\n      plans.push({ relativePath: rel, content: buf, mode: fileModeFromStat(st.mode) })\n    }\n\n    return okPlans(plans)\n  } catch (e) {\n    if (isEnoent(e)) {\n      return strategyFail(\n        'git',\n        'missing-tool',\n        'git is not installed or not on PATH.'\n      )\n    }\n    const msg = e instanceof Error ? e.message : String(e)\n    opts.log.verbose(`git sparse strategy failed: ${msg}`)\n    if (msg.startsWith('Path not found in clone:')) {\n      return strategyFail('git', 'not-found', msg)\n    }\n    const kind = failureKindFromMessage(msg)\n    return strategyFail('git', kind, msg)\n  } finally {\n    try {\n      await rm(tmpBase, { recursive: true, force: true })\n    } catch {\n      opts.log.verbose(`could not remove temp dir ${tmpBase}`)\n    }\n  }\n}\n","import { walkGithubContents } from '../github/contents-walk.ts'\nimport type { Logger } from '../logger.ts'\nimport {\n  failureKindFromMessage,\n  okPlans,\n  strategyFail,\n  type StrategyResult\n} from '../strategy-result.ts'\n\nconst API_BASE = 'https://api.github.com/'\nconst API_VERSION = '2022-11-28'\n\nfunction authHeaders (): Record<string, string> {\n  const token = process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN\n  const h: Record<string, string> = {\n    Accept: 'application/vnd.github+json',\n    'X-GitHub-Api-Version': API_VERSION,\n    'User-Agent': 'gh-cp-cli'\n  }\n  if (token !== undefined && token.length > 0) {\n    h.Authorization = `Bearer ${token}`\n  }\n  return h\n}\n\nexport async function copyViaHttpsApi (opts: {\n  owner: string\n  repo: string\n  repoPath: string\n  ref: string | undefined\n  log: Logger\n}): Promise<StrategyResult> {\n  const getJson = async (apiPath: string): Promise<unknown> => {\n    const url = new URL(apiPath, API_BASE)\n    const res = await fetch(url, { headers: authHeaders() })\n    if (res.status === 403 || res.status === 401) {\n      const t = await res.text()\n      throw new Error(\n        `GitHub API ${String(res.status)}: ${t.slice(0, 200)} — use gh auth login, git, or set GITHUB_TOKEN`\n      )\n    }\n    if (res.status === 404) {\n      throw new Error(\n        'GitHub API 404: repository, path, or ref not found'\n      )\n    }\n    if (!res.ok) {\n      const t = await res.text()\n      throw new Error(`GitHub API ${String(res.status)}: ${t.slice(0, 200)}`)\n    }\n    return await res.json() as unknown\n  }\n\n  const getFileBuffer = async (fileApiPath: string): Promise<Buffer> => {\n    const url = new URL(fileApiPath, API_BASE)\n    const headers = {\n      ...authHeaders(),\n      Accept: 'application/vnd.github.raw'\n    }\n    const res = await fetch(url, { headers })\n    if (!res.ok) {\n      const t = await res.text()\n      throw new Error(`GitHub raw fetch ${String(res.status)}: ${t.slice(0, 200)}`)\n    }\n    return Buffer.from(await res.arrayBuffer())\n  }\n\n  try {\n    const plans = await walkGithubContents({\n      owner: opts.owner,\n      repo: opts.repo,\n      ref: opts.ref,\n      sourceRootInRepo: opts.repoPath,\n      log: opts.log,\n      getJson,\n      getFileBuffer\n    })\n    return okPlans(plans)\n  } catch (e) {\n    const msg = e instanceof Error ? e.message : String(e)\n    opts.log.verbose(`HTTPS API strategy failed: ${msg}`)\n    const kind = failureKindFromMessage(msg)\n    return strategyFail('https', kind, msg)\n  }\n}\n","import { mkdir } from 'node:fs/promises'\nimport path from 'node:path'\nimport { createLogger, type Logger } from './logger.ts'\nimport { parseSourceSpec } from './parse-source-spec.ts'\nimport { applyWritePlan, type WritePlan } from './safe-write.ts'\nimport { copyViaGhApi } from './strategies/gh-api.ts'\nimport { copyViaGitSparse } from './strategies/git-sparse.ts'\nimport { copyViaHttpsApi } from './strategies/https-api.ts'\nimport {\n  CopyFromGithubError,\n  formatAllStrategiesFailed,\n  selectBestFailure,\n  type StrategyFailure\n} from './strategy-result.ts'\n\nexport type FetchStrategyName = 'gh-api' | 'git' | 'https'\n\nexport interface CopyFromGithubOptions {\n  sourceSpec: string\n  destination: string\n  /** Overrides `#ref` in the source spec when set */\n  refOverride: string | undefined\n  force: boolean\n  dryRun: boolean\n  verbose: boolean\n}\n\nexport interface CopyFromGithubResult {\n  strategy: FetchStrategyName\n  written: string[]\n  owner: string\n  repo: string\n  repoPath: string\n  ref: string | undefined\n}\n\nasync function tryStrategies (\n  ctx: {\n    owner: string\n    repo: string\n    repoPath: string\n    ref: string | undefined\n    log: Logger\n  },\n  order: readonly FetchStrategyName[]\n): Promise<{ strategy: FetchStrategyName; plans: WritePlan[] }> {\n  const failures: StrategyFailure[] = []\n  for (const name of order) {\n    const res =\n      name === 'gh-api'\n        ? await copyViaGhApi(ctx)\n        : name === 'git'\n          ? await copyViaGitSparse(ctx)\n          : await copyViaHttpsApi(ctx)\n    if (res.ok) {\n      return { strategy: name, plans: res.plans }\n    }\n    failures.push(res.failure)\n  }\n  const best = selectBestFailure(failures)\n  throw new CopyFromGithubError(\n    best,\n    formatAllStrategiesFailed(best, {\n      owner: ctx.owner,\n      repo: ctx.repo,\n      repoPath: ctx.repoPath,\n      ref: ctx.ref\n    })\n  )\n}\n\nexport async function copyFromGithub (\n  opts: CopyFromGithubOptions\n): Promise<CopyFromGithubResult> {\n  const spec = parseSourceSpec(opts.sourceSpec)\n  const ref =\n    opts.refOverride !== undefined && opts.refOverride.length > 0\n      ? opts.refOverride\n      : spec.refFromHash\n\n  const log = createLogger(opts.verbose)\n  const dest = path.resolve(opts.destination)\n\n  log.verbose(`destination: ${dest}`)\n  log.verbose(`resolved: ${spec.owner}/${spec.repo} path=${spec.repoPath || '.'} ref=${ref ?? '(default)'}`)\n\n  const ctx = {\n    owner: spec.owner,\n    repo: spec.repo,\n    repoPath: spec.repoPath,\n    ref,\n    log\n  }\n\n  const tried = await tryStrategies(ctx, ['gh-api', 'git', 'https'])\n\n  log.verbose(`using strategy: ${tried.strategy}`)\n\n  if (!opts.dryRun) {\n    await mkdir(dest, { recursive: true })\n  }\n\n  const written = await applyWritePlan(dest, tried.plans, {\n    force: opts.force,\n    dryRun: opts.dryRun,\n    log\n  })\n\n  return {\n    strategy: tried.strategy,\n    written,\n    owner: spec.owner,\n    repo: spec.repo,\n    repoPath: spec.repoPath,\n    ref\n  }\n}\n"],"mappings":"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"}