@joe-sh/pj 1.6.2 → 1.7.0
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.
- package/dist/index.cjs +13 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +13 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -61,7 +61,7 @@ var PjConfigError = class extends Error {
|
|
|
61
61
|
this.name = "PjConfigError";
|
|
62
62
|
}
|
|
63
63
|
};
|
|
64
|
-
var PJ_TARGET_VERSION = "1.
|
|
64
|
+
var PJ_TARGET_VERSION = "1.7";
|
|
65
65
|
var GITHUB_OWNER = "josephschmitt";
|
|
66
66
|
var GITHUB_REPO = "pj";
|
|
67
67
|
var GITHUB_API_URL = "https://api.github.com";
|
|
@@ -690,14 +690,24 @@ function parseJsonOutput(output) {
|
|
|
690
690
|
}
|
|
691
691
|
try {
|
|
692
692
|
const parsed = JSON.parse(output);
|
|
693
|
-
|
|
693
|
+
const projects = Array.isArray(parsed) ? parsed : parsed.projects;
|
|
694
|
+
if (!Array.isArray(projects)) {
|
|
695
|
+
throw new PjExecutionError(
|
|
696
|
+
`Unexpected pj output format: expected projects array but got ${typeof parsed}`
|
|
697
|
+
);
|
|
698
|
+
}
|
|
699
|
+
return projects.map((p) => ({
|
|
694
700
|
path: p.path,
|
|
695
701
|
name: p.name,
|
|
696
702
|
marker: p.marker,
|
|
697
703
|
icon: p.icon,
|
|
698
|
-
priority:
|
|
704
|
+
priority: void 0
|
|
705
|
+
// not included in JSON output
|
|
699
706
|
}));
|
|
700
707
|
} catch (error) {
|
|
708
|
+
if (error instanceof PjExecutionError) {
|
|
709
|
+
throw error;
|
|
710
|
+
}
|
|
701
711
|
throw new PjExecutionError(
|
|
702
712
|
`Failed to parse pj output: ${error instanceof Error ? error.message : String(error)}`
|
|
703
713
|
);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/types.ts","../src/binary/constants.ts","../src/binary/platform.ts","../src/binary/version.ts","../src/binary/manager.ts","../src/cli/executor.ts","../src/api/discover.ts","../src/api/config.ts","../src/api/cache.ts","../src/api/pj.ts"],"names":["path","os","fs","path2","tar","execa","createWriteStream","pipeline","Readable","binaryManager","path3","os2","fs2","yaml","fs3","path4"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * A discovered project from pj\n */\nexport interface Project {\n /** Absolute path to the project directory */\n path: string;\n /** Name of the project (directory name) */\n name: string;\n /** The marker file/directory that identified this as a project */\n marker: string;\n /** Optional icon for the marker (Nerd Font) */\n icon: string | undefined;\n /** Priority of the marker (higher = more specific) */\n priority: number | undefined;\n}\n\n/**\n * Options for project discovery\n */\nexport interface DiscoverOptions {\n /** Paths to search for projects */\n paths?: string[];\n /** Project marker files/directories to look for */\n markers?: string[];\n /** Patterns to exclude from search */\n excludes?: string[];\n /** Maximum directory depth to search */\n maxDepth?: number;\n /** Don't respect .gitignore files */\n noIgnore?: boolean;\n /** Allow nested project detection */\n nested?: boolean;\n /** Bypass cache and do fresh discovery */\n noCache?: boolean;\n /** Include icons in output */\n icons?: boolean;\n /** Custom config file path */\n configPath?: string;\n /** Enable verbose/debug output */\n verbose?: boolean;\n}\n\n/**\n * Configuration for pj\n */\nexport interface PjConfig {\n /** Paths to search for projects */\n paths: string[];\n /** Project marker files/directories */\n markers: string[];\n /** Patterns to exclude */\n exclude: string[];\n /** Maximum search depth */\n maxDepth: number;\n /** Cache time-to-live in seconds */\n cacheTTL: number;\n /** Don't respect .gitignore */\n noIgnore: boolean;\n /** Allow nested projects */\n noNested: boolean;\n /** Icon mappings for markers */\n icons: Record<string, string>;\n /** Priority mappings for markers (higher = more specific) */\n priorities: Record<string, number>;\n}\n\n/**\n * Information about the pj cache\n */\nexport interface CacheInfo {\n /** Whether the cache exists */\n exists: boolean;\n /** Path to the cache directory */\n path: string;\n /** Number of cache files */\n fileCount: number;\n /** Total size in bytes */\n totalSize: number;\n}\n\n/**\n * Binary installation status\n */\nexport interface BinaryStatus {\n /** Whether a binary is available */\n available: boolean;\n /** Path to the binary */\n path: string | null;\n /** Version of the binary */\n version: string | null;\n /** Source of the binary: 'global', 'cache', or 'env' */\n source: \"global\" | \"cache\" | \"env\" | null;\n}\n\n/**\n * Options for binary management\n */\nexport interface BinaryOptions {\n /** Force download even if binary exists */\n force?: boolean;\n /** Specific version to install (defaults to latest) */\n version?: string;\n /** Progress callback for downloads */\n onProgress?: (progress: DownloadProgress) => void;\n}\n\n/**\n * Download progress information\n */\nexport interface DownloadProgress {\n /** Bytes downloaded so far */\n downloaded: number;\n /** Total bytes to download (may be undefined if unknown) */\n total?: number;\n /** Percentage complete (0-100) */\n percent?: number;\n}\n\n/**\n * GitHub release information\n */\nexport interface GithubRelease {\n /** Release tag name (e.g., \"v1.4.1\") */\n tagName: string;\n /** Release version without 'v' prefix */\n version: string;\n /** Release name/title */\n name: string;\n /** Whether this is a prerelease */\n prerelease: boolean;\n /** Release assets */\n assets: GithubAsset[];\n}\n\n/**\n * GitHub release asset\n */\nexport interface GithubAsset {\n /** Asset name (e.g., \"pj_1.4.1_darwin_arm64.tar.gz\") */\n name: string;\n /** Download URL */\n downloadUrl: string;\n /** File size in bytes */\n size: number;\n /** Content type */\n contentType: string;\n}\n\n/**\n * Platform information\n */\nexport interface Platform {\n /** Operating system: darwin, linux, win32 */\n os: \"darwin\" | \"linux\" | \"win32\";\n /** Architecture: x64, arm64 */\n arch: \"x64\" | \"arm64\";\n /** pj asset OS name */\n pjOs: \"darwin\" | \"linux\" | \"windows\";\n /** pj asset architecture name */\n pjArch: \"amd64\" | \"arm64\";\n}\n\n/**\n * Error thrown when binary operations fail\n */\nexport class PjBinaryError extends Error {\n constructor(\n message: string,\n public override readonly cause?: Error\n ) {\n super(message, { cause });\n this.name = \"PjBinaryError\";\n }\n}\n\n/**\n * Error thrown when pj execution fails\n */\nexport class PjExecutionError extends Error {\n public readonly exitCode: number | undefined;\n public readonly stderr: string | undefined;\n\n constructor(message: string, exitCode?: number, stderr?: string) {\n super(message);\n this.name = \"PjExecutionError\";\n this.exitCode = exitCode;\n this.stderr = stderr;\n }\n}\n\n/**\n * Error thrown when configuration is invalid\n */\nexport class PjConfigError extends Error {\n constructor(\n message: string,\n public override readonly cause?: Error\n ) {\n super(message, { cause });\n this.name = \"PjConfigError\";\n }\n}\n","import * as path from \"node:path\";\nimport * as os from \"node:os\";\n\n/**\n * Target pj version (major.minor) that this package is compatible with.\n * The installer will accept any patch version within this range.\n * Example: \"1.4\" means pj 1.4.0, 1.4.1, 1.4.2, etc. are all compatible.\n *\n * IMPORTANT: When pj releases a new minor version (e.g., 1.5.0),\n * this package must also release a new minor version to match.\n */\nexport const PJ_TARGET_VERSION = \"1.6\";\n\n/** GitHub repository owner */\nexport const GITHUB_OWNER = \"josephschmitt\";\n\n/** GitHub repository name */\nexport const GITHUB_REPO = \"pj\";\n\n/** GitHub API base URL */\nexport const GITHUB_API_URL = \"https://api.github.com\";\n\n/** GitHub releases API endpoint */\nexport const RELEASES_URL = `${GITHUB_API_URL}/repos/${GITHUB_OWNER}/${GITHUB_REPO}/releases`;\n\n/** Latest release API endpoint */\nexport const LATEST_RELEASE_URL = `${RELEASES_URL}/latest`;\n\n/** Binary name (without extension) */\nexport const BINARY_NAME = \"pj\";\n\n/** Binary name on Windows */\nexport const BINARY_NAME_WIN = \"pj.exe\";\n\n/** Get the appropriate binary name for the current platform */\nexport function getBinaryName(): string {\n return process.platform === \"win32\" ? BINARY_NAME_WIN : BINARY_NAME;\n}\n\n/** Cache directory for pj-node */\nexport function getCacheDir(): string {\n const xdgCache = process.env[\"XDG_CACHE_HOME\"];\n if (xdgCache) {\n return path.join(xdgCache, \"pj-node\");\n }\n\n if (process.platform === \"win32\") {\n const localAppData = process.env[\"LOCALAPPDATA\"];\n if (localAppData) {\n return path.join(localAppData, \"pj-node\", \"cache\");\n }\n return path.join(os.homedir(), \"AppData\", \"Local\", \"pj-node\", \"cache\");\n }\n\n return path.join(os.homedir(), \".cache\", \"pj-node\");\n}\n\n/** Binary cache directory */\nexport function getBinaryCacheDir(): string {\n return path.join(getCacheDir(), \"bin\");\n}\n\n/** Metadata file path */\nexport function getMetadataPath(): string {\n return path.join(getCacheDir(), \"metadata.json\");\n}\n\n/** pj config directory */\nexport function getPjConfigDir(): string {\n const xdgConfig = process.env[\"XDG_CONFIG_HOME\"];\n if (xdgConfig) {\n return path.join(xdgConfig, \"pj\");\n }\n\n if (process.platform === \"win32\") {\n const appData = process.env[\"APPDATA\"];\n if (appData) {\n return path.join(appData, \"pj\");\n }\n return path.join(os.homedir(), \"AppData\", \"Roaming\", \"pj\");\n }\n\n return path.join(os.homedir(), \".config\", \"pj\");\n}\n\n/** pj config file path */\nexport function getPjConfigPath(): string {\n return path.join(getPjConfigDir(), \"config.yaml\");\n}\n\n/** pj cache directory */\nexport function getPjCacheDir(): string {\n const xdgCache = process.env[\"XDG_CACHE_HOME\"];\n if (xdgCache) {\n return path.join(xdgCache, \"pj\");\n }\n\n if (process.platform === \"win32\") {\n const localAppData = process.env[\"LOCALAPPDATA\"];\n if (localAppData) {\n return path.join(localAppData, \"pj\", \"cache\");\n }\n return path.join(os.homedir(), \"AppData\", \"Local\", \"pj\", \"cache\");\n }\n\n return path.join(os.homedir(), \".cache\", \"pj\");\n}\n\n/** User agent for GitHub API requests */\nexport const USER_AGENT = \"@joe-sh/pj\";\n\n/** Default timeout for HTTP requests in milliseconds */\nexport const HTTP_TIMEOUT = 30000;\n\n/** Update check interval in days */\nexport const UPDATE_CHECK_INTERVAL_DAYS = 7;\n","import type { Platform } from \"../api/types.js\";\nimport { PjBinaryError } from \"../api/types.js\";\n\n/**\n * Detect the current platform and return normalized platform info\n */\nexport function detectPlatform(): Platform {\n const nodeOs = process.platform;\n const nodeArch = process.arch;\n\n // Map Node.js platform to pj asset names\n let os: Platform[\"os\"];\n let pjOs: Platform[\"pjOs\"];\n\n switch (nodeOs) {\n case \"darwin\":\n os = \"darwin\";\n pjOs = \"darwin\";\n break;\n case \"linux\":\n os = \"linux\";\n pjOs = \"linux\";\n break;\n case \"win32\":\n os = \"win32\";\n pjOs = \"windows\";\n break;\n default:\n throw new PjBinaryError(`Unsupported operating system: ${nodeOs}`);\n }\n\n // Map Node.js architecture to pj asset names\n let arch: Platform[\"arch\"];\n let pjArch: Platform[\"pjArch\"];\n\n switch (nodeArch) {\n case \"x64\":\n arch = \"x64\";\n pjArch = \"amd64\";\n break;\n case \"arm64\":\n arch = \"arm64\";\n pjArch = \"arm64\";\n break;\n default:\n throw new PjBinaryError(`Unsupported architecture: ${nodeArch}`);\n }\n\n return { os, arch, pjOs, pjArch };\n}\n\n/**\n * Get the expected asset filename for the current platform\n */\nexport function getAssetFilename(version: string, platform?: Platform): string {\n const p = platform ?? detectPlatform();\n const versionWithoutV = version.startsWith(\"v\") ? version.slice(1) : version;\n\n return `pj_${versionWithoutV}_${p.pjOs}_${p.pjArch}.tar.gz`;\n}\n\n/**\n * Check if the current platform is supported\n */\nexport function isPlatformSupported(): boolean {\n try {\n detectPlatform();\n return true;\n } catch {\n return false;\n }\n}\n","import { PJ_TARGET_VERSION } from \"./constants.js\";\n\n/**\n * Parsed semantic version\n */\nexport interface ParsedVersion {\n major: number;\n minor: number;\n patch: number;\n raw: string;\n}\n\n/**\n * Parse a semantic version string\n */\nexport function parseVersion(version: string): ParsedVersion | null {\n // Remove leading 'v' if present\n const normalized = version.replace(/^v/, \"\");\n const match = /^(\\d+)\\.(\\d+)\\.(\\d+)/.exec(normalized);\n\n if (!match?.[1] || !match[2] || !match[3]) {\n return null;\n }\n\n return {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n patch: parseInt(match[3], 10),\n raw: normalized,\n };\n}\n\n/**\n * Parse a major.minor version target (e.g., \"1.4\")\n */\nexport function parseTargetVersion(\n target: string\n): { major: number; minor: number } | null {\n const match = /^(\\d+)\\.(\\d+)$/.exec(target);\n if (!match?.[1] || !match[2]) {\n return null;\n }\n\n return {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n };\n}\n\n/**\n * Check if a version is compatible with the target major.minor version.\n * A version is compatible if it has the same major.minor version.\n *\n * Example: target \"1.4\" is compatible with \"1.4.0\", \"1.4.1\", \"1.4.99\"\n * but NOT with \"1.3.0\", \"1.5.0\", or \"2.4.0\"\n */\nexport function isVersionCompatible(\n version: string,\n target: string = PJ_TARGET_VERSION\n): boolean {\n const parsed = parseVersion(version);\n const targetParsed = parseTargetVersion(target);\n\n if (!parsed || !targetParsed) {\n return false;\n }\n\n return (\n parsed.major === targetParsed.major && parsed.minor === targetParsed.minor\n );\n}\n\n/**\n * Compare two versions. Returns:\n * - negative if a < b\n * - positive if a > b\n * - 0 if a === b\n */\nexport function compareVersions(a: string, b: string): number {\n const parsedA = parseVersion(a);\n const parsedB = parseVersion(b);\n\n if (!parsedA || !parsedB) {\n return 0;\n }\n\n if (parsedA.major !== parsedB.major) {\n return parsedA.major - parsedB.major;\n }\n\n if (parsedA.minor !== parsedB.minor) {\n return parsedA.minor - parsedB.minor;\n }\n\n return parsedA.patch - parsedB.patch;\n}\n\n/**\n * Find the highest compatible version from a list of versions\n */\nexport function findHighestCompatibleVersion(\n versions: string[],\n target: string = PJ_TARGET_VERSION\n): string | null {\n const compatible = versions.filter((v) => isVersionCompatible(v, target));\n\n if (compatible.length === 0) {\n return null;\n }\n\n // Sort descending and return the highest\n compatible.sort((a, b) => compareVersions(b, a));\n return compatible[0] ?? null;\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { createWriteStream } from \"node:fs\";\nimport { pipeline } from \"node:stream/promises\";\nimport { Readable } from \"node:stream\";\nimport { execa } from \"execa\";\nimport * as tar from \"tar\";\n\nimport type {\n BinaryOptions,\n BinaryStatus,\n DownloadProgress,\n GithubAsset,\n GithubRelease,\n} from \"../api/types.js\";\nimport { PjBinaryError } from \"../api/types.js\";\nimport {\n RELEASES_URL,\n LATEST_RELEASE_URL,\n USER_AGENT,\n HTTP_TIMEOUT,\n UPDATE_CHECK_INTERVAL_DAYS,\n PJ_TARGET_VERSION,\n getBinaryCacheDir,\n getBinaryName,\n getMetadataPath,\n} from \"./constants.js\";\nimport { detectPlatform, getAssetFilename } from \"./platform.js\";\nimport {\n isVersionCompatible,\n findHighestCompatibleVersion,\n} from \"./version.js\";\n\ninterface CacheMetadata {\n version: string;\n installedAt: string;\n lastUpdateCheck: string;\n source: \"download\";\n}\n\n/**\n * Manages the pj binary installation and updates\n *\n * Note: This module uses `execa` for process execution which does NOT use shell\n * by default, preventing command injection vulnerabilities.\n */\nexport class BinaryManager {\n private cachedBinaryPath: string | null = null;\n\n /**\n * Get the path to the pj binary, downloading if necessary\n */\n async getBinaryPath(options?: BinaryOptions): Promise<string> {\n // Check environment override first\n const envPath = process.env[\"PJ_BINARY_PATH\"];\n if (envPath) {\n if (await this.isValidBinary(envPath)) {\n return envPath;\n }\n throw new PjBinaryError(\n `PJ_BINARY_PATH is set but binary is not valid: ${envPath}`\n );\n }\n\n // Check for global installation\n const globalPath = await this.findGlobalBinary();\n if (globalPath) {\n return globalPath;\n }\n\n // Check cached binary\n const cachedPath = await this.getCachedBinaryPath();\n if (cachedPath && !options?.force) {\n // Check if update is needed\n const needsUpdate = await this.shouldCheckForUpdate();\n if (needsUpdate && options?.version === undefined) {\n try {\n await this.updateBinary(options);\n } catch {\n // If update fails, continue with existing binary\n }\n }\n return cachedPath;\n }\n\n // Download binary\n return await this.downloadBinary(options);\n }\n\n /**\n * Get the current binary status\n */\n async getStatus(): Promise<BinaryStatus> {\n // Check environment override\n const envPath = process.env[\"PJ_BINARY_PATH\"];\n if (envPath && (await this.isValidBinary(envPath))) {\n const version = await this.getVersion(envPath);\n return {\n available: true,\n path: envPath,\n version,\n source: \"env\",\n };\n }\n\n // Check global installation\n const globalPath = await this.findGlobalBinary();\n if (globalPath) {\n const version = await this.getVersion(globalPath);\n return {\n available: true,\n path: globalPath,\n version,\n source: \"global\",\n };\n }\n\n // Check cached binary\n const cachedPath = await this.getCachedBinaryPath();\n if (cachedPath) {\n const version = await this.getVersion(cachedPath);\n return {\n available: true,\n path: cachedPath,\n version,\n source: \"cache\",\n };\n }\n\n return {\n available: false,\n path: null,\n version: null,\n source: null,\n };\n }\n\n /**\n * Download and install the pj binary.\n * If no specific version is requested, downloads the highest compatible version\n * within the target major.minor range.\n */\n async downloadBinary(options?: BinaryOptions): Promise<string> {\n const release = options?.version\n ? await this.getRelease(options.version)\n : await this.getCompatibleRelease();\n\n const platform = detectPlatform();\n const assetName = getAssetFilename(release.version, platform);\n\n const asset = release.assets.find((a) => a.name === assetName);\n if (!asset) {\n throw new PjBinaryError(\n `No binary available for ${platform.pjOs}/${platform.pjArch}. ` +\n `Expected asset: ${assetName}`\n );\n }\n\n // Create cache directory\n const cacheDir = getBinaryCacheDir();\n await fs.mkdir(cacheDir, { recursive: true });\n\n // Download the tarball\n const tarballPath = path.join(cacheDir, assetName);\n await this.downloadAsset(asset, tarballPath, options?.onProgress);\n\n // Extract the binary\n const binaryName = getBinaryName();\n await tar.extract({\n file: tarballPath,\n cwd: cacheDir,\n filter: (entryPath) => path.basename(entryPath) === binaryName,\n });\n\n // Clean up tarball\n await fs.unlink(tarballPath);\n\n // Set executable permissions on Unix\n const binaryPath = path.join(cacheDir, binaryName);\n if (process.platform !== \"win32\") {\n await fs.chmod(binaryPath, 0o755);\n }\n\n // Verify the binary\n if (!(await this.isValidBinary(binaryPath))) {\n throw new PjBinaryError(\"Downloaded binary failed verification\");\n }\n\n // Save metadata\n await this.saveMetadata({\n version: release.version,\n installedAt: new Date().toISOString(),\n lastUpdateCheck: new Date().toISOString(),\n source: \"download\",\n });\n\n this.cachedBinaryPath = binaryPath;\n return binaryPath;\n }\n\n /**\n * Update the binary to the highest compatible version within the target range.\n */\n async updateBinary(options?: BinaryOptions): Promise<string> {\n const compatible = await this.getCompatibleRelease();\n const metadata = await this.getMetadata();\n\n if (metadata?.version === compatible.version && !options?.force) {\n // Already up to date, just update the check timestamp\n await this.saveMetadata({\n ...metadata,\n lastUpdateCheck: new Date().toISOString(),\n });\n const cachedPath = await this.getCachedBinaryPath();\n if (cachedPath) {\n return cachedPath;\n }\n }\n\n return await this.downloadBinary({\n ...options,\n version: compatible.version,\n });\n }\n\n /**\n * Get the version of a pj binary\n */\n async getVersion(binaryPath: string): Promise<string | null> {\n try {\n // execa does not use shell by default, safe from command injection\n const result = await execa(binaryPath, [\"--version\"], { timeout: 5000 });\n // pj outputs version like \"pj version 1.4.1\"\n const match = /(?:pj\\s+)?(?:version\\s+)?v?(\\d+\\.\\d+\\.\\d+)/i.exec(\n result.stdout\n );\n return match?.[1] ?? null;\n } catch {\n return null;\n }\n }\n\n /**\n * Check if a binary path is a valid pj binary\n */\n async isValidBinary(binaryPath: string): Promise<boolean> {\n try {\n await fs.access(binaryPath, fs.constants.X_OK);\n const version = await this.getVersion(binaryPath);\n return version !== null;\n } catch {\n return false;\n }\n }\n\n /**\n * Find the globally installed pj binary.\n * Only returns the binary if it's version-compatible with our target.\n */\n private async findGlobalBinary(): Promise<string | null> {\n // execa does not use shell by default, safe from command injection\n let binaryPath: string | null = null;\n\n try {\n const result = await execa(\"which\", [\"pj\"], { timeout: 5000 });\n binaryPath = result.stdout.trim();\n } catch {\n // which failed or binary not found\n }\n\n // On Windows, try where\n if (!binaryPath && process.platform === \"win32\") {\n try {\n const result = await execa(\"where\", [\"pj\"], { timeout: 5000 });\n binaryPath = result.stdout.trim().split(\"\\n\")[0] ?? null;\n } catch {\n // where failed or binary not found\n }\n }\n\n if (!binaryPath) {\n return null;\n }\n\n // Check if the binary is valid\n if (!(await this.isValidBinary(binaryPath))) {\n return null;\n }\n\n // Check if the version is compatible\n const version = await this.getVersion(binaryPath);\n if (!version || !isVersionCompatible(version, PJ_TARGET_VERSION)) {\n return null;\n }\n\n return binaryPath;\n }\n\n /**\n * Get the path to the cached binary if it exists and is version-compatible.\n */\n private async getCachedBinaryPath(): Promise<string | null> {\n if (this.cachedBinaryPath) {\n if (await this.isValidBinary(this.cachedBinaryPath)) {\n // Verify version compatibility\n const version = await this.getVersion(this.cachedBinaryPath);\n if (version && isVersionCompatible(version, PJ_TARGET_VERSION)) {\n return this.cachedBinaryPath;\n }\n }\n this.cachedBinaryPath = null;\n }\n\n const binaryPath = path.join(getBinaryCacheDir(), getBinaryName());\n if (await this.isValidBinary(binaryPath)) {\n // Verify version compatibility\n const version = await this.getVersion(binaryPath);\n if (version && isVersionCompatible(version, PJ_TARGET_VERSION)) {\n this.cachedBinaryPath = binaryPath;\n return binaryPath;\n }\n }\n\n return null;\n }\n\n /**\n * Check if we should check for updates\n */\n private async shouldCheckForUpdate(): Promise<boolean> {\n const metadata = await this.getMetadata();\n if (!metadata) {\n return true;\n }\n\n const lastCheck = new Date(metadata.lastUpdateCheck);\n const now = new Date();\n const daysSinceCheck =\n (now.getTime() - lastCheck.getTime()) / (1000 * 60 * 60 * 24);\n\n return daysSinceCheck >= UPDATE_CHECK_INTERVAL_DAYS;\n }\n\n /**\n * Get cached metadata\n */\n private async getMetadata(): Promise<CacheMetadata | null> {\n try {\n const content = await fs.readFile(getMetadataPath(), \"utf-8\");\n return JSON.parse(content) as CacheMetadata;\n } catch {\n return null;\n }\n }\n\n /**\n * Save metadata to cache\n */\n private async saveMetadata(metadata: CacheMetadata): Promise<void> {\n const metadataPath = getMetadataPath();\n await fs.mkdir(path.dirname(metadataPath), { recursive: true });\n await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2));\n }\n\n /**\n * Get all releases from GitHub (up to 100 most recent)\n */\n async getAllReleases(): Promise<GithubRelease[]> {\n const response = await fetch(`${RELEASES_URL}?per_page=100`, {\n headers: {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": USER_AGENT,\n },\n signal: AbortSignal.timeout(HTTP_TIMEOUT),\n });\n\n if (!response.ok) {\n throw new PjBinaryError(\n `Failed to fetch releases: ${String(response.status)} ${response.statusText}`\n );\n }\n\n const data = (await response.json()) as {\n tag_name: string;\n name: string;\n prerelease: boolean;\n assets: {\n name: string;\n browser_download_url: string;\n size: number;\n content_type: string;\n }[];\n }[];\n\n return data\n .filter((release) => !release.prerelease)\n .map((release) => this.parseRelease(release));\n }\n\n /**\n * Get the highest compatible release within the target major.minor range.\n */\n async getCompatibleRelease(): Promise<GithubRelease> {\n const releases = await this.getAllReleases();\n const versions = releases.map((r) => r.version);\n\n const compatibleVersion = findHighestCompatibleVersion(\n versions,\n PJ_TARGET_VERSION\n );\n\n if (!compatibleVersion) {\n throw new PjBinaryError(\n `No compatible pj release found for version range ${PJ_TARGET_VERSION}.x. ` +\n `Available versions: ${versions.join(\", \")}`\n );\n }\n\n const release = releases.find((r) => r.version === compatibleVersion);\n if (!release) {\n throw new PjBinaryError(\n `Failed to find release for version ${compatibleVersion}`\n );\n }\n\n return release;\n }\n\n /**\n * Get the latest release from GitHub\n */\n async getLatestRelease(): Promise<GithubRelease> {\n const response = await fetch(LATEST_RELEASE_URL, {\n headers: {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": USER_AGENT,\n },\n signal: AbortSignal.timeout(HTTP_TIMEOUT),\n });\n\n if (!response.ok) {\n throw new PjBinaryError(\n `Failed to fetch latest release: ${String(response.status)} ${response.statusText}`\n );\n }\n\n const data = (await response.json()) as {\n tag_name: string;\n name: string;\n prerelease: boolean;\n assets: {\n name: string;\n browser_download_url: string;\n size: number;\n content_type: string;\n }[];\n };\n\n return this.parseRelease(data);\n }\n\n /**\n * Get a specific release from GitHub\n */\n private async getRelease(version: string): Promise<GithubRelease> {\n const tag = version.startsWith(\"v\") ? version : `v${version}`;\n const url = `${LATEST_RELEASE_URL.replace(\"/latest\", \"\")}/${tag}`;\n\n const response = await fetch(url, {\n headers: {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": USER_AGENT,\n },\n signal: AbortSignal.timeout(HTTP_TIMEOUT),\n });\n\n if (!response.ok) {\n throw new PjBinaryError(\n `Failed to fetch release ${version}: ${String(response.status)} ${response.statusText}`\n );\n }\n\n const data = (await response.json()) as {\n tag_name: string;\n name: string;\n prerelease: boolean;\n assets: {\n name: string;\n browser_download_url: string;\n size: number;\n content_type: string;\n }[];\n };\n\n return this.parseRelease(data);\n }\n\n /**\n * Parse GitHub release response\n */\n private parseRelease(data: {\n tag_name: string;\n name: string;\n prerelease: boolean;\n assets: {\n name: string;\n browser_download_url: string;\n size: number;\n content_type: string;\n }[];\n }): GithubRelease {\n return {\n tagName: data.tag_name,\n version: data.tag_name.replace(/^v/, \"\"),\n name: data.name,\n prerelease: data.prerelease,\n assets: data.assets.map((asset) => ({\n name: asset.name,\n downloadUrl: asset.browser_download_url,\n size: asset.size,\n contentType: asset.content_type,\n })),\n };\n }\n\n /**\n * Download an asset to a file\n */\n private async downloadAsset(\n asset: GithubAsset,\n destPath: string,\n onProgress?: (progress: DownloadProgress) => void\n ): Promise<void> {\n const response = await fetch(asset.downloadUrl, {\n headers: {\n \"User-Agent\": USER_AGENT,\n },\n signal: AbortSignal.timeout(HTTP_TIMEOUT * 10), // Longer timeout for downloads\n });\n\n if (!response.ok) {\n throw new PjBinaryError(\n `Failed to download asset: ${String(response.status)} ${response.statusText}`\n );\n }\n\n if (!response.body) {\n throw new PjBinaryError(\"Response body is empty\");\n }\n\n const total = asset.size;\n let downloaded = 0;\n\n const progressStream = new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n downloaded += chunk.length;\n onProgress?.({\n downloaded,\n total,\n percent: Math.round((downloaded / total) * 100),\n });\n controller.enqueue(chunk);\n },\n });\n\n const fileStream = createWriteStream(destPath);\n\n await pipeline(\n Readable.fromWeb(response.body.pipeThrough(progressStream)),\n fileStream\n );\n }\n\n /**\n * Clear the binary cache\n */\n async clearCache(): Promise<void> {\n const cacheDir = getBinaryCacheDir();\n try {\n await fs.rm(cacheDir, { recursive: true, force: true });\n } catch {\n // Ignore errors if directory doesn't exist\n }\n\n const metadataPath = getMetadataPath();\n try {\n await fs.unlink(metadataPath);\n } catch {\n // Ignore errors if file doesn't exist\n }\n\n this.cachedBinaryPath = null;\n }\n}\n\n/** Singleton instance */\nlet binaryManager: BinaryManager | null = null;\n\n/**\n * Get the singleton BinaryManager instance\n */\nexport function getBinaryManager(): BinaryManager {\n binaryManager ??= new BinaryManager();\n return binaryManager;\n}\n","import { execa, type Options as ExecaOptions } from \"execa\";\n\nimport type { DiscoverOptions, Project } from \"../api/types.js\";\nimport { PjExecutionError } from \"../api/types.js\";\nimport { getBinaryManager } from \"../binary/manager.js\";\n\n/**\n * Result from executing pj\n */\nexport interface PjResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Build command-line arguments from DiscoverOptions\n */\nexport function buildArgs(options?: DiscoverOptions): string[] {\n const args: string[] = [];\n\n if (options?.paths) {\n for (const p of options.paths) {\n args.push(\"--path\", p);\n }\n }\n\n if (options?.markers) {\n for (const m of options.markers) {\n args.push(\"--marker\", m);\n }\n }\n\n if (options?.excludes) {\n for (const e of options.excludes) {\n args.push(\"--exclude\", e);\n }\n }\n\n if (options?.maxDepth !== undefined) {\n args.push(\"--max-depth\", String(options.maxDepth));\n }\n\n if (options?.noIgnore) {\n args.push(\"--no-ignore\");\n }\n\n if (options?.nested === false) {\n args.push(\"--no-nested\");\n }\n\n if (options?.noCache) {\n args.push(\"--no-cache\");\n }\n\n if (options?.icons) {\n args.push(\"--icons\");\n }\n\n if (options?.configPath) {\n args.push(\"--config\", options.configPath);\n }\n\n if (options?.verbose) {\n args.push(\"--verbose\");\n }\n\n // Always request JSON output for programmatic use\n args.push(\"--json\");\n\n return args;\n}\n\n/**\n * Parse JSON output from pj\n */\nexport function parseJsonOutput(output: string): Project[] {\n if (!output.trim()) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(output) as {\n path: string;\n name: string;\n marker: string;\n icon?: string;\n priority?: number;\n }[];\n\n return parsed.map((p) => ({\n path: p.path,\n name: p.name,\n marker: p.marker,\n icon: p.icon,\n priority: p.priority,\n }));\n } catch (error) {\n throw new PjExecutionError(\n `Failed to parse pj output: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Execute the pj binary with the given arguments\n *\n * Note: This function uses `execa` which does NOT use shell by default,\n * preventing command injection vulnerabilities.\n */\nexport async function executePj(\n args: string[],\n execaOptions?: ExecaOptions\n): Promise<PjResult> {\n const binaryManager = getBinaryManager();\n const binaryPath = await binaryManager.getBinaryPath();\n\n try {\n // execa does not use shell by default, safe from command injection\n // stdin: 'ignore' prevents hanging when called from Node.js environments\n // that inherit stdin from parent process (e.g., Raycast, VS Code extensions)\n const result = await execa(binaryPath, args, {\n stdin: \"ignore\",\n timeout: 60000, // 1 minute timeout\n ...execaOptions,\n });\n\n return {\n stdout: String(result.stdout ?? \"\"),\n stderr: String(result.stderr ?? \"\"),\n exitCode: result.exitCode ?? 0,\n };\n } catch (error) {\n if (error instanceof Error && \"exitCode\" in error) {\n const execaError = error as Error & {\n exitCode?: number;\n stderr?: string;\n };\n throw new PjExecutionError(\n `pj command failed: ${execaError.message}`,\n execaError.exitCode,\n execaError.stderr\n );\n }\n throw error;\n }\n}\n\n/**\n * Execute pj with stdin input\n *\n * Note: This function uses `execa` which does NOT use shell by default,\n * preventing command injection vulnerabilities.\n */\nexport async function executePjWithStdin(\n args: string[],\n stdin: string,\n execaOptions?: ExecaOptions\n): Promise<PjResult> {\n const binaryManager = getBinaryManager();\n const binaryPath = await binaryManager.getBinaryPath();\n\n try {\n // execa does not use shell by default, safe from command injection\n const result = await execa(binaryPath, args, {\n input: stdin,\n timeout: 60000,\n ...execaOptions,\n });\n\n return {\n stdout: String(result.stdout ?? \"\"),\n stderr: String(result.stderr ?? \"\"),\n exitCode: result.exitCode ?? 0,\n };\n } catch (error) {\n if (error instanceof Error && \"exitCode\" in error) {\n const execaError = error as Error & {\n exitCode?: number;\n stderr?: string;\n };\n throw new PjExecutionError(\n `pj command failed: ${execaError.message}`,\n execaError.exitCode,\n execaError.stderr\n );\n }\n throw error;\n }\n}\n","import type { DiscoverOptions, Project } from \"./types.js\";\nimport {\n buildArgs,\n executePj,\n executePjWithStdin,\n parseJsonOutput,\n} from \"../cli/executor.js\";\n\n/**\n * Discover projects using pj\n */\nexport async function discover(options?: DiscoverOptions): Promise<Project[]> {\n const args = buildArgs(options);\n const result = await executePj(args);\n return parseJsonOutput(result.stdout);\n}\n\n/**\n * Discover projects from specific paths provided via stdin\n *\n * This bypasses the configured paths and discovers projects only in the\n * provided paths. Useful for integrating with other tools that provide\n * a list of directories to search.\n */\nexport async function discoverFromPaths(\n paths: string[],\n options?: Omit<DiscoverOptions, \"paths\">\n): Promise<Project[]> {\n // Build args without --path flags since we're using stdin\n // We explicitly omit paths by building options without it\n const optsWithoutPaths: DiscoverOptions = {};\n if (options?.markers !== undefined) optsWithoutPaths.markers = options.markers;\n if (options?.excludes !== undefined) optsWithoutPaths.excludes = options.excludes;\n if (options?.maxDepth !== undefined) optsWithoutPaths.maxDepth = options.maxDepth;\n if (options?.noIgnore !== undefined) optsWithoutPaths.noIgnore = options.noIgnore;\n if (options?.nested !== undefined) optsWithoutPaths.nested = options.nested;\n if (options?.noCache !== undefined) optsWithoutPaths.noCache = options.noCache;\n if (options?.icons !== undefined) optsWithoutPaths.icons = options.icons;\n if (options?.configPath !== undefined) optsWithoutPaths.configPath = options.configPath;\n if (options?.verbose !== undefined) optsWithoutPaths.verbose = options.verbose;\n\n const args = buildArgs(optsWithoutPaths);\n\n // Pass paths via stdin (one per line)\n const stdin = paths.join(\"\\n\");\n\n const result = await executePjWithStdin(args, stdin);\n\n return parseJsonOutput(result.stdout);\n}\n\n/**\n * Find a project by name\n */\nexport async function findProject(\n name: string,\n options?: DiscoverOptions\n): Promise<Project | undefined> {\n const projects = await discover(options);\n return projects.find(\n (p) => p.name === name || p.name.toLowerCase() === name.toLowerCase()\n );\n}\n\n/**\n * Find projects matching a pattern\n */\nexport async function findProjects(\n pattern: string | RegExp,\n options?: DiscoverOptions\n): Promise<Project[]> {\n const projects = await discover(options);\n const regex = typeof pattern === \"string\" ? new RegExp(pattern, \"i\") : pattern;\n return projects.filter((p) => regex.test(p.name) || regex.test(p.path));\n}\n\n/**\n * Get projects grouped by marker type\n */\nexport async function discoverByMarker(\n options?: DiscoverOptions\n): Promise<Map<string, Project[]>> {\n const projects = await discover(options);\n const grouped = new Map<string, Project[]>();\n\n for (const project of projects) {\n const existing = grouped.get(project.marker);\n if (existing) {\n existing.push(project);\n } else {\n grouped.set(project.marker, [project]);\n }\n }\n\n return grouped;\n}\n\n/**\n * Count projects by marker type\n */\nexport async function countByMarker(\n options?: DiscoverOptions\n): Promise<Map<string, number>> {\n const grouped = await discoverByMarker(options);\n const counts = new Map<string, number>();\n\n for (const [marker, projects] of grouped) {\n counts.set(marker, projects.length);\n }\n\n return counts;\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport * as yaml from \"yaml\";\n\nimport type { PjConfig } from \"./types.js\";\nimport { PjConfigError } from \"./types.js\";\nimport { getPjConfigPath } from \"../binary/constants.js\";\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG: PjConfig = {\n paths: [\n path.join(os.homedir(), \"projects\"),\n path.join(os.homedir(), \"code\"),\n path.join(os.homedir(), \"development\"),\n ],\n markers: [\n \".git\",\n \"go.mod\",\n \"package.json\",\n \"Cargo.toml\",\n \"pyproject.toml\",\n \"Makefile\",\n \"flake.nix\",\n \".vscode\",\n \".idea\",\n \".fleet\",\n \".project\",\n \".zed\",\n \"Dockerfile\",\n ],\n exclude: [\n \"node_modules\",\n \".terraform\",\n \"vendor\",\n \".git\",\n \"target\",\n \"dist\",\n \"build\",\n ],\n maxDepth: 3,\n cacheTTL: 300,\n noIgnore: false,\n noNested: false,\n icons: {\n \".git\": \"\\uf1d3 \", //\n \"package.json\": \"\\ue718 \", //\n \"go.mod\": \"\\ue626 \", //\n \"Cargo.toml\": \"\\ue7a8 \", //\n \"pyproject.toml\": \"\\ue73c \", //\n \".vscode\": \"\\ue70c \", //\n \".idea\": \"\\ue7b5 \", //\n Makefile: \"\\ue779 \", //\n Dockerfile: \"\\ue7b0\",\n },\n priorities: {\n \".git\": 1,\n \"go.mod\": 10,\n \"package.json\": 10,\n \"Cargo.toml\": 10,\n \"pyproject.toml\": 10,\n Makefile: 1,\n \"flake.nix\": 10,\n \".vscode\": 5,\n \".idea\": 5,\n \".fleet\": 5,\n \".project\": 5,\n \".zed\": 5,\n Dockerfile: 7,\n },\n};\n\n/**\n * Load pj configuration from file\n */\nexport async function loadConfig(configPath?: string): Promise<PjConfig> {\n const filePath = configPath ?? getPjConfigPath();\n\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const parsed = yaml.parse(content) as Partial<RawConfig>;\n return mergeConfig(parsed);\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n // Config file doesn't exist, return defaults\n return { ...DEFAULT_CONFIG };\n }\n throw new PjConfigError(\n `Failed to load config from ${filePath}`,\n error instanceof Error ? error : undefined\n );\n }\n}\n\n/**\n * Save configuration to file\n */\nexport async function saveConfig(\n config: Partial<PjConfig>,\n configPath?: string\n): Promise<void> {\n const filePath = configPath ?? getPjConfigPath();\n\n // Convert to raw format, only including defined properties\n const rawConfig: RawConfig = {};\n\n if (config.paths !== undefined) rawConfig.paths = config.paths;\n if (config.markers !== undefined) rawConfig.markers = config.markers;\n if (config.exclude !== undefined) rawConfig.exclude = config.exclude;\n if (config.maxDepth !== undefined) rawConfig.max_depth = config.maxDepth;\n if (config.cacheTTL !== undefined) rawConfig.cache_ttl = config.cacheTTL;\n if (config.noIgnore !== undefined) rawConfig.no_ignore = config.noIgnore;\n if (config.noNested !== undefined) rawConfig.no_nested = config.noNested;\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- support legacy format\n if (config.icons !== undefined) rawConfig.icons = config.icons;\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- support legacy format\n if (config.priorities !== undefined) rawConfig.priorities = config.priorities;\n\n const content = yaml.stringify(rawConfig, { indent: 2 });\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, content, \"utf-8\");\n}\n\n/**\n * Check if a config file exists\n */\nexport async function configExists(configPath?: string): Promise<boolean> {\n const filePath = configPath ?? getPjConfigPath();\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the default config path\n */\nexport function getConfigPath(): string {\n return getPjConfigPath();\n}\n\n/**\n * Raw marker config - can be a string or an object with marker, icon, and priority\n */\ntype RawMarker =\n | string\n | {\n marker: string;\n icon?: string;\n priority?: number;\n };\n\n/**\n * Raw config format as stored in YAML (snake_case)\n */\ninterface RawConfig {\n paths?: string[];\n markers?: RawMarker[];\n exclude?: string[];\n max_depth?: number;\n cache_ttl?: number;\n no_ignore?: boolean;\n no_nested?: boolean;\n /** @deprecated Use the new markers format with icon field instead */\n icons?: Record<string, string>;\n /** @deprecated Use the new markers format with priority field instead */\n priorities?: Record<string, number>;\n}\n\n/**\n * Parse raw markers into separate markers, icons, and priorities\n */\nfunction parseRawMarkers(rawMarkers: RawMarker[]): {\n markers: string[];\n icons: Record<string, string>;\n priorities: Record<string, number>;\n} {\n const markers: string[] = [];\n const icons: Record<string, string> = {};\n const priorities: Record<string, number> = {};\n\n for (const raw of rawMarkers) {\n if (typeof raw === \"string\") {\n markers.push(raw);\n } else {\n markers.push(raw.marker);\n if (raw.icon !== undefined) {\n icons[raw.marker] = raw.icon;\n }\n if (raw.priority !== undefined) {\n priorities[raw.marker] = raw.priority;\n }\n }\n }\n\n return { markers, icons, priorities };\n}\n\n/**\n * Merge raw config with defaults\n */\nfunction mergeConfig(raw: Partial<RawConfig>): PjConfig {\n // Parse markers from raw config if provided\n let markers = DEFAULT_CONFIG.markers;\n let parsedIcons: Record<string, string> = {};\n let parsedPriorities: Record<string, number> = {};\n\n if (raw.markers !== undefined) {\n const parsed = parseRawMarkers(raw.markers);\n markers = parsed.markers;\n parsedIcons = parsed.icons;\n parsedPriorities = parsed.priorities;\n }\n\n // Merge icons: defaults <- deprecated icons field <- new format icons\n const icons = {\n ...DEFAULT_CONFIG.icons,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- support legacy format\n ...(raw.icons ?? {}),\n ...parsedIcons,\n };\n\n // Merge priorities: defaults <- deprecated priorities field <- new format priorities\n const priorities = {\n ...DEFAULT_CONFIG.priorities,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- support legacy format\n ...(raw.priorities ?? {}),\n ...parsedPriorities,\n };\n\n return {\n paths: raw.paths ?? DEFAULT_CONFIG.paths,\n markers,\n exclude: raw.exclude ?? DEFAULT_CONFIG.exclude,\n maxDepth: raw.max_depth ?? DEFAULT_CONFIG.maxDepth,\n cacheTTL: raw.cache_ttl ?? DEFAULT_CONFIG.cacheTTL,\n noIgnore: raw.no_ignore ?? DEFAULT_CONFIG.noIgnore,\n noNested: raw.no_nested ?? DEFAULT_CONFIG.noNested,\n icons,\n priorities,\n };\n}\n\n/**\n * Expand ~ in paths to home directory\n */\nexport function expandPath(p: string): string {\n if (p.startsWith(\"~/\")) {\n return path.join(os.homedir(), p.slice(2));\n }\n if (p === \"~\") {\n return os.homedir();\n }\n return p;\n}\n\n/**\n * Expand all paths in config\n */\nexport function expandConfigPaths(config: PjConfig): PjConfig {\n return {\n ...config,\n paths: config.paths.map(expandPath),\n };\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nimport type { CacheInfo } from \"./types.js\";\nimport { getPjCacheDir } from \"../binary/constants.js\";\nimport { executePj } from \"../cli/executor.js\";\n\n/**\n * Clear the pj project cache\n */\nexport async function clearCache(): Promise<void> {\n await executePj([\"--clear-cache\"]);\n}\n\n/**\n * Get information about the pj cache\n */\nexport async function getCacheInfo(): Promise<CacheInfo> {\n const cacheDir = getPjCacheDir();\n\n try {\n const stats = await fs.stat(cacheDir);\n if (!stats.isDirectory()) {\n return {\n exists: false,\n path: cacheDir,\n fileCount: 0,\n totalSize: 0,\n };\n }\n\n const files = await fs.readdir(cacheDir);\n let totalSize = 0;\n let fileCount = 0;\n\n for (const file of files) {\n if (file.endsWith(\".json\")) {\n const filePath = path.join(cacheDir, file);\n const fileStats = await fs.stat(filePath);\n totalSize += fileStats.size;\n fileCount++;\n }\n }\n\n return {\n exists: true,\n path: cacheDir,\n fileCount,\n totalSize,\n };\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return {\n exists: false,\n path: cacheDir,\n fileCount: 0,\n totalSize: 0,\n };\n }\n throw error;\n }\n}\n\n/**\n * Get the cache directory path\n */\nexport function getCachePath(): string {\n return getPjCacheDir();\n}\n","import type {\n BinaryOptions,\n BinaryStatus,\n CacheInfo,\n DiscoverOptions,\n PjConfig,\n Project,\n} from \"./types.js\";\nimport {\n discover,\n discoverFromPaths,\n findProject,\n findProjects,\n discoverByMarker,\n countByMarker,\n} from \"./discover.js\";\nimport { loadConfig, saveConfig, DEFAULT_CONFIG } from \"./config.js\";\nimport { clearCache, getCacheInfo } from \"./cache.js\";\nimport { getBinaryManager } from \"../binary/manager.js\";\n\n/**\n * Main class for interacting with pj\n *\n * Provides a high-level API for project discovery, configuration management,\n * and binary management.\n *\n * @example\n * ```typescript\n * const pj = new Pj();\n *\n * // Discover all projects\n * const projects = await pj.discover();\n *\n * // Find a specific project\n * const myProject = await pj.findProject('my-app');\n *\n * // Search for projects\n * const reactProjects = await pj.findProjects(/react/i);\n * ```\n */\nexport class Pj {\n private config: PjConfig;\n\n /**\n * Create a new Pj instance\n *\n * @param config - Optional configuration overrides\n */\n constructor(config?: Partial<PjConfig>) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Discover all projects\n *\n * @param options - Discovery options\n * @returns Array of discovered projects\n */\n async discover(options?: DiscoverOptions): Promise<Project[]> {\n return discover(this.mergeOptions(options));\n }\n\n /**\n * Discover projects from specific paths\n *\n * Bypasses configured paths and searches only the provided paths.\n * Useful for integration with other tools.\n *\n * @param paths - Paths to search\n * @param options - Additional discovery options\n */\n async discoverFromPaths(\n paths: string[],\n options?: Omit<DiscoverOptions, \"paths\">\n ): Promise<Project[]> {\n return discoverFromPaths(paths, this.mergeOptions(options));\n }\n\n /**\n * Find a project by name\n *\n * @param name - Project name to find\n * @param options - Discovery options\n */\n async findProject(\n name: string,\n options?: DiscoverOptions\n ): Promise<Project | undefined> {\n return findProject(name, this.mergeOptions(options));\n }\n\n /**\n * Find projects matching a pattern\n *\n * @param pattern - String or regex pattern to match\n * @param options - Discovery options\n */\n async findProjects(\n pattern: string | RegExp,\n options?: DiscoverOptions\n ): Promise<Project[]> {\n return findProjects(pattern, this.mergeOptions(options));\n }\n\n /**\n * Get projects grouped by marker type\n *\n * @param options - Discovery options\n */\n async discoverByMarker(\n options?: DiscoverOptions\n ): Promise<Map<string, Project[]>> {\n return discoverByMarker(this.mergeOptions(options));\n }\n\n /**\n * Count projects by marker type\n *\n * @param options - Discovery options\n */\n async countByMarker(options?: DiscoverOptions): Promise<Map<string, number>> {\n return countByMarker(this.mergeOptions(options));\n }\n\n /**\n * Clear the pj project cache\n */\n async clearCache(): Promise<void> {\n return clearCache();\n }\n\n /**\n * Get information about the pj cache\n */\n async getCacheInfo(): Promise<CacheInfo> {\n return getCacheInfo();\n }\n\n /**\n * Load configuration from file\n *\n * @param configPath - Optional path to config file\n */\n async loadConfig(configPath?: string): Promise<PjConfig> {\n const loaded = await loadConfig(configPath);\n this.config = loaded;\n return loaded;\n }\n\n /**\n * Save configuration to file\n *\n * @param config - Configuration to save (uses current config if not provided)\n * @param configPath - Optional path to config file\n */\n async saveConfig(config?: Partial<PjConfig>, configPath?: string): Promise<void> {\n const toSave = config ? { ...this.config, ...config } : this.config;\n await saveConfig(toSave, configPath);\n }\n\n /**\n * Get current configuration\n */\n getConfig(): PjConfig {\n return { ...this.config };\n }\n\n /**\n * Update configuration\n *\n * @param config - Partial configuration to merge\n */\n setConfig(config: Partial<PjConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Ensure the pj binary is available\n *\n * Downloads the binary if not already installed.\n *\n * @param options - Binary options\n * @returns Path to the binary\n */\n async ensureBinary(options?: BinaryOptions): Promise<string> {\n const manager = getBinaryManager();\n return manager.getBinaryPath(options);\n }\n\n /**\n * Get the status of the pj binary\n */\n async getBinaryStatus(): Promise<BinaryStatus> {\n const manager = getBinaryManager();\n return manager.getStatus();\n }\n\n /**\n * Update the pj binary to the latest version\n *\n * @param options - Binary options\n * @returns Path to the updated binary\n */\n async updateBinary(options?: BinaryOptions): Promise<string> {\n const manager = getBinaryManager();\n return manager.updateBinary(options);\n }\n\n /**\n * Get the version of the pj binary\n */\n async getBinaryVersion(): Promise<string | null> {\n const manager = getBinaryManager();\n const status = await manager.getStatus();\n return status.version;\n }\n\n /**\n * Merge instance config with provided options\n */\n private mergeOptions(options?: DiscoverOptions): DiscoverOptions {\n const merged: DiscoverOptions = {\n paths: options?.paths ?? this.config.paths,\n markers: options?.markers ?? this.config.markers,\n excludes: options?.excludes ?? this.config.exclude,\n maxDepth: options?.maxDepth ?? this.config.maxDepth,\n noIgnore: options?.noIgnore ?? this.config.noIgnore,\n nested: options?.nested ?? !this.config.noNested,\n };\n\n // Only include optional properties if they have values\n if (options?.icons !== undefined) {\n merged.icons = options.icons;\n }\n if (options?.noCache !== undefined) {\n merged.noCache = options.noCache;\n }\n if (options?.configPath !== undefined) {\n merged.configPath = options.configPath;\n }\n if (options?.verbose !== undefined) {\n merged.verbose = options.verbose;\n }\n\n return merged;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api/types.ts","../src/binary/constants.ts","../src/binary/platform.ts","../src/binary/version.ts","../src/binary/manager.ts","../src/cli/executor.ts","../src/api/discover.ts","../src/api/config.ts","../src/api/cache.ts","../src/api/pj.ts"],"names":["path","os","fs","path2","tar","execa","createWriteStream","pipeline","Readable","binaryManager","path3","os2","fs2","yaml","fs3","path4"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * A discovered project from pj\n */\nexport interface Project {\n /** Absolute path to the project directory */\n path: string;\n /** Name of the project (directory name) */\n name: string;\n /** The marker file/directory that identified this as a project */\n marker: string;\n /** Optional icon for the marker (Nerd Font) */\n icon: string | undefined;\n /** Priority of the marker (higher = more specific) */\n priority: number | undefined;\n}\n\n/**\n * Options for project discovery\n */\nexport interface DiscoverOptions {\n /** Paths to search for projects */\n paths?: string[];\n /** Project marker files/directories to look for */\n markers?: string[];\n /** Patterns to exclude from search */\n excludes?: string[];\n /** Maximum directory depth to search */\n maxDepth?: number;\n /** Don't respect .gitignore files */\n noIgnore?: boolean;\n /** Allow nested project detection */\n nested?: boolean;\n /** Bypass cache and do fresh discovery */\n noCache?: boolean;\n /** Include icons in output */\n icons?: boolean;\n /** Custom config file path */\n configPath?: string;\n /** Enable verbose/debug output */\n verbose?: boolean;\n}\n\n/**\n * Configuration for pj\n */\nexport interface PjConfig {\n /** Paths to search for projects */\n paths: string[];\n /** Project marker files/directories */\n markers: string[];\n /** Patterns to exclude */\n exclude: string[];\n /** Maximum search depth */\n maxDepth: number;\n /** Cache time-to-live in seconds */\n cacheTTL: number;\n /** Don't respect .gitignore */\n noIgnore: boolean;\n /** Allow nested projects */\n noNested: boolean;\n /** Icon mappings for markers */\n icons: Record<string, string>;\n /** Priority mappings for markers (higher = more specific) */\n priorities: Record<string, number>;\n}\n\n/**\n * Information about the pj cache\n */\nexport interface CacheInfo {\n /** Whether the cache exists */\n exists: boolean;\n /** Path to the cache directory */\n path: string;\n /** Number of cache files */\n fileCount: number;\n /** Total size in bytes */\n totalSize: number;\n}\n\n/**\n * Binary installation status\n */\nexport interface BinaryStatus {\n /** Whether a binary is available */\n available: boolean;\n /** Path to the binary */\n path: string | null;\n /** Version of the binary */\n version: string | null;\n /** Source of the binary: 'global', 'cache', or 'env' */\n source: \"global\" | \"cache\" | \"env\" | null;\n}\n\n/**\n * Options for binary management\n */\nexport interface BinaryOptions {\n /** Force download even if binary exists */\n force?: boolean;\n /** Specific version to install (defaults to latest) */\n version?: string;\n /** Progress callback for downloads */\n onProgress?: (progress: DownloadProgress) => void;\n}\n\n/**\n * Download progress information\n */\nexport interface DownloadProgress {\n /** Bytes downloaded so far */\n downloaded: number;\n /** Total bytes to download (may be undefined if unknown) */\n total?: number;\n /** Percentage complete (0-100) */\n percent?: number;\n}\n\n/**\n * GitHub release information\n */\nexport interface GithubRelease {\n /** Release tag name (e.g., \"v1.4.1\") */\n tagName: string;\n /** Release version without 'v' prefix */\n version: string;\n /** Release name/title */\n name: string;\n /** Whether this is a prerelease */\n prerelease: boolean;\n /** Release assets */\n assets: GithubAsset[];\n}\n\n/**\n * GitHub release asset\n */\nexport interface GithubAsset {\n /** Asset name (e.g., \"pj_1.4.1_darwin_arm64.tar.gz\") */\n name: string;\n /** Download URL */\n downloadUrl: string;\n /** File size in bytes */\n size: number;\n /** Content type */\n contentType: string;\n}\n\n/**\n * Platform information\n */\nexport interface Platform {\n /** Operating system: darwin, linux, win32 */\n os: \"darwin\" | \"linux\" | \"win32\";\n /** Architecture: x64, arm64 */\n arch: \"x64\" | \"arm64\";\n /** pj asset OS name */\n pjOs: \"darwin\" | \"linux\" | \"windows\";\n /** pj asset architecture name */\n pjArch: \"amd64\" | \"arm64\";\n}\n\n/**\n * Error thrown when binary operations fail\n */\nexport class PjBinaryError extends Error {\n constructor(\n message: string,\n public override readonly cause?: Error\n ) {\n super(message, { cause });\n this.name = \"PjBinaryError\";\n }\n}\n\n/**\n * Error thrown when pj execution fails\n */\nexport class PjExecutionError extends Error {\n public readonly exitCode: number | undefined;\n public readonly stderr: string | undefined;\n\n constructor(message: string, exitCode?: number, stderr?: string) {\n super(message);\n this.name = \"PjExecutionError\";\n this.exitCode = exitCode;\n this.stderr = stderr;\n }\n}\n\n/**\n * Error thrown when configuration is invalid\n */\nexport class PjConfigError extends Error {\n constructor(\n message: string,\n public override readonly cause?: Error\n ) {\n super(message, { cause });\n this.name = \"PjConfigError\";\n }\n}\n","import * as path from \"node:path\";\nimport * as os from \"node:os\";\n\n/**\n * Target pj version (major.minor) that this package is compatible with.\n * The installer will accept any patch version within this range.\n * Example: \"1.4\" means pj 1.4.0, 1.4.1, 1.4.2, etc. are all compatible.\n *\n * IMPORTANT: When pj releases a new minor version (e.g., 1.5.0),\n * this package must also release a new minor version to match.\n */\nexport const PJ_TARGET_VERSION = \"1.7\";\n\n/** GitHub repository owner */\nexport const GITHUB_OWNER = \"josephschmitt\";\n\n/** GitHub repository name */\nexport const GITHUB_REPO = \"pj\";\n\n/** GitHub API base URL */\nexport const GITHUB_API_URL = \"https://api.github.com\";\n\n/** GitHub releases API endpoint */\nexport const RELEASES_URL = `${GITHUB_API_URL}/repos/${GITHUB_OWNER}/${GITHUB_REPO}/releases`;\n\n/** Latest release API endpoint */\nexport const LATEST_RELEASE_URL = `${RELEASES_URL}/latest`;\n\n/** Binary name (without extension) */\nexport const BINARY_NAME = \"pj\";\n\n/** Binary name on Windows */\nexport const BINARY_NAME_WIN = \"pj.exe\";\n\n/** Get the appropriate binary name for the current platform */\nexport function getBinaryName(): string {\n return process.platform === \"win32\" ? BINARY_NAME_WIN : BINARY_NAME;\n}\n\n/** Cache directory for pj-node */\nexport function getCacheDir(): string {\n const xdgCache = process.env[\"XDG_CACHE_HOME\"];\n if (xdgCache) {\n return path.join(xdgCache, \"pj-node\");\n }\n\n if (process.platform === \"win32\") {\n const localAppData = process.env[\"LOCALAPPDATA\"];\n if (localAppData) {\n return path.join(localAppData, \"pj-node\", \"cache\");\n }\n return path.join(os.homedir(), \"AppData\", \"Local\", \"pj-node\", \"cache\");\n }\n\n return path.join(os.homedir(), \".cache\", \"pj-node\");\n}\n\n/** Binary cache directory */\nexport function getBinaryCacheDir(): string {\n return path.join(getCacheDir(), \"bin\");\n}\n\n/** Metadata file path */\nexport function getMetadataPath(): string {\n return path.join(getCacheDir(), \"metadata.json\");\n}\n\n/** pj config directory */\nexport function getPjConfigDir(): string {\n const xdgConfig = process.env[\"XDG_CONFIG_HOME\"];\n if (xdgConfig) {\n return path.join(xdgConfig, \"pj\");\n }\n\n if (process.platform === \"win32\") {\n const appData = process.env[\"APPDATA\"];\n if (appData) {\n return path.join(appData, \"pj\");\n }\n return path.join(os.homedir(), \"AppData\", \"Roaming\", \"pj\");\n }\n\n return path.join(os.homedir(), \".config\", \"pj\");\n}\n\n/** pj config file path */\nexport function getPjConfigPath(): string {\n return path.join(getPjConfigDir(), \"config.yaml\");\n}\n\n/** pj cache directory */\nexport function getPjCacheDir(): string {\n const xdgCache = process.env[\"XDG_CACHE_HOME\"];\n if (xdgCache) {\n return path.join(xdgCache, \"pj\");\n }\n\n if (process.platform === \"win32\") {\n const localAppData = process.env[\"LOCALAPPDATA\"];\n if (localAppData) {\n return path.join(localAppData, \"pj\", \"cache\");\n }\n return path.join(os.homedir(), \"AppData\", \"Local\", \"pj\", \"cache\");\n }\n\n return path.join(os.homedir(), \".cache\", \"pj\");\n}\n\n/** User agent for GitHub API requests */\nexport const USER_AGENT = \"@joe-sh/pj\";\n\n/** Default timeout for HTTP requests in milliseconds */\nexport const HTTP_TIMEOUT = 30000;\n\n/** Update check interval in days */\nexport const UPDATE_CHECK_INTERVAL_DAYS = 7;\n","import type { Platform } from \"../api/types.js\";\nimport { PjBinaryError } from \"../api/types.js\";\n\n/**\n * Detect the current platform and return normalized platform info\n */\nexport function detectPlatform(): Platform {\n const nodeOs = process.platform;\n const nodeArch = process.arch;\n\n // Map Node.js platform to pj asset names\n let os: Platform[\"os\"];\n let pjOs: Platform[\"pjOs\"];\n\n switch (nodeOs) {\n case \"darwin\":\n os = \"darwin\";\n pjOs = \"darwin\";\n break;\n case \"linux\":\n os = \"linux\";\n pjOs = \"linux\";\n break;\n case \"win32\":\n os = \"win32\";\n pjOs = \"windows\";\n break;\n default:\n throw new PjBinaryError(`Unsupported operating system: ${nodeOs}`);\n }\n\n // Map Node.js architecture to pj asset names\n let arch: Platform[\"arch\"];\n let pjArch: Platform[\"pjArch\"];\n\n switch (nodeArch) {\n case \"x64\":\n arch = \"x64\";\n pjArch = \"amd64\";\n break;\n case \"arm64\":\n arch = \"arm64\";\n pjArch = \"arm64\";\n break;\n default:\n throw new PjBinaryError(`Unsupported architecture: ${nodeArch}`);\n }\n\n return { os, arch, pjOs, pjArch };\n}\n\n/**\n * Get the expected asset filename for the current platform\n */\nexport function getAssetFilename(version: string, platform?: Platform): string {\n const p = platform ?? detectPlatform();\n const versionWithoutV = version.startsWith(\"v\") ? version.slice(1) : version;\n\n return `pj_${versionWithoutV}_${p.pjOs}_${p.pjArch}.tar.gz`;\n}\n\n/**\n * Check if the current platform is supported\n */\nexport function isPlatformSupported(): boolean {\n try {\n detectPlatform();\n return true;\n } catch {\n return false;\n }\n}\n","import { PJ_TARGET_VERSION } from \"./constants.js\";\n\n/**\n * Parsed semantic version\n */\nexport interface ParsedVersion {\n major: number;\n minor: number;\n patch: number;\n raw: string;\n}\n\n/**\n * Parse a semantic version string\n */\nexport function parseVersion(version: string): ParsedVersion | null {\n // Remove leading 'v' if present\n const normalized = version.replace(/^v/, \"\");\n const match = /^(\\d+)\\.(\\d+)\\.(\\d+)/.exec(normalized);\n\n if (!match?.[1] || !match[2] || !match[3]) {\n return null;\n }\n\n return {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n patch: parseInt(match[3], 10),\n raw: normalized,\n };\n}\n\n/**\n * Parse a major.minor version target (e.g., \"1.4\")\n */\nexport function parseTargetVersion(\n target: string\n): { major: number; minor: number } | null {\n const match = /^(\\d+)\\.(\\d+)$/.exec(target);\n if (!match?.[1] || !match[2]) {\n return null;\n }\n\n return {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n };\n}\n\n/**\n * Check if a version is compatible with the target major.minor version.\n * A version is compatible if it has the same major.minor version.\n *\n * Example: target \"1.4\" is compatible with \"1.4.0\", \"1.4.1\", \"1.4.99\"\n * but NOT with \"1.3.0\", \"1.5.0\", or \"2.4.0\"\n */\nexport function isVersionCompatible(\n version: string,\n target: string = PJ_TARGET_VERSION\n): boolean {\n const parsed = parseVersion(version);\n const targetParsed = parseTargetVersion(target);\n\n if (!parsed || !targetParsed) {\n return false;\n }\n\n return (\n parsed.major === targetParsed.major && parsed.minor === targetParsed.minor\n );\n}\n\n/**\n * Compare two versions. Returns:\n * - negative if a < b\n * - positive if a > b\n * - 0 if a === b\n */\nexport function compareVersions(a: string, b: string): number {\n const parsedA = parseVersion(a);\n const parsedB = parseVersion(b);\n\n if (!parsedA || !parsedB) {\n return 0;\n }\n\n if (parsedA.major !== parsedB.major) {\n return parsedA.major - parsedB.major;\n }\n\n if (parsedA.minor !== parsedB.minor) {\n return parsedA.minor - parsedB.minor;\n }\n\n return parsedA.patch - parsedB.patch;\n}\n\n/**\n * Find the highest compatible version from a list of versions\n */\nexport function findHighestCompatibleVersion(\n versions: string[],\n target: string = PJ_TARGET_VERSION\n): string | null {\n const compatible = versions.filter((v) => isVersionCompatible(v, target));\n\n if (compatible.length === 0) {\n return null;\n }\n\n // Sort descending and return the highest\n compatible.sort((a, b) => compareVersions(b, a));\n return compatible[0] ?? null;\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { createWriteStream } from \"node:fs\";\nimport { pipeline } from \"node:stream/promises\";\nimport { Readable } from \"node:stream\";\nimport { execa } from \"execa\";\nimport * as tar from \"tar\";\n\nimport type {\n BinaryOptions,\n BinaryStatus,\n DownloadProgress,\n GithubAsset,\n GithubRelease,\n} from \"../api/types.js\";\nimport { PjBinaryError } from \"../api/types.js\";\nimport {\n RELEASES_URL,\n LATEST_RELEASE_URL,\n USER_AGENT,\n HTTP_TIMEOUT,\n UPDATE_CHECK_INTERVAL_DAYS,\n PJ_TARGET_VERSION,\n getBinaryCacheDir,\n getBinaryName,\n getMetadataPath,\n} from \"./constants.js\";\nimport { detectPlatform, getAssetFilename } from \"./platform.js\";\nimport {\n isVersionCompatible,\n findHighestCompatibleVersion,\n} from \"./version.js\";\n\ninterface CacheMetadata {\n version: string;\n installedAt: string;\n lastUpdateCheck: string;\n source: \"download\";\n}\n\n/**\n * Manages the pj binary installation and updates\n *\n * Note: This module uses `execa` for process execution which does NOT use shell\n * by default, preventing command injection vulnerabilities.\n */\nexport class BinaryManager {\n private cachedBinaryPath: string | null = null;\n\n /**\n * Get the path to the pj binary, downloading if necessary\n */\n async getBinaryPath(options?: BinaryOptions): Promise<string> {\n // Check environment override first\n const envPath = process.env[\"PJ_BINARY_PATH\"];\n if (envPath) {\n if (await this.isValidBinary(envPath)) {\n return envPath;\n }\n throw new PjBinaryError(\n `PJ_BINARY_PATH is set but binary is not valid: ${envPath}`\n );\n }\n\n // Check for global installation\n const globalPath = await this.findGlobalBinary();\n if (globalPath) {\n return globalPath;\n }\n\n // Check cached binary\n const cachedPath = await this.getCachedBinaryPath();\n if (cachedPath && !options?.force) {\n // Check if update is needed\n const needsUpdate = await this.shouldCheckForUpdate();\n if (needsUpdate && options?.version === undefined) {\n try {\n await this.updateBinary(options);\n } catch {\n // If update fails, continue with existing binary\n }\n }\n return cachedPath;\n }\n\n // Download binary\n return await this.downloadBinary(options);\n }\n\n /**\n * Get the current binary status\n */\n async getStatus(): Promise<BinaryStatus> {\n // Check environment override\n const envPath = process.env[\"PJ_BINARY_PATH\"];\n if (envPath && (await this.isValidBinary(envPath))) {\n const version = await this.getVersion(envPath);\n return {\n available: true,\n path: envPath,\n version,\n source: \"env\",\n };\n }\n\n // Check global installation\n const globalPath = await this.findGlobalBinary();\n if (globalPath) {\n const version = await this.getVersion(globalPath);\n return {\n available: true,\n path: globalPath,\n version,\n source: \"global\",\n };\n }\n\n // Check cached binary\n const cachedPath = await this.getCachedBinaryPath();\n if (cachedPath) {\n const version = await this.getVersion(cachedPath);\n return {\n available: true,\n path: cachedPath,\n version,\n source: \"cache\",\n };\n }\n\n return {\n available: false,\n path: null,\n version: null,\n source: null,\n };\n }\n\n /**\n * Download and install the pj binary.\n * If no specific version is requested, downloads the highest compatible version\n * within the target major.minor range.\n */\n async downloadBinary(options?: BinaryOptions): Promise<string> {\n const release = options?.version\n ? await this.getRelease(options.version)\n : await this.getCompatibleRelease();\n\n const platform = detectPlatform();\n const assetName = getAssetFilename(release.version, platform);\n\n const asset = release.assets.find((a) => a.name === assetName);\n if (!asset) {\n throw new PjBinaryError(\n `No binary available for ${platform.pjOs}/${platform.pjArch}. ` +\n `Expected asset: ${assetName}`\n );\n }\n\n // Create cache directory\n const cacheDir = getBinaryCacheDir();\n await fs.mkdir(cacheDir, { recursive: true });\n\n // Download the tarball\n const tarballPath = path.join(cacheDir, assetName);\n await this.downloadAsset(asset, tarballPath, options?.onProgress);\n\n // Extract the binary\n const binaryName = getBinaryName();\n await tar.extract({\n file: tarballPath,\n cwd: cacheDir,\n filter: (entryPath) => path.basename(entryPath) === binaryName,\n });\n\n // Clean up tarball\n await fs.unlink(tarballPath);\n\n // Set executable permissions on Unix\n const binaryPath = path.join(cacheDir, binaryName);\n if (process.platform !== \"win32\") {\n await fs.chmod(binaryPath, 0o755);\n }\n\n // Verify the binary\n if (!(await this.isValidBinary(binaryPath))) {\n throw new PjBinaryError(\"Downloaded binary failed verification\");\n }\n\n // Save metadata\n await this.saveMetadata({\n version: release.version,\n installedAt: new Date().toISOString(),\n lastUpdateCheck: new Date().toISOString(),\n source: \"download\",\n });\n\n this.cachedBinaryPath = binaryPath;\n return binaryPath;\n }\n\n /**\n * Update the binary to the highest compatible version within the target range.\n */\n async updateBinary(options?: BinaryOptions): Promise<string> {\n const compatible = await this.getCompatibleRelease();\n const metadata = await this.getMetadata();\n\n if (metadata?.version === compatible.version && !options?.force) {\n // Already up to date, just update the check timestamp\n await this.saveMetadata({\n ...metadata,\n lastUpdateCheck: new Date().toISOString(),\n });\n const cachedPath = await this.getCachedBinaryPath();\n if (cachedPath) {\n return cachedPath;\n }\n }\n\n return await this.downloadBinary({\n ...options,\n version: compatible.version,\n });\n }\n\n /**\n * Get the version of a pj binary\n */\n async getVersion(binaryPath: string): Promise<string | null> {\n try {\n // execa does not use shell by default, safe from command injection\n const result = await execa(binaryPath, [\"--version\"], { timeout: 5000 });\n // pj outputs version like \"pj version 1.4.1\"\n const match = /(?:pj\\s+)?(?:version\\s+)?v?(\\d+\\.\\d+\\.\\d+)/i.exec(\n result.stdout\n );\n return match?.[1] ?? null;\n } catch {\n return null;\n }\n }\n\n /**\n * Check if a binary path is a valid pj binary\n */\n async isValidBinary(binaryPath: string): Promise<boolean> {\n try {\n await fs.access(binaryPath, fs.constants.X_OK);\n const version = await this.getVersion(binaryPath);\n return version !== null;\n } catch {\n return false;\n }\n }\n\n /**\n * Find the globally installed pj binary.\n * Only returns the binary if it's version-compatible with our target.\n */\n private async findGlobalBinary(): Promise<string | null> {\n // execa does not use shell by default, safe from command injection\n let binaryPath: string | null = null;\n\n try {\n const result = await execa(\"which\", [\"pj\"], { timeout: 5000 });\n binaryPath = result.stdout.trim();\n } catch {\n // which failed or binary not found\n }\n\n // On Windows, try where\n if (!binaryPath && process.platform === \"win32\") {\n try {\n const result = await execa(\"where\", [\"pj\"], { timeout: 5000 });\n binaryPath = result.stdout.trim().split(\"\\n\")[0] ?? null;\n } catch {\n // where failed or binary not found\n }\n }\n\n if (!binaryPath) {\n return null;\n }\n\n // Check if the binary is valid\n if (!(await this.isValidBinary(binaryPath))) {\n return null;\n }\n\n // Check if the version is compatible\n const version = await this.getVersion(binaryPath);\n if (!version || !isVersionCompatible(version, PJ_TARGET_VERSION)) {\n return null;\n }\n\n return binaryPath;\n }\n\n /**\n * Get the path to the cached binary if it exists and is version-compatible.\n */\n private async getCachedBinaryPath(): Promise<string | null> {\n if (this.cachedBinaryPath) {\n if (await this.isValidBinary(this.cachedBinaryPath)) {\n // Verify version compatibility\n const version = await this.getVersion(this.cachedBinaryPath);\n if (version && isVersionCompatible(version, PJ_TARGET_VERSION)) {\n return this.cachedBinaryPath;\n }\n }\n this.cachedBinaryPath = null;\n }\n\n const binaryPath = path.join(getBinaryCacheDir(), getBinaryName());\n if (await this.isValidBinary(binaryPath)) {\n // Verify version compatibility\n const version = await this.getVersion(binaryPath);\n if (version && isVersionCompatible(version, PJ_TARGET_VERSION)) {\n this.cachedBinaryPath = binaryPath;\n return binaryPath;\n }\n }\n\n return null;\n }\n\n /**\n * Check if we should check for updates\n */\n private async shouldCheckForUpdate(): Promise<boolean> {\n const metadata = await this.getMetadata();\n if (!metadata) {\n return true;\n }\n\n const lastCheck = new Date(metadata.lastUpdateCheck);\n const now = new Date();\n const daysSinceCheck =\n (now.getTime() - lastCheck.getTime()) / (1000 * 60 * 60 * 24);\n\n return daysSinceCheck >= UPDATE_CHECK_INTERVAL_DAYS;\n }\n\n /**\n * Get cached metadata\n */\n private async getMetadata(): Promise<CacheMetadata | null> {\n try {\n const content = await fs.readFile(getMetadataPath(), \"utf-8\");\n return JSON.parse(content) as CacheMetadata;\n } catch {\n return null;\n }\n }\n\n /**\n * Save metadata to cache\n */\n private async saveMetadata(metadata: CacheMetadata): Promise<void> {\n const metadataPath = getMetadataPath();\n await fs.mkdir(path.dirname(metadataPath), { recursive: true });\n await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2));\n }\n\n /**\n * Get all releases from GitHub (up to 100 most recent)\n */\n async getAllReleases(): Promise<GithubRelease[]> {\n const response = await fetch(`${RELEASES_URL}?per_page=100`, {\n headers: {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": USER_AGENT,\n },\n signal: AbortSignal.timeout(HTTP_TIMEOUT),\n });\n\n if (!response.ok) {\n throw new PjBinaryError(\n `Failed to fetch releases: ${String(response.status)} ${response.statusText}`\n );\n }\n\n const data = (await response.json()) as {\n tag_name: string;\n name: string;\n prerelease: boolean;\n assets: {\n name: string;\n browser_download_url: string;\n size: number;\n content_type: string;\n }[];\n }[];\n\n return data\n .filter((release) => !release.prerelease)\n .map((release) => this.parseRelease(release));\n }\n\n /**\n * Get the highest compatible release within the target major.minor range.\n */\n async getCompatibleRelease(): Promise<GithubRelease> {\n const releases = await this.getAllReleases();\n const versions = releases.map((r) => r.version);\n\n const compatibleVersion = findHighestCompatibleVersion(\n versions,\n PJ_TARGET_VERSION\n );\n\n if (!compatibleVersion) {\n throw new PjBinaryError(\n `No compatible pj release found for version range ${PJ_TARGET_VERSION}.x. ` +\n `Available versions: ${versions.join(\", \")}`\n );\n }\n\n const release = releases.find((r) => r.version === compatibleVersion);\n if (!release) {\n throw new PjBinaryError(\n `Failed to find release for version ${compatibleVersion}`\n );\n }\n\n return release;\n }\n\n /**\n * Get the latest release from GitHub\n */\n async getLatestRelease(): Promise<GithubRelease> {\n const response = await fetch(LATEST_RELEASE_URL, {\n headers: {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": USER_AGENT,\n },\n signal: AbortSignal.timeout(HTTP_TIMEOUT),\n });\n\n if (!response.ok) {\n throw new PjBinaryError(\n `Failed to fetch latest release: ${String(response.status)} ${response.statusText}`\n );\n }\n\n const data = (await response.json()) as {\n tag_name: string;\n name: string;\n prerelease: boolean;\n assets: {\n name: string;\n browser_download_url: string;\n size: number;\n content_type: string;\n }[];\n };\n\n return this.parseRelease(data);\n }\n\n /**\n * Get a specific release from GitHub\n */\n private async getRelease(version: string): Promise<GithubRelease> {\n const tag = version.startsWith(\"v\") ? version : `v${version}`;\n const url = `${LATEST_RELEASE_URL.replace(\"/latest\", \"\")}/${tag}`;\n\n const response = await fetch(url, {\n headers: {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": USER_AGENT,\n },\n signal: AbortSignal.timeout(HTTP_TIMEOUT),\n });\n\n if (!response.ok) {\n throw new PjBinaryError(\n `Failed to fetch release ${version}: ${String(response.status)} ${response.statusText}`\n );\n }\n\n const data = (await response.json()) as {\n tag_name: string;\n name: string;\n prerelease: boolean;\n assets: {\n name: string;\n browser_download_url: string;\n size: number;\n content_type: string;\n }[];\n };\n\n return this.parseRelease(data);\n }\n\n /**\n * Parse GitHub release response\n */\n private parseRelease(data: {\n tag_name: string;\n name: string;\n prerelease: boolean;\n assets: {\n name: string;\n browser_download_url: string;\n size: number;\n content_type: string;\n }[];\n }): GithubRelease {\n return {\n tagName: data.tag_name,\n version: data.tag_name.replace(/^v/, \"\"),\n name: data.name,\n prerelease: data.prerelease,\n assets: data.assets.map((asset) => ({\n name: asset.name,\n downloadUrl: asset.browser_download_url,\n size: asset.size,\n contentType: asset.content_type,\n })),\n };\n }\n\n /**\n * Download an asset to a file\n */\n private async downloadAsset(\n asset: GithubAsset,\n destPath: string,\n onProgress?: (progress: DownloadProgress) => void\n ): Promise<void> {\n const response = await fetch(asset.downloadUrl, {\n headers: {\n \"User-Agent\": USER_AGENT,\n },\n signal: AbortSignal.timeout(HTTP_TIMEOUT * 10), // Longer timeout for downloads\n });\n\n if (!response.ok) {\n throw new PjBinaryError(\n `Failed to download asset: ${String(response.status)} ${response.statusText}`\n );\n }\n\n if (!response.body) {\n throw new PjBinaryError(\"Response body is empty\");\n }\n\n const total = asset.size;\n let downloaded = 0;\n\n const progressStream = new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n downloaded += chunk.length;\n onProgress?.({\n downloaded,\n total,\n percent: Math.round((downloaded / total) * 100),\n });\n controller.enqueue(chunk);\n },\n });\n\n const fileStream = createWriteStream(destPath);\n\n await pipeline(\n Readable.fromWeb(response.body.pipeThrough(progressStream)),\n fileStream\n );\n }\n\n /**\n * Clear the binary cache\n */\n async clearCache(): Promise<void> {\n const cacheDir = getBinaryCacheDir();\n try {\n await fs.rm(cacheDir, { recursive: true, force: true });\n } catch {\n // Ignore errors if directory doesn't exist\n }\n\n const metadataPath = getMetadataPath();\n try {\n await fs.unlink(metadataPath);\n } catch {\n // Ignore errors if file doesn't exist\n }\n\n this.cachedBinaryPath = null;\n }\n}\n\n/** Singleton instance */\nlet binaryManager: BinaryManager | null = null;\n\n/**\n * Get the singleton BinaryManager instance\n */\nexport function getBinaryManager(): BinaryManager {\n binaryManager ??= new BinaryManager();\n return binaryManager;\n}\n","import { execa, type Options as ExecaOptions } from \"execa\";\n\nimport type { DiscoverOptions, Project } from \"../api/types.js\";\nimport { PjExecutionError } from \"../api/types.js\";\nimport { getBinaryManager } from \"../binary/manager.js\";\n\n/**\n * Result from executing pj\n */\nexport interface PjResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Build command-line arguments from DiscoverOptions\n */\nexport function buildArgs(options?: DiscoverOptions): string[] {\n const args: string[] = [];\n\n if (options?.paths) {\n for (const p of options.paths) {\n args.push(\"--path\", p);\n }\n }\n\n if (options?.markers) {\n for (const m of options.markers) {\n args.push(\"--marker\", m);\n }\n }\n\n if (options?.excludes) {\n for (const e of options.excludes) {\n args.push(\"--exclude\", e);\n }\n }\n\n if (options?.maxDepth !== undefined) {\n args.push(\"--max-depth\", String(options.maxDepth));\n }\n\n if (options?.noIgnore) {\n args.push(\"--no-ignore\");\n }\n\n if (options?.nested === false) {\n args.push(\"--no-nested\");\n }\n\n if (options?.noCache) {\n args.push(\"--no-cache\");\n }\n\n if (options?.icons) {\n args.push(\"--icons\");\n }\n\n if (options?.configPath) {\n args.push(\"--config\", options.configPath);\n }\n\n if (options?.verbose) {\n args.push(\"--verbose\");\n }\n\n // Always request JSON output for programmatic use\n args.push(\"--json\");\n\n return args;\n}\n\n/**\n * JSON structure returned by pj binary\n */\ninterface PjJsonProject {\n path: string;\n name: string;\n marker: string;\n icon?: string;\n}\n\ninterface PjJsonOutput {\n projects: PjJsonProject[];\n}\n\n/**\n * Parse JSON output from pj\n */\nexport function parseJsonOutput(output: string): Project[] {\n if (!output.trim()) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(output) as PjJsonOutput | PjJsonProject[];\n\n // Handle both wrapped format { \"projects\": [...] } and direct array format\n const projects = Array.isArray(parsed) ? parsed : parsed.projects;\n\n if (!Array.isArray(projects)) {\n throw new PjExecutionError(\n `Unexpected pj output format: expected projects array but got ${typeof parsed}`\n );\n }\n\n return projects.map((p) => ({\n path: p.path,\n name: p.name,\n marker: p.marker,\n icon: p.icon,\n priority: undefined, // not included in JSON output\n }));\n } catch (error) {\n if (error instanceof PjExecutionError) {\n throw error;\n }\n throw new PjExecutionError(\n `Failed to parse pj output: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Execute the pj binary with the given arguments\n *\n * Note: This function uses `execa` which does NOT use shell by default,\n * preventing command injection vulnerabilities.\n */\nexport async function executePj(\n args: string[],\n execaOptions?: ExecaOptions\n): Promise<PjResult> {\n const binaryManager = getBinaryManager();\n const binaryPath = await binaryManager.getBinaryPath();\n\n try {\n // execa does not use shell by default, safe from command injection\n // stdin: 'ignore' prevents hanging when called from Node.js environments\n // that inherit stdin from parent process (e.g., Raycast, VS Code extensions)\n const result = await execa(binaryPath, args, {\n stdin: \"ignore\",\n timeout: 60000, // 1 minute timeout\n ...execaOptions,\n });\n\n return {\n stdout: String(result.stdout ?? \"\"),\n stderr: String(result.stderr ?? \"\"),\n exitCode: result.exitCode ?? 0,\n };\n } catch (error) {\n if (error instanceof Error && \"exitCode\" in error) {\n const execaError = error as Error & {\n exitCode?: number;\n stderr?: string;\n };\n throw new PjExecutionError(\n `pj command failed: ${execaError.message}`,\n execaError.exitCode,\n execaError.stderr\n );\n }\n throw error;\n }\n}\n\n/**\n * Execute pj with stdin input\n *\n * Note: This function uses `execa` which does NOT use shell by default,\n * preventing command injection vulnerabilities.\n */\nexport async function executePjWithStdin(\n args: string[],\n stdin: string,\n execaOptions?: ExecaOptions\n): Promise<PjResult> {\n const binaryManager = getBinaryManager();\n const binaryPath = await binaryManager.getBinaryPath();\n\n try {\n // execa does not use shell by default, safe from command injection\n const result = await execa(binaryPath, args, {\n input: stdin,\n timeout: 60000,\n ...execaOptions,\n });\n\n return {\n stdout: String(result.stdout ?? \"\"),\n stderr: String(result.stderr ?? \"\"),\n exitCode: result.exitCode ?? 0,\n };\n } catch (error) {\n if (error instanceof Error && \"exitCode\" in error) {\n const execaError = error as Error & {\n exitCode?: number;\n stderr?: string;\n };\n throw new PjExecutionError(\n `pj command failed: ${execaError.message}`,\n execaError.exitCode,\n execaError.stderr\n );\n }\n throw error;\n }\n}\n","import type { DiscoverOptions, Project } from \"./types.js\";\nimport {\n buildArgs,\n executePj,\n executePjWithStdin,\n parseJsonOutput,\n} from \"../cli/executor.js\";\n\n/**\n * Discover projects using pj\n */\nexport async function discover(options?: DiscoverOptions): Promise<Project[]> {\n const args = buildArgs(options);\n const result = await executePj(args);\n return parseJsonOutput(result.stdout);\n}\n\n/**\n * Discover projects from specific paths provided via stdin\n *\n * This bypasses the configured paths and discovers projects only in the\n * provided paths. Useful for integrating with other tools that provide\n * a list of directories to search.\n */\nexport async function discoverFromPaths(\n paths: string[],\n options?: Omit<DiscoverOptions, \"paths\">\n): Promise<Project[]> {\n // Build args without --path flags since we're using stdin\n // We explicitly omit paths by building options without it\n const optsWithoutPaths: DiscoverOptions = {};\n if (options?.markers !== undefined) optsWithoutPaths.markers = options.markers;\n if (options?.excludes !== undefined) optsWithoutPaths.excludes = options.excludes;\n if (options?.maxDepth !== undefined) optsWithoutPaths.maxDepth = options.maxDepth;\n if (options?.noIgnore !== undefined) optsWithoutPaths.noIgnore = options.noIgnore;\n if (options?.nested !== undefined) optsWithoutPaths.nested = options.nested;\n if (options?.noCache !== undefined) optsWithoutPaths.noCache = options.noCache;\n if (options?.icons !== undefined) optsWithoutPaths.icons = options.icons;\n if (options?.configPath !== undefined) optsWithoutPaths.configPath = options.configPath;\n if (options?.verbose !== undefined) optsWithoutPaths.verbose = options.verbose;\n\n const args = buildArgs(optsWithoutPaths);\n\n // Pass paths via stdin (one per line)\n const stdin = paths.join(\"\\n\");\n\n const result = await executePjWithStdin(args, stdin);\n\n return parseJsonOutput(result.stdout);\n}\n\n/**\n * Find a project by name\n */\nexport async function findProject(\n name: string,\n options?: DiscoverOptions\n): Promise<Project | undefined> {\n const projects = await discover(options);\n return projects.find(\n (p) => p.name === name || p.name.toLowerCase() === name.toLowerCase()\n );\n}\n\n/**\n * Find projects matching a pattern\n */\nexport async function findProjects(\n pattern: string | RegExp,\n options?: DiscoverOptions\n): Promise<Project[]> {\n const projects = await discover(options);\n const regex = typeof pattern === \"string\" ? new RegExp(pattern, \"i\") : pattern;\n return projects.filter((p) => regex.test(p.name) || regex.test(p.path));\n}\n\n/**\n * Get projects grouped by marker type\n */\nexport async function discoverByMarker(\n options?: DiscoverOptions\n): Promise<Map<string, Project[]>> {\n const projects = await discover(options);\n const grouped = new Map<string, Project[]>();\n\n for (const project of projects) {\n const existing = grouped.get(project.marker);\n if (existing) {\n existing.push(project);\n } else {\n grouped.set(project.marker, [project]);\n }\n }\n\n return grouped;\n}\n\n/**\n * Count projects by marker type\n */\nexport async function countByMarker(\n options?: DiscoverOptions\n): Promise<Map<string, number>> {\n const grouped = await discoverByMarker(options);\n const counts = new Map<string, number>();\n\n for (const [marker, projects] of grouped) {\n counts.set(marker, projects.length);\n }\n\n return counts;\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport * as yaml from \"yaml\";\n\nimport type { PjConfig } from \"./types.js\";\nimport { PjConfigError } from \"./types.js\";\nimport { getPjConfigPath } from \"../binary/constants.js\";\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG: PjConfig = {\n paths: [\n path.join(os.homedir(), \"projects\"),\n path.join(os.homedir(), \"code\"),\n path.join(os.homedir(), \"development\"),\n ],\n markers: [\n \".git\",\n \"go.mod\",\n \"package.json\",\n \"Cargo.toml\",\n \"pyproject.toml\",\n \"Makefile\",\n \"flake.nix\",\n \".vscode\",\n \".idea\",\n \".fleet\",\n \".project\",\n \".zed\",\n \"Dockerfile\",\n ],\n exclude: [\n \"node_modules\",\n \".terraform\",\n \"vendor\",\n \".git\",\n \"target\",\n \"dist\",\n \"build\",\n ],\n maxDepth: 3,\n cacheTTL: 300,\n noIgnore: false,\n noNested: false,\n icons: {\n \".git\": \"\\uf1d3 \", //\n \"package.json\": \"\\ue718 \", //\n \"go.mod\": \"\\ue626 \", //\n \"Cargo.toml\": \"\\ue7a8 \", //\n \"pyproject.toml\": \"\\ue73c \", //\n \".vscode\": \"\\ue70c \", //\n \".idea\": \"\\ue7b5 \", //\n Makefile: \"\\ue779 \", //\n Dockerfile: \"\\ue7b0\",\n },\n priorities: {\n \".git\": 1,\n \"go.mod\": 10,\n \"package.json\": 10,\n \"Cargo.toml\": 10,\n \"pyproject.toml\": 10,\n Makefile: 1,\n \"flake.nix\": 10,\n \".vscode\": 5,\n \".idea\": 5,\n \".fleet\": 5,\n \".project\": 5,\n \".zed\": 5,\n Dockerfile: 7,\n },\n};\n\n/**\n * Load pj configuration from file\n */\nexport async function loadConfig(configPath?: string): Promise<PjConfig> {\n const filePath = configPath ?? getPjConfigPath();\n\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const parsed = yaml.parse(content) as Partial<RawConfig>;\n return mergeConfig(parsed);\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n // Config file doesn't exist, return defaults\n return { ...DEFAULT_CONFIG };\n }\n throw new PjConfigError(\n `Failed to load config from ${filePath}`,\n error instanceof Error ? error : undefined\n );\n }\n}\n\n/**\n * Save configuration to file\n */\nexport async function saveConfig(\n config: Partial<PjConfig>,\n configPath?: string\n): Promise<void> {\n const filePath = configPath ?? getPjConfigPath();\n\n // Convert to raw format, only including defined properties\n const rawConfig: RawConfig = {};\n\n if (config.paths !== undefined) rawConfig.paths = config.paths;\n if (config.markers !== undefined) rawConfig.markers = config.markers;\n if (config.exclude !== undefined) rawConfig.exclude = config.exclude;\n if (config.maxDepth !== undefined) rawConfig.max_depth = config.maxDepth;\n if (config.cacheTTL !== undefined) rawConfig.cache_ttl = config.cacheTTL;\n if (config.noIgnore !== undefined) rawConfig.no_ignore = config.noIgnore;\n if (config.noNested !== undefined) rawConfig.no_nested = config.noNested;\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- support legacy format\n if (config.icons !== undefined) rawConfig.icons = config.icons;\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- support legacy format\n if (config.priorities !== undefined) rawConfig.priorities = config.priorities;\n\n const content = yaml.stringify(rawConfig, { indent: 2 });\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, content, \"utf-8\");\n}\n\n/**\n * Check if a config file exists\n */\nexport async function configExists(configPath?: string): Promise<boolean> {\n const filePath = configPath ?? getPjConfigPath();\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the default config path\n */\nexport function getConfigPath(): string {\n return getPjConfigPath();\n}\n\n/**\n * Raw marker config - can be a string or an object with marker, icon, and priority\n */\ntype RawMarker =\n | string\n | {\n marker: string;\n icon?: string;\n priority?: number;\n };\n\n/**\n * Raw config format as stored in YAML (snake_case)\n */\ninterface RawConfig {\n paths?: string[];\n markers?: RawMarker[];\n exclude?: string[];\n max_depth?: number;\n cache_ttl?: number;\n no_ignore?: boolean;\n no_nested?: boolean;\n /** @deprecated Use the new markers format with icon field instead */\n icons?: Record<string, string>;\n /** @deprecated Use the new markers format with priority field instead */\n priorities?: Record<string, number>;\n}\n\n/**\n * Parse raw markers into separate markers, icons, and priorities\n */\nfunction parseRawMarkers(rawMarkers: RawMarker[]): {\n markers: string[];\n icons: Record<string, string>;\n priorities: Record<string, number>;\n} {\n const markers: string[] = [];\n const icons: Record<string, string> = {};\n const priorities: Record<string, number> = {};\n\n for (const raw of rawMarkers) {\n if (typeof raw === \"string\") {\n markers.push(raw);\n } else {\n markers.push(raw.marker);\n if (raw.icon !== undefined) {\n icons[raw.marker] = raw.icon;\n }\n if (raw.priority !== undefined) {\n priorities[raw.marker] = raw.priority;\n }\n }\n }\n\n return { markers, icons, priorities };\n}\n\n/**\n * Merge raw config with defaults\n */\nfunction mergeConfig(raw: Partial<RawConfig>): PjConfig {\n // Parse markers from raw config if provided\n let markers = DEFAULT_CONFIG.markers;\n let parsedIcons: Record<string, string> = {};\n let parsedPriorities: Record<string, number> = {};\n\n if (raw.markers !== undefined) {\n const parsed = parseRawMarkers(raw.markers);\n markers = parsed.markers;\n parsedIcons = parsed.icons;\n parsedPriorities = parsed.priorities;\n }\n\n // Merge icons: defaults <- deprecated icons field <- new format icons\n const icons = {\n ...DEFAULT_CONFIG.icons,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- support legacy format\n ...(raw.icons ?? {}),\n ...parsedIcons,\n };\n\n // Merge priorities: defaults <- deprecated priorities field <- new format priorities\n const priorities = {\n ...DEFAULT_CONFIG.priorities,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- support legacy format\n ...(raw.priorities ?? {}),\n ...parsedPriorities,\n };\n\n return {\n paths: raw.paths ?? DEFAULT_CONFIG.paths,\n markers,\n exclude: raw.exclude ?? DEFAULT_CONFIG.exclude,\n maxDepth: raw.max_depth ?? DEFAULT_CONFIG.maxDepth,\n cacheTTL: raw.cache_ttl ?? DEFAULT_CONFIG.cacheTTL,\n noIgnore: raw.no_ignore ?? DEFAULT_CONFIG.noIgnore,\n noNested: raw.no_nested ?? DEFAULT_CONFIG.noNested,\n icons,\n priorities,\n };\n}\n\n/**\n * Expand ~ in paths to home directory\n */\nexport function expandPath(p: string): string {\n if (p.startsWith(\"~/\")) {\n return path.join(os.homedir(), p.slice(2));\n }\n if (p === \"~\") {\n return os.homedir();\n }\n return p;\n}\n\n/**\n * Expand all paths in config\n */\nexport function expandConfigPaths(config: PjConfig): PjConfig {\n return {\n ...config,\n paths: config.paths.map(expandPath),\n };\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nimport type { CacheInfo } from \"./types.js\";\nimport { getPjCacheDir } from \"../binary/constants.js\";\nimport { executePj } from \"../cli/executor.js\";\n\n/**\n * Clear the pj project cache\n */\nexport async function clearCache(): Promise<void> {\n await executePj([\"--clear-cache\"]);\n}\n\n/**\n * Get information about the pj cache\n */\nexport async function getCacheInfo(): Promise<CacheInfo> {\n const cacheDir = getPjCacheDir();\n\n try {\n const stats = await fs.stat(cacheDir);\n if (!stats.isDirectory()) {\n return {\n exists: false,\n path: cacheDir,\n fileCount: 0,\n totalSize: 0,\n };\n }\n\n const files = await fs.readdir(cacheDir);\n let totalSize = 0;\n let fileCount = 0;\n\n for (const file of files) {\n if (file.endsWith(\".json\")) {\n const filePath = path.join(cacheDir, file);\n const fileStats = await fs.stat(filePath);\n totalSize += fileStats.size;\n fileCount++;\n }\n }\n\n return {\n exists: true,\n path: cacheDir,\n fileCount,\n totalSize,\n };\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return {\n exists: false,\n path: cacheDir,\n fileCount: 0,\n totalSize: 0,\n };\n }\n throw error;\n }\n}\n\n/**\n * Get the cache directory path\n */\nexport function getCachePath(): string {\n return getPjCacheDir();\n}\n","import type {\n BinaryOptions,\n BinaryStatus,\n CacheInfo,\n DiscoverOptions,\n PjConfig,\n Project,\n} from \"./types.js\";\nimport {\n discover,\n discoverFromPaths,\n findProject,\n findProjects,\n discoverByMarker,\n countByMarker,\n} from \"./discover.js\";\nimport { loadConfig, saveConfig, DEFAULT_CONFIG } from \"./config.js\";\nimport { clearCache, getCacheInfo } from \"./cache.js\";\nimport { getBinaryManager } from \"../binary/manager.js\";\n\n/**\n * Main class for interacting with pj\n *\n * Provides a high-level API for project discovery, configuration management,\n * and binary management.\n *\n * @example\n * ```typescript\n * const pj = new Pj();\n *\n * // Discover all projects\n * const projects = await pj.discover();\n *\n * // Find a specific project\n * const myProject = await pj.findProject('my-app');\n *\n * // Search for projects\n * const reactProjects = await pj.findProjects(/react/i);\n * ```\n */\nexport class Pj {\n private config: PjConfig;\n\n /**\n * Create a new Pj instance\n *\n * @param config - Optional configuration overrides\n */\n constructor(config?: Partial<PjConfig>) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Discover all projects\n *\n * @param options - Discovery options\n * @returns Array of discovered projects\n */\n async discover(options?: DiscoverOptions): Promise<Project[]> {\n return discover(this.mergeOptions(options));\n }\n\n /**\n * Discover projects from specific paths\n *\n * Bypasses configured paths and searches only the provided paths.\n * Useful for integration with other tools.\n *\n * @param paths - Paths to search\n * @param options - Additional discovery options\n */\n async discoverFromPaths(\n paths: string[],\n options?: Omit<DiscoverOptions, \"paths\">\n ): Promise<Project[]> {\n return discoverFromPaths(paths, this.mergeOptions(options));\n }\n\n /**\n * Find a project by name\n *\n * @param name - Project name to find\n * @param options - Discovery options\n */\n async findProject(\n name: string,\n options?: DiscoverOptions\n ): Promise<Project | undefined> {\n return findProject(name, this.mergeOptions(options));\n }\n\n /**\n * Find projects matching a pattern\n *\n * @param pattern - String or regex pattern to match\n * @param options - Discovery options\n */\n async findProjects(\n pattern: string | RegExp,\n options?: DiscoverOptions\n ): Promise<Project[]> {\n return findProjects(pattern, this.mergeOptions(options));\n }\n\n /**\n * Get projects grouped by marker type\n *\n * @param options - Discovery options\n */\n async discoverByMarker(\n options?: DiscoverOptions\n ): Promise<Map<string, Project[]>> {\n return discoverByMarker(this.mergeOptions(options));\n }\n\n /**\n * Count projects by marker type\n *\n * @param options - Discovery options\n */\n async countByMarker(options?: DiscoverOptions): Promise<Map<string, number>> {\n return countByMarker(this.mergeOptions(options));\n }\n\n /**\n * Clear the pj project cache\n */\n async clearCache(): Promise<void> {\n return clearCache();\n }\n\n /**\n * Get information about the pj cache\n */\n async getCacheInfo(): Promise<CacheInfo> {\n return getCacheInfo();\n }\n\n /**\n * Load configuration from file\n *\n * @param configPath - Optional path to config file\n */\n async loadConfig(configPath?: string): Promise<PjConfig> {\n const loaded = await loadConfig(configPath);\n this.config = loaded;\n return loaded;\n }\n\n /**\n * Save configuration to file\n *\n * @param config - Configuration to save (uses current config if not provided)\n * @param configPath - Optional path to config file\n */\n async saveConfig(config?: Partial<PjConfig>, configPath?: string): Promise<void> {\n const toSave = config ? { ...this.config, ...config } : this.config;\n await saveConfig(toSave, configPath);\n }\n\n /**\n * Get current configuration\n */\n getConfig(): PjConfig {\n return { ...this.config };\n }\n\n /**\n * Update configuration\n *\n * @param config - Partial configuration to merge\n */\n setConfig(config: Partial<PjConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Ensure the pj binary is available\n *\n * Downloads the binary if not already installed.\n *\n * @param options - Binary options\n * @returns Path to the binary\n */\n async ensureBinary(options?: BinaryOptions): Promise<string> {\n const manager = getBinaryManager();\n return manager.getBinaryPath(options);\n }\n\n /**\n * Get the status of the pj binary\n */\n async getBinaryStatus(): Promise<BinaryStatus> {\n const manager = getBinaryManager();\n return manager.getStatus();\n }\n\n /**\n * Update the pj binary to the latest version\n *\n * @param options - Binary options\n * @returns Path to the updated binary\n */\n async updateBinary(options?: BinaryOptions): Promise<string> {\n const manager = getBinaryManager();\n return manager.updateBinary(options);\n }\n\n /**\n * Get the version of the pj binary\n */\n async getBinaryVersion(): Promise<string | null> {\n const manager = getBinaryManager();\n const status = await manager.getStatus();\n return status.version;\n }\n\n /**\n * Merge instance config with provided options\n */\n private mergeOptions(options?: DiscoverOptions): DiscoverOptions {\n const merged: DiscoverOptions = {\n paths: options?.paths ?? this.config.paths,\n markers: options?.markers ?? this.config.markers,\n excludes: options?.excludes ?? this.config.exclude,\n maxDepth: options?.maxDepth ?? this.config.maxDepth,\n noIgnore: options?.noIgnore ?? this.config.noIgnore,\n nested: options?.nested ?? !this.config.noNested,\n };\n\n // Only include optional properties if they have values\n if (options?.icons !== undefined) {\n merged.icons = options.icons;\n }\n if (options?.noCache !== undefined) {\n merged.noCache = options.noCache;\n }\n if (options?.configPath !== undefined) {\n merged.configPath = options.configPath;\n }\n if (options?.verbose !== undefined) {\n merged.verbose = options.verbose;\n }\n\n return merged;\n }\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -488,7 +488,7 @@ declare function isPlatformSupported(): boolean;
|
|
|
488
488
|
* IMPORTANT: When pj releases a new minor version (e.g., 1.5.0),
|
|
489
489
|
* this package must also release a new minor version to match.
|
|
490
490
|
*/
|
|
491
|
-
declare const PJ_TARGET_VERSION = "1.
|
|
491
|
+
declare const PJ_TARGET_VERSION = "1.7";
|
|
492
492
|
/** GitHub repository owner */
|
|
493
493
|
declare const GITHUB_OWNER = "josephschmitt";
|
|
494
494
|
/** GitHub repository name */
|
package/dist/index.d.ts
CHANGED
|
@@ -488,7 +488,7 @@ declare function isPlatformSupported(): boolean;
|
|
|
488
488
|
* IMPORTANT: When pj releases a new minor version (e.g., 1.5.0),
|
|
489
489
|
* this package must also release a new minor version to match.
|
|
490
490
|
*/
|
|
491
|
-
declare const PJ_TARGET_VERSION = "1.
|
|
491
|
+
declare const PJ_TARGET_VERSION = "1.7";
|
|
492
492
|
/** GitHub repository owner */
|
|
493
493
|
declare const GITHUB_OWNER = "josephschmitt";
|
|
494
494
|
/** GitHub repository name */
|
package/dist/index.js
CHANGED
|
@@ -35,7 +35,7 @@ var PjConfigError = class extends Error {
|
|
|
35
35
|
this.name = "PjConfigError";
|
|
36
36
|
}
|
|
37
37
|
};
|
|
38
|
-
var PJ_TARGET_VERSION = "1.
|
|
38
|
+
var PJ_TARGET_VERSION = "1.7";
|
|
39
39
|
var GITHUB_OWNER = "josephschmitt";
|
|
40
40
|
var GITHUB_REPO = "pj";
|
|
41
41
|
var GITHUB_API_URL = "https://api.github.com";
|
|
@@ -664,14 +664,24 @@ function parseJsonOutput(output) {
|
|
|
664
664
|
}
|
|
665
665
|
try {
|
|
666
666
|
const parsed = JSON.parse(output);
|
|
667
|
-
|
|
667
|
+
const projects = Array.isArray(parsed) ? parsed : parsed.projects;
|
|
668
|
+
if (!Array.isArray(projects)) {
|
|
669
|
+
throw new PjExecutionError(
|
|
670
|
+
`Unexpected pj output format: expected projects array but got ${typeof parsed}`
|
|
671
|
+
);
|
|
672
|
+
}
|
|
673
|
+
return projects.map((p) => ({
|
|
668
674
|
path: p.path,
|
|
669
675
|
name: p.name,
|
|
670
676
|
marker: p.marker,
|
|
671
677
|
icon: p.icon,
|
|
672
|
-
priority:
|
|
678
|
+
priority: void 0
|
|
679
|
+
// not included in JSON output
|
|
673
680
|
}));
|
|
674
681
|
} catch (error) {
|
|
682
|
+
if (error instanceof PjExecutionError) {
|
|
683
|
+
throw error;
|
|
684
|
+
}
|
|
675
685
|
throw new PjExecutionError(
|
|
676
686
|
`Failed to parse pj output: ${error instanceof Error ? error.message : String(error)}`
|
|
677
687
|
);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/types.ts","../src/binary/constants.ts","../src/binary/platform.ts","../src/binary/version.ts","../src/binary/manager.ts","../src/cli/executor.ts","../src/api/discover.ts","../src/api/config.ts","../src/api/cache.ts","../src/api/pj.ts"],"names":["os","path2","binaryManager","execa","path3","os2","fs2","fs3","path4"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * A discovered project from pj\n */\nexport interface Project {\n /** Absolute path to the project directory */\n path: string;\n /** Name of the project (directory name) */\n name: string;\n /** The marker file/directory that identified this as a project */\n marker: string;\n /** Optional icon for the marker (Nerd Font) */\n icon: string | undefined;\n /** Priority of the marker (higher = more specific) */\n priority: number | undefined;\n}\n\n/**\n * Options for project discovery\n */\nexport interface DiscoverOptions {\n /** Paths to search for projects */\n paths?: string[];\n /** Project marker files/directories to look for */\n markers?: string[];\n /** Patterns to exclude from search */\n excludes?: string[];\n /** Maximum directory depth to search */\n maxDepth?: number;\n /** Don't respect .gitignore files */\n noIgnore?: boolean;\n /** Allow nested project detection */\n nested?: boolean;\n /** Bypass cache and do fresh discovery */\n noCache?: boolean;\n /** Include icons in output */\n icons?: boolean;\n /** Custom config file path */\n configPath?: string;\n /** Enable verbose/debug output */\n verbose?: boolean;\n}\n\n/**\n * Configuration for pj\n */\nexport interface PjConfig {\n /** Paths to search for projects */\n paths: string[];\n /** Project marker files/directories */\n markers: string[];\n /** Patterns to exclude */\n exclude: string[];\n /** Maximum search depth */\n maxDepth: number;\n /** Cache time-to-live in seconds */\n cacheTTL: number;\n /** Don't respect .gitignore */\n noIgnore: boolean;\n /** Allow nested projects */\n noNested: boolean;\n /** Icon mappings for markers */\n icons: Record<string, string>;\n /** Priority mappings for markers (higher = more specific) */\n priorities: Record<string, number>;\n}\n\n/**\n * Information about the pj cache\n */\nexport interface CacheInfo {\n /** Whether the cache exists */\n exists: boolean;\n /** Path to the cache directory */\n path: string;\n /** Number of cache files */\n fileCount: number;\n /** Total size in bytes */\n totalSize: number;\n}\n\n/**\n * Binary installation status\n */\nexport interface BinaryStatus {\n /** Whether a binary is available */\n available: boolean;\n /** Path to the binary */\n path: string | null;\n /** Version of the binary */\n version: string | null;\n /** Source of the binary: 'global', 'cache', or 'env' */\n source: \"global\" | \"cache\" | \"env\" | null;\n}\n\n/**\n * Options for binary management\n */\nexport interface BinaryOptions {\n /** Force download even if binary exists */\n force?: boolean;\n /** Specific version to install (defaults to latest) */\n version?: string;\n /** Progress callback for downloads */\n onProgress?: (progress: DownloadProgress) => void;\n}\n\n/**\n * Download progress information\n */\nexport interface DownloadProgress {\n /** Bytes downloaded so far */\n downloaded: number;\n /** Total bytes to download (may be undefined if unknown) */\n total?: number;\n /** Percentage complete (0-100) */\n percent?: number;\n}\n\n/**\n * GitHub release information\n */\nexport interface GithubRelease {\n /** Release tag name (e.g., \"v1.4.1\") */\n tagName: string;\n /** Release version without 'v' prefix */\n version: string;\n /** Release name/title */\n name: string;\n /** Whether this is a prerelease */\n prerelease: boolean;\n /** Release assets */\n assets: GithubAsset[];\n}\n\n/**\n * GitHub release asset\n */\nexport interface GithubAsset {\n /** Asset name (e.g., \"pj_1.4.1_darwin_arm64.tar.gz\") */\n name: string;\n /** Download URL */\n downloadUrl: string;\n /** File size in bytes */\n size: number;\n /** Content type */\n contentType: string;\n}\n\n/**\n * Platform information\n */\nexport interface Platform {\n /** Operating system: darwin, linux, win32 */\n os: \"darwin\" | \"linux\" | \"win32\";\n /** Architecture: x64, arm64 */\n arch: \"x64\" | \"arm64\";\n /** pj asset OS name */\n pjOs: \"darwin\" | \"linux\" | \"windows\";\n /** pj asset architecture name */\n pjArch: \"amd64\" | \"arm64\";\n}\n\n/**\n * Error thrown when binary operations fail\n */\nexport class PjBinaryError extends Error {\n constructor(\n message: string,\n public override readonly cause?: Error\n ) {\n super(message, { cause });\n this.name = \"PjBinaryError\";\n }\n}\n\n/**\n * Error thrown when pj execution fails\n */\nexport class PjExecutionError extends Error {\n public readonly exitCode: number | undefined;\n public readonly stderr: string | undefined;\n\n constructor(message: string, exitCode?: number, stderr?: string) {\n super(message);\n this.name = \"PjExecutionError\";\n this.exitCode = exitCode;\n this.stderr = stderr;\n }\n}\n\n/**\n * Error thrown when configuration is invalid\n */\nexport class PjConfigError extends Error {\n constructor(\n message: string,\n public override readonly cause?: Error\n ) {\n super(message, { cause });\n this.name = \"PjConfigError\";\n }\n}\n","import * as path from \"node:path\";\nimport * as os from \"node:os\";\n\n/**\n * Target pj version (major.minor) that this package is compatible with.\n * The installer will accept any patch version within this range.\n * Example: \"1.4\" means pj 1.4.0, 1.4.1, 1.4.2, etc. are all compatible.\n *\n * IMPORTANT: When pj releases a new minor version (e.g., 1.5.0),\n * this package must also release a new minor version to match.\n */\nexport const PJ_TARGET_VERSION = \"1.6\";\n\n/** GitHub repository owner */\nexport const GITHUB_OWNER = \"josephschmitt\";\n\n/** GitHub repository name */\nexport const GITHUB_REPO = \"pj\";\n\n/** GitHub API base URL */\nexport const GITHUB_API_URL = \"https://api.github.com\";\n\n/** GitHub releases API endpoint */\nexport const RELEASES_URL = `${GITHUB_API_URL}/repos/${GITHUB_OWNER}/${GITHUB_REPO}/releases`;\n\n/** Latest release API endpoint */\nexport const LATEST_RELEASE_URL = `${RELEASES_URL}/latest`;\n\n/** Binary name (without extension) */\nexport const BINARY_NAME = \"pj\";\n\n/** Binary name on Windows */\nexport const BINARY_NAME_WIN = \"pj.exe\";\n\n/** Get the appropriate binary name for the current platform */\nexport function getBinaryName(): string {\n return process.platform === \"win32\" ? BINARY_NAME_WIN : BINARY_NAME;\n}\n\n/** Cache directory for pj-node */\nexport function getCacheDir(): string {\n const xdgCache = process.env[\"XDG_CACHE_HOME\"];\n if (xdgCache) {\n return path.join(xdgCache, \"pj-node\");\n }\n\n if (process.platform === \"win32\") {\n const localAppData = process.env[\"LOCALAPPDATA\"];\n if (localAppData) {\n return path.join(localAppData, \"pj-node\", \"cache\");\n }\n return path.join(os.homedir(), \"AppData\", \"Local\", \"pj-node\", \"cache\");\n }\n\n return path.join(os.homedir(), \".cache\", \"pj-node\");\n}\n\n/** Binary cache directory */\nexport function getBinaryCacheDir(): string {\n return path.join(getCacheDir(), \"bin\");\n}\n\n/** Metadata file path */\nexport function getMetadataPath(): string {\n return path.join(getCacheDir(), \"metadata.json\");\n}\n\n/** pj config directory */\nexport function getPjConfigDir(): string {\n const xdgConfig = process.env[\"XDG_CONFIG_HOME\"];\n if (xdgConfig) {\n return path.join(xdgConfig, \"pj\");\n }\n\n if (process.platform === \"win32\") {\n const appData = process.env[\"APPDATA\"];\n if (appData) {\n return path.join(appData, \"pj\");\n }\n return path.join(os.homedir(), \"AppData\", \"Roaming\", \"pj\");\n }\n\n return path.join(os.homedir(), \".config\", \"pj\");\n}\n\n/** pj config file path */\nexport function getPjConfigPath(): string {\n return path.join(getPjConfigDir(), \"config.yaml\");\n}\n\n/** pj cache directory */\nexport function getPjCacheDir(): string {\n const xdgCache = process.env[\"XDG_CACHE_HOME\"];\n if (xdgCache) {\n return path.join(xdgCache, \"pj\");\n }\n\n if (process.platform === \"win32\") {\n const localAppData = process.env[\"LOCALAPPDATA\"];\n if (localAppData) {\n return path.join(localAppData, \"pj\", \"cache\");\n }\n return path.join(os.homedir(), \"AppData\", \"Local\", \"pj\", \"cache\");\n }\n\n return path.join(os.homedir(), \".cache\", \"pj\");\n}\n\n/** User agent for GitHub API requests */\nexport const USER_AGENT = \"@joe-sh/pj\";\n\n/** Default timeout for HTTP requests in milliseconds */\nexport const HTTP_TIMEOUT = 30000;\n\n/** Update check interval in days */\nexport const UPDATE_CHECK_INTERVAL_DAYS = 7;\n","import type { Platform } from \"../api/types.js\";\nimport { PjBinaryError } from \"../api/types.js\";\n\n/**\n * Detect the current platform and return normalized platform info\n */\nexport function detectPlatform(): Platform {\n const nodeOs = process.platform;\n const nodeArch = process.arch;\n\n // Map Node.js platform to pj asset names\n let os: Platform[\"os\"];\n let pjOs: Platform[\"pjOs\"];\n\n switch (nodeOs) {\n case \"darwin\":\n os = \"darwin\";\n pjOs = \"darwin\";\n break;\n case \"linux\":\n os = \"linux\";\n pjOs = \"linux\";\n break;\n case \"win32\":\n os = \"win32\";\n pjOs = \"windows\";\n break;\n default:\n throw new PjBinaryError(`Unsupported operating system: ${nodeOs}`);\n }\n\n // Map Node.js architecture to pj asset names\n let arch: Platform[\"arch\"];\n let pjArch: Platform[\"pjArch\"];\n\n switch (nodeArch) {\n case \"x64\":\n arch = \"x64\";\n pjArch = \"amd64\";\n break;\n case \"arm64\":\n arch = \"arm64\";\n pjArch = \"arm64\";\n break;\n default:\n throw new PjBinaryError(`Unsupported architecture: ${nodeArch}`);\n }\n\n return { os, arch, pjOs, pjArch };\n}\n\n/**\n * Get the expected asset filename for the current platform\n */\nexport function getAssetFilename(version: string, platform?: Platform): string {\n const p = platform ?? detectPlatform();\n const versionWithoutV = version.startsWith(\"v\") ? version.slice(1) : version;\n\n return `pj_${versionWithoutV}_${p.pjOs}_${p.pjArch}.tar.gz`;\n}\n\n/**\n * Check if the current platform is supported\n */\nexport function isPlatformSupported(): boolean {\n try {\n detectPlatform();\n return true;\n } catch {\n return false;\n }\n}\n","import { PJ_TARGET_VERSION } from \"./constants.js\";\n\n/**\n * Parsed semantic version\n */\nexport interface ParsedVersion {\n major: number;\n minor: number;\n patch: number;\n raw: string;\n}\n\n/**\n * Parse a semantic version string\n */\nexport function parseVersion(version: string): ParsedVersion | null {\n // Remove leading 'v' if present\n const normalized = version.replace(/^v/, \"\");\n const match = /^(\\d+)\\.(\\d+)\\.(\\d+)/.exec(normalized);\n\n if (!match?.[1] || !match[2] || !match[3]) {\n return null;\n }\n\n return {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n patch: parseInt(match[3], 10),\n raw: normalized,\n };\n}\n\n/**\n * Parse a major.minor version target (e.g., \"1.4\")\n */\nexport function parseTargetVersion(\n target: string\n): { major: number; minor: number } | null {\n const match = /^(\\d+)\\.(\\d+)$/.exec(target);\n if (!match?.[1] || !match[2]) {\n return null;\n }\n\n return {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n };\n}\n\n/**\n * Check if a version is compatible with the target major.minor version.\n * A version is compatible if it has the same major.minor version.\n *\n * Example: target \"1.4\" is compatible with \"1.4.0\", \"1.4.1\", \"1.4.99\"\n * but NOT with \"1.3.0\", \"1.5.0\", or \"2.4.0\"\n */\nexport function isVersionCompatible(\n version: string,\n target: string = PJ_TARGET_VERSION\n): boolean {\n const parsed = parseVersion(version);\n const targetParsed = parseTargetVersion(target);\n\n if (!parsed || !targetParsed) {\n return false;\n }\n\n return (\n parsed.major === targetParsed.major && parsed.minor === targetParsed.minor\n );\n}\n\n/**\n * Compare two versions. Returns:\n * - negative if a < b\n * - positive if a > b\n * - 0 if a === b\n */\nexport function compareVersions(a: string, b: string): number {\n const parsedA = parseVersion(a);\n const parsedB = parseVersion(b);\n\n if (!parsedA || !parsedB) {\n return 0;\n }\n\n if (parsedA.major !== parsedB.major) {\n return parsedA.major - parsedB.major;\n }\n\n if (parsedA.minor !== parsedB.minor) {\n return parsedA.minor - parsedB.minor;\n }\n\n return parsedA.patch - parsedB.patch;\n}\n\n/**\n * Find the highest compatible version from a list of versions\n */\nexport function findHighestCompatibleVersion(\n versions: string[],\n target: string = PJ_TARGET_VERSION\n): string | null {\n const compatible = versions.filter((v) => isVersionCompatible(v, target));\n\n if (compatible.length === 0) {\n return null;\n }\n\n // Sort descending and return the highest\n compatible.sort((a, b) => compareVersions(b, a));\n return compatible[0] ?? null;\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { createWriteStream } from \"node:fs\";\nimport { pipeline } from \"node:stream/promises\";\nimport { Readable } from \"node:stream\";\nimport { execa } from \"execa\";\nimport * as tar from \"tar\";\n\nimport type {\n BinaryOptions,\n BinaryStatus,\n DownloadProgress,\n GithubAsset,\n GithubRelease,\n} from \"../api/types.js\";\nimport { PjBinaryError } from \"../api/types.js\";\nimport {\n RELEASES_URL,\n LATEST_RELEASE_URL,\n USER_AGENT,\n HTTP_TIMEOUT,\n UPDATE_CHECK_INTERVAL_DAYS,\n PJ_TARGET_VERSION,\n getBinaryCacheDir,\n getBinaryName,\n getMetadataPath,\n} from \"./constants.js\";\nimport { detectPlatform, getAssetFilename } from \"./platform.js\";\nimport {\n isVersionCompatible,\n findHighestCompatibleVersion,\n} from \"./version.js\";\n\ninterface CacheMetadata {\n version: string;\n installedAt: string;\n lastUpdateCheck: string;\n source: \"download\";\n}\n\n/**\n * Manages the pj binary installation and updates\n *\n * Note: This module uses `execa` for process execution which does NOT use shell\n * by default, preventing command injection vulnerabilities.\n */\nexport class BinaryManager {\n private cachedBinaryPath: string | null = null;\n\n /**\n * Get the path to the pj binary, downloading if necessary\n */\n async getBinaryPath(options?: BinaryOptions): Promise<string> {\n // Check environment override first\n const envPath = process.env[\"PJ_BINARY_PATH\"];\n if (envPath) {\n if (await this.isValidBinary(envPath)) {\n return envPath;\n }\n throw new PjBinaryError(\n `PJ_BINARY_PATH is set but binary is not valid: ${envPath}`\n );\n }\n\n // Check for global installation\n const globalPath = await this.findGlobalBinary();\n if (globalPath) {\n return globalPath;\n }\n\n // Check cached binary\n const cachedPath = await this.getCachedBinaryPath();\n if (cachedPath && !options?.force) {\n // Check if update is needed\n const needsUpdate = await this.shouldCheckForUpdate();\n if (needsUpdate && options?.version === undefined) {\n try {\n await this.updateBinary(options);\n } catch {\n // If update fails, continue with existing binary\n }\n }\n return cachedPath;\n }\n\n // Download binary\n return await this.downloadBinary(options);\n }\n\n /**\n * Get the current binary status\n */\n async getStatus(): Promise<BinaryStatus> {\n // Check environment override\n const envPath = process.env[\"PJ_BINARY_PATH\"];\n if (envPath && (await this.isValidBinary(envPath))) {\n const version = await this.getVersion(envPath);\n return {\n available: true,\n path: envPath,\n version,\n source: \"env\",\n };\n }\n\n // Check global installation\n const globalPath = await this.findGlobalBinary();\n if (globalPath) {\n const version = await this.getVersion(globalPath);\n return {\n available: true,\n path: globalPath,\n version,\n source: \"global\",\n };\n }\n\n // Check cached binary\n const cachedPath = await this.getCachedBinaryPath();\n if (cachedPath) {\n const version = await this.getVersion(cachedPath);\n return {\n available: true,\n path: cachedPath,\n version,\n source: \"cache\",\n };\n }\n\n return {\n available: false,\n path: null,\n version: null,\n source: null,\n };\n }\n\n /**\n * Download and install the pj binary.\n * If no specific version is requested, downloads the highest compatible version\n * within the target major.minor range.\n */\n async downloadBinary(options?: BinaryOptions): Promise<string> {\n const release = options?.version\n ? await this.getRelease(options.version)\n : await this.getCompatibleRelease();\n\n const platform = detectPlatform();\n const assetName = getAssetFilename(release.version, platform);\n\n const asset = release.assets.find((a) => a.name === assetName);\n if (!asset) {\n throw new PjBinaryError(\n `No binary available for ${platform.pjOs}/${platform.pjArch}. ` +\n `Expected asset: ${assetName}`\n );\n }\n\n // Create cache directory\n const cacheDir = getBinaryCacheDir();\n await fs.mkdir(cacheDir, { recursive: true });\n\n // Download the tarball\n const tarballPath = path.join(cacheDir, assetName);\n await this.downloadAsset(asset, tarballPath, options?.onProgress);\n\n // Extract the binary\n const binaryName = getBinaryName();\n await tar.extract({\n file: tarballPath,\n cwd: cacheDir,\n filter: (entryPath) => path.basename(entryPath) === binaryName,\n });\n\n // Clean up tarball\n await fs.unlink(tarballPath);\n\n // Set executable permissions on Unix\n const binaryPath = path.join(cacheDir, binaryName);\n if (process.platform !== \"win32\") {\n await fs.chmod(binaryPath, 0o755);\n }\n\n // Verify the binary\n if (!(await this.isValidBinary(binaryPath))) {\n throw new PjBinaryError(\"Downloaded binary failed verification\");\n }\n\n // Save metadata\n await this.saveMetadata({\n version: release.version,\n installedAt: new Date().toISOString(),\n lastUpdateCheck: new Date().toISOString(),\n source: \"download\",\n });\n\n this.cachedBinaryPath = binaryPath;\n return binaryPath;\n }\n\n /**\n * Update the binary to the highest compatible version within the target range.\n */\n async updateBinary(options?: BinaryOptions): Promise<string> {\n const compatible = await this.getCompatibleRelease();\n const metadata = await this.getMetadata();\n\n if (metadata?.version === compatible.version && !options?.force) {\n // Already up to date, just update the check timestamp\n await this.saveMetadata({\n ...metadata,\n lastUpdateCheck: new Date().toISOString(),\n });\n const cachedPath = await this.getCachedBinaryPath();\n if (cachedPath) {\n return cachedPath;\n }\n }\n\n return await this.downloadBinary({\n ...options,\n version: compatible.version,\n });\n }\n\n /**\n * Get the version of a pj binary\n */\n async getVersion(binaryPath: string): Promise<string | null> {\n try {\n // execa does not use shell by default, safe from command injection\n const result = await execa(binaryPath, [\"--version\"], { timeout: 5000 });\n // pj outputs version like \"pj version 1.4.1\"\n const match = /(?:pj\\s+)?(?:version\\s+)?v?(\\d+\\.\\d+\\.\\d+)/i.exec(\n result.stdout\n );\n return match?.[1] ?? null;\n } catch {\n return null;\n }\n }\n\n /**\n * Check if a binary path is a valid pj binary\n */\n async isValidBinary(binaryPath: string): Promise<boolean> {\n try {\n await fs.access(binaryPath, fs.constants.X_OK);\n const version = await this.getVersion(binaryPath);\n return version !== null;\n } catch {\n return false;\n }\n }\n\n /**\n * Find the globally installed pj binary.\n * Only returns the binary if it's version-compatible with our target.\n */\n private async findGlobalBinary(): Promise<string | null> {\n // execa does not use shell by default, safe from command injection\n let binaryPath: string | null = null;\n\n try {\n const result = await execa(\"which\", [\"pj\"], { timeout: 5000 });\n binaryPath = result.stdout.trim();\n } catch {\n // which failed or binary not found\n }\n\n // On Windows, try where\n if (!binaryPath && process.platform === \"win32\") {\n try {\n const result = await execa(\"where\", [\"pj\"], { timeout: 5000 });\n binaryPath = result.stdout.trim().split(\"\\n\")[0] ?? null;\n } catch {\n // where failed or binary not found\n }\n }\n\n if (!binaryPath) {\n return null;\n }\n\n // Check if the binary is valid\n if (!(await this.isValidBinary(binaryPath))) {\n return null;\n }\n\n // Check if the version is compatible\n const version = await this.getVersion(binaryPath);\n if (!version || !isVersionCompatible(version, PJ_TARGET_VERSION)) {\n return null;\n }\n\n return binaryPath;\n }\n\n /**\n * Get the path to the cached binary if it exists and is version-compatible.\n */\n private async getCachedBinaryPath(): Promise<string | null> {\n if (this.cachedBinaryPath) {\n if (await this.isValidBinary(this.cachedBinaryPath)) {\n // Verify version compatibility\n const version = await this.getVersion(this.cachedBinaryPath);\n if (version && isVersionCompatible(version, PJ_TARGET_VERSION)) {\n return this.cachedBinaryPath;\n }\n }\n this.cachedBinaryPath = null;\n }\n\n const binaryPath = path.join(getBinaryCacheDir(), getBinaryName());\n if (await this.isValidBinary(binaryPath)) {\n // Verify version compatibility\n const version = await this.getVersion(binaryPath);\n if (version && isVersionCompatible(version, PJ_TARGET_VERSION)) {\n this.cachedBinaryPath = binaryPath;\n return binaryPath;\n }\n }\n\n return null;\n }\n\n /**\n * Check if we should check for updates\n */\n private async shouldCheckForUpdate(): Promise<boolean> {\n const metadata = await this.getMetadata();\n if (!metadata) {\n return true;\n }\n\n const lastCheck = new Date(metadata.lastUpdateCheck);\n const now = new Date();\n const daysSinceCheck =\n (now.getTime() - lastCheck.getTime()) / (1000 * 60 * 60 * 24);\n\n return daysSinceCheck >= UPDATE_CHECK_INTERVAL_DAYS;\n }\n\n /**\n * Get cached metadata\n */\n private async getMetadata(): Promise<CacheMetadata | null> {\n try {\n const content = await fs.readFile(getMetadataPath(), \"utf-8\");\n return JSON.parse(content) as CacheMetadata;\n } catch {\n return null;\n }\n }\n\n /**\n * Save metadata to cache\n */\n private async saveMetadata(metadata: CacheMetadata): Promise<void> {\n const metadataPath = getMetadataPath();\n await fs.mkdir(path.dirname(metadataPath), { recursive: true });\n await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2));\n }\n\n /**\n * Get all releases from GitHub (up to 100 most recent)\n */\n async getAllReleases(): Promise<GithubRelease[]> {\n const response = await fetch(`${RELEASES_URL}?per_page=100`, {\n headers: {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": USER_AGENT,\n },\n signal: AbortSignal.timeout(HTTP_TIMEOUT),\n });\n\n if (!response.ok) {\n throw new PjBinaryError(\n `Failed to fetch releases: ${String(response.status)} ${response.statusText}`\n );\n }\n\n const data = (await response.json()) as {\n tag_name: string;\n name: string;\n prerelease: boolean;\n assets: {\n name: string;\n browser_download_url: string;\n size: number;\n content_type: string;\n }[];\n }[];\n\n return data\n .filter((release) => !release.prerelease)\n .map((release) => this.parseRelease(release));\n }\n\n /**\n * Get the highest compatible release within the target major.minor range.\n */\n async getCompatibleRelease(): Promise<GithubRelease> {\n const releases = await this.getAllReleases();\n const versions = releases.map((r) => r.version);\n\n const compatibleVersion = findHighestCompatibleVersion(\n versions,\n PJ_TARGET_VERSION\n );\n\n if (!compatibleVersion) {\n throw new PjBinaryError(\n `No compatible pj release found for version range ${PJ_TARGET_VERSION}.x. ` +\n `Available versions: ${versions.join(\", \")}`\n );\n }\n\n const release = releases.find((r) => r.version === compatibleVersion);\n if (!release) {\n throw new PjBinaryError(\n `Failed to find release for version ${compatibleVersion}`\n );\n }\n\n return release;\n }\n\n /**\n * Get the latest release from GitHub\n */\n async getLatestRelease(): Promise<GithubRelease> {\n const response = await fetch(LATEST_RELEASE_URL, {\n headers: {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": USER_AGENT,\n },\n signal: AbortSignal.timeout(HTTP_TIMEOUT),\n });\n\n if (!response.ok) {\n throw new PjBinaryError(\n `Failed to fetch latest release: ${String(response.status)} ${response.statusText}`\n );\n }\n\n const data = (await response.json()) as {\n tag_name: string;\n name: string;\n prerelease: boolean;\n assets: {\n name: string;\n browser_download_url: string;\n size: number;\n content_type: string;\n }[];\n };\n\n return this.parseRelease(data);\n }\n\n /**\n * Get a specific release from GitHub\n */\n private async getRelease(version: string): Promise<GithubRelease> {\n const tag = version.startsWith(\"v\") ? version : `v${version}`;\n const url = `${LATEST_RELEASE_URL.replace(\"/latest\", \"\")}/${tag}`;\n\n const response = await fetch(url, {\n headers: {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": USER_AGENT,\n },\n signal: AbortSignal.timeout(HTTP_TIMEOUT),\n });\n\n if (!response.ok) {\n throw new PjBinaryError(\n `Failed to fetch release ${version}: ${String(response.status)} ${response.statusText}`\n );\n }\n\n const data = (await response.json()) as {\n tag_name: string;\n name: string;\n prerelease: boolean;\n assets: {\n name: string;\n browser_download_url: string;\n size: number;\n content_type: string;\n }[];\n };\n\n return this.parseRelease(data);\n }\n\n /**\n * Parse GitHub release response\n */\n private parseRelease(data: {\n tag_name: string;\n name: string;\n prerelease: boolean;\n assets: {\n name: string;\n browser_download_url: string;\n size: number;\n content_type: string;\n }[];\n }): GithubRelease {\n return {\n tagName: data.tag_name,\n version: data.tag_name.replace(/^v/, \"\"),\n name: data.name,\n prerelease: data.prerelease,\n assets: data.assets.map((asset) => ({\n name: asset.name,\n downloadUrl: asset.browser_download_url,\n size: asset.size,\n contentType: asset.content_type,\n })),\n };\n }\n\n /**\n * Download an asset to a file\n */\n private async downloadAsset(\n asset: GithubAsset,\n destPath: string,\n onProgress?: (progress: DownloadProgress) => void\n ): Promise<void> {\n const response = await fetch(asset.downloadUrl, {\n headers: {\n \"User-Agent\": USER_AGENT,\n },\n signal: AbortSignal.timeout(HTTP_TIMEOUT * 10), // Longer timeout for downloads\n });\n\n if (!response.ok) {\n throw new PjBinaryError(\n `Failed to download asset: ${String(response.status)} ${response.statusText}`\n );\n }\n\n if (!response.body) {\n throw new PjBinaryError(\"Response body is empty\");\n }\n\n const total = asset.size;\n let downloaded = 0;\n\n const progressStream = new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n downloaded += chunk.length;\n onProgress?.({\n downloaded,\n total,\n percent: Math.round((downloaded / total) * 100),\n });\n controller.enqueue(chunk);\n },\n });\n\n const fileStream = createWriteStream(destPath);\n\n await pipeline(\n Readable.fromWeb(response.body.pipeThrough(progressStream)),\n fileStream\n );\n }\n\n /**\n * Clear the binary cache\n */\n async clearCache(): Promise<void> {\n const cacheDir = getBinaryCacheDir();\n try {\n await fs.rm(cacheDir, { recursive: true, force: true });\n } catch {\n // Ignore errors if directory doesn't exist\n }\n\n const metadataPath = getMetadataPath();\n try {\n await fs.unlink(metadataPath);\n } catch {\n // Ignore errors if file doesn't exist\n }\n\n this.cachedBinaryPath = null;\n }\n}\n\n/** Singleton instance */\nlet binaryManager: BinaryManager | null = null;\n\n/**\n * Get the singleton BinaryManager instance\n */\nexport function getBinaryManager(): BinaryManager {\n binaryManager ??= new BinaryManager();\n return binaryManager;\n}\n","import { execa, type Options as ExecaOptions } from \"execa\";\n\nimport type { DiscoverOptions, Project } from \"../api/types.js\";\nimport { PjExecutionError } from \"../api/types.js\";\nimport { getBinaryManager } from \"../binary/manager.js\";\n\n/**\n * Result from executing pj\n */\nexport interface PjResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Build command-line arguments from DiscoverOptions\n */\nexport function buildArgs(options?: DiscoverOptions): string[] {\n const args: string[] = [];\n\n if (options?.paths) {\n for (const p of options.paths) {\n args.push(\"--path\", p);\n }\n }\n\n if (options?.markers) {\n for (const m of options.markers) {\n args.push(\"--marker\", m);\n }\n }\n\n if (options?.excludes) {\n for (const e of options.excludes) {\n args.push(\"--exclude\", e);\n }\n }\n\n if (options?.maxDepth !== undefined) {\n args.push(\"--max-depth\", String(options.maxDepth));\n }\n\n if (options?.noIgnore) {\n args.push(\"--no-ignore\");\n }\n\n if (options?.nested === false) {\n args.push(\"--no-nested\");\n }\n\n if (options?.noCache) {\n args.push(\"--no-cache\");\n }\n\n if (options?.icons) {\n args.push(\"--icons\");\n }\n\n if (options?.configPath) {\n args.push(\"--config\", options.configPath);\n }\n\n if (options?.verbose) {\n args.push(\"--verbose\");\n }\n\n // Always request JSON output for programmatic use\n args.push(\"--json\");\n\n return args;\n}\n\n/**\n * Parse JSON output from pj\n */\nexport function parseJsonOutput(output: string): Project[] {\n if (!output.trim()) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(output) as {\n path: string;\n name: string;\n marker: string;\n icon?: string;\n priority?: number;\n }[];\n\n return parsed.map((p) => ({\n path: p.path,\n name: p.name,\n marker: p.marker,\n icon: p.icon,\n priority: p.priority,\n }));\n } catch (error) {\n throw new PjExecutionError(\n `Failed to parse pj output: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Execute the pj binary with the given arguments\n *\n * Note: This function uses `execa` which does NOT use shell by default,\n * preventing command injection vulnerabilities.\n */\nexport async function executePj(\n args: string[],\n execaOptions?: ExecaOptions\n): Promise<PjResult> {\n const binaryManager = getBinaryManager();\n const binaryPath = await binaryManager.getBinaryPath();\n\n try {\n // execa does not use shell by default, safe from command injection\n // stdin: 'ignore' prevents hanging when called from Node.js environments\n // that inherit stdin from parent process (e.g., Raycast, VS Code extensions)\n const result = await execa(binaryPath, args, {\n stdin: \"ignore\",\n timeout: 60000, // 1 minute timeout\n ...execaOptions,\n });\n\n return {\n stdout: String(result.stdout ?? \"\"),\n stderr: String(result.stderr ?? \"\"),\n exitCode: result.exitCode ?? 0,\n };\n } catch (error) {\n if (error instanceof Error && \"exitCode\" in error) {\n const execaError = error as Error & {\n exitCode?: number;\n stderr?: string;\n };\n throw new PjExecutionError(\n `pj command failed: ${execaError.message}`,\n execaError.exitCode,\n execaError.stderr\n );\n }\n throw error;\n }\n}\n\n/**\n * Execute pj with stdin input\n *\n * Note: This function uses `execa` which does NOT use shell by default,\n * preventing command injection vulnerabilities.\n */\nexport async function executePjWithStdin(\n args: string[],\n stdin: string,\n execaOptions?: ExecaOptions\n): Promise<PjResult> {\n const binaryManager = getBinaryManager();\n const binaryPath = await binaryManager.getBinaryPath();\n\n try {\n // execa does not use shell by default, safe from command injection\n const result = await execa(binaryPath, args, {\n input: stdin,\n timeout: 60000,\n ...execaOptions,\n });\n\n return {\n stdout: String(result.stdout ?? \"\"),\n stderr: String(result.stderr ?? \"\"),\n exitCode: result.exitCode ?? 0,\n };\n } catch (error) {\n if (error instanceof Error && \"exitCode\" in error) {\n const execaError = error as Error & {\n exitCode?: number;\n stderr?: string;\n };\n throw new PjExecutionError(\n `pj command failed: ${execaError.message}`,\n execaError.exitCode,\n execaError.stderr\n );\n }\n throw error;\n }\n}\n","import type { DiscoverOptions, Project } from \"./types.js\";\nimport {\n buildArgs,\n executePj,\n executePjWithStdin,\n parseJsonOutput,\n} from \"../cli/executor.js\";\n\n/**\n * Discover projects using pj\n */\nexport async function discover(options?: DiscoverOptions): Promise<Project[]> {\n const args = buildArgs(options);\n const result = await executePj(args);\n return parseJsonOutput(result.stdout);\n}\n\n/**\n * Discover projects from specific paths provided via stdin\n *\n * This bypasses the configured paths and discovers projects only in the\n * provided paths. Useful for integrating with other tools that provide\n * a list of directories to search.\n */\nexport async function discoverFromPaths(\n paths: string[],\n options?: Omit<DiscoverOptions, \"paths\">\n): Promise<Project[]> {\n // Build args without --path flags since we're using stdin\n // We explicitly omit paths by building options without it\n const optsWithoutPaths: DiscoverOptions = {};\n if (options?.markers !== undefined) optsWithoutPaths.markers = options.markers;\n if (options?.excludes !== undefined) optsWithoutPaths.excludes = options.excludes;\n if (options?.maxDepth !== undefined) optsWithoutPaths.maxDepth = options.maxDepth;\n if (options?.noIgnore !== undefined) optsWithoutPaths.noIgnore = options.noIgnore;\n if (options?.nested !== undefined) optsWithoutPaths.nested = options.nested;\n if (options?.noCache !== undefined) optsWithoutPaths.noCache = options.noCache;\n if (options?.icons !== undefined) optsWithoutPaths.icons = options.icons;\n if (options?.configPath !== undefined) optsWithoutPaths.configPath = options.configPath;\n if (options?.verbose !== undefined) optsWithoutPaths.verbose = options.verbose;\n\n const args = buildArgs(optsWithoutPaths);\n\n // Pass paths via stdin (one per line)\n const stdin = paths.join(\"\\n\");\n\n const result = await executePjWithStdin(args, stdin);\n\n return parseJsonOutput(result.stdout);\n}\n\n/**\n * Find a project by name\n */\nexport async function findProject(\n name: string,\n options?: DiscoverOptions\n): Promise<Project | undefined> {\n const projects = await discover(options);\n return projects.find(\n (p) => p.name === name || p.name.toLowerCase() === name.toLowerCase()\n );\n}\n\n/**\n * Find projects matching a pattern\n */\nexport async function findProjects(\n pattern: string | RegExp,\n options?: DiscoverOptions\n): Promise<Project[]> {\n const projects = await discover(options);\n const regex = typeof pattern === \"string\" ? new RegExp(pattern, \"i\") : pattern;\n return projects.filter((p) => regex.test(p.name) || regex.test(p.path));\n}\n\n/**\n * Get projects grouped by marker type\n */\nexport async function discoverByMarker(\n options?: DiscoverOptions\n): Promise<Map<string, Project[]>> {\n const projects = await discover(options);\n const grouped = new Map<string, Project[]>();\n\n for (const project of projects) {\n const existing = grouped.get(project.marker);\n if (existing) {\n existing.push(project);\n } else {\n grouped.set(project.marker, [project]);\n }\n }\n\n return grouped;\n}\n\n/**\n * Count projects by marker type\n */\nexport async function countByMarker(\n options?: DiscoverOptions\n): Promise<Map<string, number>> {\n const grouped = await discoverByMarker(options);\n const counts = new Map<string, number>();\n\n for (const [marker, projects] of grouped) {\n counts.set(marker, projects.length);\n }\n\n return counts;\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport * as yaml from \"yaml\";\n\nimport type { PjConfig } from \"./types.js\";\nimport { PjConfigError } from \"./types.js\";\nimport { getPjConfigPath } from \"../binary/constants.js\";\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG: PjConfig = {\n paths: [\n path.join(os.homedir(), \"projects\"),\n path.join(os.homedir(), \"code\"),\n path.join(os.homedir(), \"development\"),\n ],\n markers: [\n \".git\",\n \"go.mod\",\n \"package.json\",\n \"Cargo.toml\",\n \"pyproject.toml\",\n \"Makefile\",\n \"flake.nix\",\n \".vscode\",\n \".idea\",\n \".fleet\",\n \".project\",\n \".zed\",\n \"Dockerfile\",\n ],\n exclude: [\n \"node_modules\",\n \".terraform\",\n \"vendor\",\n \".git\",\n \"target\",\n \"dist\",\n \"build\",\n ],\n maxDepth: 3,\n cacheTTL: 300,\n noIgnore: false,\n noNested: false,\n icons: {\n \".git\": \"\\uf1d3 \", //\n \"package.json\": \"\\ue718 \", //\n \"go.mod\": \"\\ue626 \", //\n \"Cargo.toml\": \"\\ue7a8 \", //\n \"pyproject.toml\": \"\\ue73c \", //\n \".vscode\": \"\\ue70c \", //\n \".idea\": \"\\ue7b5 \", //\n Makefile: \"\\ue779 \", //\n Dockerfile: \"\\ue7b0\",\n },\n priorities: {\n \".git\": 1,\n \"go.mod\": 10,\n \"package.json\": 10,\n \"Cargo.toml\": 10,\n \"pyproject.toml\": 10,\n Makefile: 1,\n \"flake.nix\": 10,\n \".vscode\": 5,\n \".idea\": 5,\n \".fleet\": 5,\n \".project\": 5,\n \".zed\": 5,\n Dockerfile: 7,\n },\n};\n\n/**\n * Load pj configuration from file\n */\nexport async function loadConfig(configPath?: string): Promise<PjConfig> {\n const filePath = configPath ?? getPjConfigPath();\n\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const parsed = yaml.parse(content) as Partial<RawConfig>;\n return mergeConfig(parsed);\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n // Config file doesn't exist, return defaults\n return { ...DEFAULT_CONFIG };\n }\n throw new PjConfigError(\n `Failed to load config from ${filePath}`,\n error instanceof Error ? error : undefined\n );\n }\n}\n\n/**\n * Save configuration to file\n */\nexport async function saveConfig(\n config: Partial<PjConfig>,\n configPath?: string\n): Promise<void> {\n const filePath = configPath ?? getPjConfigPath();\n\n // Convert to raw format, only including defined properties\n const rawConfig: RawConfig = {};\n\n if (config.paths !== undefined) rawConfig.paths = config.paths;\n if (config.markers !== undefined) rawConfig.markers = config.markers;\n if (config.exclude !== undefined) rawConfig.exclude = config.exclude;\n if (config.maxDepth !== undefined) rawConfig.max_depth = config.maxDepth;\n if (config.cacheTTL !== undefined) rawConfig.cache_ttl = config.cacheTTL;\n if (config.noIgnore !== undefined) rawConfig.no_ignore = config.noIgnore;\n if (config.noNested !== undefined) rawConfig.no_nested = config.noNested;\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- support legacy format\n if (config.icons !== undefined) rawConfig.icons = config.icons;\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- support legacy format\n if (config.priorities !== undefined) rawConfig.priorities = config.priorities;\n\n const content = yaml.stringify(rawConfig, { indent: 2 });\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, content, \"utf-8\");\n}\n\n/**\n * Check if a config file exists\n */\nexport async function configExists(configPath?: string): Promise<boolean> {\n const filePath = configPath ?? getPjConfigPath();\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the default config path\n */\nexport function getConfigPath(): string {\n return getPjConfigPath();\n}\n\n/**\n * Raw marker config - can be a string or an object with marker, icon, and priority\n */\ntype RawMarker =\n | string\n | {\n marker: string;\n icon?: string;\n priority?: number;\n };\n\n/**\n * Raw config format as stored in YAML (snake_case)\n */\ninterface RawConfig {\n paths?: string[];\n markers?: RawMarker[];\n exclude?: string[];\n max_depth?: number;\n cache_ttl?: number;\n no_ignore?: boolean;\n no_nested?: boolean;\n /** @deprecated Use the new markers format with icon field instead */\n icons?: Record<string, string>;\n /** @deprecated Use the new markers format with priority field instead */\n priorities?: Record<string, number>;\n}\n\n/**\n * Parse raw markers into separate markers, icons, and priorities\n */\nfunction parseRawMarkers(rawMarkers: RawMarker[]): {\n markers: string[];\n icons: Record<string, string>;\n priorities: Record<string, number>;\n} {\n const markers: string[] = [];\n const icons: Record<string, string> = {};\n const priorities: Record<string, number> = {};\n\n for (const raw of rawMarkers) {\n if (typeof raw === \"string\") {\n markers.push(raw);\n } else {\n markers.push(raw.marker);\n if (raw.icon !== undefined) {\n icons[raw.marker] = raw.icon;\n }\n if (raw.priority !== undefined) {\n priorities[raw.marker] = raw.priority;\n }\n }\n }\n\n return { markers, icons, priorities };\n}\n\n/**\n * Merge raw config with defaults\n */\nfunction mergeConfig(raw: Partial<RawConfig>): PjConfig {\n // Parse markers from raw config if provided\n let markers = DEFAULT_CONFIG.markers;\n let parsedIcons: Record<string, string> = {};\n let parsedPriorities: Record<string, number> = {};\n\n if (raw.markers !== undefined) {\n const parsed = parseRawMarkers(raw.markers);\n markers = parsed.markers;\n parsedIcons = parsed.icons;\n parsedPriorities = parsed.priorities;\n }\n\n // Merge icons: defaults <- deprecated icons field <- new format icons\n const icons = {\n ...DEFAULT_CONFIG.icons,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- support legacy format\n ...(raw.icons ?? {}),\n ...parsedIcons,\n };\n\n // Merge priorities: defaults <- deprecated priorities field <- new format priorities\n const priorities = {\n ...DEFAULT_CONFIG.priorities,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- support legacy format\n ...(raw.priorities ?? {}),\n ...parsedPriorities,\n };\n\n return {\n paths: raw.paths ?? DEFAULT_CONFIG.paths,\n markers,\n exclude: raw.exclude ?? DEFAULT_CONFIG.exclude,\n maxDepth: raw.max_depth ?? DEFAULT_CONFIG.maxDepth,\n cacheTTL: raw.cache_ttl ?? DEFAULT_CONFIG.cacheTTL,\n noIgnore: raw.no_ignore ?? DEFAULT_CONFIG.noIgnore,\n noNested: raw.no_nested ?? DEFAULT_CONFIG.noNested,\n icons,\n priorities,\n };\n}\n\n/**\n * Expand ~ in paths to home directory\n */\nexport function expandPath(p: string): string {\n if (p.startsWith(\"~/\")) {\n return path.join(os.homedir(), p.slice(2));\n }\n if (p === \"~\") {\n return os.homedir();\n }\n return p;\n}\n\n/**\n * Expand all paths in config\n */\nexport function expandConfigPaths(config: PjConfig): PjConfig {\n return {\n ...config,\n paths: config.paths.map(expandPath),\n };\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nimport type { CacheInfo } from \"./types.js\";\nimport { getPjCacheDir } from \"../binary/constants.js\";\nimport { executePj } from \"../cli/executor.js\";\n\n/**\n * Clear the pj project cache\n */\nexport async function clearCache(): Promise<void> {\n await executePj([\"--clear-cache\"]);\n}\n\n/**\n * Get information about the pj cache\n */\nexport async function getCacheInfo(): Promise<CacheInfo> {\n const cacheDir = getPjCacheDir();\n\n try {\n const stats = await fs.stat(cacheDir);\n if (!stats.isDirectory()) {\n return {\n exists: false,\n path: cacheDir,\n fileCount: 0,\n totalSize: 0,\n };\n }\n\n const files = await fs.readdir(cacheDir);\n let totalSize = 0;\n let fileCount = 0;\n\n for (const file of files) {\n if (file.endsWith(\".json\")) {\n const filePath = path.join(cacheDir, file);\n const fileStats = await fs.stat(filePath);\n totalSize += fileStats.size;\n fileCount++;\n }\n }\n\n return {\n exists: true,\n path: cacheDir,\n fileCount,\n totalSize,\n };\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return {\n exists: false,\n path: cacheDir,\n fileCount: 0,\n totalSize: 0,\n };\n }\n throw error;\n }\n}\n\n/**\n * Get the cache directory path\n */\nexport function getCachePath(): string {\n return getPjCacheDir();\n}\n","import type {\n BinaryOptions,\n BinaryStatus,\n CacheInfo,\n DiscoverOptions,\n PjConfig,\n Project,\n} from \"./types.js\";\nimport {\n discover,\n discoverFromPaths,\n findProject,\n findProjects,\n discoverByMarker,\n countByMarker,\n} from \"./discover.js\";\nimport { loadConfig, saveConfig, DEFAULT_CONFIG } from \"./config.js\";\nimport { clearCache, getCacheInfo } from \"./cache.js\";\nimport { getBinaryManager } from \"../binary/manager.js\";\n\n/**\n * Main class for interacting with pj\n *\n * Provides a high-level API for project discovery, configuration management,\n * and binary management.\n *\n * @example\n * ```typescript\n * const pj = new Pj();\n *\n * // Discover all projects\n * const projects = await pj.discover();\n *\n * // Find a specific project\n * const myProject = await pj.findProject('my-app');\n *\n * // Search for projects\n * const reactProjects = await pj.findProjects(/react/i);\n * ```\n */\nexport class Pj {\n private config: PjConfig;\n\n /**\n * Create a new Pj instance\n *\n * @param config - Optional configuration overrides\n */\n constructor(config?: Partial<PjConfig>) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Discover all projects\n *\n * @param options - Discovery options\n * @returns Array of discovered projects\n */\n async discover(options?: DiscoverOptions): Promise<Project[]> {\n return discover(this.mergeOptions(options));\n }\n\n /**\n * Discover projects from specific paths\n *\n * Bypasses configured paths and searches only the provided paths.\n * Useful for integration with other tools.\n *\n * @param paths - Paths to search\n * @param options - Additional discovery options\n */\n async discoverFromPaths(\n paths: string[],\n options?: Omit<DiscoverOptions, \"paths\">\n ): Promise<Project[]> {\n return discoverFromPaths(paths, this.mergeOptions(options));\n }\n\n /**\n * Find a project by name\n *\n * @param name - Project name to find\n * @param options - Discovery options\n */\n async findProject(\n name: string,\n options?: DiscoverOptions\n ): Promise<Project | undefined> {\n return findProject(name, this.mergeOptions(options));\n }\n\n /**\n * Find projects matching a pattern\n *\n * @param pattern - String or regex pattern to match\n * @param options - Discovery options\n */\n async findProjects(\n pattern: string | RegExp,\n options?: DiscoverOptions\n ): Promise<Project[]> {\n return findProjects(pattern, this.mergeOptions(options));\n }\n\n /**\n * Get projects grouped by marker type\n *\n * @param options - Discovery options\n */\n async discoverByMarker(\n options?: DiscoverOptions\n ): Promise<Map<string, Project[]>> {\n return discoverByMarker(this.mergeOptions(options));\n }\n\n /**\n * Count projects by marker type\n *\n * @param options - Discovery options\n */\n async countByMarker(options?: DiscoverOptions): Promise<Map<string, number>> {\n return countByMarker(this.mergeOptions(options));\n }\n\n /**\n * Clear the pj project cache\n */\n async clearCache(): Promise<void> {\n return clearCache();\n }\n\n /**\n * Get information about the pj cache\n */\n async getCacheInfo(): Promise<CacheInfo> {\n return getCacheInfo();\n }\n\n /**\n * Load configuration from file\n *\n * @param configPath - Optional path to config file\n */\n async loadConfig(configPath?: string): Promise<PjConfig> {\n const loaded = await loadConfig(configPath);\n this.config = loaded;\n return loaded;\n }\n\n /**\n * Save configuration to file\n *\n * @param config - Configuration to save (uses current config if not provided)\n * @param configPath - Optional path to config file\n */\n async saveConfig(config?: Partial<PjConfig>, configPath?: string): Promise<void> {\n const toSave = config ? { ...this.config, ...config } : this.config;\n await saveConfig(toSave, configPath);\n }\n\n /**\n * Get current configuration\n */\n getConfig(): PjConfig {\n return { ...this.config };\n }\n\n /**\n * Update configuration\n *\n * @param config - Partial configuration to merge\n */\n setConfig(config: Partial<PjConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Ensure the pj binary is available\n *\n * Downloads the binary if not already installed.\n *\n * @param options - Binary options\n * @returns Path to the binary\n */\n async ensureBinary(options?: BinaryOptions): Promise<string> {\n const manager = getBinaryManager();\n return manager.getBinaryPath(options);\n }\n\n /**\n * Get the status of the pj binary\n */\n async getBinaryStatus(): Promise<BinaryStatus> {\n const manager = getBinaryManager();\n return manager.getStatus();\n }\n\n /**\n * Update the pj binary to the latest version\n *\n * @param options - Binary options\n * @returns Path to the updated binary\n */\n async updateBinary(options?: BinaryOptions): Promise<string> {\n const manager = getBinaryManager();\n return manager.updateBinary(options);\n }\n\n /**\n * Get the version of the pj binary\n */\n async getBinaryVersion(): Promise<string | null> {\n const manager = getBinaryManager();\n const status = await manager.getStatus();\n return status.version;\n }\n\n /**\n * Merge instance config with provided options\n */\n private mergeOptions(options?: DiscoverOptions): DiscoverOptions {\n const merged: DiscoverOptions = {\n paths: options?.paths ?? this.config.paths,\n markers: options?.markers ?? this.config.markers,\n excludes: options?.excludes ?? this.config.exclude,\n maxDepth: options?.maxDepth ?? this.config.maxDepth,\n noIgnore: options?.noIgnore ?? this.config.noIgnore,\n nested: options?.nested ?? !this.config.noNested,\n };\n\n // Only include optional properties if they have values\n if (options?.icons !== undefined) {\n merged.icons = options.icons;\n }\n if (options?.noCache !== undefined) {\n merged.noCache = options.noCache;\n }\n if (options?.configPath !== undefined) {\n merged.configPath = options.configPath;\n }\n if (options?.verbose !== undefined) {\n merged.verbose = options.verbose;\n }\n\n return merged;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api/types.ts","../src/binary/constants.ts","../src/binary/platform.ts","../src/binary/version.ts","../src/binary/manager.ts","../src/cli/executor.ts","../src/api/discover.ts","../src/api/config.ts","../src/api/cache.ts","../src/api/pj.ts"],"names":["os","path2","binaryManager","execa","path3","os2","fs2","fs3","path4"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * A discovered project from pj\n */\nexport interface Project {\n /** Absolute path to the project directory */\n path: string;\n /** Name of the project (directory name) */\n name: string;\n /** The marker file/directory that identified this as a project */\n marker: string;\n /** Optional icon for the marker (Nerd Font) */\n icon: string | undefined;\n /** Priority of the marker (higher = more specific) */\n priority: number | undefined;\n}\n\n/**\n * Options for project discovery\n */\nexport interface DiscoverOptions {\n /** Paths to search for projects */\n paths?: string[];\n /** Project marker files/directories to look for */\n markers?: string[];\n /** Patterns to exclude from search */\n excludes?: string[];\n /** Maximum directory depth to search */\n maxDepth?: number;\n /** Don't respect .gitignore files */\n noIgnore?: boolean;\n /** Allow nested project detection */\n nested?: boolean;\n /** Bypass cache and do fresh discovery */\n noCache?: boolean;\n /** Include icons in output */\n icons?: boolean;\n /** Custom config file path */\n configPath?: string;\n /** Enable verbose/debug output */\n verbose?: boolean;\n}\n\n/**\n * Configuration for pj\n */\nexport interface PjConfig {\n /** Paths to search for projects */\n paths: string[];\n /** Project marker files/directories */\n markers: string[];\n /** Patterns to exclude */\n exclude: string[];\n /** Maximum search depth */\n maxDepth: number;\n /** Cache time-to-live in seconds */\n cacheTTL: number;\n /** Don't respect .gitignore */\n noIgnore: boolean;\n /** Allow nested projects */\n noNested: boolean;\n /** Icon mappings for markers */\n icons: Record<string, string>;\n /** Priority mappings for markers (higher = more specific) */\n priorities: Record<string, number>;\n}\n\n/**\n * Information about the pj cache\n */\nexport interface CacheInfo {\n /** Whether the cache exists */\n exists: boolean;\n /** Path to the cache directory */\n path: string;\n /** Number of cache files */\n fileCount: number;\n /** Total size in bytes */\n totalSize: number;\n}\n\n/**\n * Binary installation status\n */\nexport interface BinaryStatus {\n /** Whether a binary is available */\n available: boolean;\n /** Path to the binary */\n path: string | null;\n /** Version of the binary */\n version: string | null;\n /** Source of the binary: 'global', 'cache', or 'env' */\n source: \"global\" | \"cache\" | \"env\" | null;\n}\n\n/**\n * Options for binary management\n */\nexport interface BinaryOptions {\n /** Force download even if binary exists */\n force?: boolean;\n /** Specific version to install (defaults to latest) */\n version?: string;\n /** Progress callback for downloads */\n onProgress?: (progress: DownloadProgress) => void;\n}\n\n/**\n * Download progress information\n */\nexport interface DownloadProgress {\n /** Bytes downloaded so far */\n downloaded: number;\n /** Total bytes to download (may be undefined if unknown) */\n total?: number;\n /** Percentage complete (0-100) */\n percent?: number;\n}\n\n/**\n * GitHub release information\n */\nexport interface GithubRelease {\n /** Release tag name (e.g., \"v1.4.1\") */\n tagName: string;\n /** Release version without 'v' prefix */\n version: string;\n /** Release name/title */\n name: string;\n /** Whether this is a prerelease */\n prerelease: boolean;\n /** Release assets */\n assets: GithubAsset[];\n}\n\n/**\n * GitHub release asset\n */\nexport interface GithubAsset {\n /** Asset name (e.g., \"pj_1.4.1_darwin_arm64.tar.gz\") */\n name: string;\n /** Download URL */\n downloadUrl: string;\n /** File size in bytes */\n size: number;\n /** Content type */\n contentType: string;\n}\n\n/**\n * Platform information\n */\nexport interface Platform {\n /** Operating system: darwin, linux, win32 */\n os: \"darwin\" | \"linux\" | \"win32\";\n /** Architecture: x64, arm64 */\n arch: \"x64\" | \"arm64\";\n /** pj asset OS name */\n pjOs: \"darwin\" | \"linux\" | \"windows\";\n /** pj asset architecture name */\n pjArch: \"amd64\" | \"arm64\";\n}\n\n/**\n * Error thrown when binary operations fail\n */\nexport class PjBinaryError extends Error {\n constructor(\n message: string,\n public override readonly cause?: Error\n ) {\n super(message, { cause });\n this.name = \"PjBinaryError\";\n }\n}\n\n/**\n * Error thrown when pj execution fails\n */\nexport class PjExecutionError extends Error {\n public readonly exitCode: number | undefined;\n public readonly stderr: string | undefined;\n\n constructor(message: string, exitCode?: number, stderr?: string) {\n super(message);\n this.name = \"PjExecutionError\";\n this.exitCode = exitCode;\n this.stderr = stderr;\n }\n}\n\n/**\n * Error thrown when configuration is invalid\n */\nexport class PjConfigError extends Error {\n constructor(\n message: string,\n public override readonly cause?: Error\n ) {\n super(message, { cause });\n this.name = \"PjConfigError\";\n }\n}\n","import * as path from \"node:path\";\nimport * as os from \"node:os\";\n\n/**\n * Target pj version (major.minor) that this package is compatible with.\n * The installer will accept any patch version within this range.\n * Example: \"1.4\" means pj 1.4.0, 1.4.1, 1.4.2, etc. are all compatible.\n *\n * IMPORTANT: When pj releases a new minor version (e.g., 1.5.0),\n * this package must also release a new minor version to match.\n */\nexport const PJ_TARGET_VERSION = \"1.7\";\n\n/** GitHub repository owner */\nexport const GITHUB_OWNER = \"josephschmitt\";\n\n/** GitHub repository name */\nexport const GITHUB_REPO = \"pj\";\n\n/** GitHub API base URL */\nexport const GITHUB_API_URL = \"https://api.github.com\";\n\n/** GitHub releases API endpoint */\nexport const RELEASES_URL = `${GITHUB_API_URL}/repos/${GITHUB_OWNER}/${GITHUB_REPO}/releases`;\n\n/** Latest release API endpoint */\nexport const LATEST_RELEASE_URL = `${RELEASES_URL}/latest`;\n\n/** Binary name (without extension) */\nexport const BINARY_NAME = \"pj\";\n\n/** Binary name on Windows */\nexport const BINARY_NAME_WIN = \"pj.exe\";\n\n/** Get the appropriate binary name for the current platform */\nexport function getBinaryName(): string {\n return process.platform === \"win32\" ? BINARY_NAME_WIN : BINARY_NAME;\n}\n\n/** Cache directory for pj-node */\nexport function getCacheDir(): string {\n const xdgCache = process.env[\"XDG_CACHE_HOME\"];\n if (xdgCache) {\n return path.join(xdgCache, \"pj-node\");\n }\n\n if (process.platform === \"win32\") {\n const localAppData = process.env[\"LOCALAPPDATA\"];\n if (localAppData) {\n return path.join(localAppData, \"pj-node\", \"cache\");\n }\n return path.join(os.homedir(), \"AppData\", \"Local\", \"pj-node\", \"cache\");\n }\n\n return path.join(os.homedir(), \".cache\", \"pj-node\");\n}\n\n/** Binary cache directory */\nexport function getBinaryCacheDir(): string {\n return path.join(getCacheDir(), \"bin\");\n}\n\n/** Metadata file path */\nexport function getMetadataPath(): string {\n return path.join(getCacheDir(), \"metadata.json\");\n}\n\n/** pj config directory */\nexport function getPjConfigDir(): string {\n const xdgConfig = process.env[\"XDG_CONFIG_HOME\"];\n if (xdgConfig) {\n return path.join(xdgConfig, \"pj\");\n }\n\n if (process.platform === \"win32\") {\n const appData = process.env[\"APPDATA\"];\n if (appData) {\n return path.join(appData, \"pj\");\n }\n return path.join(os.homedir(), \"AppData\", \"Roaming\", \"pj\");\n }\n\n return path.join(os.homedir(), \".config\", \"pj\");\n}\n\n/** pj config file path */\nexport function getPjConfigPath(): string {\n return path.join(getPjConfigDir(), \"config.yaml\");\n}\n\n/** pj cache directory */\nexport function getPjCacheDir(): string {\n const xdgCache = process.env[\"XDG_CACHE_HOME\"];\n if (xdgCache) {\n return path.join(xdgCache, \"pj\");\n }\n\n if (process.platform === \"win32\") {\n const localAppData = process.env[\"LOCALAPPDATA\"];\n if (localAppData) {\n return path.join(localAppData, \"pj\", \"cache\");\n }\n return path.join(os.homedir(), \"AppData\", \"Local\", \"pj\", \"cache\");\n }\n\n return path.join(os.homedir(), \".cache\", \"pj\");\n}\n\n/** User agent for GitHub API requests */\nexport const USER_AGENT = \"@joe-sh/pj\";\n\n/** Default timeout for HTTP requests in milliseconds */\nexport const HTTP_TIMEOUT = 30000;\n\n/** Update check interval in days */\nexport const UPDATE_CHECK_INTERVAL_DAYS = 7;\n","import type { Platform } from \"../api/types.js\";\nimport { PjBinaryError } from \"../api/types.js\";\n\n/**\n * Detect the current platform and return normalized platform info\n */\nexport function detectPlatform(): Platform {\n const nodeOs = process.platform;\n const nodeArch = process.arch;\n\n // Map Node.js platform to pj asset names\n let os: Platform[\"os\"];\n let pjOs: Platform[\"pjOs\"];\n\n switch (nodeOs) {\n case \"darwin\":\n os = \"darwin\";\n pjOs = \"darwin\";\n break;\n case \"linux\":\n os = \"linux\";\n pjOs = \"linux\";\n break;\n case \"win32\":\n os = \"win32\";\n pjOs = \"windows\";\n break;\n default:\n throw new PjBinaryError(`Unsupported operating system: ${nodeOs}`);\n }\n\n // Map Node.js architecture to pj asset names\n let arch: Platform[\"arch\"];\n let pjArch: Platform[\"pjArch\"];\n\n switch (nodeArch) {\n case \"x64\":\n arch = \"x64\";\n pjArch = \"amd64\";\n break;\n case \"arm64\":\n arch = \"arm64\";\n pjArch = \"arm64\";\n break;\n default:\n throw new PjBinaryError(`Unsupported architecture: ${nodeArch}`);\n }\n\n return { os, arch, pjOs, pjArch };\n}\n\n/**\n * Get the expected asset filename for the current platform\n */\nexport function getAssetFilename(version: string, platform?: Platform): string {\n const p = platform ?? detectPlatform();\n const versionWithoutV = version.startsWith(\"v\") ? version.slice(1) : version;\n\n return `pj_${versionWithoutV}_${p.pjOs}_${p.pjArch}.tar.gz`;\n}\n\n/**\n * Check if the current platform is supported\n */\nexport function isPlatformSupported(): boolean {\n try {\n detectPlatform();\n return true;\n } catch {\n return false;\n }\n}\n","import { PJ_TARGET_VERSION } from \"./constants.js\";\n\n/**\n * Parsed semantic version\n */\nexport interface ParsedVersion {\n major: number;\n minor: number;\n patch: number;\n raw: string;\n}\n\n/**\n * Parse a semantic version string\n */\nexport function parseVersion(version: string): ParsedVersion | null {\n // Remove leading 'v' if present\n const normalized = version.replace(/^v/, \"\");\n const match = /^(\\d+)\\.(\\d+)\\.(\\d+)/.exec(normalized);\n\n if (!match?.[1] || !match[2] || !match[3]) {\n return null;\n }\n\n return {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n patch: parseInt(match[3], 10),\n raw: normalized,\n };\n}\n\n/**\n * Parse a major.minor version target (e.g., \"1.4\")\n */\nexport function parseTargetVersion(\n target: string\n): { major: number; minor: number } | null {\n const match = /^(\\d+)\\.(\\d+)$/.exec(target);\n if (!match?.[1] || !match[2]) {\n return null;\n }\n\n return {\n major: parseInt(match[1], 10),\n minor: parseInt(match[2], 10),\n };\n}\n\n/**\n * Check if a version is compatible with the target major.minor version.\n * A version is compatible if it has the same major.minor version.\n *\n * Example: target \"1.4\" is compatible with \"1.4.0\", \"1.4.1\", \"1.4.99\"\n * but NOT with \"1.3.0\", \"1.5.0\", or \"2.4.0\"\n */\nexport function isVersionCompatible(\n version: string,\n target: string = PJ_TARGET_VERSION\n): boolean {\n const parsed = parseVersion(version);\n const targetParsed = parseTargetVersion(target);\n\n if (!parsed || !targetParsed) {\n return false;\n }\n\n return (\n parsed.major === targetParsed.major && parsed.minor === targetParsed.minor\n );\n}\n\n/**\n * Compare two versions. Returns:\n * - negative if a < b\n * - positive if a > b\n * - 0 if a === b\n */\nexport function compareVersions(a: string, b: string): number {\n const parsedA = parseVersion(a);\n const parsedB = parseVersion(b);\n\n if (!parsedA || !parsedB) {\n return 0;\n }\n\n if (parsedA.major !== parsedB.major) {\n return parsedA.major - parsedB.major;\n }\n\n if (parsedA.minor !== parsedB.minor) {\n return parsedA.minor - parsedB.minor;\n }\n\n return parsedA.patch - parsedB.patch;\n}\n\n/**\n * Find the highest compatible version from a list of versions\n */\nexport function findHighestCompatibleVersion(\n versions: string[],\n target: string = PJ_TARGET_VERSION\n): string | null {\n const compatible = versions.filter((v) => isVersionCompatible(v, target));\n\n if (compatible.length === 0) {\n return null;\n }\n\n // Sort descending and return the highest\n compatible.sort((a, b) => compareVersions(b, a));\n return compatible[0] ?? null;\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { createWriteStream } from \"node:fs\";\nimport { pipeline } from \"node:stream/promises\";\nimport { Readable } from \"node:stream\";\nimport { execa } from \"execa\";\nimport * as tar from \"tar\";\n\nimport type {\n BinaryOptions,\n BinaryStatus,\n DownloadProgress,\n GithubAsset,\n GithubRelease,\n} from \"../api/types.js\";\nimport { PjBinaryError } from \"../api/types.js\";\nimport {\n RELEASES_URL,\n LATEST_RELEASE_URL,\n USER_AGENT,\n HTTP_TIMEOUT,\n UPDATE_CHECK_INTERVAL_DAYS,\n PJ_TARGET_VERSION,\n getBinaryCacheDir,\n getBinaryName,\n getMetadataPath,\n} from \"./constants.js\";\nimport { detectPlatform, getAssetFilename } from \"./platform.js\";\nimport {\n isVersionCompatible,\n findHighestCompatibleVersion,\n} from \"./version.js\";\n\ninterface CacheMetadata {\n version: string;\n installedAt: string;\n lastUpdateCheck: string;\n source: \"download\";\n}\n\n/**\n * Manages the pj binary installation and updates\n *\n * Note: This module uses `execa` for process execution which does NOT use shell\n * by default, preventing command injection vulnerabilities.\n */\nexport class BinaryManager {\n private cachedBinaryPath: string | null = null;\n\n /**\n * Get the path to the pj binary, downloading if necessary\n */\n async getBinaryPath(options?: BinaryOptions): Promise<string> {\n // Check environment override first\n const envPath = process.env[\"PJ_BINARY_PATH\"];\n if (envPath) {\n if (await this.isValidBinary(envPath)) {\n return envPath;\n }\n throw new PjBinaryError(\n `PJ_BINARY_PATH is set but binary is not valid: ${envPath}`\n );\n }\n\n // Check for global installation\n const globalPath = await this.findGlobalBinary();\n if (globalPath) {\n return globalPath;\n }\n\n // Check cached binary\n const cachedPath = await this.getCachedBinaryPath();\n if (cachedPath && !options?.force) {\n // Check if update is needed\n const needsUpdate = await this.shouldCheckForUpdate();\n if (needsUpdate && options?.version === undefined) {\n try {\n await this.updateBinary(options);\n } catch {\n // If update fails, continue with existing binary\n }\n }\n return cachedPath;\n }\n\n // Download binary\n return await this.downloadBinary(options);\n }\n\n /**\n * Get the current binary status\n */\n async getStatus(): Promise<BinaryStatus> {\n // Check environment override\n const envPath = process.env[\"PJ_BINARY_PATH\"];\n if (envPath && (await this.isValidBinary(envPath))) {\n const version = await this.getVersion(envPath);\n return {\n available: true,\n path: envPath,\n version,\n source: \"env\",\n };\n }\n\n // Check global installation\n const globalPath = await this.findGlobalBinary();\n if (globalPath) {\n const version = await this.getVersion(globalPath);\n return {\n available: true,\n path: globalPath,\n version,\n source: \"global\",\n };\n }\n\n // Check cached binary\n const cachedPath = await this.getCachedBinaryPath();\n if (cachedPath) {\n const version = await this.getVersion(cachedPath);\n return {\n available: true,\n path: cachedPath,\n version,\n source: \"cache\",\n };\n }\n\n return {\n available: false,\n path: null,\n version: null,\n source: null,\n };\n }\n\n /**\n * Download and install the pj binary.\n * If no specific version is requested, downloads the highest compatible version\n * within the target major.minor range.\n */\n async downloadBinary(options?: BinaryOptions): Promise<string> {\n const release = options?.version\n ? await this.getRelease(options.version)\n : await this.getCompatibleRelease();\n\n const platform = detectPlatform();\n const assetName = getAssetFilename(release.version, platform);\n\n const asset = release.assets.find((a) => a.name === assetName);\n if (!asset) {\n throw new PjBinaryError(\n `No binary available for ${platform.pjOs}/${platform.pjArch}. ` +\n `Expected asset: ${assetName}`\n );\n }\n\n // Create cache directory\n const cacheDir = getBinaryCacheDir();\n await fs.mkdir(cacheDir, { recursive: true });\n\n // Download the tarball\n const tarballPath = path.join(cacheDir, assetName);\n await this.downloadAsset(asset, tarballPath, options?.onProgress);\n\n // Extract the binary\n const binaryName = getBinaryName();\n await tar.extract({\n file: tarballPath,\n cwd: cacheDir,\n filter: (entryPath) => path.basename(entryPath) === binaryName,\n });\n\n // Clean up tarball\n await fs.unlink(tarballPath);\n\n // Set executable permissions on Unix\n const binaryPath = path.join(cacheDir, binaryName);\n if (process.platform !== \"win32\") {\n await fs.chmod(binaryPath, 0o755);\n }\n\n // Verify the binary\n if (!(await this.isValidBinary(binaryPath))) {\n throw new PjBinaryError(\"Downloaded binary failed verification\");\n }\n\n // Save metadata\n await this.saveMetadata({\n version: release.version,\n installedAt: new Date().toISOString(),\n lastUpdateCheck: new Date().toISOString(),\n source: \"download\",\n });\n\n this.cachedBinaryPath = binaryPath;\n return binaryPath;\n }\n\n /**\n * Update the binary to the highest compatible version within the target range.\n */\n async updateBinary(options?: BinaryOptions): Promise<string> {\n const compatible = await this.getCompatibleRelease();\n const metadata = await this.getMetadata();\n\n if (metadata?.version === compatible.version && !options?.force) {\n // Already up to date, just update the check timestamp\n await this.saveMetadata({\n ...metadata,\n lastUpdateCheck: new Date().toISOString(),\n });\n const cachedPath = await this.getCachedBinaryPath();\n if (cachedPath) {\n return cachedPath;\n }\n }\n\n return await this.downloadBinary({\n ...options,\n version: compatible.version,\n });\n }\n\n /**\n * Get the version of a pj binary\n */\n async getVersion(binaryPath: string): Promise<string | null> {\n try {\n // execa does not use shell by default, safe from command injection\n const result = await execa(binaryPath, [\"--version\"], { timeout: 5000 });\n // pj outputs version like \"pj version 1.4.1\"\n const match = /(?:pj\\s+)?(?:version\\s+)?v?(\\d+\\.\\d+\\.\\d+)/i.exec(\n result.stdout\n );\n return match?.[1] ?? null;\n } catch {\n return null;\n }\n }\n\n /**\n * Check if a binary path is a valid pj binary\n */\n async isValidBinary(binaryPath: string): Promise<boolean> {\n try {\n await fs.access(binaryPath, fs.constants.X_OK);\n const version = await this.getVersion(binaryPath);\n return version !== null;\n } catch {\n return false;\n }\n }\n\n /**\n * Find the globally installed pj binary.\n * Only returns the binary if it's version-compatible with our target.\n */\n private async findGlobalBinary(): Promise<string | null> {\n // execa does not use shell by default, safe from command injection\n let binaryPath: string | null = null;\n\n try {\n const result = await execa(\"which\", [\"pj\"], { timeout: 5000 });\n binaryPath = result.stdout.trim();\n } catch {\n // which failed or binary not found\n }\n\n // On Windows, try where\n if (!binaryPath && process.platform === \"win32\") {\n try {\n const result = await execa(\"where\", [\"pj\"], { timeout: 5000 });\n binaryPath = result.stdout.trim().split(\"\\n\")[0] ?? null;\n } catch {\n // where failed or binary not found\n }\n }\n\n if (!binaryPath) {\n return null;\n }\n\n // Check if the binary is valid\n if (!(await this.isValidBinary(binaryPath))) {\n return null;\n }\n\n // Check if the version is compatible\n const version = await this.getVersion(binaryPath);\n if (!version || !isVersionCompatible(version, PJ_TARGET_VERSION)) {\n return null;\n }\n\n return binaryPath;\n }\n\n /**\n * Get the path to the cached binary if it exists and is version-compatible.\n */\n private async getCachedBinaryPath(): Promise<string | null> {\n if (this.cachedBinaryPath) {\n if (await this.isValidBinary(this.cachedBinaryPath)) {\n // Verify version compatibility\n const version = await this.getVersion(this.cachedBinaryPath);\n if (version && isVersionCompatible(version, PJ_TARGET_VERSION)) {\n return this.cachedBinaryPath;\n }\n }\n this.cachedBinaryPath = null;\n }\n\n const binaryPath = path.join(getBinaryCacheDir(), getBinaryName());\n if (await this.isValidBinary(binaryPath)) {\n // Verify version compatibility\n const version = await this.getVersion(binaryPath);\n if (version && isVersionCompatible(version, PJ_TARGET_VERSION)) {\n this.cachedBinaryPath = binaryPath;\n return binaryPath;\n }\n }\n\n return null;\n }\n\n /**\n * Check if we should check for updates\n */\n private async shouldCheckForUpdate(): Promise<boolean> {\n const metadata = await this.getMetadata();\n if (!metadata) {\n return true;\n }\n\n const lastCheck = new Date(metadata.lastUpdateCheck);\n const now = new Date();\n const daysSinceCheck =\n (now.getTime() - lastCheck.getTime()) / (1000 * 60 * 60 * 24);\n\n return daysSinceCheck >= UPDATE_CHECK_INTERVAL_DAYS;\n }\n\n /**\n * Get cached metadata\n */\n private async getMetadata(): Promise<CacheMetadata | null> {\n try {\n const content = await fs.readFile(getMetadataPath(), \"utf-8\");\n return JSON.parse(content) as CacheMetadata;\n } catch {\n return null;\n }\n }\n\n /**\n * Save metadata to cache\n */\n private async saveMetadata(metadata: CacheMetadata): Promise<void> {\n const metadataPath = getMetadataPath();\n await fs.mkdir(path.dirname(metadataPath), { recursive: true });\n await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2));\n }\n\n /**\n * Get all releases from GitHub (up to 100 most recent)\n */\n async getAllReleases(): Promise<GithubRelease[]> {\n const response = await fetch(`${RELEASES_URL}?per_page=100`, {\n headers: {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": USER_AGENT,\n },\n signal: AbortSignal.timeout(HTTP_TIMEOUT),\n });\n\n if (!response.ok) {\n throw new PjBinaryError(\n `Failed to fetch releases: ${String(response.status)} ${response.statusText}`\n );\n }\n\n const data = (await response.json()) as {\n tag_name: string;\n name: string;\n prerelease: boolean;\n assets: {\n name: string;\n browser_download_url: string;\n size: number;\n content_type: string;\n }[];\n }[];\n\n return data\n .filter((release) => !release.prerelease)\n .map((release) => this.parseRelease(release));\n }\n\n /**\n * Get the highest compatible release within the target major.minor range.\n */\n async getCompatibleRelease(): Promise<GithubRelease> {\n const releases = await this.getAllReleases();\n const versions = releases.map((r) => r.version);\n\n const compatibleVersion = findHighestCompatibleVersion(\n versions,\n PJ_TARGET_VERSION\n );\n\n if (!compatibleVersion) {\n throw new PjBinaryError(\n `No compatible pj release found for version range ${PJ_TARGET_VERSION}.x. ` +\n `Available versions: ${versions.join(\", \")}`\n );\n }\n\n const release = releases.find((r) => r.version === compatibleVersion);\n if (!release) {\n throw new PjBinaryError(\n `Failed to find release for version ${compatibleVersion}`\n );\n }\n\n return release;\n }\n\n /**\n * Get the latest release from GitHub\n */\n async getLatestRelease(): Promise<GithubRelease> {\n const response = await fetch(LATEST_RELEASE_URL, {\n headers: {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": USER_AGENT,\n },\n signal: AbortSignal.timeout(HTTP_TIMEOUT),\n });\n\n if (!response.ok) {\n throw new PjBinaryError(\n `Failed to fetch latest release: ${String(response.status)} ${response.statusText}`\n );\n }\n\n const data = (await response.json()) as {\n tag_name: string;\n name: string;\n prerelease: boolean;\n assets: {\n name: string;\n browser_download_url: string;\n size: number;\n content_type: string;\n }[];\n };\n\n return this.parseRelease(data);\n }\n\n /**\n * Get a specific release from GitHub\n */\n private async getRelease(version: string): Promise<GithubRelease> {\n const tag = version.startsWith(\"v\") ? version : `v${version}`;\n const url = `${LATEST_RELEASE_URL.replace(\"/latest\", \"\")}/${tag}`;\n\n const response = await fetch(url, {\n headers: {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": USER_AGENT,\n },\n signal: AbortSignal.timeout(HTTP_TIMEOUT),\n });\n\n if (!response.ok) {\n throw new PjBinaryError(\n `Failed to fetch release ${version}: ${String(response.status)} ${response.statusText}`\n );\n }\n\n const data = (await response.json()) as {\n tag_name: string;\n name: string;\n prerelease: boolean;\n assets: {\n name: string;\n browser_download_url: string;\n size: number;\n content_type: string;\n }[];\n };\n\n return this.parseRelease(data);\n }\n\n /**\n * Parse GitHub release response\n */\n private parseRelease(data: {\n tag_name: string;\n name: string;\n prerelease: boolean;\n assets: {\n name: string;\n browser_download_url: string;\n size: number;\n content_type: string;\n }[];\n }): GithubRelease {\n return {\n tagName: data.tag_name,\n version: data.tag_name.replace(/^v/, \"\"),\n name: data.name,\n prerelease: data.prerelease,\n assets: data.assets.map((asset) => ({\n name: asset.name,\n downloadUrl: asset.browser_download_url,\n size: asset.size,\n contentType: asset.content_type,\n })),\n };\n }\n\n /**\n * Download an asset to a file\n */\n private async downloadAsset(\n asset: GithubAsset,\n destPath: string,\n onProgress?: (progress: DownloadProgress) => void\n ): Promise<void> {\n const response = await fetch(asset.downloadUrl, {\n headers: {\n \"User-Agent\": USER_AGENT,\n },\n signal: AbortSignal.timeout(HTTP_TIMEOUT * 10), // Longer timeout for downloads\n });\n\n if (!response.ok) {\n throw new PjBinaryError(\n `Failed to download asset: ${String(response.status)} ${response.statusText}`\n );\n }\n\n if (!response.body) {\n throw new PjBinaryError(\"Response body is empty\");\n }\n\n const total = asset.size;\n let downloaded = 0;\n\n const progressStream = new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n downloaded += chunk.length;\n onProgress?.({\n downloaded,\n total,\n percent: Math.round((downloaded / total) * 100),\n });\n controller.enqueue(chunk);\n },\n });\n\n const fileStream = createWriteStream(destPath);\n\n await pipeline(\n Readable.fromWeb(response.body.pipeThrough(progressStream)),\n fileStream\n );\n }\n\n /**\n * Clear the binary cache\n */\n async clearCache(): Promise<void> {\n const cacheDir = getBinaryCacheDir();\n try {\n await fs.rm(cacheDir, { recursive: true, force: true });\n } catch {\n // Ignore errors if directory doesn't exist\n }\n\n const metadataPath = getMetadataPath();\n try {\n await fs.unlink(metadataPath);\n } catch {\n // Ignore errors if file doesn't exist\n }\n\n this.cachedBinaryPath = null;\n }\n}\n\n/** Singleton instance */\nlet binaryManager: BinaryManager | null = null;\n\n/**\n * Get the singleton BinaryManager instance\n */\nexport function getBinaryManager(): BinaryManager {\n binaryManager ??= new BinaryManager();\n return binaryManager;\n}\n","import { execa, type Options as ExecaOptions } from \"execa\";\n\nimport type { DiscoverOptions, Project } from \"../api/types.js\";\nimport { PjExecutionError } from \"../api/types.js\";\nimport { getBinaryManager } from \"../binary/manager.js\";\n\n/**\n * Result from executing pj\n */\nexport interface PjResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Build command-line arguments from DiscoverOptions\n */\nexport function buildArgs(options?: DiscoverOptions): string[] {\n const args: string[] = [];\n\n if (options?.paths) {\n for (const p of options.paths) {\n args.push(\"--path\", p);\n }\n }\n\n if (options?.markers) {\n for (const m of options.markers) {\n args.push(\"--marker\", m);\n }\n }\n\n if (options?.excludes) {\n for (const e of options.excludes) {\n args.push(\"--exclude\", e);\n }\n }\n\n if (options?.maxDepth !== undefined) {\n args.push(\"--max-depth\", String(options.maxDepth));\n }\n\n if (options?.noIgnore) {\n args.push(\"--no-ignore\");\n }\n\n if (options?.nested === false) {\n args.push(\"--no-nested\");\n }\n\n if (options?.noCache) {\n args.push(\"--no-cache\");\n }\n\n if (options?.icons) {\n args.push(\"--icons\");\n }\n\n if (options?.configPath) {\n args.push(\"--config\", options.configPath);\n }\n\n if (options?.verbose) {\n args.push(\"--verbose\");\n }\n\n // Always request JSON output for programmatic use\n args.push(\"--json\");\n\n return args;\n}\n\n/**\n * JSON structure returned by pj binary\n */\ninterface PjJsonProject {\n path: string;\n name: string;\n marker: string;\n icon?: string;\n}\n\ninterface PjJsonOutput {\n projects: PjJsonProject[];\n}\n\n/**\n * Parse JSON output from pj\n */\nexport function parseJsonOutput(output: string): Project[] {\n if (!output.trim()) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(output) as PjJsonOutput | PjJsonProject[];\n\n // Handle both wrapped format { \"projects\": [...] } and direct array format\n const projects = Array.isArray(parsed) ? parsed : parsed.projects;\n\n if (!Array.isArray(projects)) {\n throw new PjExecutionError(\n `Unexpected pj output format: expected projects array but got ${typeof parsed}`\n );\n }\n\n return projects.map((p) => ({\n path: p.path,\n name: p.name,\n marker: p.marker,\n icon: p.icon,\n priority: undefined, // not included in JSON output\n }));\n } catch (error) {\n if (error instanceof PjExecutionError) {\n throw error;\n }\n throw new PjExecutionError(\n `Failed to parse pj output: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Execute the pj binary with the given arguments\n *\n * Note: This function uses `execa` which does NOT use shell by default,\n * preventing command injection vulnerabilities.\n */\nexport async function executePj(\n args: string[],\n execaOptions?: ExecaOptions\n): Promise<PjResult> {\n const binaryManager = getBinaryManager();\n const binaryPath = await binaryManager.getBinaryPath();\n\n try {\n // execa does not use shell by default, safe from command injection\n // stdin: 'ignore' prevents hanging when called from Node.js environments\n // that inherit stdin from parent process (e.g., Raycast, VS Code extensions)\n const result = await execa(binaryPath, args, {\n stdin: \"ignore\",\n timeout: 60000, // 1 minute timeout\n ...execaOptions,\n });\n\n return {\n stdout: String(result.stdout ?? \"\"),\n stderr: String(result.stderr ?? \"\"),\n exitCode: result.exitCode ?? 0,\n };\n } catch (error) {\n if (error instanceof Error && \"exitCode\" in error) {\n const execaError = error as Error & {\n exitCode?: number;\n stderr?: string;\n };\n throw new PjExecutionError(\n `pj command failed: ${execaError.message}`,\n execaError.exitCode,\n execaError.stderr\n );\n }\n throw error;\n }\n}\n\n/**\n * Execute pj with stdin input\n *\n * Note: This function uses `execa` which does NOT use shell by default,\n * preventing command injection vulnerabilities.\n */\nexport async function executePjWithStdin(\n args: string[],\n stdin: string,\n execaOptions?: ExecaOptions\n): Promise<PjResult> {\n const binaryManager = getBinaryManager();\n const binaryPath = await binaryManager.getBinaryPath();\n\n try {\n // execa does not use shell by default, safe from command injection\n const result = await execa(binaryPath, args, {\n input: stdin,\n timeout: 60000,\n ...execaOptions,\n });\n\n return {\n stdout: String(result.stdout ?? \"\"),\n stderr: String(result.stderr ?? \"\"),\n exitCode: result.exitCode ?? 0,\n };\n } catch (error) {\n if (error instanceof Error && \"exitCode\" in error) {\n const execaError = error as Error & {\n exitCode?: number;\n stderr?: string;\n };\n throw new PjExecutionError(\n `pj command failed: ${execaError.message}`,\n execaError.exitCode,\n execaError.stderr\n );\n }\n throw error;\n }\n}\n","import type { DiscoverOptions, Project } from \"./types.js\";\nimport {\n buildArgs,\n executePj,\n executePjWithStdin,\n parseJsonOutput,\n} from \"../cli/executor.js\";\n\n/**\n * Discover projects using pj\n */\nexport async function discover(options?: DiscoverOptions): Promise<Project[]> {\n const args = buildArgs(options);\n const result = await executePj(args);\n return parseJsonOutput(result.stdout);\n}\n\n/**\n * Discover projects from specific paths provided via stdin\n *\n * This bypasses the configured paths and discovers projects only in the\n * provided paths. Useful for integrating with other tools that provide\n * a list of directories to search.\n */\nexport async function discoverFromPaths(\n paths: string[],\n options?: Omit<DiscoverOptions, \"paths\">\n): Promise<Project[]> {\n // Build args without --path flags since we're using stdin\n // We explicitly omit paths by building options without it\n const optsWithoutPaths: DiscoverOptions = {};\n if (options?.markers !== undefined) optsWithoutPaths.markers = options.markers;\n if (options?.excludes !== undefined) optsWithoutPaths.excludes = options.excludes;\n if (options?.maxDepth !== undefined) optsWithoutPaths.maxDepth = options.maxDepth;\n if (options?.noIgnore !== undefined) optsWithoutPaths.noIgnore = options.noIgnore;\n if (options?.nested !== undefined) optsWithoutPaths.nested = options.nested;\n if (options?.noCache !== undefined) optsWithoutPaths.noCache = options.noCache;\n if (options?.icons !== undefined) optsWithoutPaths.icons = options.icons;\n if (options?.configPath !== undefined) optsWithoutPaths.configPath = options.configPath;\n if (options?.verbose !== undefined) optsWithoutPaths.verbose = options.verbose;\n\n const args = buildArgs(optsWithoutPaths);\n\n // Pass paths via stdin (one per line)\n const stdin = paths.join(\"\\n\");\n\n const result = await executePjWithStdin(args, stdin);\n\n return parseJsonOutput(result.stdout);\n}\n\n/**\n * Find a project by name\n */\nexport async function findProject(\n name: string,\n options?: DiscoverOptions\n): Promise<Project | undefined> {\n const projects = await discover(options);\n return projects.find(\n (p) => p.name === name || p.name.toLowerCase() === name.toLowerCase()\n );\n}\n\n/**\n * Find projects matching a pattern\n */\nexport async function findProjects(\n pattern: string | RegExp,\n options?: DiscoverOptions\n): Promise<Project[]> {\n const projects = await discover(options);\n const regex = typeof pattern === \"string\" ? new RegExp(pattern, \"i\") : pattern;\n return projects.filter((p) => regex.test(p.name) || regex.test(p.path));\n}\n\n/**\n * Get projects grouped by marker type\n */\nexport async function discoverByMarker(\n options?: DiscoverOptions\n): Promise<Map<string, Project[]>> {\n const projects = await discover(options);\n const grouped = new Map<string, Project[]>();\n\n for (const project of projects) {\n const existing = grouped.get(project.marker);\n if (existing) {\n existing.push(project);\n } else {\n grouped.set(project.marker, [project]);\n }\n }\n\n return grouped;\n}\n\n/**\n * Count projects by marker type\n */\nexport async function countByMarker(\n options?: DiscoverOptions\n): Promise<Map<string, number>> {\n const grouped = await discoverByMarker(options);\n const counts = new Map<string, number>();\n\n for (const [marker, projects] of grouped) {\n counts.set(marker, projects.length);\n }\n\n return counts;\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport * as yaml from \"yaml\";\n\nimport type { PjConfig } from \"./types.js\";\nimport { PjConfigError } from \"./types.js\";\nimport { getPjConfigPath } from \"../binary/constants.js\";\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG: PjConfig = {\n paths: [\n path.join(os.homedir(), \"projects\"),\n path.join(os.homedir(), \"code\"),\n path.join(os.homedir(), \"development\"),\n ],\n markers: [\n \".git\",\n \"go.mod\",\n \"package.json\",\n \"Cargo.toml\",\n \"pyproject.toml\",\n \"Makefile\",\n \"flake.nix\",\n \".vscode\",\n \".idea\",\n \".fleet\",\n \".project\",\n \".zed\",\n \"Dockerfile\",\n ],\n exclude: [\n \"node_modules\",\n \".terraform\",\n \"vendor\",\n \".git\",\n \"target\",\n \"dist\",\n \"build\",\n ],\n maxDepth: 3,\n cacheTTL: 300,\n noIgnore: false,\n noNested: false,\n icons: {\n \".git\": \"\\uf1d3 \", //\n \"package.json\": \"\\ue718 \", //\n \"go.mod\": \"\\ue626 \", //\n \"Cargo.toml\": \"\\ue7a8 \", //\n \"pyproject.toml\": \"\\ue73c \", //\n \".vscode\": \"\\ue70c \", //\n \".idea\": \"\\ue7b5 \", //\n Makefile: \"\\ue779 \", //\n Dockerfile: \"\\ue7b0\",\n },\n priorities: {\n \".git\": 1,\n \"go.mod\": 10,\n \"package.json\": 10,\n \"Cargo.toml\": 10,\n \"pyproject.toml\": 10,\n Makefile: 1,\n \"flake.nix\": 10,\n \".vscode\": 5,\n \".idea\": 5,\n \".fleet\": 5,\n \".project\": 5,\n \".zed\": 5,\n Dockerfile: 7,\n },\n};\n\n/**\n * Load pj configuration from file\n */\nexport async function loadConfig(configPath?: string): Promise<PjConfig> {\n const filePath = configPath ?? getPjConfigPath();\n\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const parsed = yaml.parse(content) as Partial<RawConfig>;\n return mergeConfig(parsed);\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n // Config file doesn't exist, return defaults\n return { ...DEFAULT_CONFIG };\n }\n throw new PjConfigError(\n `Failed to load config from ${filePath}`,\n error instanceof Error ? error : undefined\n );\n }\n}\n\n/**\n * Save configuration to file\n */\nexport async function saveConfig(\n config: Partial<PjConfig>,\n configPath?: string\n): Promise<void> {\n const filePath = configPath ?? getPjConfigPath();\n\n // Convert to raw format, only including defined properties\n const rawConfig: RawConfig = {};\n\n if (config.paths !== undefined) rawConfig.paths = config.paths;\n if (config.markers !== undefined) rawConfig.markers = config.markers;\n if (config.exclude !== undefined) rawConfig.exclude = config.exclude;\n if (config.maxDepth !== undefined) rawConfig.max_depth = config.maxDepth;\n if (config.cacheTTL !== undefined) rawConfig.cache_ttl = config.cacheTTL;\n if (config.noIgnore !== undefined) rawConfig.no_ignore = config.noIgnore;\n if (config.noNested !== undefined) rawConfig.no_nested = config.noNested;\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- support legacy format\n if (config.icons !== undefined) rawConfig.icons = config.icons;\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- support legacy format\n if (config.priorities !== undefined) rawConfig.priorities = config.priorities;\n\n const content = yaml.stringify(rawConfig, { indent: 2 });\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, content, \"utf-8\");\n}\n\n/**\n * Check if a config file exists\n */\nexport async function configExists(configPath?: string): Promise<boolean> {\n const filePath = configPath ?? getPjConfigPath();\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the default config path\n */\nexport function getConfigPath(): string {\n return getPjConfigPath();\n}\n\n/**\n * Raw marker config - can be a string or an object with marker, icon, and priority\n */\ntype RawMarker =\n | string\n | {\n marker: string;\n icon?: string;\n priority?: number;\n };\n\n/**\n * Raw config format as stored in YAML (snake_case)\n */\ninterface RawConfig {\n paths?: string[];\n markers?: RawMarker[];\n exclude?: string[];\n max_depth?: number;\n cache_ttl?: number;\n no_ignore?: boolean;\n no_nested?: boolean;\n /** @deprecated Use the new markers format with icon field instead */\n icons?: Record<string, string>;\n /** @deprecated Use the new markers format with priority field instead */\n priorities?: Record<string, number>;\n}\n\n/**\n * Parse raw markers into separate markers, icons, and priorities\n */\nfunction parseRawMarkers(rawMarkers: RawMarker[]): {\n markers: string[];\n icons: Record<string, string>;\n priorities: Record<string, number>;\n} {\n const markers: string[] = [];\n const icons: Record<string, string> = {};\n const priorities: Record<string, number> = {};\n\n for (const raw of rawMarkers) {\n if (typeof raw === \"string\") {\n markers.push(raw);\n } else {\n markers.push(raw.marker);\n if (raw.icon !== undefined) {\n icons[raw.marker] = raw.icon;\n }\n if (raw.priority !== undefined) {\n priorities[raw.marker] = raw.priority;\n }\n }\n }\n\n return { markers, icons, priorities };\n}\n\n/**\n * Merge raw config with defaults\n */\nfunction mergeConfig(raw: Partial<RawConfig>): PjConfig {\n // Parse markers from raw config if provided\n let markers = DEFAULT_CONFIG.markers;\n let parsedIcons: Record<string, string> = {};\n let parsedPriorities: Record<string, number> = {};\n\n if (raw.markers !== undefined) {\n const parsed = parseRawMarkers(raw.markers);\n markers = parsed.markers;\n parsedIcons = parsed.icons;\n parsedPriorities = parsed.priorities;\n }\n\n // Merge icons: defaults <- deprecated icons field <- new format icons\n const icons = {\n ...DEFAULT_CONFIG.icons,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- support legacy format\n ...(raw.icons ?? {}),\n ...parsedIcons,\n };\n\n // Merge priorities: defaults <- deprecated priorities field <- new format priorities\n const priorities = {\n ...DEFAULT_CONFIG.priorities,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- support legacy format\n ...(raw.priorities ?? {}),\n ...parsedPriorities,\n };\n\n return {\n paths: raw.paths ?? DEFAULT_CONFIG.paths,\n markers,\n exclude: raw.exclude ?? DEFAULT_CONFIG.exclude,\n maxDepth: raw.max_depth ?? DEFAULT_CONFIG.maxDepth,\n cacheTTL: raw.cache_ttl ?? DEFAULT_CONFIG.cacheTTL,\n noIgnore: raw.no_ignore ?? DEFAULT_CONFIG.noIgnore,\n noNested: raw.no_nested ?? DEFAULT_CONFIG.noNested,\n icons,\n priorities,\n };\n}\n\n/**\n * Expand ~ in paths to home directory\n */\nexport function expandPath(p: string): string {\n if (p.startsWith(\"~/\")) {\n return path.join(os.homedir(), p.slice(2));\n }\n if (p === \"~\") {\n return os.homedir();\n }\n return p;\n}\n\n/**\n * Expand all paths in config\n */\nexport function expandConfigPaths(config: PjConfig): PjConfig {\n return {\n ...config,\n paths: config.paths.map(expandPath),\n };\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nimport type { CacheInfo } from \"./types.js\";\nimport { getPjCacheDir } from \"../binary/constants.js\";\nimport { executePj } from \"../cli/executor.js\";\n\n/**\n * Clear the pj project cache\n */\nexport async function clearCache(): Promise<void> {\n await executePj([\"--clear-cache\"]);\n}\n\n/**\n * Get information about the pj cache\n */\nexport async function getCacheInfo(): Promise<CacheInfo> {\n const cacheDir = getPjCacheDir();\n\n try {\n const stats = await fs.stat(cacheDir);\n if (!stats.isDirectory()) {\n return {\n exists: false,\n path: cacheDir,\n fileCount: 0,\n totalSize: 0,\n };\n }\n\n const files = await fs.readdir(cacheDir);\n let totalSize = 0;\n let fileCount = 0;\n\n for (const file of files) {\n if (file.endsWith(\".json\")) {\n const filePath = path.join(cacheDir, file);\n const fileStats = await fs.stat(filePath);\n totalSize += fileStats.size;\n fileCount++;\n }\n }\n\n return {\n exists: true,\n path: cacheDir,\n fileCount,\n totalSize,\n };\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return {\n exists: false,\n path: cacheDir,\n fileCount: 0,\n totalSize: 0,\n };\n }\n throw error;\n }\n}\n\n/**\n * Get the cache directory path\n */\nexport function getCachePath(): string {\n return getPjCacheDir();\n}\n","import type {\n BinaryOptions,\n BinaryStatus,\n CacheInfo,\n DiscoverOptions,\n PjConfig,\n Project,\n} from \"./types.js\";\nimport {\n discover,\n discoverFromPaths,\n findProject,\n findProjects,\n discoverByMarker,\n countByMarker,\n} from \"./discover.js\";\nimport { loadConfig, saveConfig, DEFAULT_CONFIG } from \"./config.js\";\nimport { clearCache, getCacheInfo } from \"./cache.js\";\nimport { getBinaryManager } from \"../binary/manager.js\";\n\n/**\n * Main class for interacting with pj\n *\n * Provides a high-level API for project discovery, configuration management,\n * and binary management.\n *\n * @example\n * ```typescript\n * const pj = new Pj();\n *\n * // Discover all projects\n * const projects = await pj.discover();\n *\n * // Find a specific project\n * const myProject = await pj.findProject('my-app');\n *\n * // Search for projects\n * const reactProjects = await pj.findProjects(/react/i);\n * ```\n */\nexport class Pj {\n private config: PjConfig;\n\n /**\n * Create a new Pj instance\n *\n * @param config - Optional configuration overrides\n */\n constructor(config?: Partial<PjConfig>) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Discover all projects\n *\n * @param options - Discovery options\n * @returns Array of discovered projects\n */\n async discover(options?: DiscoverOptions): Promise<Project[]> {\n return discover(this.mergeOptions(options));\n }\n\n /**\n * Discover projects from specific paths\n *\n * Bypasses configured paths and searches only the provided paths.\n * Useful for integration with other tools.\n *\n * @param paths - Paths to search\n * @param options - Additional discovery options\n */\n async discoverFromPaths(\n paths: string[],\n options?: Omit<DiscoverOptions, \"paths\">\n ): Promise<Project[]> {\n return discoverFromPaths(paths, this.mergeOptions(options));\n }\n\n /**\n * Find a project by name\n *\n * @param name - Project name to find\n * @param options - Discovery options\n */\n async findProject(\n name: string,\n options?: DiscoverOptions\n ): Promise<Project | undefined> {\n return findProject(name, this.mergeOptions(options));\n }\n\n /**\n * Find projects matching a pattern\n *\n * @param pattern - String or regex pattern to match\n * @param options - Discovery options\n */\n async findProjects(\n pattern: string | RegExp,\n options?: DiscoverOptions\n ): Promise<Project[]> {\n return findProjects(pattern, this.mergeOptions(options));\n }\n\n /**\n * Get projects grouped by marker type\n *\n * @param options - Discovery options\n */\n async discoverByMarker(\n options?: DiscoverOptions\n ): Promise<Map<string, Project[]>> {\n return discoverByMarker(this.mergeOptions(options));\n }\n\n /**\n * Count projects by marker type\n *\n * @param options - Discovery options\n */\n async countByMarker(options?: DiscoverOptions): Promise<Map<string, number>> {\n return countByMarker(this.mergeOptions(options));\n }\n\n /**\n * Clear the pj project cache\n */\n async clearCache(): Promise<void> {\n return clearCache();\n }\n\n /**\n * Get information about the pj cache\n */\n async getCacheInfo(): Promise<CacheInfo> {\n return getCacheInfo();\n }\n\n /**\n * Load configuration from file\n *\n * @param configPath - Optional path to config file\n */\n async loadConfig(configPath?: string): Promise<PjConfig> {\n const loaded = await loadConfig(configPath);\n this.config = loaded;\n return loaded;\n }\n\n /**\n * Save configuration to file\n *\n * @param config - Configuration to save (uses current config if not provided)\n * @param configPath - Optional path to config file\n */\n async saveConfig(config?: Partial<PjConfig>, configPath?: string): Promise<void> {\n const toSave = config ? { ...this.config, ...config } : this.config;\n await saveConfig(toSave, configPath);\n }\n\n /**\n * Get current configuration\n */\n getConfig(): PjConfig {\n return { ...this.config };\n }\n\n /**\n * Update configuration\n *\n * @param config - Partial configuration to merge\n */\n setConfig(config: Partial<PjConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Ensure the pj binary is available\n *\n * Downloads the binary if not already installed.\n *\n * @param options - Binary options\n * @returns Path to the binary\n */\n async ensureBinary(options?: BinaryOptions): Promise<string> {\n const manager = getBinaryManager();\n return manager.getBinaryPath(options);\n }\n\n /**\n * Get the status of the pj binary\n */\n async getBinaryStatus(): Promise<BinaryStatus> {\n const manager = getBinaryManager();\n return manager.getStatus();\n }\n\n /**\n * Update the pj binary to the latest version\n *\n * @param options - Binary options\n * @returns Path to the updated binary\n */\n async updateBinary(options?: BinaryOptions): Promise<string> {\n const manager = getBinaryManager();\n return manager.updateBinary(options);\n }\n\n /**\n * Get the version of the pj binary\n */\n async getBinaryVersion(): Promise<string | null> {\n const manager = getBinaryManager();\n const status = await manager.getStatus();\n return status.version;\n }\n\n /**\n * Merge instance config with provided options\n */\n private mergeOptions(options?: DiscoverOptions): DiscoverOptions {\n const merged: DiscoverOptions = {\n paths: options?.paths ?? this.config.paths,\n markers: options?.markers ?? this.config.markers,\n excludes: options?.excludes ?? this.config.exclude,\n maxDepth: options?.maxDepth ?? this.config.maxDepth,\n noIgnore: options?.noIgnore ?? this.config.noIgnore,\n nested: options?.nested ?? !this.config.noNested,\n };\n\n // Only include optional properties if they have values\n if (options?.icons !== undefined) {\n merged.icons = options.icons;\n }\n if (options?.noCache !== undefined) {\n merged.noCache = options.noCache;\n }\n if (options?.configPath !== undefined) {\n merged.configPath = options.configPath;\n }\n if (options?.verbose !== undefined) {\n merged.verbose = options.verbose;\n }\n\n return merged;\n }\n}\n"]}
|