Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Convert X (Twitter) tweets, threads, and articles to Markdown with YAML front matter via reverse-engineered API.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
scripts/paths.ts
1import { execSync } from "node:child_process";2import os from "node:os";3import path from "node:path";4import process from "node:process";56const APP_DATA_DIR = "baoyu-skills";7const X_TO_MARKDOWN_DATA_DIR = "x-to-markdown";8const COOKIE_FILE_NAME = "cookies.json";9const PROFILE_DIR_NAME = "chrome-profile";10const CONSENT_FILE_NAME = "consent.json";1112export function resolveUserDataRoot(): string {13if (process.platform === "win32") {14return process.env.APPDATA ?? path.join(os.homedir(), "AppData", "Roaming");15}16if (process.platform === "darwin") {17return path.join(os.homedir(), "Library", "Application Support");18}19return process.env.XDG_DATA_HOME ?? path.join(os.homedir(), ".local", "share");20}2122export function resolveXToMarkdownDataDir(): string {23const override = process.env.X_DATA_DIR?.trim();24if (override) return path.resolve(override);25return path.join(resolveUserDataRoot(), APP_DATA_DIR, X_TO_MARKDOWN_DATA_DIR);26}2728export function resolveXToMarkdownCookiePath(): string {29const override = process.env.X_COOKIE_PATH?.trim();30if (override) return path.resolve(override);31return path.join(resolveXToMarkdownDataDir(), COOKIE_FILE_NAME);32}3334let _wslHome: string | null | undefined;35function getWslWindowsHome(): string | null {36if (_wslHome !== undefined) return _wslHome;37if (!process.env.WSL_DISTRO_NAME) { _wslHome = null; return null; }38try {39const raw = execSync('cmd.exe /C "echo %USERPROFILE%"', { encoding: 'utf-8', timeout: 5000 }).trim().replace(/\r/g, '');40_wslHome = execSync(`wslpath -u "${raw}"`, { encoding: 'utf-8', timeout: 5000 }).trim() || null;41} catch { _wslHome = null; }42return _wslHome;43}4445export function resolveXToMarkdownChromeProfileDir(): string {46const override = process.env.BAOYU_CHROME_PROFILE_DIR?.trim() || process.env.X_CHROME_PROFILE_DIR?.trim();47if (override) return path.resolve(override);48const wslHome = getWslWindowsHome();49if (wslHome) return path.join(wslHome, ".local", "share", APP_DATA_DIR, PROFILE_DIR_NAME);50return path.join(resolveUserDataRoot(), APP_DATA_DIR, PROFILE_DIR_NAME);51}5253export function resolveXToMarkdownConsentPath(): string {54return path.join(resolveXToMarkdownDataDir(), CONSENT_FILE_NAME);55}56