epicshop 6.47.4 → 6.47.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"workshops.d.ts","sourceRoot":"","sources":["../../../src/commands/workshops.ts"],"names":[],"mappings":"AAAA,OAAO,mCAAmC,CAAA;AA0C1C;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4B/D;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE9D;AAED,MAAM,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,KAAK,CAAA;CACb,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AA6MD,MAAM,MAAM,YAAY,GAAG;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;CAC/B,CAAA;AAED;;GAEG;AACH,wBAAsB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CA+QvE;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,EAC1B,MAAc,GACd,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CA4HtD;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,EAC5B,QAAQ,EACR,MAAc,GACd,EAAE;IACF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;CAChB,GAAG,OAAO,CAAC,eAAe,CAAC,CAuI3B;AAED;;GAEG;AACH,wBAAsB,aAAa,CAClC,OAAO,GAAE,YAAiB,GACxB,OAAO,CAAC,eAAe,CAAC,CA6G1B;AAED;;GAEG;AACH,wBAAsB,YAAY,CACjC,OAAO,GAAE,YAAiB,GACxB,OAAO,CAAC,eAAe,CAAC,CA+I1B;AAED;;GAEG;AACH,wBAAsB,MAAM,CAC3B,OAAO,GAAE,aAAkB,GACzB,OAAO,CAAC,eAAe,CAAC,CAgO1B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAYzD;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,eAAe,CAAC,CAqG3D;AAmdD;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAKrD"}
1
+ {"version":3,"file":"workshops.d.ts","sourceRoot":"","sources":["../../../src/commands/workshops.ts"],"names":[],"mappings":"AAAA,OAAO,mCAAmC,CAAA;AA0C1C;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4B/D;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE9D;AAED,MAAM,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,KAAK,CAAA;CACb,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AA8MD,MAAM,MAAM,YAAY,GAAG;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;CAC/B,CAAA;AAED;;GAEG;AACH,wBAAsB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CA+QvE;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,EAC1B,MAAc,GACd,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CA4HtD;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,EAC5B,QAAQ,EACR,MAAc,GACd,EAAE;IACF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;CAChB,GAAG,OAAO,CAAC,eAAe,CAAC,CAuI3B;AAED;;GAEG;AACH,wBAAsB,aAAa,CAClC,OAAO,GAAE,YAAiB,GACxB,OAAO,CAAC,eAAe,CAAC,CA6G1B;AAED;;GAEG;AACH,wBAAsB,YAAY,CACjC,OAAO,GAAE,YAAiB,GACxB,OAAO,CAAC,eAAe,CAAC,CA+I1B;AAED;;GAEG;AACH,wBAAsB,MAAM,CAC3B,OAAO,GAAE,aAAkB,GACzB,OAAO,CAAC,eAAe,CAAC,CAgO1B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAYzD;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,eAAe,CAAC,CAqG3D;AAmdD;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAKrD"}
@@ -93,7 +93,8 @@ async function fetchAvailableWorkshops() {
93
93
  ttl: 1000 * 60 * 15, // 15 minutes
94
94
  swr: 1000 * 60 * 60 * 6, // 6 hours stale-while-revalidate
95
95
  async getFreshValue() {
96
- const url = `https://api.github.com/search/repositories?q=topic:workshop+org:${GITHUB_ORG}&sort=stars&order=desc`;
96
+ // Note: `archived:false` is supported by GitHub search.
97
+ const url = `https://api.github.com/search/repositories?q=topic:workshop+org:${GITHUB_ORG}+archived:false&sort=stars&order=desc`;
97
98
  const response = await fetch(url, {
98
99
  headers: getGitHubHeaders(),
99
100
  });
@@ -104,7 +105,7 @@ async function fetchAvailableWorkshops() {
104
105
  throw new Error(`Failed to fetch workshops from GitHub: ${response.status}`);
105
106
  }
106
107
  const data = (await response.json());
107
- return data.items.filter((repo) => !repo.archived);
108
+ return Array.isArray(data.items) ? data.items : [];
108
109
  },
109
110
  });
110
111
  }
@@ -1652,7 +1653,8 @@ async function directoryExists(dirPath) {
1652
1653
  function resolveCliCommand(command) {
1653
1654
  // On Windows, package manager binaries are typically shimmed as *.cmd files.
1654
1655
  // Spawning "npm" directly can fail with ENOENT even though "npm.cmd" exists.
1655
- if (process.platform === 'win32' && (command === 'npm' || command === 'npx')) {
1656
+ if (process.platform === 'win32' &&
1657
+ (command === 'npm' || command === 'npx')) {
1656
1658
  return `${command}.cmd`;
1657
1659
  }
1658
1660
  return command;
@@ -1 +1 @@
1
- {"version":3,"file":"workshops.js","sourceRoot":"","sources":["../../../src/commands/workshops.ts"],"names":[],"mappings":"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","sourcesContent":["import '@epic-web/workshop-utils/init-env'\n\nimport { spawn } from 'node:child_process'\nimport * as fs from 'node:fs'\nimport * as os from 'node:os'\nimport * as path from 'node:path'\nimport { cachified, githubCache } from '@epic-web/workshop-utils/cache.server'\nimport { parseEpicshopConfig } from '@epic-web/workshop-utils/config.server'\nimport { getAuthInfo } from '@epic-web/workshop-utils/db.server'\nimport { userHasAccessToWorkshop } from '@epic-web/workshop-utils/epic-api.server'\nimport chalk from 'chalk'\nimport { matchSorter, rankings } from 'match-sorter'\nimport ora from 'ora'\n\nconst GITHUB_ORG = 'epicweb-dev'\nconst TUTORIAL_REPO = 'epicshop-tutorial'\nconst GITHUB_TOKEN = process.env.GITHUB_TOKEN\n\ntype EpicSite = {\n\thost: string\n\tname: string\n\tdescription: string\n}\n\nconst EPIC_SITES: Array<EpicSite> = [\n\t{\n\t\thost: 'www.epicreact.dev',\n\t\tname: 'Epic React',\n\t\tdescription: 'React development workshops',\n\t},\n\t{\n\t\thost: 'www.epicweb.dev',\n\t\tname: 'Epic Web',\n\t\tdescription: 'Full-stack web development workshops',\n\t},\n\t{\n\t\thost: 'www.epicai.pro',\n\t\tname: 'Epic AI',\n\t\tdescription: 'AI development workshops',\n\t},\n]\n\n/**\n * Find the workshop root directory by walking up from the current directory\n * looking for a package.json with an epicshop field.\n * Returns the workshop root path if found, null otherwise.\n */\nexport async function findWorkshopRoot(): Promise<string | null> {\n\tlet currentDir = process.cwd()\n\tconst root = path.parse(currentDir).root\n\n\twhile (currentDir !== root) {\n\t\ttry {\n\t\t\tconst packageJsonPath = path.join(currentDir, 'package.json')\n\t\t\tconst content = await fs.promises.readFile(packageJsonPath, 'utf-8')\n\t\t\tconst packageJson = JSON.parse(content) as { epicshop?: unknown }\n\n\t\t\t// Check if epicshop config exists\n\t\t\tif (packageJson.epicshop) {\n\t\t\t\treturn currentDir\n\t\t\t}\n\t\t} catch {\n\t\t\t// No package.json or can't read it, continue up\n\t\t}\n\n\t\t// Move up one directory\n\t\tconst parentDir = path.dirname(currentDir)\n\t\tif (parentDir === currentDir) {\n\t\t\t// We've reached the root\n\t\t\tbreak\n\t\t}\n\t\tcurrentDir = parentDir\n\t}\n\n\treturn null\n}\n\n/**\n * Check if the current working directory is inside a workshop\n * (has epicshop config in package.json in current dir or any parent)\n */\nexport async function isInWorkshopDirectory(): Promise<boolean> {\n\treturn (await findWorkshopRoot()) !== null\n}\n\nexport type WorkshopsResult = {\n\tsuccess: boolean\n\tmessage?: string\n\terror?: Error\n}\n\nexport type AddOptions = {\n\trepoName?: string\n\tdirectory?: string\n\tsilent?: boolean\n}\n\ntype GitHubRepo = {\n\tname: string\n\tdescription: string | null\n\thtml_url: string\n\tstargazers_count: number\n\ttopics: string[]\n\tarchived: boolean\n}\n\ntype GitHubSearchResponse = {\n\ttotal_count: number\n\tincomplete_results: boolean\n\titems: GitHubRepo[]\n}\n\ntype EnrichedWorkshop = GitHubRepo & {\n\tproductHost?: string\n\tproductSlug?: string\n\tproductDisplayName?: string\n\tinstructorName?: string\n\ttitle?: string\n\thasAccess?: boolean\n\tisDownloaded?: boolean\n}\n\nconst PRODUCT_ICONS: Record<string, string> = {\n\t'www.epicweb.dev': '🌌',\n\t'www.epicai.pro': '⚡',\n\t'www.epicreact.dev': '🚀',\n}\n\nfunction getGitHubHeaders(): HeadersInit {\n\tconst headers: HeadersInit = {\n\t\tAccept: 'application/vnd.github.v3+json',\n\t\t'User-Agent': 'epicshop-cli',\n\t}\n\tif (GITHUB_TOKEN) {\n\t\theaders.Authorization = `Bearer ${GITHUB_TOKEN}`\n\t}\n\treturn headers\n}\n\n/**\n * Fetch available workshops from GitHub (epicweb-dev org with 'workshop' topic)\n */\nasync function fetchAvailableWorkshops(): Promise<GitHubRepo[]> {\n\treturn cachified({\n\t\tkey: `github-workshops-list`,\n\t\tcache: githubCache,\n\t\tttl: 1000 * 60 * 15, // 15 minutes\n\t\tswr: 1000 * 60 * 60 * 6, // 6 hours stale-while-revalidate\n\t\tasync getFreshValue() {\n\t\t\tconst url = `https://api.github.com/search/repositories?q=topic:workshop+org:${GITHUB_ORG}&sort=stars&order=desc`\n\n\t\t\tconst response = await fetch(url, {\n\t\t\t\theaders: getGitHubHeaders(),\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\tif (response.status === 403) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'GitHub API rate limit exceeded. Please try again in a minute.',\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to fetch workshops from GitHub: ${response.status}`,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst data = (await response.json()) as GitHubSearchResponse\n\t\t\treturn data.items.filter((repo) => !repo.archived)\n\t\t},\n\t})\n}\n\n/**\n * Fetch a workshop's package.json from GitHub raw content\n */\nasync function fetchWorkshopPackageJson(\n\trepoName: string,\n): Promise<Record<string, unknown> | null> {\n\treturn cachified({\n\t\tkey: `github-package-json:${repoName}`,\n\t\tcache: githubCache,\n\t\tttl: 1000 * 60 * 60 * 6, // 6 hours\n\t\tswr: 1000 * 60 * 60 * 24 * 30, // 30 days stale-while-revalidate\n\t\tasync getFreshValue() {\n\t\t\tconst url = `https://raw.githubusercontent.com/${GITHUB_ORG}/${repoName}/main/package.json`\n\n\t\t\tconst response = await fetch(url, {\n\t\t\t\theaders: {\n\t\t\t\t\t'User-Agent': 'epicshop-cli',\n\t\t\t\t\t...(GITHUB_TOKEN ? { Authorization: `Bearer ${GITHUB_TOKEN}` } : {}),\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\treturn (await response.json()) as Record<string, unknown>\n\t\t\t} catch {\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\t})\n}\n\n/**\n * Enrich workshops with metadata from their package.json files\n */\nasync function enrichWorkshopsWithMetadata(\n\tworkshops: GitHubRepo[],\n): Promise<EnrichedWorkshop[]> {\n\tconst packageJsons = await Promise.all(\n\t\tworkshops.map((w) => fetchWorkshopPackageJson(w.name)),\n\t)\n\n\treturn workshops.map((workshop, index) => {\n\t\tconst packageJson = packageJsons[index]\n\t\tconst config = packageJson ? parseEpicshopConfig(packageJson) : null\n\n\t\treturn {\n\t\t\t...workshop,\n\t\t\tproductHost: config?.product?.host,\n\t\t\tproductSlug: config?.product?.slug,\n\t\t\tproductDisplayName: config?.product?.displayName,\n\t\t\tinstructorName: config?.instructor?.name,\n\t\t\ttitle: config?.title,\n\t\t}\n\t})\n}\n\n/**\n * Check which product sites the user is logged in to\n */\nasync function checkAuthStatus(\n\tworkshops: EnrichedWorkshop[],\n): Promise<Map<string, boolean>> {\n\tconst uniqueHosts = new Set(\n\t\tworkshops\n\t\t\t.map((w) => w.productHost)\n\t\t\t.filter((host): host is string => Boolean(host)),\n\t)\n\n\tconst authStatusMap = new Map<string, boolean>()\n\tawait Promise.all(\n\t\tArray.from(uniqueHosts).map(async (host) => {\n\t\t\tconst authInfo = await getAuthInfo({ productHost: host })\n\t\t\tauthStatusMap.set(host, isValidLoginInfo(authInfo))\n\t\t}),\n\t)\n\n\treturn authStatusMap\n}\n\n/**\n * Check if workshops are already downloaded\n */\nasync function checkWorkshopDownloadStatus(\n\tworkshops: EnrichedWorkshop[],\n): Promise<EnrichedWorkshop[]> {\n\tconst { workshopExists } = await import(\n\t\t'@epic-web/workshop-utils/workshops.server'\n\t)\n\n\tconst downloadStatusResults = await Promise.all(\n\t\tworkshops.map(async (workshop) => {\n\t\t\treturn await workshopExists(workshop.name)\n\t\t}),\n\t)\n\n\treturn workshops.map((workshop, index) => ({\n\t\t...workshop,\n\t\tisDownloaded: downloadStatusResults[index],\n\t}))\n}\n\n/**\n * Check access for workshops in parallel\n */\nasync function checkWorkshopAccess(\n\tworkshops: EnrichedWorkshop[],\n): Promise<EnrichedWorkshop[]> {\n\tconst accessResults = await Promise.all(\n\t\tworkshops.map(async (workshop) => {\n\t\t\tif (!workshop.productHost || !workshop.productSlug) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn userHasAccessToWorkshop({\n\t\t\t\tproductHost: workshop.productHost,\n\t\t\t\tworkshopSlug: workshop.productSlug,\n\t\t\t})\n\t\t}),\n\t)\n\n\treturn workshops.map((workshop, index) => ({\n\t\t...workshop,\n\t\thasAccess: accessResults[index],\n\t}))\n}\n\nexport type StartOptions = {\n\tworkshop?: string\n\tsilent?: boolean\n}\n\nexport type ConfigOptions = {\n\treposDir?: string\n\tsilent?: boolean\n\tsubcommand?: 'reset' | 'delete'\n}\n\n/**\n * Add a workshop by cloning from epicweb-dev GitHub org and running setup\n */\nexport async function add(options: AddOptions): Promise<WorkshopsResult> {\n\tconst { silent = false } = options\n\tlet { repoName } = options\n\n\ttry {\n\t\t// If no repo name provided, fetch available workshops and let user select\n\t\tif (!repoName) {\n\t\t\tif (silent) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tmessage: 'Repository name is required in silent mode',\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst spinner = ora('Fetching available workshops...').start()\n\n\t\t\tlet enrichedWorkshops: EnrichedWorkshop[]\n\t\t\ttry {\n\t\t\t\tconst workshops = await fetchAvailableWorkshops()\n\n\t\t\t\tif (workshops.length === 0) {\n\t\t\t\t\tspinner.fail('No workshops found on GitHub')\n\t\t\t\t\treturn { success: false, message: 'No workshops found on GitHub' }\n\t\t\t\t}\n\n\t\t\t\tspinner.text = 'Loading workshop details...'\n\t\t\t\tenrichedWorkshops = await enrichWorkshopsWithMetadata(workshops)\n\n\t\t\t\tspinner.text = 'Checking download status...'\n\t\t\t\tenrichedWorkshops = await checkWorkshopDownloadStatus(enrichedWorkshops)\n\n\t\t\t\tspinner.stop()\n\t\t\t\tconst authStatusMap = await checkAuthStatus(enrichedWorkshops)\n\n\t\t\t\tconst hostsNotLoggedIn = Array.from(authStatusMap.entries())\n\t\t\t\t\t.filter(([, isLoggedIn]) => !isLoggedIn)\n\t\t\t\t\t.map(([host]) => host)\n\n\t\t\t\tif (hostsNotLoggedIn.length > 0) {\n\t\t\t\t\tconst hostDisplayNames = hostsNotLoggedIn.map((host) => {\n\t\t\t\t\t\tconst workshop = enrichedWorkshops.find(\n\t\t\t\t\t\t\t(w) => w.productHost === host,\n\t\t\t\t\t\t)\n\t\t\t\t\t\treturn workshop?.productDisplayName || host\n\t\t\t\t\t})\n\n\t\t\t\t\tconsole.log()\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.yellow(\n\t\t\t\t\t\t\t`💡 Tip: You are not logged in to ${hostDisplayNames.join(', ')}. ` +\n\t\t\t\t\t\t\t\t'Logging in will allow us to check your workshop access.',\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.gray(` To login, run: ${chalk.cyan('npx epicshop auth')}`),\n\t\t\t\t\t)\n\t\t\t\t\tconsole.log()\n\t\t\t\t}\n\n\t\t\t\tspinner.start('Checking access...')\n\t\t\t\tenrichedWorkshops = await checkWorkshopAccess(enrichedWorkshops)\n\n\t\t\t\tenrichedWorkshops.sort((a, b) => {\n\t\t\t\t\tconst aHasAccess = a.hasAccess === true\n\t\t\t\t\tconst aIsDownloaded = a.isDownloaded === true\n\t\t\t\t\tconst bHasAccess = b.hasAccess === true\n\t\t\t\t\tconst bIsDownloaded = b.isDownloaded === true\n\n\t\t\t\t\t// Priority 1: Access and not yet downloaded\n\t\t\t\t\tconst aPriority1 = aHasAccess && !aIsDownloaded\n\t\t\t\t\tconst bPriority1 = bHasAccess && !bIsDownloaded\n\t\t\t\t\tif (aPriority1 && !bPriority1) return -1\n\t\t\t\t\tif (!aPriority1 && bPriority1) return 1\n\n\t\t\t\t\t// Priority 2: No access and not yet downloaded\n\t\t\t\t\tconst aPriority2 = !aHasAccess && !aIsDownloaded\n\t\t\t\t\tconst bPriority2 = !bHasAccess && !bIsDownloaded\n\t\t\t\t\tif (aPriority2 && !bPriority2) return -1\n\t\t\t\t\tif (!aPriority2 && bPriority2) return 1\n\n\t\t\t\t\t// Priority 3: Access and downloaded\n\t\t\t\t\tconst aPriority3 = aHasAccess && aIsDownloaded\n\t\t\t\t\tconst bPriority3 = bHasAccess && bIsDownloaded\n\t\t\t\t\tif (aPriority3 && !bPriority3) return -1\n\t\t\t\t\tif (!aPriority3 && bPriority3) return 1\n\n\t\t\t\t\treturn 0\n\t\t\t\t})\n\n\t\t\t\tspinner.succeed(`Found ${enrichedWorkshops.length} available workshops`)\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\t\t\tspinner.fail(message)\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tmessage,\n\t\t\t\t\terror: error instanceof Error ? error : new Error(message),\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst { search } = await import('@inquirer/prompts')\n\n\t\t\tconsole.log()\n\t\t\tconsole.log(chalk.bold.cyan('📚 Available Workshops\\n'))\n\t\t\tconsole.log(chalk.gray('Icon Key:'))\n\t\t\tconsole.log(chalk.gray(` 🚀 EpicReact.dev`))\n\t\t\tconsole.log(chalk.gray(` 🌌 EpicWeb.dev`))\n\t\t\tconsole.log(chalk.gray(` ⚡ EpicAI.pro`))\n\t\t\tconsole.log(chalk.gray(` 🔑 You have access to this workshop`))\n\t\t\tconsole.log(chalk.gray(` ✔︎ Already downloaded on your machine`))\n\t\t\tconsole.log()\n\n\t\t\tconst allChoices = enrichedWorkshops.map((w) => {\n\t\t\t\tconst productIcon = w.productHost\n\t\t\t\t\t? PRODUCT_ICONS[w.productHost] || ''\n\t\t\t\t\t: ''\n\t\t\t\tconst accessIcon = w.hasAccess === true ? chalk.yellow('🔑') : ''\n\t\t\t\tconst downloadedIcon = w.isDownloaded === true ? chalk.green('✔︎') : ''\n\n\t\t\t\tconst nameParts = [\n\t\t\t\t\tproductIcon,\n\t\t\t\t\tw.title || w.name,\n\t\t\t\t\taccessIcon,\n\t\t\t\t\tdownloadedIcon,\n\t\t\t\t].filter(Boolean)\n\t\t\t\tconst name = nameParts.join(' ')\n\n\t\t\t\tconst descriptionParts = [\n\t\t\t\t\tw.instructorName ? `by ${w.instructorName}` : null,\n\t\t\t\t\tw.productDisplayName || w.productHost,\n\t\t\t\t\tw.description,\n\t\t\t\t].filter(Boolean)\n\t\t\t\tconst description = descriptionParts.join(' • ') || undefined\n\n\t\t\t\treturn {\n\t\t\t\t\tname,\n\t\t\t\t\tvalue: w.name,\n\t\t\t\t\tdescription,\n\t\t\t\t\tworkshop: w,\n\t\t\t\t}\n\t\t\t})\n\n\t\t\trepoName = await search({\n\t\t\t\tmessage: 'Select a workshop to add:',\n\t\t\t\tsource: async (input) => {\n\t\t\t\t\tif (!input) {\n\t\t\t\t\t\treturn allChoices\n\t\t\t\t\t}\n\t\t\t\t\treturn matchSorter(allChoices, input, {\n\t\t\t\t\t\tkeys: [\n\t\t\t\t\t\t\t{ key: 'name', threshold: rankings.CONTAINS },\n\t\t\t\t\t\t\t{ key: 'value', threshold: rankings.CONTAINS },\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkey: 'workshop.productDisplayName',\n\t\t\t\t\t\t\t\tthreshold: rankings.CONTAINS,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkey: 'workshop.instructorName',\n\t\t\t\t\t\t\t\tthreshold: rankings.CONTAINS,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ key: 'description', threshold: rankings.WORD_STARTS_WITH },\n\t\t\t\t\t\t],\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\t// Ensure config is set up first\n\t\tif (!(await ensureConfigured())) {\n\t\t\treturn { success: false, message: 'Setup cancelled' }\n\t\t}\n\n\t\tconst { getReposDirectory, workshopExists } = await import(\n\t\t\t'@epic-web/workshop-utils/workshops.server'\n\t\t)\n\n\t\t// Check if workshop already exists\n\t\tif (await workshopExists(repoName)) {\n\t\t\tconst message = `Workshop \"${repoName}\" already exists`\n\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\treturn { success: false, message }\n\t\t}\n\n\t\t// Get target directory\n\t\tconst reposDir = options.directory || (await getReposDirectory())\n\t\tconst workshopPath = path.join(reposDir, repoName)\n\n\t\t// Ensure the repos directory exists\n\t\tawait fs.promises.mkdir(reposDir, { recursive: true })\n\n\t\t// Check if directory already exists\n\t\ttry {\n\t\t\tawait fs.promises.access(workshopPath)\n\t\t\tconst message = `Directory already exists: ${workshopPath}`\n\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\treturn { success: false, message }\n\t\t} catch {\n\t\t\t// Directory doesn't exist, which is what we want\n\t\t}\n\n\t\tconst repoUrl = `https://github.com/${GITHUB_ORG}/${repoName}.git`\n\n\t\tif (!silent) {\n\t\t\tconsole.log(chalk.cyan(`📦 Cloning ${repoUrl}...`))\n\t\t}\n\n\t\t// Clone the repository\n\t\tconst cloneResult = await runCommand(\n\t\t\t'git',\n\t\t\t['clone', repoUrl, workshopPath],\n\t\t\t{\n\t\t\t\tcwd: reposDir,\n\t\t\t\tsilent,\n\t\t\t},\n\t\t)\n\n\t\tif (!cloneResult.success) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tmessage: `Failed to clone repository: ${cloneResult.message}`,\n\t\t\t\terror: cloneResult.error,\n\t\t\t}\n\t\t}\n\n\t\tif (!silent) {\n\t\t\tconsole.log(chalk.cyan(`🔧 Running npm run setup...`))\n\t\t}\n\n\t\t// Run npm run setup\n\t\tconst setupResult = await runCommand('npm', ['run', 'setup'], {\n\t\t\tcwd: workshopPath,\n\t\t\tsilent,\n\t\t})\n\n\t\tif (!setupResult.success) {\n\t\t\t// Clean up the cloned directory on setup failure\n\t\t\tif (!silent) {\n\t\t\t\tconsole.log(chalk.yellow(`🧹 Cleaning up cloned directory...`))\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait fs.promises.rm(workshopPath, { recursive: true, force: true })\n\t\t\t} catch {\n\t\t\t\t// Ignore cleanup errors\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tmessage: `Failed to run setup: ${setupResult.message}`,\n\t\t\t\terror: setupResult.error,\n\t\t\t}\n\t\t}\n\n\t\tconst message = `Workshop \"${repoName}\" added successfully at ${workshopPath}`\n\t\tif (!silent) {\n\t\t\tconsole.log(chalk.green(`✅ ${message}`))\n\t\t}\n\n\t\treturn { success: true, message }\n\t} catch (error) {\n\t\tif ((error as Error).message === 'USER_QUIT') {\n\t\t\treturn { success: false, message: 'User quit' }\n\t\t}\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tif (!silent) {\n\t\t\tconsole.error(chalk.red(`❌ ${message}`))\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\terror: error instanceof Error ? error : new Error(message),\n\t\t}\n\t}\n}\n\n/**\n * List all workshops found in the repos directory\n */\nexport async function list({\n\tsilent = false,\n}: { silent?: boolean } = {}): Promise<WorkshopsResult> {\n\ttry {\n\t\t// Ensure config is set up first\n\t\tif (!(await ensureConfigured())) {\n\t\t\treturn { success: false, message: 'Setup cancelled' }\n\t\t}\n\n\t\tconst { listWorkshops, getReposDirectory } = await import(\n\t\t\t'@epic-web/workshop-utils/workshops.server'\n\t\t)\n\n\t\tconst workshops = await listWorkshops()\n\t\tconst reposDir = await getReposDirectory()\n\n\t\tif (workshops.length === 0) {\n\t\t\tconst message = `No workshops found. Use 'epicshop add <repo-name>' to add one.`\n\t\t\tif (!silent) {\n\t\t\t\tconsole.log(chalk.yellow(message))\n\t\t\t\tconsole.log(chalk.gray(`\\nWorkshops directory: ${reposDir}`))\n\t\t\t}\n\t\t\treturn { success: true, message }\n\t\t}\n\n\t\tif (silent) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tmessage: `Found ${workshops.length} workshop(s)`,\n\t\t\t}\n\t\t}\n\n\t\t// Interactive selection\n\t\tconst { search } = await import('@inquirer/prompts')\n\n\t\tconst allChoices = workshops.map((w) => ({\n\t\t\tname: `${w.title} (${w.repoName})`,\n\t\t\tvalue: w,\n\t\t\tdescription: w.path,\n\t\t}))\n\n\t\tconsole.log(chalk.bold.cyan('\\n📚 Your Workshops:\\n'))\n\n\t\tconst selectedWorkshop = await search({\n\t\t\tmessage: 'Select a workshop:',\n\t\t\tsource: async (input) => {\n\t\t\t\tif (!input) {\n\t\t\t\t\treturn allChoices\n\t\t\t\t}\n\t\t\t\treturn matchSorter(allChoices, input, {\n\t\t\t\t\tkeys: [\n\t\t\t\t\t\t'name',\n\t\t\t\t\t\t'value.repoName',\n\t\t\t\t\t\t'value.title',\n\t\t\t\t\t\t'value.subtitle',\n\t\t\t\t\t\t'description',\n\t\t\t\t\t],\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\n\t\t// Show actions for selected workshop\n\t\tconst actionChoices = [\n\t\t\t{\n\t\t\t\tname: 'Start workshop',\n\t\t\t\tvalue: 'start',\n\t\t\t\tdescription: 'Run npm start in the workshop directory',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Open in editor',\n\t\t\t\tvalue: 'open',\n\t\t\t\tdescription: 'Open the workshop in your code editor',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Remove workshop',\n\t\t\t\tvalue: 'remove',\n\t\t\t\tdescription: 'Delete the workshop directory',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Back to list',\n\t\t\t\tvalue: 'back',\n\t\t\t\tdescription: 'Go back to workshop selection',\n\t\t\t},\n\t\t]\n\n\t\tconst action = await search({\n\t\t\tmessage: `What would you like to do with \"${selectedWorkshop.title}\"?`,\n\t\t\tsource: async (input) => {\n\t\t\t\tif (!input) {\n\t\t\t\t\treturn actionChoices\n\t\t\t\t}\n\t\t\t\treturn matchSorter(actionChoices, input, {\n\t\t\t\t\tkeys: ['name', 'value', 'description'],\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\n\t\tswitch (action) {\n\t\t\tcase 'start':\n\t\t\t\treturn await startWorkshop({ workshop: selectedWorkshop.repoName })\n\t\t\tcase 'open':\n\t\t\t\treturn await openWorkshop({ workshop: selectedWorkshop.repoName })\n\t\t\tcase 'remove':\n\t\t\t\treturn await remove({ workshop: selectedWorkshop.repoName })\n\t\t\tcase 'back':\n\t\t\t\treturn await list({ silent })\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tmessage: `Found ${workshops.length} workshop(s)`,\n\t\t}\n\t} catch (error) {\n\t\tif ((error as Error).message === 'USER_QUIT') {\n\t\t\treturn { success: false, message: 'User quit' }\n\t\t}\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tif (!silent) {\n\t\t\tconsole.error(chalk.red(`❌ ${message}`))\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\terror: error instanceof Error ? error : new Error(message),\n\t\t}\n\t}\n}\n\n/**\n * Remove a workshop (deletes the directory)\n */\nexport async function remove({\n\tworkshop,\n\tsilent = false,\n}: {\n\tworkshop?: string\n\tsilent?: boolean\n}): Promise<WorkshopsResult> {\n\ttry {\n\t\tconst {\n\t\t\tgetWorkshop,\n\t\t\tgetWorkshopByPath,\n\t\t\tlistWorkshops,\n\t\t\tgetUnpushedChanges,\n\t\t\tdeleteWorkshop,\n\t\t} = await import('@epic-web/workshop-utils/workshops.server')\n\n\t\tlet workshopData\n\n\t\t// If workshop specified, try to find it\n\t\tif (workshop) {\n\t\t\t// First check if it's a path (absolute or looks like a directory)\n\t\t\tif (workshop.startsWith('/') || workshop.includes(path.sep)) {\n\t\t\t\t// Try to find by path\n\t\t\t\tworkshopData = await getWorkshopByPath(workshop)\n\t\t\t\tif (!workshopData) {\n\t\t\t\t\tconst message = `Workshop at \"${workshop}\" is not in your repos directory and cannot be removed via epicshop. Delete it manually if needed.`\n\t\t\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\t\t\treturn { success: false, message }\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// It's a workshop name, look it up\n\t\t\t\tworkshopData = await getWorkshop(workshop)\n\t\t\t\tif (!workshopData) {\n\t\t\t\t\tconst message = `Workshop \"${workshop}\" not found`\n\t\t\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\t\t\treturn { success: false, message }\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Ensure config is set up first for interactive selection\n\t\t\tif (!(await ensureConfigured())) {\n\t\t\t\treturn { success: false, message: 'Setup cancelled' }\n\t\t\t}\n\n\t\t\t// No workshop specified, prompt for selection\n\t\t\tconst workshops = await listWorkshops()\n\n\t\t\tif (workshops.length === 0) {\n\t\t\t\tconst message = `No workshops to remove. Use 'epicshop add <repo-name>' to add one first.`\n\t\t\t\tif (!silent) console.log(chalk.yellow(message))\n\t\t\t\treturn { success: false, message }\n\t\t\t}\n\n\t\t\tconst { search } = await import('@inquirer/prompts')\n\n\t\t\tconst allChoices = workshops.map((w) => ({\n\t\t\t\tname: `${w.title} (${w.repoName})`,\n\t\t\t\tvalue: w,\n\t\t\t\tdescription: w.path,\n\t\t\t}))\n\n\t\t\tworkshopData = await search({\n\t\t\t\tmessage: 'Select a workshop to remove:',\n\t\t\t\tsource: async (input) => {\n\t\t\t\t\tif (!input) {\n\t\t\t\t\t\treturn allChoices\n\t\t\t\t\t}\n\t\t\t\t\treturn matchSorter(allChoices, input, {\n\t\t\t\t\t\tkeys: ['name', 'value.repoName', 'value.title', 'description'],\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\tif (!workshopData) {\n\t\t\tconst message = 'No workshop selected'\n\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\treturn { success: false, message }\n\t\t}\n\n\t\t// Check for unpushed changes\n\t\tconst unpushed = await getUnpushedChanges(workshopData.path)\n\n\t\tif (unpushed.hasUnpushed) {\n\t\t\tconsole.log()\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellow.bold(\n\t\t\t\t\t`⚠️ Warning: \"${workshopData.title}\" has unpushed changes:\\n`,\n\t\t\t\t),\n\t\t\t)\n\t\t\tfor (const line of unpushed.summary) {\n\t\t\t\tconsole.log(chalk.yellow(` • ${line}`))\n\t\t\t}\n\t\t\tconsole.log()\n\n\t\t\tconst { confirm } = await import('@inquirer/prompts')\n\t\t\tconst shouldDelete = await confirm({\n\t\t\t\tmessage: `Delete \"${workshopData.title}\" anyway? This cannot be undone.`,\n\t\t\t\tdefault: false,\n\t\t\t})\n\n\t\t\tif (!shouldDelete) {\n\t\t\t\tconst message = 'Removal cancelled'\n\t\t\t\tif (!silent) console.log(chalk.gray(message))\n\t\t\t\treturn { success: false, message }\n\t\t\t}\n\t\t} else {\n\t\t\t// No unpushed changes, but still confirm deletion\n\t\t\tconst { confirm } = await import('@inquirer/prompts')\n\t\t\tconst shouldDelete = await confirm({\n\t\t\t\tmessage: `Delete \"${workshopData.title}\" at ${workshopData.path}?`,\n\t\t\t\tdefault: false,\n\t\t\t})\n\n\t\t\tif (!shouldDelete) {\n\t\t\t\tconst message = 'Removal cancelled'\n\t\t\t\tif (!silent) console.log(chalk.gray(message))\n\t\t\t\treturn { success: false, message }\n\t\t\t}\n\t\t}\n\n\t\t// Delete the workshop directory\n\t\tawait deleteWorkshop(workshopData.path)\n\n\t\tconst message = `Workshop \"${workshopData.title}\" deleted successfully`\n\t\tif (!silent) console.log(chalk.green(`✅ ${message}`))\n\t\treturn { success: true, message }\n\t} catch (error) {\n\t\tif ((error as Error).message === 'USER_QUIT') {\n\t\t\treturn { success: false, message: 'User quit' }\n\t\t}\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tif (!silent) {\n\t\t\tconsole.error(chalk.red(`❌ ${message}`))\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\terror: error instanceof Error ? error : new Error(message),\n\t\t}\n\t}\n}\n\n/**\n * Start a workshop\n */\nexport async function startWorkshop(\n\toptions: StartOptions = {},\n): Promise<WorkshopsResult> {\n\tconst { silent = false } = options\n\n\ttry {\n\t\t// Ensure config is set up first\n\t\tif (!(await ensureConfigured())) {\n\t\t\treturn { success: false, message: 'Setup cancelled' }\n\t\t}\n\n\t\tconst { listWorkshops, getWorkshop } = await import(\n\t\t\t'@epic-web/workshop-utils/workshops.server'\n\t\t)\n\n\t\tlet workshopToStart\n\n\t\t// If workshop specified, look it up and fail if not found\n\t\tif (options.workshop) {\n\t\t\tworkshopToStart = await getWorkshop(options.workshop)\n\t\t\tif (!workshopToStart) {\n\t\t\t\tconst message = `Workshop \"${options.workshop}\" not found`\n\t\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\t\treturn { success: false, message }\n\t\t\t}\n\t\t} else {\n\t\t\t// No workshop specified, show selection\n\t\t\tconst workshops = await listWorkshops()\n\n\t\t\tif (workshops.length === 0) {\n\t\t\t\tconst message = `No workshops found. Use 'epicshop add <repo-name>' to add one.`\n\t\t\t\tif (!silent) console.log(chalk.yellow(message))\n\t\t\t\treturn { success: false, message }\n\t\t\t}\n\n\t\t\t// Interactive selection\n\t\t\tconst { search } = await import('@inquirer/prompts')\n\n\t\t\tconst allChoices = workshops.map((w) => ({\n\t\t\t\tname: `${w.title} (${w.repoName})`,\n\t\t\t\tvalue: w,\n\t\t\t\tdescription: w.path,\n\t\t\t}))\n\n\t\t\tworkshopToStart = await search({\n\t\t\t\tmessage: 'Select a workshop to start:',\n\t\t\t\tsource: async (input) => {\n\t\t\t\t\tif (!input) {\n\t\t\t\t\t\treturn allChoices\n\t\t\t\t\t}\n\t\t\t\t\treturn matchSorter(allChoices, input, {\n\t\t\t\t\t\tkeys: [\n\t\t\t\t\t\t\t'name',\n\t\t\t\t\t\t\t'value.repoName',\n\t\t\t\t\t\t\t'value.title',\n\t\t\t\t\t\t\t'value.subtitle',\n\t\t\t\t\t\t\t'description',\n\t\t\t\t\t\t],\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\tif (!workshopToStart) {\n\t\t\tconst message = 'No workshop selected'\n\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\treturn { success: false, message }\n\t\t}\n\n\t\t// Check if the workshop directory exists\n\t\tif (!(await directoryExists(workshopToStart.path))) {\n\t\t\tconst message = `Workshop directory not found: ${workshopToStart.path}`\n\t\t\tif (!silent) console.log(chalk.red(`❌ ${message}`))\n\t\t\treturn { success: false, message }\n\t\t}\n\n\t\tif (!silent) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.cyan(`🚀 Starting ${chalk.bold(workshopToStart.title)}...`),\n\t\t\t)\n\t\t\tconsole.log(chalk.gray(` Path: ${workshopToStart.path}\\n`))\n\t\t}\n\n\t\t// Run npm start in the workshop directory\n\t\tconst startResult = await runCommandInteractive('npm', ['start'], {\n\t\t\tcwd: workshopToStart.path,\n\t\t})\n\n\t\tif (!startResult.success) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tmessage: `Failed to start workshop: ${startResult.message}`,\n\t\t\t\terror: startResult.error,\n\t\t\t}\n\t\t}\n\n\t\treturn { success: true, message: 'Workshop started' }\n\t} catch (error) {\n\t\tif ((error as Error).message === 'USER_QUIT') {\n\t\t\treturn { success: false, message: 'User quit' }\n\t\t}\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tif (!silent) {\n\t\t\tconsole.error(chalk.red(`❌ ${message}`))\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\terror: error instanceof Error ? error : new Error(message),\n\t\t}\n\t}\n}\n\n/**\n * Open a workshop in the user's editor\n */\nexport async function openWorkshop(\n\toptions: StartOptions = {},\n): Promise<WorkshopsResult> {\n\tconst { silent = false } = options\n\n\ttry {\n\t\tconst { listWorkshops, getWorkshop, getWorkshopByPath } = await import(\n\t\t\t'@epic-web/workshop-utils/workshops.server'\n\t\t)\n\t\tconst { launchEditor } = await import(\n\t\t\t'@epic-web/workshop-utils/launch-editor.server'\n\t\t)\n\n\t\tlet workshopToOpen\n\n\t\t// If workshop specified, try to find it\n\t\tif (options.workshop) {\n\t\t\t// First check if it's a path (absolute or looks like a directory)\n\t\t\tif (\n\t\t\t\toptions.workshop.startsWith('/') ||\n\t\t\t\toptions.workshop.includes(path.sep)\n\t\t\t) {\n\t\t\t\t// Try to find by path first\n\t\t\t\tworkshopToOpen = await getWorkshopByPath(options.workshop)\n\t\t\t\tif (!workshopToOpen) {\n\t\t\t\t\t// Not in managed workshops, but if it's a valid workshop dir, open it directly\n\t\t\t\t\tconst pkgPath = path.join(options.workshop, 'package.json')\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst pkgContent = await fs.promises.readFile(pkgPath, 'utf-8')\n\t\t\t\t\t\tconst pkg = JSON.parse(pkgContent) as {\n\t\t\t\t\t\t\tname?: string\n\t\t\t\t\t\t\tepicshop?: { title?: string }\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (pkg.epicshop) {\n\t\t\t\t\t\t\t// It's a valid workshop directory, create a minimal workshop object\n\t\t\t\t\t\t\tworkshopToOpen = {\n\t\t\t\t\t\t\t\tname: pkg.name || path.basename(options.workshop),\n\t\t\t\t\t\t\t\ttitle: pkg.epicshop.title || path.basename(options.workshop),\n\t\t\t\t\t\t\t\trepoName: path.basename(options.workshop),\n\t\t\t\t\t\t\t\tpath: options.workshop,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Not a valid workshop directory\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// It's a workshop name, look it up\n\t\t\t\tworkshopToOpen = await getWorkshop(options.workshop)\n\t\t\t}\n\n\t\t\tif (!workshopToOpen) {\n\t\t\t\tconst message = `Workshop \"${options.workshop}\" not found`\n\t\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\t\treturn { success: false, message }\n\t\t\t}\n\t\t} else {\n\t\t\t// Ensure config is set up first for interactive selection\n\t\t\tif (!(await ensureConfigured())) {\n\t\t\t\treturn { success: false, message: 'Setup cancelled' }\n\t\t\t}\n\t\t\t// No workshop specified, show selection\n\t\t\tconst workshops = await listWorkshops()\n\n\t\t\tif (workshops.length === 0) {\n\t\t\t\tconst message = `No workshops found. Use 'epicshop add <repo-name>' to add one.`\n\t\t\t\tif (!silent) console.log(chalk.yellow(message))\n\t\t\t\treturn { success: false, message }\n\t\t\t}\n\n\t\t\t// Interactive selection\n\t\t\tconst { search } = await import('@inquirer/prompts')\n\n\t\t\tconst allChoices = workshops.map((w) => ({\n\t\t\t\tname: `${w.title} (${w.repoName})`,\n\t\t\t\tvalue: w,\n\t\t\t\tdescription: w.path,\n\t\t\t}))\n\n\t\t\tworkshopToOpen = await search({\n\t\t\t\tmessage: 'Select a workshop to open:',\n\t\t\t\tsource: async (input) => {\n\t\t\t\t\tif (!input) {\n\t\t\t\t\t\treturn allChoices\n\t\t\t\t\t}\n\t\t\t\t\treturn matchSorter(allChoices, input, {\n\t\t\t\t\t\tkeys: [\n\t\t\t\t\t\t\t'name',\n\t\t\t\t\t\t\t'value.repoName',\n\t\t\t\t\t\t\t'value.title',\n\t\t\t\t\t\t\t'value.subtitle',\n\t\t\t\t\t\t\t'description',\n\t\t\t\t\t\t],\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\tif (!workshopToOpen) {\n\t\t\tconst message = 'No workshop selected'\n\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\treturn { success: false, message }\n\t\t}\n\n\t\t// Check if the workshop directory exists\n\t\tif (!(await directoryExists(workshopToOpen.path))) {\n\t\t\tconst message = `Workshop directory not found: ${workshopToOpen.path}`\n\t\t\tif (!silent) console.log(chalk.red(`❌ ${message}`))\n\t\t\treturn { success: false, message }\n\t\t}\n\n\t\tif (!silent) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.cyan(\n\t\t\t\t\t`📂 Opening ${chalk.bold(workshopToOpen.title)} in your editor...`,\n\t\t\t\t),\n\t\t\t)\n\t\t\tconsole.log(chalk.gray(` Path: ${workshopToOpen.path}\\n`))\n\t\t}\n\n\t\t// Launch the editor with the workshop directory\n\t\tconst result = await launchEditor(workshopToOpen.path)\n\n\t\tif (result.status === 'error') {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tmessage: result.message,\n\t\t\t}\n\t\t}\n\n\t\treturn { success: true, message: 'Workshop opened in editor' }\n\t} catch (error) {\n\t\tif ((error as Error).message === 'USER_QUIT') {\n\t\t\treturn { success: false, message: 'User quit' }\n\t\t}\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tif (!silent) {\n\t\t\tconsole.error(chalk.red(`❌ ${message}`))\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\terror: error instanceof Error ? error : new Error(message),\n\t\t}\n\t}\n}\n\n/**\n * Configure workshops settings\n */\nexport async function config(\n\toptions: ConfigOptions = {},\n): Promise<WorkshopsResult> {\n\tconst { silent = false } = options\n\n\ttry {\n\t\tconst {\n\t\t\tgetReposDirectory,\n\t\t\tsetReposDirectory,\n\t\t\tisReposDirectoryConfigured,\n\t\t\tloadConfig,\n\t\t\tsaveConfig,\n\t\t\tgetDefaultReposDir,\n\t\t\tdeleteConfig,\n\t\t} = await import('@epic-web/workshop-utils/workshops.server')\n\n\t\t// Handle reset subcommand\n\t\tif (options.subcommand === 'reset' || options.subcommand === 'delete') {\n\t\t\tif (silent) {\n\t\t\t\tawait deleteConfig()\n\t\t\t\treturn { success: true, message: 'Config file deleted' }\n\t\t\t}\n\n\t\t\tconst { confirm } = await import('@inquirer/prompts')\n\t\t\tconst shouldDelete = await confirm({\n\t\t\t\tmessage:\n\t\t\t\t\t'Are you sure you want to delete the config file? This will reset all settings to defaults.',\n\t\t\t\tdefault: false,\n\t\t\t})\n\n\t\t\tif (shouldDelete) {\n\t\t\t\tawait deleteConfig()\n\t\t\t\tconst message = 'Config file deleted. All settings reset to defaults.'\n\t\t\t\tconsole.log(chalk.green(`✅ ${message}`))\n\t\t\t\treturn { success: true, message }\n\t\t\t} else {\n\t\t\t\tconsole.log(chalk.gray('No changes made.'))\n\t\t\t\treturn { success: true, message: 'Cancelled' }\n\t\t\t}\n\t\t}\n\n\t\tif (options.reposDir) {\n\t\t\t// Set the repos directory directly via CLI flag\n\t\t\tconst resolvedPath = path.resolve(options.reposDir)\n\t\t\tawait setReposDirectory(resolvedPath)\n\t\t\tconst message = `Repos directory set to: ${resolvedPath}`\n\t\t\tif (!silent) console.log(chalk.green(`✅ ${message}`))\n\t\t\treturn { success: true, message }\n\t\t}\n\n\t\tif (silent) {\n\t\t\t// In silent mode, just return current config\n\t\t\tconst reposDir = await getReposDirectory()\n\t\t\treturn { success: true, message: `Repos directory: ${reposDir}` }\n\t\t}\n\n\t\t// Interactive config selection\n\t\tconst { search, confirm } = await import('@inquirer/prompts')\n\n\t\tconst reposDir = await getReposDirectory()\n\t\tconst isConfigured = await isReposDirectoryConfigured()\n\t\tconst defaultDir = getDefaultReposDir()\n\n\t\t// Build config options\n\t\tconst configOptions = [\n\t\t\t{\n\t\t\t\tname: `Repos directory`,\n\t\t\t\tvalue: 'repos-dir',\n\t\t\t\tdescription: isConfigured ? reposDir : `${reposDir} (default)`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: `Reset config file`,\n\t\t\t\tvalue: 'reset',\n\t\t\t\tdescription: 'Delete config file and reset all settings to defaults',\n\t\t\t},\n\t\t]\n\n\t\tconsole.log(chalk.bold.cyan('\\n⚙️ Workshop Configuration\\n'))\n\n\t\tconst selectedConfig = await search({\n\t\t\tmessage: 'Select a setting to configure:',\n\t\t\tsource: async (input) => {\n\t\t\t\tif (!input) return configOptions\n\t\t\t\treturn matchSorter(configOptions, input, {\n\t\t\t\t\tkeys: ['name', 'value', 'description'],\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\n\t\tif (selectedConfig === 'reset') {\n\t\t\tconst shouldDelete = await confirm({\n\t\t\t\tmessage:\n\t\t\t\t\t'Are you sure you want to delete the config file? This will reset all settings to defaults.',\n\t\t\t\tdefault: false,\n\t\t\t})\n\n\t\t\tif (shouldDelete) {\n\t\t\t\tawait deleteConfig()\n\t\t\t\tconsole.log()\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.green(\n\t\t\t\t\t\t`✅ Config file deleted. All settings reset to defaults.`,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tmessage: 'Config file deleted. All settings reset to defaults.',\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconsole.log(chalk.gray('\\nNo changes made.'))\n\t\t\t\treturn { success: true, message: 'Cancelled' }\n\t\t\t}\n\t\t}\n\n\t\tif (selectedConfig === 'repos-dir') {\n\t\t\t// Show current value and actions\n\t\t\tconsole.log()\n\t\t\tconsole.log(chalk.bold(' Current value:'))\n\t\t\tif (isConfigured) {\n\t\t\t\tconsole.log(chalk.white(` ${reposDir}`))\n\t\t\t} else {\n\t\t\t\tconsole.log(chalk.gray(` ${reposDir} (default, not explicitly set)`))\n\t\t\t}\n\t\t\tconsole.log()\n\n\t\t\tconst actionChoices = [\n\t\t\t\t{\n\t\t\t\t\tname: 'Edit',\n\t\t\t\t\tvalue: 'edit',\n\t\t\t\t\tdescription: 'Change the repos directory',\n\t\t\t\t},\n\t\t\t\t...(isConfigured\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tname: 'Remove',\n\t\t\t\t\t\t\t\tvalue: 'remove',\n\t\t\t\t\t\t\t\tdescription: `Reset to default (${defaultDir})`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]\n\t\t\t\t\t: []),\n\t\t\t\t{\n\t\t\t\t\tname: 'Cancel',\n\t\t\t\t\tvalue: 'cancel',\n\t\t\t\t\tdescription: 'Go back without changes',\n\t\t\t\t},\n\t\t\t]\n\n\t\t\tconst action = await search({\n\t\t\t\tmessage: 'What would you like to do?',\n\t\t\t\tsource: async (input) => {\n\t\t\t\t\tif (!input) return actionChoices\n\t\t\t\t\treturn matchSorter(actionChoices, input, {\n\t\t\t\t\t\tkeys: ['name', 'value', 'description'],\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tif (action === 'edit') {\n\t\t\t\tconsole.log()\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.cyan('🐨 Use the directory browser to select a new location.'),\n\t\t\t\t)\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.gray(' Type to search, use arrow keys to navigate.\\n'),\n\t\t\t\t)\n\n\t\t\t\tconst newDir = await browseDirectory(\n\t\t\t\t\tisConfigured ? reposDir : path.dirname(defaultDir),\n\t\t\t\t)\n\t\t\t\tconst resolvedPath = path.resolve(newDir)\n\t\t\t\tawait setReposDirectory(resolvedPath)\n\n\t\t\t\tconsole.log()\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.green(`✅ Repos directory set to: ${chalk.bold(resolvedPath)}`),\n\t\t\t\t)\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tmessage: `Repos directory set to: ${resolvedPath}`,\n\t\t\t\t}\n\t\t\t} else if (action === 'remove') {\n\t\t\t\tconst shouldRemove = await confirm({\n\t\t\t\t\tmessage: `Reset repos directory to default (${defaultDir})?`,\n\t\t\t\t\tdefault: false,\n\t\t\t\t})\n\n\t\t\t\tif (shouldRemove) {\n\t\t\t\t\tconst currentConfig = await loadConfig()\n\t\t\t\t\tdelete currentConfig.reposDirectory\n\t\t\t\t\tawait saveConfig(currentConfig)\n\n\t\t\t\t\tconsole.log()\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.green(\n\t\t\t\t\t\t\t`✅ Repos directory reset to default: ${chalk.bold(defaultDir)}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tmessage: `Repos directory reset to default: ${defaultDir}`,\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(chalk.gray('\\nNo changes made.'))\n\t\t\t\t\treturn { success: true, message: 'Cancelled' }\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconsole.log(chalk.gray('\\nNo changes made.'))\n\t\t\t\treturn { success: true, message: 'Cancelled' }\n\t\t\t}\n\t\t}\n\n\t\treturn { success: true, message: 'Config viewed' }\n\t} catch (error) {\n\t\tif ((error as Error).message === 'USER_QUIT') {\n\t\t\treturn { success: false, message: 'User quit' }\n\t\t}\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tif (!silent) {\n\t\t\tconsole.error(chalk.red(`❌ ${message}`))\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\terror: error instanceof Error ? error : new Error(message),\n\t\t}\n\t}\n}\n\n/**\n * Check if the workshops directory is configured, and run onboarding if not\n * Call this at the start of any command that requires the config to be set\n */\nexport async function ensureConfigured(): Promise<boolean> {\n\tconst { isReposDirectoryConfigured } = await import(\n\t\t'@epic-web/workshop-utils/workshops.server'\n\t)\n\n\tif (await isReposDirectoryConfigured()) {\n\t\treturn true\n\t}\n\n\t// Not configured, run onboarding\n\tconst result = await onboarding()\n\treturn result.success\n}\n\n/**\n * Run the onboarding flow for new users\n */\nexport async function onboarding(): Promise<WorkshopsResult> {\n\ttry {\n\t\tconst {\n\t\t\tisReposDirectoryConfigured,\n\t\t\tgetDefaultReposDir,\n\t\t\tsetReposDirectory,\n\t\t} = await import('@epic-web/workshop-utils/workshops.server')\n\n\t\t// Check if already configured\n\t\tif (await isReposDirectoryConfigured()) {\n\t\t\t// Already configured, check for tutorial\n\t\t\treturn await ensureTutorialAndStart()\n\t\t}\n\n\t\t// Welcome message from Kody\n\t\tconsole.log()\n\t\tconsole.log(\n\t\t\tchalk.cyan(\n\t\t\t\t\"🐨 Hey there! Welcome to the epicshop CLI. I'm Kody the Koala, and I'm here to help you learn.\",\n\t\t\t),\n\t\t)\n\t\tconsole.log(\n\t\t\tchalk.cyan(\n\t\t\t\t\" It looks like this is the first time you're using epicshop, so I'm going to help you get set up and get you started with the tutorial.\",\n\t\t\t),\n\t\t)\n\t\tconsole.log(\n\t\t\tchalk.gray(\n\t\t\t\t` Once you're finished going through the tutorial, feel free to run ${chalk.underline(`npx epicshop ${process.argv.slice(2).join(' ')}`)} again.\\n`,\n\t\t\t),\n\t\t)\n\n\t\tconsole.log(\n\t\t\tchalk.white(' First, we need to choose where to store your workshops.'),\n\t\t)\n\t\tconsole.log(\n\t\t\tchalk.white(\n\t\t\t\t' Workshops are cloned from GitHub and stored in a directory of your choice.\\n',\n\t\t\t),\n\t\t)\n\n\t\t// Prompt for directory configuration\n\t\tconst { confirm } = await import('@inquirer/prompts')\n\t\tconst defaultDir = getDefaultReposDir()\n\n\t\tconsole.log(chalk.gray(` Recommended: ${chalk.white(defaultDir)}\\n`))\n\n\t\tconst useDefault = await confirm({\n\t\t\tmessage: 'Use the recommended directory?',\n\t\t\tdefault: true,\n\t\t})\n\n\t\tlet reposDir: string\n\t\tif (useDefault) {\n\t\t\treposDir = defaultDir\n\t\t} else {\n\t\t\tconsole.log()\n\t\t\tconsole.log(\n\t\t\t\tchalk.cyan(\n\t\t\t\t\t'🐨 No problem! Use the directory browser to find your preferred location.',\n\t\t\t\t),\n\t\t\t)\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(' Type to search, use arrow keys to navigate.\\n'),\n\t\t\t)\n\t\t\treposDir = await browseDirectory(path.dirname(defaultDir))\n\t\t}\n\n\t\t// Resolve and save the directory\n\t\tconst resolvedPath = path.resolve(reposDir)\n\t\tawait setReposDirectory(resolvedPath)\n\n\t\tconsole.log()\n\t\tconsole.log(\n\t\t\tchalk.green(`✅ Workshops directory set to: ${chalk.bold(resolvedPath)}`),\n\t\t)\n\t\tconsole.log()\n\n\t\t// Ensure directory exists\n\t\tawait fs.promises.mkdir(resolvedPath, { recursive: true })\n\n\t\t// Offer site login right after workshop directory setup\n\t\tawait runSiteLoginOnboarding()\n\n\t\t// Offer to set up any workshops the user wants (optional)\n\t\tawait promptAndSetupAccessibleWorkshops()\n\n\t\t// Now check for tutorial and start it\n\t\treturn await ensureTutorialAndStart()\n\t} catch (error) {\n\t\tif ((error as Error).message === 'USER_QUIT') {\n\t\t\treturn { success: false, message: 'User quit' }\n\t\t}\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tconsole.error(chalk.red(`❌ ${message}`))\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\terror: error instanceof Error ? error : new Error(message),\n\t\t}\n\t}\n}\n\nfunction isValidLoginInfo(authInfo: unknown): authInfo is {\n\temail: string\n\tname?: string | null\n\ttokenSet: { access_token: string }\n} {\n\tif (!authInfo || typeof authInfo !== 'object') return false\n\tconst a = authInfo as any\n\treturn (\n\t\ttypeof a.email === 'string' &&\n\t\ta.email.length > 3 &&\n\t\ttypeof a.tokenSet?.access_token === 'string' &&\n\t\ta.tokenSet.access_token.length > 10\n\t)\n}\n\nasync function runSiteLoginOnboarding(): Promise<void> {\n\tconst { search } = await import('@inquirer/prompts')\n\tconst { login } = await import('./auth.js')\n\n\twhile (true) {\n\t\tconst siteStatuses = await Promise.all(\n\t\t\tEPIC_SITES.map(async (site) => {\n\t\t\t\tconst authInfo = await getAuthInfo({ productHost: site.host })\n\t\t\t\treturn { site, authInfo, loggedIn: isValidLoginInfo(authInfo) }\n\t\t\t}),\n\t\t)\n\n\t\tconsole.log(chalk.bold.cyan('\\n🔐 Site Login\\n'))\n\t\tfor (const { site, authInfo, loggedIn } of siteStatuses) {\n\t\t\tif (loggedIn && isValidLoginInfo(authInfo)) {\n\t\t\t\tconst name = authInfo.name ? ` (${authInfo.name})` : ''\n\t\t\t\tconsole.log(\n\t\t\t\t\t` ${chalk.green('✓')} ${chalk.bold(site.name)}: ${chalk.green('Logged in')} as ${chalk.cyan(authInfo.email)}${name}`,\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tconsole.log(\n\t\t\t\t\t` ${chalk.gray('○')} ${chalk.bold(site.name)}: ${chalk.gray('Not logged in')}`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tconsole.log()\n\n\t\t// If already logged in everywhere, move on\n\t\tif (siteStatuses.every((s) => s.loggedIn)) {\n\t\t\treturn\n\t\t}\n\n\t\tconsole.log(\n\t\t\tchalk.gray(\n\t\t\t\t` Logging in is optional. If you don’t have an account yet, you can create a free one on any of these sites.\\n`,\n\t\t\t),\n\t\t)\n\n\t\tconst remaining = siteStatuses.filter((s) => !s.loggedIn).map((s) => s.site)\n\t\tconst choices = [\n\t\t\t...remaining.map((h) => ({\n\t\t\t\tname: `Log in to ${h.name}`,\n\t\t\t\tvalue: h.host,\n\t\t\t\tdescription: h.description,\n\t\t\t})),\n\t\t\t{\n\t\t\t\tname: `Skip login`,\n\t\t\t\tvalue: 'skip' as const,\n\t\t\t\tdescription: 'Continue without logging in',\n\t\t\t},\n\t\t]\n\n\t\tconst selection = await search({\n\t\t\tmessage: 'Would you like to log in to any of these sites now?',\n\t\t\tsource: async (input) => {\n\t\t\t\tif (!input) return choices\n\t\t\t\treturn matchSorter(choices, input, {\n\t\t\t\t\tkeys: ['name', 'value', 'description'],\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\n\t\tif (selection === 'skip') {\n\t\t\treturn\n\t\t}\n\n\t\t// Run the existing login flow for the selected site\n\t\tlet result: { success: boolean; message?: string; error?: Error }\n\t\ttry {\n\t\t\tresult = await login({ domain: selection, silent: false })\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\t\tresult = { success: false, message, error: error as Error }\n\t\t}\n\n\t\tif (!result.success) {\n\t\t\tconsole.log()\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellow(\n\t\t\t\t\t`⚠️ Login didn’t complete (${result.message ?? 'unknown error'}). You can try again, choose a different site, or skip.\\n`,\n\t\t\t\t),\n\t\t\t)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nasync function promptAndSetupAccessibleWorkshops(): Promise<void> {\n\tconst { workshopExists } = await import(\n\t\t'@epic-web/workshop-utils/workshops.server'\n\t)\n\n\tconsole.log(chalk.bold.cyan('\\n📚 Workshop Setup\\n'))\n\tconsole.log(\n\t\tchalk.cyan(\n\t\t\t'🐨 Next, you can select any workshops you’d like me to set up for you.',\n\t\t),\n\t)\n\tconsole.log(\n\t\tchalk.gray(\n\t\t\t' This will clone each workshop repo into your workshops directory and run `npm run setup`.\\n' +\n\t\t\t\t' (If something fails, we’ll keep going and you can retry later with `npx epicshop add`.)\\n',\n\t\t),\n\t)\n\n\tconst { search } = await import('@inquirer/prompts')\n\n\tconst spinner = ora('Fetching available workshops...').start()\n\tlet enrichedWorkshops: EnrichedWorkshop[]\n\ttry {\n\t\tconst workshops = await fetchAvailableWorkshops()\n\t\tif (workshops.length === 0) {\n\t\t\tspinner.fail('No workshops found on GitHub')\n\t\t\tconsole.log(chalk.gray('\\nContinuing...\\n'))\n\t\t\treturn\n\t\t}\n\n\t\tspinner.text = 'Loading workshop details...'\n\t\tenrichedWorkshops = await enrichWorkshopsWithMetadata(workshops)\n\n\t\tspinner.text = 'Checking download status...'\n\t\tenrichedWorkshops = await checkWorkshopDownloadStatus(enrichedWorkshops)\n\n\t\tconst authStatusMap = await checkAuthStatus(enrichedWorkshops)\n\t\tconst sitesNotLoggedIn = Array.from(authStatusMap.entries())\n\t\t\t.filter(([, isLoggedIn]) => !isLoggedIn)\n\t\t\t.map(([host]) => host)\n\n\t\tif (sitesNotLoggedIn.length > 0) {\n\t\t\tspinner.stop()\n\t\t\tconst siteNames = sitesNotLoggedIn.map((host) => {\n\t\t\t\tconst workshop = enrichedWorkshops.find((w) => w.productHost === host)\n\t\t\t\treturn workshop?.productDisplayName || host\n\t\t\t})\n\t\t\tconsole.log()\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellow(\n\t\t\t\t\t`💡 Tip: You’re not logged in to ${siteNames.join(\n\t\t\t\t\t\t', ',\n\t\t\t\t\t)}. Logging in can help us confirm which workshops you have access to.`,\n\t\t\t\t),\n\t\t\t)\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(` To log in, run: ${chalk.cyan('npx epicshop auth')}`),\n\t\t\t)\n\t\t\tconsole.log()\n\t\t\tspinner.start('Checking access...')\n\t\t} else {\n\t\t\tspinner.start('Checking access...')\n\t\t}\n\n\t\tenrichedWorkshops = await checkWorkshopAccess(enrichedWorkshops)\n\t\tspinner.succeed(`Found ${enrichedWorkshops.length} available workshops`)\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tspinner.fail(message)\n\t\tconsole.log(\n\t\t\tchalk.yellow(\n\t\t\t\t`⚠️ Could not load workshops right now. Skipping this step.\\n`,\n\t\t\t),\n\t\t)\n\t\treturn\n\t}\n\n\tconst candidates = enrichedWorkshops.filter(\n\t\t(w) => w.name !== TUTORIAL_REPO && w.hasAccess === true && !w.isDownloaded,\n\t)\n\n\tif (candidates.length === 0) {\n\t\tconsole.log(\n\t\t\tchalk.gray(\n\t\t\t\t'No additional workshops to set up right now (either none found, none accessible, or already downloaded).\\n',\n\t\t\t),\n\t\t)\n\t\treturn\n\t}\n\n\tconsole.log()\n\tconsole.log(chalk.bold.cyan('Available Workshops You Have Access To\\n'))\n\tconsole.log(chalk.gray('Icon Key:'))\n\tconsole.log(chalk.gray(` 🚀 EpicReact.dev`))\n\tconsole.log(chalk.gray(` 🌌 EpicWeb.dev`))\n\tconsole.log(chalk.gray(` ⚡ EpicAI.pro`))\n\tconsole.log(chalk.gray(` 🔑 You have access to this workshop`))\n\tconsole.log()\n\n\tconst buildChoices = async () => {\n\t\t// Recompute downloaded status each loop (in case user just added one)\n\t\tconst updated = await checkWorkshopDownloadStatus(candidates)\n\t\tconst remaining = updated.filter((w) => !w.isDownloaded)\n\t\tconst workshopChoices = remaining.map((w) => {\n\t\t\tconst productIcon = w.productHost\n\t\t\t\t? PRODUCT_ICONS[w.productHost] || ''\n\t\t\t\t: ''\n\t\t\tconst accessIcon = chalk.yellow('🔑')\n\t\t\tconst name = [productIcon, w.title || w.name, accessIcon]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(' ')\n\n\t\t\tconst descriptionParts = [\n\t\t\t\tw.instructorName ? `by ${w.instructorName}` : null,\n\t\t\t\tw.productDisplayName || w.productHost,\n\t\t\t\tw.description,\n\t\t\t].filter(Boolean)\n\t\t\tconst description = descriptionParts.join(' • ') || undefined\n\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tvalue: w.name,\n\t\t\t\tdescription,\n\t\t\t\tworkshop: w,\n\t\t\t}\n\t\t})\n\n\t\treturn [\n\t\t\t...workshopChoices,\n\t\t\t{\n\t\t\t\tname: 'Done',\n\t\t\t\tvalue: 'done' as const,\n\t\t\t\tdescription: 'Continue to the tutorial setup',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Skip workshop setup',\n\t\t\t\tvalue: 'skip' as const,\n\t\t\t\tdescription: 'Continue without setting up more workshops',\n\t\t\t},\n\t\t]\n\t}\n\n\twhile (true) {\n\t\tconst choices = await buildChoices()\n\t\t// If there are no remaining workshops, stop\n\t\tif (choices.length <= 2) return\n\n\t\tconst selection = await search({\n\t\t\tmessage: 'Select a workshop to set up (you can pick multiple):',\n\t\t\tsource: async (input) => {\n\t\t\t\tif (!input) return choices\n\t\t\t\treturn matchSorter(choices, input, {\n\t\t\t\t\tkeys: [\n\t\t\t\t\t\t{ key: 'name', threshold: rankings.CONTAINS },\n\t\t\t\t\t\t{ key: 'value', threshold: rankings.CONTAINS },\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'workshop.productDisplayName',\n\t\t\t\t\t\t\tthreshold: rankings.CONTAINS,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ key: 'workshop.instructorName', threshold: rankings.CONTAINS },\n\t\t\t\t\t\t{ key: 'description', threshold: rankings.WORD_STARTS_WITH },\n\t\t\t\t\t],\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\n\t\tif (selection === 'done' || selection === 'skip') {\n\t\t\tconsole.log()\n\t\t\treturn\n\t\t}\n\n\t\t// If already present, don’t treat that as an error\n\t\tif (await workshopExists(selection)) {\n\t\t\tconsole.log(chalk.gray(`• ${selection} (already set up)`))\n\t\t\tcontinue\n\t\t}\n\n\t\tconst result = await add({ repoName: selection, silent: false })\n\t\tif (!result.success) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellow(\n\t\t\t\t\t`⚠️ Failed to set up ${selection}. You can retry later with \\`npx epicshop add ${selection}\\`.`,\n\t\t\t\t),\n\t\t\t)\n\t\t\tif (result.message) console.log(chalk.gray(` ${result.message}`))\n\t\t\tconsole.log()\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n/**\n * Ensure the tutorial workshop exists and start it\n */\nasync function ensureTutorialAndStart(): Promise<WorkshopsResult> {\n\tconst { workshopExists, getReposDirectory, getWorkshop } = await import(\n\t\t'@epic-web/workshop-utils/workshops.server'\n\t)\n\n\tasync function promptAndOpenTutorial(): Promise<WorkshopsResult> {\n\t\tconsole.log()\n\t\tconsole.log(\n\t\t\tchalk.cyan(\n\t\t\t\t\"🐨 Before we start the tutorial, let's open it in your editor so you can follow along.\",\n\t\t\t),\n\t\t)\n\t\tconsole.log(\n\t\t\tchalk.cyan(\n\t\t\t\t' This will run the \"open\" command for the tutorial repository.\\n',\n\t\t\t),\n\t\t)\n\t\tconst openCommand = `npx epicshop open ${TUTORIAL_REPO}`\n\t\tconsole.log(chalk.gray(' Running:'))\n\t\tconsole.log(chalk.white.bold(` ${openCommand}\\n`))\n\n\t\tawait waitForGo()\n\n\t\treturn await openWorkshop({ workshop: TUTORIAL_REPO })\n\t}\n\n\tasync function promptToStartTutorial(workshopTitle: string): Promise<void> {\n\t\tconsole.log()\n\t\tconsole.log(\n\t\t\tchalk.cyan(\n\t\t\t\t`🐨 Alright, let's get ${chalk.bold(workshopTitle)} started for you.`,\n\t\t\t),\n\t\t)\n\t\tconsole.log(\n\t\t\tchalk.cyan(\n\t\t\t\t' Once it\\'s running, open it using the \"o\" key or by going to',\n\t\t\t),\n\t\t)\n\t\tconsole.log(chalk.cyan.bold(' http://localhost:5639'))\n\t\tconsole.log(chalk.cyan(' in your browser. See you over there!\\n'))\n\n\t\tconst startCommand = `npx epicshop start ${TUTORIAL_REPO}`\n\t\tconsole.log(chalk.gray(' Running:'))\n\t\tconsole.log(chalk.white.bold(` ${startCommand}\\n`))\n\n\t\tawait waitForGo()\n\t}\n\n\t// Check if tutorial already exists\n\tif (await workshopExists(TUTORIAL_REPO)) {\n\t\t// Tutorial already added, open it in the editor before starting\n\t\tconst openResult = await promptAndOpenTutorial()\n\t\tif (!openResult.success) {\n\t\t\treturn openResult\n\t\t}\n\n\t\t// Now start the tutorial\n\t\tconst workshop = await getWorkshop(TUTORIAL_REPO)\n\t\tconst workshopTitle = workshop?.title || TUTORIAL_REPO\n\n\t\tawait promptToStartTutorial(workshopTitle)\n\t\treturn await startWorkshop({ workshop: TUTORIAL_REPO })\n\t}\n\n\tconst reposDir = await getReposDirectory()\n\tconst workshopPath = path.join(reposDir, TUTORIAL_REPO)\n\tconst repoUrl = `https://github.com/${GITHUB_ORG}/${TUTORIAL_REPO}.git`\n\n\tconsole.log()\n\tconsole.log(\n\t\tchalk.cyan(\"🐨 Now let's get you started with the epicshop tutorial.\"),\n\t)\n\tconsole.log(\n\t\tchalk.cyan(\n\t\t\t\" I'll clone the tutorial repository and set it up for you.\\n\",\n\t\t),\n\t)\n\n\t// Show the command we're effectively running\n\tconst addCommand = `npx epicshop add ${TUTORIAL_REPO}`\n\tconsole.log(chalk.gray(' Running:'))\n\tconsole.log(chalk.white.bold(` ${addCommand}\\n`))\n\n\t// Wait for user to press Enter to proceed\n\tawait waitForGo()\n\n\tconsole.log(chalk.cyan(`\\n📦 Cloning ${TUTORIAL_REPO}...`))\n\n\t// Clone the repository\n\tconst cloneResult = await runCommand(\n\t\t'git',\n\t\t['clone', repoUrl, workshopPath],\n\t\t{\n\t\t\tcwd: reposDir,\n\t\t\tsilent: false,\n\t\t},\n\t)\n\n\tif (!cloneResult.success) {\n\t\tconsole.error(\n\t\t\tchalk.red(`❌ Failed to clone repository: ${cloneResult.message}`),\n\t\t)\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Failed to clone repository: ${cloneResult.message}`,\n\t\t\terror: cloneResult.error,\n\t\t}\n\t}\n\n\tconsole.log(chalk.cyan(`\\n🔧 Running npm run setup...\\n`))\n\n\t// Run npm run setup\n\tconst setupResult = await runCommand('npm', ['run', 'setup'], {\n\t\tcwd: workshopPath,\n\t\tsilent: false,\n\t})\n\n\tif (!setupResult.success) {\n\t\t// Clean up on failure\n\t\tconsole.log(chalk.yellow(`🧹 Cleaning up cloned directory...`))\n\t\ttry {\n\t\t\tawait fs.promises.rm(workshopPath, { recursive: true, force: true })\n\t\t} catch {\n\t\t\t// Ignore cleanup errors\n\t\t}\n\t\tconsole.error(chalk.red(`❌ Failed to run setup: ${setupResult.message}`))\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Failed to run setup: ${setupResult.message}`,\n\t\t\terror: setupResult.error,\n\t\t}\n\t}\n\n\t// Get the workshop info (now discoverable since it has package.json with epicshop)\n\tconst workshop = await getWorkshop(TUTORIAL_REPO)\n\tconst workshopTitle = workshop?.title || TUTORIAL_REPO\n\n\tconsole.log()\n\tconsole.log(\n\t\tchalk.green(\n\t\t\t`✅ ${chalk.bold(workshopTitle)} has been set up successfully!\\n`,\n\t\t),\n\t)\n\n\tconst openResult = await promptAndOpenTutorial()\n\tif (!openResult.success) {\n\t\treturn openResult\n\t}\n\n\tawait promptToStartTutorial(workshopTitle)\n\n\tconsole.log(chalk.cyan(`\\n🚀 Starting ${chalk.bold(workshopTitle)}...\\n`))\n\n\t// Start the workshop\n\tconst startResult = await runCommandInteractive('npm', ['start'], {\n\t\tcwd: workshopPath,\n\t})\n\n\tif (!startResult.success) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Failed to start workshop: ${startResult.message}`,\n\t\t\terror: startResult.error,\n\t\t}\n\t}\n\n\treturn { success: true, message: 'Tutorial started successfully' }\n}\n\n/**\n * Check if the workshops directory is configured\n */\nexport async function isConfigured(): Promise<boolean> {\n\tconst { isReposDirectoryConfigured } = await import(\n\t\t'@epic-web/workshop-utils/workshops.server'\n\t)\n\treturn isReposDirectoryConfigured()\n}\n\n/**\n * Wait for user to press Enter to proceed or 'q' to quit\n */\nasync function waitForGo(): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconsole.log(chalk.cyan(\"🐨 Press Enter when you're ready to go.\"))\n\t\tconsole.log(chalk.gray(' (press \"q\" to quit)'))\n\t\tconsole.log()\n\n\t\tconst cleanup = () => {\n\t\t\tif (process.stdin.isTTY) {\n\t\t\t\tprocess.stdin.setRawMode(false)\n\t\t\t\tprocess.stdin.removeListener('data', onData)\n\t\t\t\tprocess.stdin.pause()\n\t\t\t}\n\t\t}\n\n\t\tconst onData = (key: Buffer) => {\n\t\t\tconst char = key.toString()\n\t\t\t// Handle Enter key to go (Enter sends '\\r' in raw mode)\n\t\t\tif (char === '\\r' || char === '\\n') {\n\t\t\t\tcleanup()\n\t\t\t\tresolve()\n\t\t\t}\n\t\t\t// Handle 'q' or Ctrl+C to quit\n\t\t\tif (char.toLowerCase() === 'q' || char === '\\u0003') {\n\t\t\t\tcleanup()\n\t\t\t\tconsole.log(chalk.gray('\\n👋 Goodbye!'))\n\t\t\t\treject(new Error('USER_QUIT'))\n\t\t\t}\n\t\t}\n\n\t\tif (process.stdin.isTTY) {\n\t\t\tprocess.stdin.setRawMode(true)\n\t\t\tprocess.stdin.resume()\n\t\t\tprocess.stdin.on('data', onData)\n\t\t} else {\n\t\t\t// Non-TTY mode, just resolve immediately\n\t\t\tresolve()\n\t\t}\n\t})\n}\n\n// Helper functions\n\nconst SELECT_CURRENT = Symbol('SELECT_CURRENT')\nconst GO_UP = Symbol('GO_UP')\nconst ENTER_CUSTOM = Symbol('ENTER_CUSTOM')\n\ntype DirectoryChoice =\n\t| { type: 'directory'; path: string; name: string }\n\t| {\n\t\t\ttype: 'action'\n\t\t\taction: typeof SELECT_CURRENT | typeof GO_UP | typeof ENTER_CUSTOM\n\t }\n\n/**\n * Interactive directory browser that lets users navigate and select a directory\n */\nasync function browseDirectory(startPath?: string): Promise<string> {\n\tconst { search, input } = await import('@inquirer/prompts')\n\n\tlet currentPath = startPath || os.homedir()\n\n\t// Resolve to absolute path\n\tcurrentPath = path.resolve(currentPath)\n\n\twhile (true) {\n\t\t// Build choices for current directory\n\t\tconst choices: Array<{\n\t\t\tname: string\n\t\t\tvalue: DirectoryChoice\n\t\t\tdescription?: string\n\t\t}> = []\n\n\t\t// Add action choices at the top\n\t\tchoices.push({\n\t\t\tname: `📁 Select this directory`,\n\t\t\tvalue: { type: 'action', action: SELECT_CURRENT },\n\t\t\tdescription: currentPath,\n\t\t})\n\n\t\t// Add \"go up\" option if not at root\n\t\tconst parentDir = path.dirname(currentPath)\n\t\tif (parentDir !== currentPath) {\n\t\t\tchoices.push({\n\t\t\t\tname: `⬆️ Go up to parent`,\n\t\t\t\tvalue: { type: 'action', action: GO_UP },\n\t\t\t\tdescription: parentDir,\n\t\t\t})\n\t\t}\n\n\t\t// Add custom path option\n\t\tchoices.push({\n\t\t\tname: `✏️ Enter a custom path`,\n\t\t\tvalue: { type: 'action', action: ENTER_CUSTOM },\n\t\t\tdescription: 'Type in any path manually',\n\t\t})\n\n\t\t// List subdirectories\n\t\ttry {\n\t\t\tconst entries = await fs.promises.readdir(currentPath, {\n\t\t\t\twithFileTypes: true,\n\t\t\t})\n\t\t\tconst directories = entries\n\t\t\t\t.filter((entry) => entry.isDirectory() && !entry.name.startsWith('.'))\n\t\t\t\t.sort((a, b) => a.name.localeCompare(b.name))\n\n\t\t\tfor (const dir of directories) {\n\t\t\t\tconst fullPath = path.join(currentPath, dir.name)\n\t\t\t\tchoices.push({\n\t\t\t\t\tname: `📂 ${dir.name}/`,\n\t\t\t\t\tvalue: { type: 'directory', path: fullPath, name: dir.name },\n\t\t\t\t\tdescription: fullPath,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch {\n\t\t\t// Can't read directory, just show action choices\n\t\t}\n\n\t\tconst selected = await search<DirectoryChoice>({\n\t\t\tmessage: `Browse directories (current: ${currentPath})`,\n\t\t\tsource: async (term) => {\n\t\t\t\tif (!term) {\n\t\t\t\t\treturn choices\n\t\t\t\t}\n\t\t\t\treturn matchSorter(choices, term, {\n\t\t\t\t\tkeys: ['name', 'value.name', 'description'],\n\t\t\t\t})\n\t\t\t},\n\t\t\tpageSize: 15,\n\t\t})\n\n\t\tif (selected.type === 'action') {\n\t\t\tif (selected.action === SELECT_CURRENT) {\n\t\t\t\treturn currentPath\n\t\t\t} else if (selected.action === GO_UP) {\n\t\t\t\tcurrentPath = parentDir\n\t\t\t} else if (selected.action === ENTER_CUSTOM) {\n\t\t\t\tconst customPath = await input({\n\t\t\t\t\tmessage: 'Enter the directory path:',\n\t\t\t\t\tdefault: currentPath,\n\t\t\t\t\tvalidate: (value) => {\n\t\t\t\t\t\tif (!value.trim()) {\n\t\t\t\t\t\t\treturn 'Please enter a directory path'\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\treturn path.resolve(customPath)\n\t\t\t}\n\t\t} else if (selected.type === 'directory') {\n\t\t\tcurrentPath = selected.path\n\t\t}\n\t}\n}\n\nasync function directoryExists(dirPath: string): Promise<boolean> {\n\ttry {\n\t\tconst stat = await fs.promises.stat(dirPath)\n\t\treturn stat.isDirectory()\n\t} catch {\n\t\treturn false\n\t}\n}\n\ntype CommandResult = {\n\tsuccess: boolean\n\tmessage?: string\n\terror?: Error\n}\n\nfunction resolveCliCommand(command: string): string {\n\t// On Windows, package manager binaries are typically shimmed as *.cmd files.\n\t// Spawning \"npm\" directly can fail with ENOENT even though \"npm.cmd\" exists.\n\tif (process.platform === 'win32' && (command === 'npm' || command === 'npx')) {\n\t\treturn `${command}.cmd`\n\t}\n\treturn command\n}\n\nfunction runCommand(\n\tcommand: string,\n\targs: string[],\n\toptions: { cwd: string; silent?: boolean },\n): Promise<CommandResult> {\n\treturn new Promise((resolve) => {\n\t\tconst child = spawn(resolveCliCommand(command), args, {\n\t\t\tcwd: options.cwd,\n\t\t\tstdio: options.silent ? 'pipe' : 'inherit',\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\tresolve({ success: false, message: error.message, error })\n\t\t})\n\n\t\tchild.on('close', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve({ success: true })\n\t\t\t} else {\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tmessage: `Command exited with code ${code}`,\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t})\n}\n\nfunction runCommandInteractive(\n\tcommand: string,\n\targs: string[],\n\toptions: { cwd: string },\n): Promise<CommandResult> {\n\treturn new Promise((resolve) => {\n\t\tconst child = spawn(resolveCliCommand(command), args, {\n\t\t\tcwd: options.cwd,\n\t\t\tstdio: 'inherit',\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\tresolve({ success: false, message: error.message, error })\n\t\t})\n\n\t\tchild.on('close', (code) => {\n\t\t\tif (code === 0 || code === null) {\n\t\t\t\tresolve({ success: true })\n\t\t\t} else {\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tmessage: `Command exited with code ${code}`,\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t})\n}\n"]}
1
+ {"version":3,"file":"workshops.js","sourceRoot":"","sources":["../../../src/commands/workshops.ts"],"names":[],"mappings":"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","sourcesContent":["import '@epic-web/workshop-utils/init-env'\n\nimport { spawn } from 'node:child_process'\nimport * as fs from 'node:fs'\nimport * as os from 'node:os'\nimport * as path from 'node:path'\nimport { cachified, githubCache } from '@epic-web/workshop-utils/cache.server'\nimport { parseEpicshopConfig } from '@epic-web/workshop-utils/config.server'\nimport { getAuthInfo } from '@epic-web/workshop-utils/db.server'\nimport { userHasAccessToWorkshop } from '@epic-web/workshop-utils/epic-api.server'\nimport chalk from 'chalk'\nimport { matchSorter, rankings } from 'match-sorter'\nimport ora from 'ora'\n\nconst GITHUB_ORG = 'epicweb-dev'\nconst TUTORIAL_REPO = 'epicshop-tutorial'\nconst GITHUB_TOKEN = process.env.GITHUB_TOKEN\n\ntype EpicSite = {\n\thost: string\n\tname: string\n\tdescription: string\n}\n\nconst EPIC_SITES: Array<EpicSite> = [\n\t{\n\t\thost: 'www.epicreact.dev',\n\t\tname: 'Epic React',\n\t\tdescription: 'React development workshops',\n\t},\n\t{\n\t\thost: 'www.epicweb.dev',\n\t\tname: 'Epic Web',\n\t\tdescription: 'Full-stack web development workshops',\n\t},\n\t{\n\t\thost: 'www.epicai.pro',\n\t\tname: 'Epic AI',\n\t\tdescription: 'AI development workshops',\n\t},\n]\n\n/**\n * Find the workshop root directory by walking up from the current directory\n * looking for a package.json with an epicshop field.\n * Returns the workshop root path if found, null otherwise.\n */\nexport async function findWorkshopRoot(): Promise<string | null> {\n\tlet currentDir = process.cwd()\n\tconst root = path.parse(currentDir).root\n\n\twhile (currentDir !== root) {\n\t\ttry {\n\t\t\tconst packageJsonPath = path.join(currentDir, 'package.json')\n\t\t\tconst content = await fs.promises.readFile(packageJsonPath, 'utf-8')\n\t\t\tconst packageJson = JSON.parse(content) as { epicshop?: unknown }\n\n\t\t\t// Check if epicshop config exists\n\t\t\tif (packageJson.epicshop) {\n\t\t\t\treturn currentDir\n\t\t\t}\n\t\t} catch {\n\t\t\t// No package.json or can't read it, continue up\n\t\t}\n\n\t\t// Move up one directory\n\t\tconst parentDir = path.dirname(currentDir)\n\t\tif (parentDir === currentDir) {\n\t\t\t// We've reached the root\n\t\t\tbreak\n\t\t}\n\t\tcurrentDir = parentDir\n\t}\n\n\treturn null\n}\n\n/**\n * Check if the current working directory is inside a workshop\n * (has epicshop config in package.json in current dir or any parent)\n */\nexport async function isInWorkshopDirectory(): Promise<boolean> {\n\treturn (await findWorkshopRoot()) !== null\n}\n\nexport type WorkshopsResult = {\n\tsuccess: boolean\n\tmessage?: string\n\terror?: Error\n}\n\nexport type AddOptions = {\n\trepoName?: string\n\tdirectory?: string\n\tsilent?: boolean\n}\n\ntype GitHubRepo = {\n\tname: string\n\tdescription: string | null\n\thtml_url: string\n\tstargazers_count: number\n\ttopics: string[]\n\tarchived: boolean\n}\n\ntype GitHubSearchResponse = {\n\ttotal_count: number\n\tincomplete_results: boolean\n\titems: GitHubRepo[]\n}\n\ntype EnrichedWorkshop = GitHubRepo & {\n\tproductHost?: string\n\tproductSlug?: string\n\tproductDisplayName?: string\n\tinstructorName?: string\n\ttitle?: string\n\thasAccess?: boolean\n\tisDownloaded?: boolean\n}\n\nconst PRODUCT_ICONS: Record<string, string> = {\n\t'www.epicweb.dev': '🌌',\n\t'www.epicai.pro': '⚡',\n\t'www.epicreact.dev': '🚀',\n}\n\nfunction getGitHubHeaders(): HeadersInit {\n\tconst headers: HeadersInit = {\n\t\tAccept: 'application/vnd.github.v3+json',\n\t\t'User-Agent': 'epicshop-cli',\n\t}\n\tif (GITHUB_TOKEN) {\n\t\theaders.Authorization = `Bearer ${GITHUB_TOKEN}`\n\t}\n\treturn headers\n}\n\n/**\n * Fetch available workshops from GitHub (epicweb-dev org with 'workshop' topic)\n */\nasync function fetchAvailableWorkshops(): Promise<GitHubRepo[]> {\n\treturn cachified({\n\t\tkey: `github-workshops-list`,\n\t\tcache: githubCache,\n\t\tttl: 1000 * 60 * 15, // 15 minutes\n\t\tswr: 1000 * 60 * 60 * 6, // 6 hours stale-while-revalidate\n\t\tasync getFreshValue() {\n\t\t\t// Note: `archived:false` is supported by GitHub search.\n\t\t\tconst url = `https://api.github.com/search/repositories?q=topic:workshop+org:${GITHUB_ORG}+archived:false&sort=stars&order=desc`\n\n\t\t\tconst response = await fetch(url, {\n\t\t\t\theaders: getGitHubHeaders(),\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\tif (response.status === 403) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'GitHub API rate limit exceeded. Please try again in a minute.',\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to fetch workshops from GitHub: ${response.status}`,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst data = (await response.json()) as Partial<GitHubSearchResponse>\n\t\t\treturn Array.isArray(data.items) ? data.items : []\n\t\t},\n\t})\n}\n\n/**\n * Fetch a workshop's package.json from GitHub raw content\n */\nasync function fetchWorkshopPackageJson(\n\trepoName: string,\n): Promise<Record<string, unknown> | null> {\n\treturn cachified({\n\t\tkey: `github-package-json:${repoName}`,\n\t\tcache: githubCache,\n\t\tttl: 1000 * 60 * 60 * 6, // 6 hours\n\t\tswr: 1000 * 60 * 60 * 24 * 30, // 30 days stale-while-revalidate\n\t\tasync getFreshValue() {\n\t\t\tconst url = `https://raw.githubusercontent.com/${GITHUB_ORG}/${repoName}/main/package.json`\n\n\t\t\tconst response = await fetch(url, {\n\t\t\t\theaders: {\n\t\t\t\t\t'User-Agent': 'epicshop-cli',\n\t\t\t\t\t...(GITHUB_TOKEN ? { Authorization: `Bearer ${GITHUB_TOKEN}` } : {}),\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tif (!response.ok) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\treturn (await response.json()) as Record<string, unknown>\n\t\t\t} catch {\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\t})\n}\n\n/**\n * Enrich workshops with metadata from their package.json files\n */\nasync function enrichWorkshopsWithMetadata(\n\tworkshops: GitHubRepo[],\n): Promise<EnrichedWorkshop[]> {\n\tconst packageJsons = await Promise.all(\n\t\tworkshops.map((w) => fetchWorkshopPackageJson(w.name)),\n\t)\n\n\treturn workshops.map((workshop, index) => {\n\t\tconst packageJson = packageJsons[index]\n\t\tconst config = packageJson ? parseEpicshopConfig(packageJson) : null\n\n\t\treturn {\n\t\t\t...workshop,\n\t\t\tproductHost: config?.product?.host,\n\t\t\tproductSlug: config?.product?.slug,\n\t\t\tproductDisplayName: config?.product?.displayName,\n\t\t\tinstructorName: config?.instructor?.name,\n\t\t\ttitle: config?.title,\n\t\t}\n\t})\n}\n\n/**\n * Check which product sites the user is logged in to\n */\nasync function checkAuthStatus(\n\tworkshops: EnrichedWorkshop[],\n): Promise<Map<string, boolean>> {\n\tconst uniqueHosts = new Set(\n\t\tworkshops\n\t\t\t.map((w) => w.productHost)\n\t\t\t.filter((host): host is string => Boolean(host)),\n\t)\n\n\tconst authStatusMap = new Map<string, boolean>()\n\tawait Promise.all(\n\t\tArray.from(uniqueHosts).map(async (host) => {\n\t\t\tconst authInfo = await getAuthInfo({ productHost: host })\n\t\t\tauthStatusMap.set(host, isValidLoginInfo(authInfo))\n\t\t}),\n\t)\n\n\treturn authStatusMap\n}\n\n/**\n * Check if workshops are already downloaded\n */\nasync function checkWorkshopDownloadStatus(\n\tworkshops: EnrichedWorkshop[],\n): Promise<EnrichedWorkshop[]> {\n\tconst { workshopExists } = await import(\n\t\t'@epic-web/workshop-utils/workshops.server'\n\t)\n\n\tconst downloadStatusResults = await Promise.all(\n\t\tworkshops.map(async (workshop) => {\n\t\t\treturn await workshopExists(workshop.name)\n\t\t}),\n\t)\n\n\treturn workshops.map((workshop, index) => ({\n\t\t...workshop,\n\t\tisDownloaded: downloadStatusResults[index],\n\t}))\n}\n\n/**\n * Check access for workshops in parallel\n */\nasync function checkWorkshopAccess(\n\tworkshops: EnrichedWorkshop[],\n): Promise<EnrichedWorkshop[]> {\n\tconst accessResults = await Promise.all(\n\t\tworkshops.map(async (workshop) => {\n\t\t\tif (!workshop.productHost || !workshop.productSlug) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn userHasAccessToWorkshop({\n\t\t\t\tproductHost: workshop.productHost,\n\t\t\t\tworkshopSlug: workshop.productSlug,\n\t\t\t})\n\t\t}),\n\t)\n\n\treturn workshops.map((workshop, index) => ({\n\t\t...workshop,\n\t\thasAccess: accessResults[index],\n\t}))\n}\n\nexport type StartOptions = {\n\tworkshop?: string\n\tsilent?: boolean\n}\n\nexport type ConfigOptions = {\n\treposDir?: string\n\tsilent?: boolean\n\tsubcommand?: 'reset' | 'delete'\n}\n\n/**\n * Add a workshop by cloning from epicweb-dev GitHub org and running setup\n */\nexport async function add(options: AddOptions): Promise<WorkshopsResult> {\n\tconst { silent = false } = options\n\tlet { repoName } = options\n\n\ttry {\n\t\t// If no repo name provided, fetch available workshops and let user select\n\t\tif (!repoName) {\n\t\t\tif (silent) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tmessage: 'Repository name is required in silent mode',\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst spinner = ora('Fetching available workshops...').start()\n\n\t\t\tlet enrichedWorkshops: EnrichedWorkshop[]\n\t\t\ttry {\n\t\t\t\tconst workshops = await fetchAvailableWorkshops()\n\n\t\t\t\tif (workshops.length === 0) {\n\t\t\t\t\tspinner.fail('No workshops found on GitHub')\n\t\t\t\t\treturn { success: false, message: 'No workshops found on GitHub' }\n\t\t\t\t}\n\n\t\t\t\tspinner.text = 'Loading workshop details...'\n\t\t\t\tenrichedWorkshops = await enrichWorkshopsWithMetadata(workshops)\n\n\t\t\t\tspinner.text = 'Checking download status...'\n\t\t\t\tenrichedWorkshops = await checkWorkshopDownloadStatus(enrichedWorkshops)\n\n\t\t\t\tspinner.stop()\n\t\t\t\tconst authStatusMap = await checkAuthStatus(enrichedWorkshops)\n\n\t\t\t\tconst hostsNotLoggedIn = Array.from(authStatusMap.entries())\n\t\t\t\t\t.filter(([, isLoggedIn]) => !isLoggedIn)\n\t\t\t\t\t.map(([host]) => host)\n\n\t\t\t\tif (hostsNotLoggedIn.length > 0) {\n\t\t\t\t\tconst hostDisplayNames = hostsNotLoggedIn.map((host) => {\n\t\t\t\t\t\tconst workshop = enrichedWorkshops.find(\n\t\t\t\t\t\t\t(w) => w.productHost === host,\n\t\t\t\t\t\t)\n\t\t\t\t\t\treturn workshop?.productDisplayName || host\n\t\t\t\t\t})\n\n\t\t\t\t\tconsole.log()\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.yellow(\n\t\t\t\t\t\t\t`💡 Tip: You are not logged in to ${hostDisplayNames.join(', ')}. ` +\n\t\t\t\t\t\t\t\t'Logging in will allow us to check your workshop access.',\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.gray(` To login, run: ${chalk.cyan('npx epicshop auth')}`),\n\t\t\t\t\t)\n\t\t\t\t\tconsole.log()\n\t\t\t\t}\n\n\t\t\t\tspinner.start('Checking access...')\n\t\t\t\tenrichedWorkshops = await checkWorkshopAccess(enrichedWorkshops)\n\n\t\t\t\tenrichedWorkshops.sort((a, b) => {\n\t\t\t\t\tconst aHasAccess = a.hasAccess === true\n\t\t\t\t\tconst aIsDownloaded = a.isDownloaded === true\n\t\t\t\t\tconst bHasAccess = b.hasAccess === true\n\t\t\t\t\tconst bIsDownloaded = b.isDownloaded === true\n\n\t\t\t\t\t// Priority 1: Access and not yet downloaded\n\t\t\t\t\tconst aPriority1 = aHasAccess && !aIsDownloaded\n\t\t\t\t\tconst bPriority1 = bHasAccess && !bIsDownloaded\n\t\t\t\t\tif (aPriority1 && !bPriority1) return -1\n\t\t\t\t\tif (!aPriority1 && bPriority1) return 1\n\n\t\t\t\t\t// Priority 2: No access and not yet downloaded\n\t\t\t\t\tconst aPriority2 = !aHasAccess && !aIsDownloaded\n\t\t\t\t\tconst bPriority2 = !bHasAccess && !bIsDownloaded\n\t\t\t\t\tif (aPriority2 && !bPriority2) return -1\n\t\t\t\t\tif (!aPriority2 && bPriority2) return 1\n\n\t\t\t\t\t// Priority 3: Access and downloaded\n\t\t\t\t\tconst aPriority3 = aHasAccess && aIsDownloaded\n\t\t\t\t\tconst bPriority3 = bHasAccess && bIsDownloaded\n\t\t\t\t\tif (aPriority3 && !bPriority3) return -1\n\t\t\t\t\tif (!aPriority3 && bPriority3) return 1\n\n\t\t\t\t\treturn 0\n\t\t\t\t})\n\n\t\t\t\tspinner.succeed(`Found ${enrichedWorkshops.length} available workshops`)\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\t\t\tspinner.fail(message)\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tmessage,\n\t\t\t\t\terror: error instanceof Error ? error : new Error(message),\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst { search } = await import('@inquirer/prompts')\n\n\t\t\tconsole.log()\n\t\t\tconsole.log(chalk.bold.cyan('📚 Available Workshops\\n'))\n\t\t\tconsole.log(chalk.gray('Icon Key:'))\n\t\t\tconsole.log(chalk.gray(` 🚀 EpicReact.dev`))\n\t\t\tconsole.log(chalk.gray(` 🌌 EpicWeb.dev`))\n\t\t\tconsole.log(chalk.gray(` ⚡ EpicAI.pro`))\n\t\t\tconsole.log(chalk.gray(` 🔑 You have access to this workshop`))\n\t\t\tconsole.log(chalk.gray(` ✔︎ Already downloaded on your machine`))\n\t\t\tconsole.log()\n\n\t\t\tconst allChoices = enrichedWorkshops.map((w) => {\n\t\t\t\tconst productIcon = w.productHost\n\t\t\t\t\t? PRODUCT_ICONS[w.productHost] || ''\n\t\t\t\t\t: ''\n\t\t\t\tconst accessIcon = w.hasAccess === true ? chalk.yellow('🔑') : ''\n\t\t\t\tconst downloadedIcon = w.isDownloaded === true ? chalk.green('✔︎') : ''\n\n\t\t\t\tconst nameParts = [\n\t\t\t\t\tproductIcon,\n\t\t\t\t\tw.title || w.name,\n\t\t\t\t\taccessIcon,\n\t\t\t\t\tdownloadedIcon,\n\t\t\t\t].filter(Boolean)\n\t\t\t\tconst name = nameParts.join(' ')\n\n\t\t\t\tconst descriptionParts = [\n\t\t\t\t\tw.instructorName ? `by ${w.instructorName}` : null,\n\t\t\t\t\tw.productDisplayName || w.productHost,\n\t\t\t\t\tw.description,\n\t\t\t\t].filter(Boolean)\n\t\t\t\tconst description = descriptionParts.join(' • ') || undefined\n\n\t\t\t\treturn {\n\t\t\t\t\tname,\n\t\t\t\t\tvalue: w.name,\n\t\t\t\t\tdescription,\n\t\t\t\t\tworkshop: w,\n\t\t\t\t}\n\t\t\t})\n\n\t\t\trepoName = await search({\n\t\t\t\tmessage: 'Select a workshop to add:',\n\t\t\t\tsource: async (input) => {\n\t\t\t\t\tif (!input) {\n\t\t\t\t\t\treturn allChoices\n\t\t\t\t\t}\n\t\t\t\t\treturn matchSorter(allChoices, input, {\n\t\t\t\t\t\tkeys: [\n\t\t\t\t\t\t\t{ key: 'name', threshold: rankings.CONTAINS },\n\t\t\t\t\t\t\t{ key: 'value', threshold: rankings.CONTAINS },\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkey: 'workshop.productDisplayName',\n\t\t\t\t\t\t\t\tthreshold: rankings.CONTAINS,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkey: 'workshop.instructorName',\n\t\t\t\t\t\t\t\tthreshold: rankings.CONTAINS,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ key: 'description', threshold: rankings.WORD_STARTS_WITH },\n\t\t\t\t\t\t],\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\t// Ensure config is set up first\n\t\tif (!(await ensureConfigured())) {\n\t\t\treturn { success: false, message: 'Setup cancelled' }\n\t\t}\n\n\t\tconst { getReposDirectory, workshopExists } = await import(\n\t\t\t'@epic-web/workshop-utils/workshops.server'\n\t\t)\n\n\t\t// Check if workshop already exists\n\t\tif (await workshopExists(repoName)) {\n\t\t\tconst message = `Workshop \"${repoName}\" already exists`\n\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\treturn { success: false, message }\n\t\t}\n\n\t\t// Get target directory\n\t\tconst reposDir = options.directory || (await getReposDirectory())\n\t\tconst workshopPath = path.join(reposDir, repoName)\n\n\t\t// Ensure the repos directory exists\n\t\tawait fs.promises.mkdir(reposDir, { recursive: true })\n\n\t\t// Check if directory already exists\n\t\ttry {\n\t\t\tawait fs.promises.access(workshopPath)\n\t\t\tconst message = `Directory already exists: ${workshopPath}`\n\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\treturn { success: false, message }\n\t\t} catch {\n\t\t\t// Directory doesn't exist, which is what we want\n\t\t}\n\n\t\tconst repoUrl = `https://github.com/${GITHUB_ORG}/${repoName}.git`\n\n\t\tif (!silent) {\n\t\t\tconsole.log(chalk.cyan(`📦 Cloning ${repoUrl}...`))\n\t\t}\n\n\t\t// Clone the repository\n\t\tconst cloneResult = await runCommand(\n\t\t\t'git',\n\t\t\t['clone', repoUrl, workshopPath],\n\t\t\t{\n\t\t\t\tcwd: reposDir,\n\t\t\t\tsilent,\n\t\t\t},\n\t\t)\n\n\t\tif (!cloneResult.success) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tmessage: `Failed to clone repository: ${cloneResult.message}`,\n\t\t\t\terror: cloneResult.error,\n\t\t\t}\n\t\t}\n\n\t\tif (!silent) {\n\t\t\tconsole.log(chalk.cyan(`🔧 Running npm run setup...`))\n\t\t}\n\n\t\t// Run npm run setup\n\t\tconst setupResult = await runCommand('npm', ['run', 'setup'], {\n\t\t\tcwd: workshopPath,\n\t\t\tsilent,\n\t\t})\n\n\t\tif (!setupResult.success) {\n\t\t\t// Clean up the cloned directory on setup failure\n\t\t\tif (!silent) {\n\t\t\t\tconsole.log(chalk.yellow(`🧹 Cleaning up cloned directory...`))\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait fs.promises.rm(workshopPath, { recursive: true, force: true })\n\t\t\t} catch {\n\t\t\t\t// Ignore cleanup errors\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tmessage: `Failed to run setup: ${setupResult.message}`,\n\t\t\t\terror: setupResult.error,\n\t\t\t}\n\t\t}\n\n\t\tconst message = `Workshop \"${repoName}\" added successfully at ${workshopPath}`\n\t\tif (!silent) {\n\t\t\tconsole.log(chalk.green(`✅ ${message}`))\n\t\t}\n\n\t\treturn { success: true, message }\n\t} catch (error) {\n\t\tif ((error as Error).message === 'USER_QUIT') {\n\t\t\treturn { success: false, message: 'User quit' }\n\t\t}\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tif (!silent) {\n\t\t\tconsole.error(chalk.red(`❌ ${message}`))\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\terror: error instanceof Error ? error : new Error(message),\n\t\t}\n\t}\n}\n\n/**\n * List all workshops found in the repos directory\n */\nexport async function list({\n\tsilent = false,\n}: { silent?: boolean } = {}): Promise<WorkshopsResult> {\n\ttry {\n\t\t// Ensure config is set up first\n\t\tif (!(await ensureConfigured())) {\n\t\t\treturn { success: false, message: 'Setup cancelled' }\n\t\t}\n\n\t\tconst { listWorkshops, getReposDirectory } = await import(\n\t\t\t'@epic-web/workshop-utils/workshops.server'\n\t\t)\n\n\t\tconst workshops = await listWorkshops()\n\t\tconst reposDir = await getReposDirectory()\n\n\t\tif (workshops.length === 0) {\n\t\t\tconst message = `No workshops found. Use 'epicshop add <repo-name>' to add one.`\n\t\t\tif (!silent) {\n\t\t\t\tconsole.log(chalk.yellow(message))\n\t\t\t\tconsole.log(chalk.gray(`\\nWorkshops directory: ${reposDir}`))\n\t\t\t}\n\t\t\treturn { success: true, message }\n\t\t}\n\n\t\tif (silent) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tmessage: `Found ${workshops.length} workshop(s)`,\n\t\t\t}\n\t\t}\n\n\t\t// Interactive selection\n\t\tconst { search } = await import('@inquirer/prompts')\n\n\t\tconst allChoices = workshops.map((w) => ({\n\t\t\tname: `${w.title} (${w.repoName})`,\n\t\t\tvalue: w,\n\t\t\tdescription: w.path,\n\t\t}))\n\n\t\tconsole.log(chalk.bold.cyan('\\n📚 Your Workshops:\\n'))\n\n\t\tconst selectedWorkshop = await search({\n\t\t\tmessage: 'Select a workshop:',\n\t\t\tsource: async (input) => {\n\t\t\t\tif (!input) {\n\t\t\t\t\treturn allChoices\n\t\t\t\t}\n\t\t\t\treturn matchSorter(allChoices, input, {\n\t\t\t\t\tkeys: [\n\t\t\t\t\t\t'name',\n\t\t\t\t\t\t'value.repoName',\n\t\t\t\t\t\t'value.title',\n\t\t\t\t\t\t'value.subtitle',\n\t\t\t\t\t\t'description',\n\t\t\t\t\t],\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\n\t\t// Show actions for selected workshop\n\t\tconst actionChoices = [\n\t\t\t{\n\t\t\t\tname: 'Start workshop',\n\t\t\t\tvalue: 'start',\n\t\t\t\tdescription: 'Run npm start in the workshop directory',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Open in editor',\n\t\t\t\tvalue: 'open',\n\t\t\t\tdescription: 'Open the workshop in your code editor',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Remove workshop',\n\t\t\t\tvalue: 'remove',\n\t\t\t\tdescription: 'Delete the workshop directory',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Back to list',\n\t\t\t\tvalue: 'back',\n\t\t\t\tdescription: 'Go back to workshop selection',\n\t\t\t},\n\t\t]\n\n\t\tconst action = await search({\n\t\t\tmessage: `What would you like to do with \"${selectedWorkshop.title}\"?`,\n\t\t\tsource: async (input) => {\n\t\t\t\tif (!input) {\n\t\t\t\t\treturn actionChoices\n\t\t\t\t}\n\t\t\t\treturn matchSorter(actionChoices, input, {\n\t\t\t\t\tkeys: ['name', 'value', 'description'],\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\n\t\tswitch (action) {\n\t\t\tcase 'start':\n\t\t\t\treturn await startWorkshop({ workshop: selectedWorkshop.repoName })\n\t\t\tcase 'open':\n\t\t\t\treturn await openWorkshop({ workshop: selectedWorkshop.repoName })\n\t\t\tcase 'remove':\n\t\t\t\treturn await remove({ workshop: selectedWorkshop.repoName })\n\t\t\tcase 'back':\n\t\t\t\treturn await list({ silent })\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tmessage: `Found ${workshops.length} workshop(s)`,\n\t\t}\n\t} catch (error) {\n\t\tif ((error as Error).message === 'USER_QUIT') {\n\t\t\treturn { success: false, message: 'User quit' }\n\t\t}\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tif (!silent) {\n\t\t\tconsole.error(chalk.red(`❌ ${message}`))\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\terror: error instanceof Error ? error : new Error(message),\n\t\t}\n\t}\n}\n\n/**\n * Remove a workshop (deletes the directory)\n */\nexport async function remove({\n\tworkshop,\n\tsilent = false,\n}: {\n\tworkshop?: string\n\tsilent?: boolean\n}): Promise<WorkshopsResult> {\n\ttry {\n\t\tconst {\n\t\t\tgetWorkshop,\n\t\t\tgetWorkshopByPath,\n\t\t\tlistWorkshops,\n\t\t\tgetUnpushedChanges,\n\t\t\tdeleteWorkshop,\n\t\t} = await import('@epic-web/workshop-utils/workshops.server')\n\n\t\tlet workshopData\n\n\t\t// If workshop specified, try to find it\n\t\tif (workshop) {\n\t\t\t// First check if it's a path (absolute or looks like a directory)\n\t\t\tif (workshop.startsWith('/') || workshop.includes(path.sep)) {\n\t\t\t\t// Try to find by path\n\t\t\t\tworkshopData = await getWorkshopByPath(workshop)\n\t\t\t\tif (!workshopData) {\n\t\t\t\t\tconst message = `Workshop at \"${workshop}\" is not in your repos directory and cannot be removed via epicshop. Delete it manually if needed.`\n\t\t\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\t\t\treturn { success: false, message }\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// It's a workshop name, look it up\n\t\t\t\tworkshopData = await getWorkshop(workshop)\n\t\t\t\tif (!workshopData) {\n\t\t\t\t\tconst message = `Workshop \"${workshop}\" not found`\n\t\t\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\t\t\treturn { success: false, message }\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Ensure config is set up first for interactive selection\n\t\t\tif (!(await ensureConfigured())) {\n\t\t\t\treturn { success: false, message: 'Setup cancelled' }\n\t\t\t}\n\n\t\t\t// No workshop specified, prompt for selection\n\t\t\tconst workshops = await listWorkshops()\n\n\t\t\tif (workshops.length === 0) {\n\t\t\t\tconst message = `No workshops to remove. Use 'epicshop add <repo-name>' to add one first.`\n\t\t\t\tif (!silent) console.log(chalk.yellow(message))\n\t\t\t\treturn { success: false, message }\n\t\t\t}\n\n\t\t\tconst { search } = await import('@inquirer/prompts')\n\n\t\t\tconst allChoices = workshops.map((w) => ({\n\t\t\t\tname: `${w.title} (${w.repoName})`,\n\t\t\t\tvalue: w,\n\t\t\t\tdescription: w.path,\n\t\t\t}))\n\n\t\t\tworkshopData = await search({\n\t\t\t\tmessage: 'Select a workshop to remove:',\n\t\t\t\tsource: async (input) => {\n\t\t\t\t\tif (!input) {\n\t\t\t\t\t\treturn allChoices\n\t\t\t\t\t}\n\t\t\t\t\treturn matchSorter(allChoices, input, {\n\t\t\t\t\t\tkeys: ['name', 'value.repoName', 'value.title', 'description'],\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\tif (!workshopData) {\n\t\t\tconst message = 'No workshop selected'\n\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\treturn { success: false, message }\n\t\t}\n\n\t\t// Check for unpushed changes\n\t\tconst unpushed = await getUnpushedChanges(workshopData.path)\n\n\t\tif (unpushed.hasUnpushed) {\n\t\t\tconsole.log()\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellow.bold(\n\t\t\t\t\t`⚠️ Warning: \"${workshopData.title}\" has unpushed changes:\\n`,\n\t\t\t\t),\n\t\t\t)\n\t\t\tfor (const line of unpushed.summary) {\n\t\t\t\tconsole.log(chalk.yellow(` • ${line}`))\n\t\t\t}\n\t\t\tconsole.log()\n\n\t\t\tconst { confirm } = await import('@inquirer/prompts')\n\t\t\tconst shouldDelete = await confirm({\n\t\t\t\tmessage: `Delete \"${workshopData.title}\" anyway? This cannot be undone.`,\n\t\t\t\tdefault: false,\n\t\t\t})\n\n\t\t\tif (!shouldDelete) {\n\t\t\t\tconst message = 'Removal cancelled'\n\t\t\t\tif (!silent) console.log(chalk.gray(message))\n\t\t\t\treturn { success: false, message }\n\t\t\t}\n\t\t} else {\n\t\t\t// No unpushed changes, but still confirm deletion\n\t\t\tconst { confirm } = await import('@inquirer/prompts')\n\t\t\tconst shouldDelete = await confirm({\n\t\t\t\tmessage: `Delete \"${workshopData.title}\" at ${workshopData.path}?`,\n\t\t\t\tdefault: false,\n\t\t\t})\n\n\t\t\tif (!shouldDelete) {\n\t\t\t\tconst message = 'Removal cancelled'\n\t\t\t\tif (!silent) console.log(chalk.gray(message))\n\t\t\t\treturn { success: false, message }\n\t\t\t}\n\t\t}\n\n\t\t// Delete the workshop directory\n\t\tawait deleteWorkshop(workshopData.path)\n\n\t\tconst message = `Workshop \"${workshopData.title}\" deleted successfully`\n\t\tif (!silent) console.log(chalk.green(`✅ ${message}`))\n\t\treturn { success: true, message }\n\t} catch (error) {\n\t\tif ((error as Error).message === 'USER_QUIT') {\n\t\t\treturn { success: false, message: 'User quit' }\n\t\t}\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tif (!silent) {\n\t\t\tconsole.error(chalk.red(`❌ ${message}`))\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\terror: error instanceof Error ? error : new Error(message),\n\t\t}\n\t}\n}\n\n/**\n * Start a workshop\n */\nexport async function startWorkshop(\n\toptions: StartOptions = {},\n): Promise<WorkshopsResult> {\n\tconst { silent = false } = options\n\n\ttry {\n\t\t// Ensure config is set up first\n\t\tif (!(await ensureConfigured())) {\n\t\t\treturn { success: false, message: 'Setup cancelled' }\n\t\t}\n\n\t\tconst { listWorkshops, getWorkshop } = await import(\n\t\t\t'@epic-web/workshop-utils/workshops.server'\n\t\t)\n\n\t\tlet workshopToStart\n\n\t\t// If workshop specified, look it up and fail if not found\n\t\tif (options.workshop) {\n\t\t\tworkshopToStart = await getWorkshop(options.workshop)\n\t\t\tif (!workshopToStart) {\n\t\t\t\tconst message = `Workshop \"${options.workshop}\" not found`\n\t\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\t\treturn { success: false, message }\n\t\t\t}\n\t\t} else {\n\t\t\t// No workshop specified, show selection\n\t\t\tconst workshops = await listWorkshops()\n\n\t\t\tif (workshops.length === 0) {\n\t\t\t\tconst message = `No workshops found. Use 'epicshop add <repo-name>' to add one.`\n\t\t\t\tif (!silent) console.log(chalk.yellow(message))\n\t\t\t\treturn { success: false, message }\n\t\t\t}\n\n\t\t\t// Interactive selection\n\t\t\tconst { search } = await import('@inquirer/prompts')\n\n\t\t\tconst allChoices = workshops.map((w) => ({\n\t\t\t\tname: `${w.title} (${w.repoName})`,\n\t\t\t\tvalue: w,\n\t\t\t\tdescription: w.path,\n\t\t\t}))\n\n\t\t\tworkshopToStart = await search({\n\t\t\t\tmessage: 'Select a workshop to start:',\n\t\t\t\tsource: async (input) => {\n\t\t\t\t\tif (!input) {\n\t\t\t\t\t\treturn allChoices\n\t\t\t\t\t}\n\t\t\t\t\treturn matchSorter(allChoices, input, {\n\t\t\t\t\t\tkeys: [\n\t\t\t\t\t\t\t'name',\n\t\t\t\t\t\t\t'value.repoName',\n\t\t\t\t\t\t\t'value.title',\n\t\t\t\t\t\t\t'value.subtitle',\n\t\t\t\t\t\t\t'description',\n\t\t\t\t\t\t],\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\tif (!workshopToStart) {\n\t\t\tconst message = 'No workshop selected'\n\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\treturn { success: false, message }\n\t\t}\n\n\t\t// Check if the workshop directory exists\n\t\tif (!(await directoryExists(workshopToStart.path))) {\n\t\t\tconst message = `Workshop directory not found: ${workshopToStart.path}`\n\t\t\tif (!silent) console.log(chalk.red(`❌ ${message}`))\n\t\t\treturn { success: false, message }\n\t\t}\n\n\t\tif (!silent) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.cyan(`🚀 Starting ${chalk.bold(workshopToStart.title)}...`),\n\t\t\t)\n\t\t\tconsole.log(chalk.gray(` Path: ${workshopToStart.path}\\n`))\n\t\t}\n\n\t\t// Run npm start in the workshop directory\n\t\tconst startResult = await runCommandInteractive('npm', ['start'], {\n\t\t\tcwd: workshopToStart.path,\n\t\t})\n\n\t\tif (!startResult.success) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tmessage: `Failed to start workshop: ${startResult.message}`,\n\t\t\t\terror: startResult.error,\n\t\t\t}\n\t\t}\n\n\t\treturn { success: true, message: 'Workshop started' }\n\t} catch (error) {\n\t\tif ((error as Error).message === 'USER_QUIT') {\n\t\t\treturn { success: false, message: 'User quit' }\n\t\t}\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tif (!silent) {\n\t\t\tconsole.error(chalk.red(`❌ ${message}`))\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\terror: error instanceof Error ? error : new Error(message),\n\t\t}\n\t}\n}\n\n/**\n * Open a workshop in the user's editor\n */\nexport async function openWorkshop(\n\toptions: StartOptions = {},\n): Promise<WorkshopsResult> {\n\tconst { silent = false } = options\n\n\ttry {\n\t\tconst { listWorkshops, getWorkshop, getWorkshopByPath } = await import(\n\t\t\t'@epic-web/workshop-utils/workshops.server'\n\t\t)\n\t\tconst { launchEditor } = await import(\n\t\t\t'@epic-web/workshop-utils/launch-editor.server'\n\t\t)\n\n\t\tlet workshopToOpen\n\n\t\t// If workshop specified, try to find it\n\t\tif (options.workshop) {\n\t\t\t// First check if it's a path (absolute or looks like a directory)\n\t\t\tif (\n\t\t\t\toptions.workshop.startsWith('/') ||\n\t\t\t\toptions.workshop.includes(path.sep)\n\t\t\t) {\n\t\t\t\t// Try to find by path first\n\t\t\t\tworkshopToOpen = await getWorkshopByPath(options.workshop)\n\t\t\t\tif (!workshopToOpen) {\n\t\t\t\t\t// Not in managed workshops, but if it's a valid workshop dir, open it directly\n\t\t\t\t\tconst pkgPath = path.join(options.workshop, 'package.json')\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst pkgContent = await fs.promises.readFile(pkgPath, 'utf-8')\n\t\t\t\t\t\tconst pkg = JSON.parse(pkgContent) as {\n\t\t\t\t\t\t\tname?: string\n\t\t\t\t\t\t\tepicshop?: { title?: string }\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (pkg.epicshop) {\n\t\t\t\t\t\t\t// It's a valid workshop directory, create a minimal workshop object\n\t\t\t\t\t\t\tworkshopToOpen = {\n\t\t\t\t\t\t\t\tname: pkg.name || path.basename(options.workshop),\n\t\t\t\t\t\t\t\ttitle: pkg.epicshop.title || path.basename(options.workshop),\n\t\t\t\t\t\t\t\trepoName: path.basename(options.workshop),\n\t\t\t\t\t\t\t\tpath: options.workshop,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Not a valid workshop directory\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// It's a workshop name, look it up\n\t\t\t\tworkshopToOpen = await getWorkshop(options.workshop)\n\t\t\t}\n\n\t\t\tif (!workshopToOpen) {\n\t\t\t\tconst message = `Workshop \"${options.workshop}\" not found`\n\t\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\t\treturn { success: false, message }\n\t\t\t}\n\t\t} else {\n\t\t\t// Ensure config is set up first for interactive selection\n\t\t\tif (!(await ensureConfigured())) {\n\t\t\t\treturn { success: false, message: 'Setup cancelled' }\n\t\t\t}\n\t\t\t// No workshop specified, show selection\n\t\t\tconst workshops = await listWorkshops()\n\n\t\t\tif (workshops.length === 0) {\n\t\t\t\tconst message = `No workshops found. Use 'epicshop add <repo-name>' to add one.`\n\t\t\t\tif (!silent) console.log(chalk.yellow(message))\n\t\t\t\treturn { success: false, message }\n\t\t\t}\n\n\t\t\t// Interactive selection\n\t\t\tconst { search } = await import('@inquirer/prompts')\n\n\t\t\tconst allChoices = workshops.map((w) => ({\n\t\t\t\tname: `${w.title} (${w.repoName})`,\n\t\t\t\tvalue: w,\n\t\t\t\tdescription: w.path,\n\t\t\t}))\n\n\t\t\tworkshopToOpen = await search({\n\t\t\t\tmessage: 'Select a workshop to open:',\n\t\t\t\tsource: async (input) => {\n\t\t\t\t\tif (!input) {\n\t\t\t\t\t\treturn allChoices\n\t\t\t\t\t}\n\t\t\t\t\treturn matchSorter(allChoices, input, {\n\t\t\t\t\t\tkeys: [\n\t\t\t\t\t\t\t'name',\n\t\t\t\t\t\t\t'value.repoName',\n\t\t\t\t\t\t\t'value.title',\n\t\t\t\t\t\t\t'value.subtitle',\n\t\t\t\t\t\t\t'description',\n\t\t\t\t\t\t],\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\tif (!workshopToOpen) {\n\t\t\tconst message = 'No workshop selected'\n\t\t\tif (!silent) console.log(chalk.yellow(`⚠️ ${message}`))\n\t\t\treturn { success: false, message }\n\t\t}\n\n\t\t// Check if the workshop directory exists\n\t\tif (!(await directoryExists(workshopToOpen.path))) {\n\t\t\tconst message = `Workshop directory not found: ${workshopToOpen.path}`\n\t\t\tif (!silent) console.log(chalk.red(`❌ ${message}`))\n\t\t\treturn { success: false, message }\n\t\t}\n\n\t\tif (!silent) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.cyan(\n\t\t\t\t\t`📂 Opening ${chalk.bold(workshopToOpen.title)} in your editor...`,\n\t\t\t\t),\n\t\t\t)\n\t\t\tconsole.log(chalk.gray(` Path: ${workshopToOpen.path}\\n`))\n\t\t}\n\n\t\t// Launch the editor with the workshop directory\n\t\tconst result = await launchEditor(workshopToOpen.path)\n\n\t\tif (result.status === 'error') {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tmessage: result.message,\n\t\t\t}\n\t\t}\n\n\t\treturn { success: true, message: 'Workshop opened in editor' }\n\t} catch (error) {\n\t\tif ((error as Error).message === 'USER_QUIT') {\n\t\t\treturn { success: false, message: 'User quit' }\n\t\t}\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tif (!silent) {\n\t\t\tconsole.error(chalk.red(`❌ ${message}`))\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\terror: error instanceof Error ? error : new Error(message),\n\t\t}\n\t}\n}\n\n/**\n * Configure workshops settings\n */\nexport async function config(\n\toptions: ConfigOptions = {},\n): Promise<WorkshopsResult> {\n\tconst { silent = false } = options\n\n\ttry {\n\t\tconst {\n\t\t\tgetReposDirectory,\n\t\t\tsetReposDirectory,\n\t\t\tisReposDirectoryConfigured,\n\t\t\tloadConfig,\n\t\t\tsaveConfig,\n\t\t\tgetDefaultReposDir,\n\t\t\tdeleteConfig,\n\t\t} = await import('@epic-web/workshop-utils/workshops.server')\n\n\t\t// Handle reset subcommand\n\t\tif (options.subcommand === 'reset' || options.subcommand === 'delete') {\n\t\t\tif (silent) {\n\t\t\t\tawait deleteConfig()\n\t\t\t\treturn { success: true, message: 'Config file deleted' }\n\t\t\t}\n\n\t\t\tconst { confirm } = await import('@inquirer/prompts')\n\t\t\tconst shouldDelete = await confirm({\n\t\t\t\tmessage:\n\t\t\t\t\t'Are you sure you want to delete the config file? This will reset all settings to defaults.',\n\t\t\t\tdefault: false,\n\t\t\t})\n\n\t\t\tif (shouldDelete) {\n\t\t\t\tawait deleteConfig()\n\t\t\t\tconst message = 'Config file deleted. All settings reset to defaults.'\n\t\t\t\tconsole.log(chalk.green(`✅ ${message}`))\n\t\t\t\treturn { success: true, message }\n\t\t\t} else {\n\t\t\t\tconsole.log(chalk.gray('No changes made.'))\n\t\t\t\treturn { success: true, message: 'Cancelled' }\n\t\t\t}\n\t\t}\n\n\t\tif (options.reposDir) {\n\t\t\t// Set the repos directory directly via CLI flag\n\t\t\tconst resolvedPath = path.resolve(options.reposDir)\n\t\t\tawait setReposDirectory(resolvedPath)\n\t\t\tconst message = `Repos directory set to: ${resolvedPath}`\n\t\t\tif (!silent) console.log(chalk.green(`✅ ${message}`))\n\t\t\treturn { success: true, message }\n\t\t}\n\n\t\tif (silent) {\n\t\t\t// In silent mode, just return current config\n\t\t\tconst reposDir = await getReposDirectory()\n\t\t\treturn { success: true, message: `Repos directory: ${reposDir}` }\n\t\t}\n\n\t\t// Interactive config selection\n\t\tconst { search, confirm } = await import('@inquirer/prompts')\n\n\t\tconst reposDir = await getReposDirectory()\n\t\tconst isConfigured = await isReposDirectoryConfigured()\n\t\tconst defaultDir = getDefaultReposDir()\n\n\t\t// Build config options\n\t\tconst configOptions = [\n\t\t\t{\n\t\t\t\tname: `Repos directory`,\n\t\t\t\tvalue: 'repos-dir',\n\t\t\t\tdescription: isConfigured ? reposDir : `${reposDir} (default)`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: `Reset config file`,\n\t\t\t\tvalue: 'reset',\n\t\t\t\tdescription: 'Delete config file and reset all settings to defaults',\n\t\t\t},\n\t\t]\n\n\t\tconsole.log(chalk.bold.cyan('\\n⚙️ Workshop Configuration\\n'))\n\n\t\tconst selectedConfig = await search({\n\t\t\tmessage: 'Select a setting to configure:',\n\t\t\tsource: async (input) => {\n\t\t\t\tif (!input) return configOptions\n\t\t\t\treturn matchSorter(configOptions, input, {\n\t\t\t\t\tkeys: ['name', 'value', 'description'],\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\n\t\tif (selectedConfig === 'reset') {\n\t\t\tconst shouldDelete = await confirm({\n\t\t\t\tmessage:\n\t\t\t\t\t'Are you sure you want to delete the config file? This will reset all settings to defaults.',\n\t\t\t\tdefault: false,\n\t\t\t})\n\n\t\t\tif (shouldDelete) {\n\t\t\t\tawait deleteConfig()\n\t\t\t\tconsole.log()\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.green(\n\t\t\t\t\t\t`✅ Config file deleted. All settings reset to defaults.`,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tmessage: 'Config file deleted. All settings reset to defaults.',\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconsole.log(chalk.gray('\\nNo changes made.'))\n\t\t\t\treturn { success: true, message: 'Cancelled' }\n\t\t\t}\n\t\t}\n\n\t\tif (selectedConfig === 'repos-dir') {\n\t\t\t// Show current value and actions\n\t\t\tconsole.log()\n\t\t\tconsole.log(chalk.bold(' Current value:'))\n\t\t\tif (isConfigured) {\n\t\t\t\tconsole.log(chalk.white(` ${reposDir}`))\n\t\t\t} else {\n\t\t\t\tconsole.log(chalk.gray(` ${reposDir} (default, not explicitly set)`))\n\t\t\t}\n\t\t\tconsole.log()\n\n\t\t\tconst actionChoices = [\n\t\t\t\t{\n\t\t\t\t\tname: 'Edit',\n\t\t\t\t\tvalue: 'edit',\n\t\t\t\t\tdescription: 'Change the repos directory',\n\t\t\t\t},\n\t\t\t\t...(isConfigured\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tname: 'Remove',\n\t\t\t\t\t\t\t\tvalue: 'remove',\n\t\t\t\t\t\t\t\tdescription: `Reset to default (${defaultDir})`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]\n\t\t\t\t\t: []),\n\t\t\t\t{\n\t\t\t\t\tname: 'Cancel',\n\t\t\t\t\tvalue: 'cancel',\n\t\t\t\t\tdescription: 'Go back without changes',\n\t\t\t\t},\n\t\t\t]\n\n\t\t\tconst action = await search({\n\t\t\t\tmessage: 'What would you like to do?',\n\t\t\t\tsource: async (input) => {\n\t\t\t\t\tif (!input) return actionChoices\n\t\t\t\t\treturn matchSorter(actionChoices, input, {\n\t\t\t\t\t\tkeys: ['name', 'value', 'description'],\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tif (action === 'edit') {\n\t\t\t\tconsole.log()\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.cyan('🐨 Use the directory browser to select a new location.'),\n\t\t\t\t)\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.gray(' Type to search, use arrow keys to navigate.\\n'),\n\t\t\t\t)\n\n\t\t\t\tconst newDir = await browseDirectory(\n\t\t\t\t\tisConfigured ? reposDir : path.dirname(defaultDir),\n\t\t\t\t)\n\t\t\t\tconst resolvedPath = path.resolve(newDir)\n\t\t\t\tawait setReposDirectory(resolvedPath)\n\n\t\t\t\tconsole.log()\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.green(`✅ Repos directory set to: ${chalk.bold(resolvedPath)}`),\n\t\t\t\t)\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tmessage: `Repos directory set to: ${resolvedPath}`,\n\t\t\t\t}\n\t\t\t} else if (action === 'remove') {\n\t\t\t\tconst shouldRemove = await confirm({\n\t\t\t\t\tmessage: `Reset repos directory to default (${defaultDir})?`,\n\t\t\t\t\tdefault: false,\n\t\t\t\t})\n\n\t\t\t\tif (shouldRemove) {\n\t\t\t\t\tconst currentConfig = await loadConfig()\n\t\t\t\t\tdelete currentConfig.reposDirectory\n\t\t\t\t\tawait saveConfig(currentConfig)\n\n\t\t\t\t\tconsole.log()\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.green(\n\t\t\t\t\t\t\t`✅ Repos directory reset to default: ${chalk.bold(defaultDir)}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tmessage: `Repos directory reset to default: ${defaultDir}`,\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(chalk.gray('\\nNo changes made.'))\n\t\t\t\t\treturn { success: true, message: 'Cancelled' }\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconsole.log(chalk.gray('\\nNo changes made.'))\n\t\t\t\treturn { success: true, message: 'Cancelled' }\n\t\t\t}\n\t\t}\n\n\t\treturn { success: true, message: 'Config viewed' }\n\t} catch (error) {\n\t\tif ((error as Error).message === 'USER_QUIT') {\n\t\t\treturn { success: false, message: 'User quit' }\n\t\t}\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tif (!silent) {\n\t\t\tconsole.error(chalk.red(`❌ ${message}`))\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\terror: error instanceof Error ? error : new Error(message),\n\t\t}\n\t}\n}\n\n/**\n * Check if the workshops directory is configured, and run onboarding if not\n * Call this at the start of any command that requires the config to be set\n */\nexport async function ensureConfigured(): Promise<boolean> {\n\tconst { isReposDirectoryConfigured } = await import(\n\t\t'@epic-web/workshop-utils/workshops.server'\n\t)\n\n\tif (await isReposDirectoryConfigured()) {\n\t\treturn true\n\t}\n\n\t// Not configured, run onboarding\n\tconst result = await onboarding()\n\treturn result.success\n}\n\n/**\n * Run the onboarding flow for new users\n */\nexport async function onboarding(): Promise<WorkshopsResult> {\n\ttry {\n\t\tconst {\n\t\t\tisReposDirectoryConfigured,\n\t\t\tgetDefaultReposDir,\n\t\t\tsetReposDirectory,\n\t\t} = await import('@epic-web/workshop-utils/workshops.server')\n\n\t\t// Check if already configured\n\t\tif (await isReposDirectoryConfigured()) {\n\t\t\t// Already configured, check for tutorial\n\t\t\treturn await ensureTutorialAndStart()\n\t\t}\n\n\t\t// Welcome message from Kody\n\t\tconsole.log()\n\t\tconsole.log(\n\t\t\tchalk.cyan(\n\t\t\t\t\"🐨 Hey there! Welcome to the epicshop CLI. I'm Kody the Koala, and I'm here to help you learn.\",\n\t\t\t),\n\t\t)\n\t\tconsole.log(\n\t\t\tchalk.cyan(\n\t\t\t\t\" It looks like this is the first time you're using epicshop, so I'm going to help you get set up and get you started with the tutorial.\",\n\t\t\t),\n\t\t)\n\t\tconsole.log(\n\t\t\tchalk.gray(\n\t\t\t\t` Once you're finished going through the tutorial, feel free to run ${chalk.underline(`npx epicshop ${process.argv.slice(2).join(' ')}`)} again.\\n`,\n\t\t\t),\n\t\t)\n\n\t\tconsole.log(\n\t\t\tchalk.white(' First, we need to choose where to store your workshops.'),\n\t\t)\n\t\tconsole.log(\n\t\t\tchalk.white(\n\t\t\t\t' Workshops are cloned from GitHub and stored in a directory of your choice.\\n',\n\t\t\t),\n\t\t)\n\n\t\t// Prompt for directory configuration\n\t\tconst { confirm } = await import('@inquirer/prompts')\n\t\tconst defaultDir = getDefaultReposDir()\n\n\t\tconsole.log(chalk.gray(` Recommended: ${chalk.white(defaultDir)}\\n`))\n\n\t\tconst useDefault = await confirm({\n\t\t\tmessage: 'Use the recommended directory?',\n\t\t\tdefault: true,\n\t\t})\n\n\t\tlet reposDir: string\n\t\tif (useDefault) {\n\t\t\treposDir = defaultDir\n\t\t} else {\n\t\t\tconsole.log()\n\t\t\tconsole.log(\n\t\t\t\tchalk.cyan(\n\t\t\t\t\t'🐨 No problem! Use the directory browser to find your preferred location.',\n\t\t\t\t),\n\t\t\t)\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(' Type to search, use arrow keys to navigate.\\n'),\n\t\t\t)\n\t\t\treposDir = await browseDirectory(path.dirname(defaultDir))\n\t\t}\n\n\t\t// Resolve and save the directory\n\t\tconst resolvedPath = path.resolve(reposDir)\n\t\tawait setReposDirectory(resolvedPath)\n\n\t\tconsole.log()\n\t\tconsole.log(\n\t\t\tchalk.green(`✅ Workshops directory set to: ${chalk.bold(resolvedPath)}`),\n\t\t)\n\t\tconsole.log()\n\n\t\t// Ensure directory exists\n\t\tawait fs.promises.mkdir(resolvedPath, { recursive: true })\n\n\t\t// Offer site login right after workshop directory setup\n\t\tawait runSiteLoginOnboarding()\n\n\t\t// Offer to set up any workshops the user wants (optional)\n\t\tawait promptAndSetupAccessibleWorkshops()\n\n\t\t// Now check for tutorial and start it\n\t\treturn await ensureTutorialAndStart()\n\t} catch (error) {\n\t\tif ((error as Error).message === 'USER_QUIT') {\n\t\t\treturn { success: false, message: 'User quit' }\n\t\t}\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tconsole.error(chalk.red(`❌ ${message}`))\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\terror: error instanceof Error ? error : new Error(message),\n\t\t}\n\t}\n}\n\nfunction isValidLoginInfo(authInfo: unknown): authInfo is {\n\temail: string\n\tname?: string | null\n\ttokenSet: { access_token: string }\n} {\n\tif (!authInfo || typeof authInfo !== 'object') return false\n\tconst a = authInfo as any\n\treturn (\n\t\ttypeof a.email === 'string' &&\n\t\ta.email.length > 3 &&\n\t\ttypeof a.tokenSet?.access_token === 'string' &&\n\t\ta.tokenSet.access_token.length > 10\n\t)\n}\n\nasync function runSiteLoginOnboarding(): Promise<void> {\n\tconst { search } = await import('@inquirer/prompts')\n\tconst { login } = await import('./auth.js')\n\n\twhile (true) {\n\t\tconst siteStatuses = await Promise.all(\n\t\t\tEPIC_SITES.map(async (site) => {\n\t\t\t\tconst authInfo = await getAuthInfo({ productHost: site.host })\n\t\t\t\treturn { site, authInfo, loggedIn: isValidLoginInfo(authInfo) }\n\t\t\t}),\n\t\t)\n\n\t\tconsole.log(chalk.bold.cyan('\\n🔐 Site Login\\n'))\n\t\tfor (const { site, authInfo, loggedIn } of siteStatuses) {\n\t\t\tif (loggedIn && isValidLoginInfo(authInfo)) {\n\t\t\t\tconst name = authInfo.name ? ` (${authInfo.name})` : ''\n\t\t\t\tconsole.log(\n\t\t\t\t\t` ${chalk.green('✓')} ${chalk.bold(site.name)}: ${chalk.green('Logged in')} as ${chalk.cyan(authInfo.email)}${name}`,\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tconsole.log(\n\t\t\t\t\t` ${chalk.gray('○')} ${chalk.bold(site.name)}: ${chalk.gray('Not logged in')}`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tconsole.log()\n\n\t\t// If already logged in everywhere, move on\n\t\tif (siteStatuses.every((s) => s.loggedIn)) {\n\t\t\treturn\n\t\t}\n\n\t\tconsole.log(\n\t\t\tchalk.gray(\n\t\t\t\t` Logging in is optional. If you don’t have an account yet, you can create a free one on any of these sites.\\n`,\n\t\t\t),\n\t\t)\n\n\t\tconst remaining = siteStatuses.filter((s) => !s.loggedIn).map((s) => s.site)\n\t\tconst choices = [\n\t\t\t...remaining.map((h) => ({\n\t\t\t\tname: `Log in to ${h.name}`,\n\t\t\t\tvalue: h.host,\n\t\t\t\tdescription: h.description,\n\t\t\t})),\n\t\t\t{\n\t\t\t\tname: `Skip login`,\n\t\t\t\tvalue: 'skip' as const,\n\t\t\t\tdescription: 'Continue without logging in',\n\t\t\t},\n\t\t]\n\n\t\tconst selection = await search({\n\t\t\tmessage: 'Would you like to log in to any of these sites now?',\n\t\t\tsource: async (input) => {\n\t\t\t\tif (!input) return choices\n\t\t\t\treturn matchSorter(choices, input, {\n\t\t\t\t\tkeys: ['name', 'value', 'description'],\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\n\t\tif (selection === 'skip') {\n\t\t\treturn\n\t\t}\n\n\t\t// Run the existing login flow for the selected site\n\t\tlet result: { success: boolean; message?: string; error?: Error }\n\t\ttry {\n\t\t\tresult = await login({ domain: selection, silent: false })\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\t\tresult = { success: false, message, error: error as Error }\n\t\t}\n\n\t\tif (!result.success) {\n\t\t\tconsole.log()\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellow(\n\t\t\t\t\t`⚠️ Login didn’t complete (${result.message ?? 'unknown error'}). You can try again, choose a different site, or skip.\\n`,\n\t\t\t\t),\n\t\t\t)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nasync function promptAndSetupAccessibleWorkshops(): Promise<void> {\n\tconst { workshopExists } = await import(\n\t\t'@epic-web/workshop-utils/workshops.server'\n\t)\n\n\tconsole.log(chalk.bold.cyan('\\n📚 Workshop Setup\\n'))\n\tconsole.log(\n\t\tchalk.cyan(\n\t\t\t'🐨 Next, you can select any workshops you’d like me to set up for you.',\n\t\t),\n\t)\n\tconsole.log(\n\t\tchalk.gray(\n\t\t\t' This will clone each workshop repo into your workshops directory and run `npm run setup`.\\n' +\n\t\t\t\t' (If something fails, we’ll keep going and you can retry later with `npx epicshop add`.)\\n',\n\t\t),\n\t)\n\n\tconst { search } = await import('@inquirer/prompts')\n\n\tconst spinner = ora('Fetching available workshops...').start()\n\tlet enrichedWorkshops: EnrichedWorkshop[]\n\ttry {\n\t\tconst workshops = await fetchAvailableWorkshops()\n\t\tif (workshops.length === 0) {\n\t\t\tspinner.fail('No workshops found on GitHub')\n\t\t\tconsole.log(chalk.gray('\\nContinuing...\\n'))\n\t\t\treturn\n\t\t}\n\n\t\tspinner.text = 'Loading workshop details...'\n\t\tenrichedWorkshops = await enrichWorkshopsWithMetadata(workshops)\n\n\t\tspinner.text = 'Checking download status...'\n\t\tenrichedWorkshops = await checkWorkshopDownloadStatus(enrichedWorkshops)\n\n\t\tconst authStatusMap = await checkAuthStatus(enrichedWorkshops)\n\t\tconst sitesNotLoggedIn = Array.from(authStatusMap.entries())\n\t\t\t.filter(([, isLoggedIn]) => !isLoggedIn)\n\t\t\t.map(([host]) => host)\n\n\t\tif (sitesNotLoggedIn.length > 0) {\n\t\t\tspinner.stop()\n\t\t\tconst siteNames = sitesNotLoggedIn.map((host) => {\n\t\t\t\tconst workshop = enrichedWorkshops.find((w) => w.productHost === host)\n\t\t\t\treturn workshop?.productDisplayName || host\n\t\t\t})\n\t\t\tconsole.log()\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellow(\n\t\t\t\t\t`💡 Tip: You’re not logged in to ${siteNames.join(\n\t\t\t\t\t\t', ',\n\t\t\t\t\t)}. Logging in can help us confirm which workshops you have access to.`,\n\t\t\t\t),\n\t\t\t)\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(` To log in, run: ${chalk.cyan('npx epicshop auth')}`),\n\t\t\t)\n\t\t\tconsole.log()\n\t\t\tspinner.start('Checking access...')\n\t\t} else {\n\t\t\tspinner.start('Checking access...')\n\t\t}\n\n\t\tenrichedWorkshops = await checkWorkshopAccess(enrichedWorkshops)\n\t\tspinner.succeed(`Found ${enrichedWorkshops.length} available workshops`)\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tspinner.fail(message)\n\t\tconsole.log(\n\t\t\tchalk.yellow(\n\t\t\t\t`⚠️ Could not load workshops right now. Skipping this step.\\n`,\n\t\t\t),\n\t\t)\n\t\treturn\n\t}\n\n\tconst candidates = enrichedWorkshops.filter(\n\t\t(w) => w.name !== TUTORIAL_REPO && w.hasAccess === true && !w.isDownloaded,\n\t)\n\n\tif (candidates.length === 0) {\n\t\tconsole.log(\n\t\t\tchalk.gray(\n\t\t\t\t'No additional workshops to set up right now (either none found, none accessible, or already downloaded).\\n',\n\t\t\t),\n\t\t)\n\t\treturn\n\t}\n\n\tconsole.log()\n\tconsole.log(chalk.bold.cyan('Available Workshops You Have Access To\\n'))\n\tconsole.log(chalk.gray('Icon Key:'))\n\tconsole.log(chalk.gray(` 🚀 EpicReact.dev`))\n\tconsole.log(chalk.gray(` 🌌 EpicWeb.dev`))\n\tconsole.log(chalk.gray(` ⚡ EpicAI.pro`))\n\tconsole.log(chalk.gray(` 🔑 You have access to this workshop`))\n\tconsole.log()\n\n\tconst buildChoices = async () => {\n\t\t// Recompute downloaded status each loop (in case user just added one)\n\t\tconst updated = await checkWorkshopDownloadStatus(candidates)\n\t\tconst remaining = updated.filter((w) => !w.isDownloaded)\n\t\tconst workshopChoices = remaining.map((w) => {\n\t\t\tconst productIcon = w.productHost\n\t\t\t\t? PRODUCT_ICONS[w.productHost] || ''\n\t\t\t\t: ''\n\t\t\tconst accessIcon = chalk.yellow('🔑')\n\t\t\tconst name = [productIcon, w.title || w.name, accessIcon]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(' ')\n\n\t\t\tconst descriptionParts = [\n\t\t\t\tw.instructorName ? `by ${w.instructorName}` : null,\n\t\t\t\tw.productDisplayName || w.productHost,\n\t\t\t\tw.description,\n\t\t\t].filter(Boolean)\n\t\t\tconst description = descriptionParts.join(' • ') || undefined\n\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tvalue: w.name,\n\t\t\t\tdescription,\n\t\t\t\tworkshop: w,\n\t\t\t}\n\t\t})\n\n\t\treturn [\n\t\t\t...workshopChoices,\n\t\t\t{\n\t\t\t\tname: 'Done',\n\t\t\t\tvalue: 'done' as const,\n\t\t\t\tdescription: 'Continue to the tutorial setup',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Skip workshop setup',\n\t\t\t\tvalue: 'skip' as const,\n\t\t\t\tdescription: 'Continue without setting up more workshops',\n\t\t\t},\n\t\t]\n\t}\n\n\twhile (true) {\n\t\tconst choices = await buildChoices()\n\t\t// If there are no remaining workshops, stop\n\t\tif (choices.length <= 2) return\n\n\t\tconst selection = await search({\n\t\t\tmessage: 'Select a workshop to set up (you can pick multiple):',\n\t\t\tsource: async (input) => {\n\t\t\t\tif (!input) return choices\n\t\t\t\treturn matchSorter(choices, input, {\n\t\t\t\t\tkeys: [\n\t\t\t\t\t\t{ key: 'name', threshold: rankings.CONTAINS },\n\t\t\t\t\t\t{ key: 'value', threshold: rankings.CONTAINS },\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'workshop.productDisplayName',\n\t\t\t\t\t\t\tthreshold: rankings.CONTAINS,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ key: 'workshop.instructorName', threshold: rankings.CONTAINS },\n\t\t\t\t\t\t{ key: 'description', threshold: rankings.WORD_STARTS_WITH },\n\t\t\t\t\t],\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\n\t\tif (selection === 'done' || selection === 'skip') {\n\t\t\tconsole.log()\n\t\t\treturn\n\t\t}\n\n\t\t// If already present, don’t treat that as an error\n\t\tif (await workshopExists(selection)) {\n\t\t\tconsole.log(chalk.gray(`• ${selection} (already set up)`))\n\t\t\tcontinue\n\t\t}\n\n\t\tconst result = await add({ repoName: selection, silent: false })\n\t\tif (!result.success) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellow(\n\t\t\t\t\t`⚠️ Failed to set up ${selection}. You can retry later with \\`npx epicshop add ${selection}\\`.`,\n\t\t\t\t),\n\t\t\t)\n\t\t\tif (result.message) console.log(chalk.gray(` ${result.message}`))\n\t\t\tconsole.log()\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n/**\n * Ensure the tutorial workshop exists and start it\n */\nasync function ensureTutorialAndStart(): Promise<WorkshopsResult> {\n\tconst { workshopExists, getReposDirectory, getWorkshop } = await import(\n\t\t'@epic-web/workshop-utils/workshops.server'\n\t)\n\n\tasync function promptAndOpenTutorial(): Promise<WorkshopsResult> {\n\t\tconsole.log()\n\t\tconsole.log(\n\t\t\tchalk.cyan(\n\t\t\t\t\"🐨 Before we start the tutorial, let's open it in your editor so you can follow along.\",\n\t\t\t),\n\t\t)\n\t\tconsole.log(\n\t\t\tchalk.cyan(\n\t\t\t\t' This will run the \"open\" command for the tutorial repository.\\n',\n\t\t\t),\n\t\t)\n\t\tconst openCommand = `npx epicshop open ${TUTORIAL_REPO}`\n\t\tconsole.log(chalk.gray(' Running:'))\n\t\tconsole.log(chalk.white.bold(` ${openCommand}\\n`))\n\n\t\tawait waitForGo()\n\n\t\treturn await openWorkshop({ workshop: TUTORIAL_REPO })\n\t}\n\n\tasync function promptToStartTutorial(workshopTitle: string): Promise<void> {\n\t\tconsole.log()\n\t\tconsole.log(\n\t\t\tchalk.cyan(\n\t\t\t\t`🐨 Alright, let's get ${chalk.bold(workshopTitle)} started for you.`,\n\t\t\t),\n\t\t)\n\t\tconsole.log(\n\t\t\tchalk.cyan(\n\t\t\t\t' Once it\\'s running, open it using the \"o\" key or by going to',\n\t\t\t),\n\t\t)\n\t\tconsole.log(chalk.cyan.bold(' http://localhost:5639'))\n\t\tconsole.log(chalk.cyan(' in your browser. See you over there!\\n'))\n\n\t\tconst startCommand = `npx epicshop start ${TUTORIAL_REPO}`\n\t\tconsole.log(chalk.gray(' Running:'))\n\t\tconsole.log(chalk.white.bold(` ${startCommand}\\n`))\n\n\t\tawait waitForGo()\n\t}\n\n\t// Check if tutorial already exists\n\tif (await workshopExists(TUTORIAL_REPO)) {\n\t\t// Tutorial already added, open it in the editor before starting\n\t\tconst openResult = await promptAndOpenTutorial()\n\t\tif (!openResult.success) {\n\t\t\treturn openResult\n\t\t}\n\n\t\t// Now start the tutorial\n\t\tconst workshop = await getWorkshop(TUTORIAL_REPO)\n\t\tconst workshopTitle = workshop?.title || TUTORIAL_REPO\n\n\t\tawait promptToStartTutorial(workshopTitle)\n\t\treturn await startWorkshop({ workshop: TUTORIAL_REPO })\n\t}\n\n\tconst reposDir = await getReposDirectory()\n\tconst workshopPath = path.join(reposDir, TUTORIAL_REPO)\n\tconst repoUrl = `https://github.com/${GITHUB_ORG}/${TUTORIAL_REPO}.git`\n\n\tconsole.log()\n\tconsole.log(\n\t\tchalk.cyan(\"🐨 Now let's get you started with the epicshop tutorial.\"),\n\t)\n\tconsole.log(\n\t\tchalk.cyan(\n\t\t\t\" I'll clone the tutorial repository and set it up for you.\\n\",\n\t\t),\n\t)\n\n\t// Show the command we're effectively running\n\tconst addCommand = `npx epicshop add ${TUTORIAL_REPO}`\n\tconsole.log(chalk.gray(' Running:'))\n\tconsole.log(chalk.white.bold(` ${addCommand}\\n`))\n\n\t// Wait for user to press Enter to proceed\n\tawait waitForGo()\n\n\tconsole.log(chalk.cyan(`\\n📦 Cloning ${TUTORIAL_REPO}...`))\n\n\t// Clone the repository\n\tconst cloneResult = await runCommand(\n\t\t'git',\n\t\t['clone', repoUrl, workshopPath],\n\t\t{\n\t\t\tcwd: reposDir,\n\t\t\tsilent: false,\n\t\t},\n\t)\n\n\tif (!cloneResult.success) {\n\t\tconsole.error(\n\t\t\tchalk.red(`❌ Failed to clone repository: ${cloneResult.message}`),\n\t\t)\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Failed to clone repository: ${cloneResult.message}`,\n\t\t\terror: cloneResult.error,\n\t\t}\n\t}\n\n\tconsole.log(chalk.cyan(`\\n🔧 Running npm run setup...\\n`))\n\n\t// Run npm run setup\n\tconst setupResult = await runCommand('npm', ['run', 'setup'], {\n\t\tcwd: workshopPath,\n\t\tsilent: false,\n\t})\n\n\tif (!setupResult.success) {\n\t\t// Clean up on failure\n\t\tconsole.log(chalk.yellow(`🧹 Cleaning up cloned directory...`))\n\t\ttry {\n\t\t\tawait fs.promises.rm(workshopPath, { recursive: true, force: true })\n\t\t} catch {\n\t\t\t// Ignore cleanup errors\n\t\t}\n\t\tconsole.error(chalk.red(`❌ Failed to run setup: ${setupResult.message}`))\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Failed to run setup: ${setupResult.message}`,\n\t\t\terror: setupResult.error,\n\t\t}\n\t}\n\n\t// Get the workshop info (now discoverable since it has package.json with epicshop)\n\tconst workshop = await getWorkshop(TUTORIAL_REPO)\n\tconst workshopTitle = workshop?.title || TUTORIAL_REPO\n\n\tconsole.log()\n\tconsole.log(\n\t\tchalk.green(\n\t\t\t`✅ ${chalk.bold(workshopTitle)} has been set up successfully!\\n`,\n\t\t),\n\t)\n\n\tconst openResult = await promptAndOpenTutorial()\n\tif (!openResult.success) {\n\t\treturn openResult\n\t}\n\n\tawait promptToStartTutorial(workshopTitle)\n\n\tconsole.log(chalk.cyan(`\\n🚀 Starting ${chalk.bold(workshopTitle)}...\\n`))\n\n\t// Start the workshop\n\tconst startResult = await runCommandInteractive('npm', ['start'], {\n\t\tcwd: workshopPath,\n\t})\n\n\tif (!startResult.success) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Failed to start workshop: ${startResult.message}`,\n\t\t\terror: startResult.error,\n\t\t}\n\t}\n\n\treturn { success: true, message: 'Tutorial started successfully' }\n}\n\n/**\n * Check if the workshops directory is configured\n */\nexport async function isConfigured(): Promise<boolean> {\n\tconst { isReposDirectoryConfigured } = await import(\n\t\t'@epic-web/workshop-utils/workshops.server'\n\t)\n\treturn isReposDirectoryConfigured()\n}\n\n/**\n * Wait for user to press Enter to proceed or 'q' to quit\n */\nasync function waitForGo(): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconsole.log(chalk.cyan(\"🐨 Press Enter when you're ready to go.\"))\n\t\tconsole.log(chalk.gray(' (press \"q\" to quit)'))\n\t\tconsole.log()\n\n\t\tconst cleanup = () => {\n\t\t\tif (process.stdin.isTTY) {\n\t\t\t\tprocess.stdin.setRawMode(false)\n\t\t\t\tprocess.stdin.removeListener('data', onData)\n\t\t\t\tprocess.stdin.pause()\n\t\t\t}\n\t\t}\n\n\t\tconst onData = (key: Buffer) => {\n\t\t\tconst char = key.toString()\n\t\t\t// Handle Enter key to go (Enter sends '\\r' in raw mode)\n\t\t\tif (char === '\\r' || char === '\\n') {\n\t\t\t\tcleanup()\n\t\t\t\tresolve()\n\t\t\t}\n\t\t\t// Handle 'q' or Ctrl+C to quit\n\t\t\tif (char.toLowerCase() === 'q' || char === '\\u0003') {\n\t\t\t\tcleanup()\n\t\t\t\tconsole.log(chalk.gray('\\n👋 Goodbye!'))\n\t\t\t\treject(new Error('USER_QUIT'))\n\t\t\t}\n\t\t}\n\n\t\tif (process.stdin.isTTY) {\n\t\t\tprocess.stdin.setRawMode(true)\n\t\t\tprocess.stdin.resume()\n\t\t\tprocess.stdin.on('data', onData)\n\t\t} else {\n\t\t\t// Non-TTY mode, just resolve immediately\n\t\t\tresolve()\n\t\t}\n\t})\n}\n\n// Helper functions\n\nconst SELECT_CURRENT = Symbol('SELECT_CURRENT')\nconst GO_UP = Symbol('GO_UP')\nconst ENTER_CUSTOM = Symbol('ENTER_CUSTOM')\n\ntype DirectoryChoice =\n\t| { type: 'directory'; path: string; name: string }\n\t| {\n\t\t\ttype: 'action'\n\t\t\taction: typeof SELECT_CURRENT | typeof GO_UP | typeof ENTER_CUSTOM\n\t }\n\n/**\n * Interactive directory browser that lets users navigate and select a directory\n */\nasync function browseDirectory(startPath?: string): Promise<string> {\n\tconst { search, input } = await import('@inquirer/prompts')\n\n\tlet currentPath = startPath || os.homedir()\n\n\t// Resolve to absolute path\n\tcurrentPath = path.resolve(currentPath)\n\n\twhile (true) {\n\t\t// Build choices for current directory\n\t\tconst choices: Array<{\n\t\t\tname: string\n\t\t\tvalue: DirectoryChoice\n\t\t\tdescription?: string\n\t\t}> = []\n\n\t\t// Add action choices at the top\n\t\tchoices.push({\n\t\t\tname: `📁 Select this directory`,\n\t\t\tvalue: { type: 'action', action: SELECT_CURRENT },\n\t\t\tdescription: currentPath,\n\t\t})\n\n\t\t// Add \"go up\" option if not at root\n\t\tconst parentDir = path.dirname(currentPath)\n\t\tif (parentDir !== currentPath) {\n\t\t\tchoices.push({\n\t\t\t\tname: `⬆️ Go up to parent`,\n\t\t\t\tvalue: { type: 'action', action: GO_UP },\n\t\t\t\tdescription: parentDir,\n\t\t\t})\n\t\t}\n\n\t\t// Add custom path option\n\t\tchoices.push({\n\t\t\tname: `✏️ Enter a custom path`,\n\t\t\tvalue: { type: 'action', action: ENTER_CUSTOM },\n\t\t\tdescription: 'Type in any path manually',\n\t\t})\n\n\t\t// List subdirectories\n\t\ttry {\n\t\t\tconst entries = await fs.promises.readdir(currentPath, {\n\t\t\t\twithFileTypes: true,\n\t\t\t})\n\t\t\tconst directories = entries\n\t\t\t\t.filter((entry) => entry.isDirectory() && !entry.name.startsWith('.'))\n\t\t\t\t.sort((a, b) => a.name.localeCompare(b.name))\n\n\t\t\tfor (const dir of directories) {\n\t\t\t\tconst fullPath = path.join(currentPath, dir.name)\n\t\t\t\tchoices.push({\n\t\t\t\t\tname: `📂 ${dir.name}/`,\n\t\t\t\t\tvalue: { type: 'directory', path: fullPath, name: dir.name },\n\t\t\t\t\tdescription: fullPath,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch {\n\t\t\t// Can't read directory, just show action choices\n\t\t}\n\n\t\tconst selected = await search<DirectoryChoice>({\n\t\t\tmessage: `Browse directories (current: ${currentPath})`,\n\t\t\tsource: async (term) => {\n\t\t\t\tif (!term) {\n\t\t\t\t\treturn choices\n\t\t\t\t}\n\t\t\t\treturn matchSorter(choices, term, {\n\t\t\t\t\tkeys: ['name', 'value.name', 'description'],\n\t\t\t\t})\n\t\t\t},\n\t\t\tpageSize: 15,\n\t\t})\n\n\t\tif (selected.type === 'action') {\n\t\t\tif (selected.action === SELECT_CURRENT) {\n\t\t\t\treturn currentPath\n\t\t\t} else if (selected.action === GO_UP) {\n\t\t\t\tcurrentPath = parentDir\n\t\t\t} else if (selected.action === ENTER_CUSTOM) {\n\t\t\t\tconst customPath = await input({\n\t\t\t\t\tmessage: 'Enter the directory path:',\n\t\t\t\t\tdefault: currentPath,\n\t\t\t\t\tvalidate: (value) => {\n\t\t\t\t\t\tif (!value.trim()) {\n\t\t\t\t\t\t\treturn 'Please enter a directory path'\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\treturn path.resolve(customPath)\n\t\t\t}\n\t\t} else if (selected.type === 'directory') {\n\t\t\tcurrentPath = selected.path\n\t\t}\n\t}\n}\n\nasync function directoryExists(dirPath: string): Promise<boolean> {\n\ttry {\n\t\tconst stat = await fs.promises.stat(dirPath)\n\t\treturn stat.isDirectory()\n\t} catch {\n\t\treturn false\n\t}\n}\n\ntype CommandResult = {\n\tsuccess: boolean\n\tmessage?: string\n\terror?: Error\n}\n\nfunction resolveCliCommand(command: string): string {\n\t// On Windows, package manager binaries are typically shimmed as *.cmd files.\n\t// Spawning \"npm\" directly can fail with ENOENT even though \"npm.cmd\" exists.\n\tif (\n\t\tprocess.platform === 'win32' &&\n\t\t(command === 'npm' || command === 'npx')\n\t) {\n\t\treturn `${command}.cmd`\n\t}\n\treturn command\n}\n\nfunction runCommand(\n\tcommand: string,\n\targs: string[],\n\toptions: { cwd: string; silent?: boolean },\n): Promise<CommandResult> {\n\treturn new Promise((resolve) => {\n\t\tconst child = spawn(resolveCliCommand(command), args, {\n\t\t\tcwd: options.cwd,\n\t\t\tstdio: options.silent ? 'pipe' : 'inherit',\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\tresolve({ success: false, message: error.message, error })\n\t\t})\n\n\t\tchild.on('close', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tresolve({ success: true })\n\t\t\t} else {\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tmessage: `Command exited with code ${code}`,\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t})\n}\n\nfunction runCommandInteractive(\n\tcommand: string,\n\targs: string[],\n\toptions: { cwd: string },\n): Promise<CommandResult> {\n\treturn new Promise((resolve) => {\n\t\tconst child = spawn(resolveCliCommand(command), args, {\n\t\t\tcwd: options.cwd,\n\t\t\tstdio: 'inherit',\n\t\t})\n\n\t\tchild.on('error', (error) => {\n\t\t\tresolve({ success: false, message: error.message, error })\n\t\t})\n\n\t\tchild.on('close', (code) => {\n\t\t\tif (code === 0 || code === null) {\n\t\t\t\tresolve({ success: true })\n\t\t\t} else {\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tmessage: `Command exited with code ${code}`,\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t})\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "epicshop",
3
- "version": "6.47.4",
3
+ "version": "6.47.6",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -60,7 +60,7 @@
60
60
  "build:watch": "nx watch --projects=epicshop -- nx run \\$NX_PROJECT_NAME:build"
61
61
  },
62
62
  "dependencies": {
63
- "@epic-web/workshop-utils": "6.47.4",
63
+ "@epic-web/workshop-utils": "6.47.6",
64
64
  "@inquirer/prompts": "^7.5.1",
65
65
  "chalk": "^5.6.2",
66
66
  "close-with-grace": "^2.3.0",