{"version":3,"file":"messages-Gc4q6t6X.cjs","names":[],"sources":["../src/utils/exec.ts","../src/utils/auto-detect.ts","../src/utils/prompts.ts","../src/config/loader.ts","../src/stages/auth.ts","../src/stages/git.ts","../src/utils/package.ts","../src/i18n/translator.ts","../src/messages.ts"],"sourcesContent":["/**\n * 命令执行工具\n */\n\nimport { execSync } from \"child_process\";\n\nexport interface ExecOptions {\n    silent?: boolean;\n    cwd?: string;\n    encoding?: BufferEncoding;\n    /**\n     * 超时时间（毫秒）\n     * 如果未指定，则使用默认超时（30分钟）\n     * 设置为 0 表示无超时\n     */\n    timeout?: number;\n    /**\n     * 命令描述（用于错误报告）\n     */\n    description?: string;\n}\n\nconst DEFAULT_TIMEOUT = 30 * 60 * 1000; // 30 分钟\n\n/**\n * 执行命令（支持超时）\n */\nexport function exec(command: string, options: ExecOptions = {}): string {\n    const {\n        silent = false,\n        cwd = process.cwd(),\n        encoding = \"utf-8\",\n        timeout = DEFAULT_TIMEOUT,\n        description,\n    } = options;\n\n    try {\n        const execOptions: Parameters<typeof execSync>[1] = {\n            stdio: silent ? \"pipe\" : \"inherit\",\n            cwd,\n            encoding,\n        };\n\n        // 添加超时选项（Node.js 12.5.0+ 支持）\n        if (timeout > 0) {\n            execOptions.timeout = timeout;\n        }\n\n        return execSync(command, execOptions) as string;\n    } catch (error: unknown) {\n        const errorMessage = error instanceof Error ? error.message : String(error);\n        const context = buildErrorContext(command, cwd, description, timeout);\n        // 保留子进程 stderr/stdout（如 tsc、lint 等），便于诊断\n        const execErr = error as { stderr?: Buffer | string; stdout?: Buffer | string };\n        const stderrStr =\n            execErr.stderr != null\n                ? typeof execErr.stderr === \"string\"\n                    ? execErr.stderr.trim()\n                    : execErr.stderr.toString(\"utf-8\").trim()\n                : \"\";\n        const stdoutStr =\n            execErr.stdout != null\n                ? typeof execErr.stdout === \"string\"\n                    ? execErr.stdout.trim()\n                    : execErr.stdout.toString(\"utf-8\").trim()\n                : \"\";\n        const childOutput = [stderrStr, stdoutStr].filter(Boolean).join(\"\\n\");\n\n        // 检查是否是超时错误\n        if (errorMessage.includes(\"ETIMEDOUT\") || errorMessage.includes(\"timeout\")) {\n            throw new Error(\n                `命令执行超时（${timeout / 1000}秒）: ${context}\\n` +\n                    `命令可能已挂起，请检查：\\n` +\n                    `  1. 命令是否正确\\n` +\n                    `  2. 网络连接是否正常\\n` +\n                    `  3. 依赖服务是否可用\\n` +\n                    `  4. 是否需要交互式输入\\n` +\n                    `  5. 命令是否在等待用户输入`,\n            );\n        }\n\n        // 检查是否是命令未找到错误\n        if (\n            errorMessage.includes(\"ENOENT\") ||\n            errorMessage.includes(\"command not found\") ||\n            errorMessage.includes(\"不是内部或外部命令\")\n        ) {\n            throw new Error(\n                `命令未找到: ${context}\\n` +\n                    `请检查：\\n` +\n                    `  1. 命令是否正确安装\\n` +\n                    `  2. 命令是否在 PATH 中\\n` +\n                    `  3. 是否需要安装依赖`,\n            );\n        }\n\n        // 其他错误：附上子进程输出以便诊断（如 tsc 类型错误）\n        const withOutput = childOutput ? `\\n\\n命令输出:\\n${childOutput}` : \"\";\n        throw new Error(`命令执行失败: ${context}\\n错误: ${errorMessage}${withOutput}`);\n    }\n}\n\n/**\n * 构建错误上下文信息\n */\nfunction buildErrorContext(\n    command: string,\n    cwd: string,\n    description?: string,\n    timeout?: number,\n): string {\n    const parts: string[] = [];\n    if (description) {\n        parts.push(`[${description}]`);\n    }\n    parts.push(`命令: ${command}`);\n    parts.push(`工作目录: ${cwd}`);\n    if (timeout && timeout > 0) {\n        parts.push(`超时: ${timeout / 1000}秒`);\n    }\n    return parts.join(\" \");\n}\n\n/**\n * 静默执行命令\n */\nexport function execSilent(\n    command: string,\n    options: Omit<ExecOptions, \"silent\"> = {},\n): string | null {\n    try {\n        return execSync(command, {\n            stdio: \"pipe\",\n            cwd: options.cwd || process.cwd(),\n            encoding: options.encoding || \"utf-8\",\n        })\n            .toString()\n            .trim();\n    } catch {\n        return null;\n    }\n}\n","/**\n * 零配置自动检测工具\n */\n\nimport { existsSync, readFileSync, readdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { execSilent } from \"./exec\";\n\n/**\n * 检测包管理器\n * @returns 检测到的包管理器，如果无法检测则返回 null\n */\nexport function detectPackageManager(rootDir: string): \"npm\" | \"pnpm\" | \"yarn\" | null {\n    // 检测 packageManager 字段\n    const packageJsonPath = join(rootDir, \"package.json\");\n    if (existsSync(packageJsonPath)) {\n        try {\n            const pkg = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n            if (pkg.packageManager) {\n                if (pkg.packageManager.startsWith(\"pnpm\")) return \"pnpm\";\n                if (pkg.packageManager.startsWith(\"yarn\")) return \"yarn\";\n                if (pkg.packageManager.startsWith(\"npm\")) return \"npm\";\n            }\n        } catch {\n            // 忽略解析错误\n        }\n    }\n\n    // 检测 lockfile\n    if (existsSync(join(rootDir, \"pnpm-lock.yaml\"))) return \"pnpm\";\n    if (existsSync(join(rootDir, \"yarn.lock\"))) return \"yarn\";\n    if (existsSync(join(rootDir, \"package-lock.json\"))) return \"npm\";\n\n    return null; // 无法检测，需要用户选择\n}\n\n/**\n * 检测 workspace 类型\n */\nexport function detectWorkspace(rootDir: string): {\n    type: \"pnpm\" | \"yarn\" | \"npm\" | null;\n    configPath?: string;\n} {\n    // 检测 pnpm workspace\n    const pnpmWorkspacePath = join(rootDir, \"pnpm-workspace.yaml\");\n    if (existsSync(pnpmWorkspacePath)) {\n        return { type: \"pnpm\", configPath: \"pnpm-workspace.yaml\" };\n    }\n\n    // 检测 package.json workspaces\n    const packageJsonPath = join(rootDir, \"package.json\");\n    if (existsSync(packageJsonPath)) {\n        try {\n            const pkg = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n            if (pkg.workspaces) {\n                return { type: \"yarn\", configPath: \"package.json\" };\n            }\n        } catch {\n            // 忽略解析错误\n        }\n    }\n\n    return { type: null };\n}\n\n/**\n * 检测 changeset\n */\nexport function detectChangeset(rootDir: string): boolean {\n    return existsSync(join(rootDir, \".changeset\"));\n}\n\n/**\n * 检测 Turbo\n */\nexport function detectTurbo(rootDir: string): boolean {\n    return existsSync(join(rootDir, \"turbo.json\"));\n}\n\n/**\n * 检测 Nx\n */\nexport function detectNx(rootDir: string): boolean {\n    return existsSync(join(rootDir, \"nx.json\"));\n}\n\n/**\n * 检测 Git 分支\n */\nexport function detectGitBranch(): string | null {\n    return execSilent(\"git branch --show-current\");\n}\n\n/**\n * 检测是否有 changeset 文件\n */\nexport function hasChangesetFiles(rootDir: string): boolean {\n    const changesetDir = join(rootDir, \".changeset\");\n    if (!existsSync(changesetDir)) {\n        return false;\n    }\n\n    try {\n        const files = readdirSync(changesetDir);\n        // 排除 config.json 和 README.md\n        const changesetFiles = files.filter((f) => f.endsWith(\".md\") && f !== \"README.md\");\n        return changesetFiles.length > 0;\n    } catch {\n        return false;\n    }\n}\n","/**\n * 交互式提示工具（使用 inquirer）\n */\n\nimport inquirer from \"inquirer\";\n\n/**\n * 确认对话框\n */\nexport async function confirm(message: string, defaultValue = true): Promise<boolean> {\n    const { confirmed } = await inquirer.prompt([\n        {\n            type: \"confirm\",\n            name: \"confirmed\",\n            message,\n            default: defaultValue,\n        },\n    ]);\n    return confirmed;\n}\n\n/**\n * 选择列表\n */\nexport async function select<T = string>(\n    message: string,\n    options: Array<{ label: string; value: T }>,\n    defaultValue?: T,\n): Promise<T> {\n    const defaultIndex = defaultValue ? options.findIndex((opt) => opt.value === defaultValue) : 0;\n    const { selectedValue } = await inquirer.prompt([\n        {\n            type: \"rawlist\",\n            name: \"selectedValue\",\n            message,\n            choices: options.map((opt) => ({\n                name: opt.label,\n                value: opt.value,\n            })),\n            default: defaultIndex >= 0 ? defaultIndex + 1 : 1,\n            pageSize: 10,\n        },\n    ]);\n    return selectedValue;\n}\n","/**\n * 配置加载器\n * 支持多种配置文件格式和零配置自动推断\n */\n\nimport { readFileSync, existsSync } from \"fs\";\nimport { join } from \"path\";\nimport type { PublishConfig } from \"../types\";\nimport {\n    detectPackageManager,\n    detectWorkspace,\n    detectChangeset,\n    detectTurbo,\n    detectNx,\n    detectGitBranch,\n} from \"../utils/auto-detect\";\nimport { select } from \"../utils/prompts\";\n\n/**\n * 查找配置文件\n */\nexport function findConfigFile(rootDir: string): string | null {\n    const configNames = [\n        \"qingniao.config.ts\",\n        \"qingniao.config.mjs\",\n        \"qingniao.config.js\",\n        \"qingniao.config.json\",\n        \"publish.config.ts\",\n        \"publish.config.mjs\",\n        \"publish.config.js\",\n        \"publish.config.json\",\n    ];\n\n    for (const name of configNames) {\n        const path = join(rootDir, name);\n        if (existsSync(path)) {\n            return path;\n        }\n    }\n\n    return null;\n}\n\n/**\n * 从 package.json 加载配置\n */\nexport function loadConfigFromPackageJson(rootDir: string): Partial<PublishConfig> | null {\n    const packageJsonPath = join(rootDir, \"package.json\");\n    if (!existsSync(packageJsonPath)) {\n        return null;\n    }\n\n    try {\n        const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n        return packageJson.qingniao || null;\n    } catch {\n        return null;\n    }\n}\n\n/**\n * 自动检测并填充配置\n */\nasync function autoDetectConfig(rootDir: string): Promise<Partial<PublishConfig>> {\n    let packageManager = detectPackageManager(rootDir);\n\n    // 如果无法检测到包管理器，询问用户选择\n    if (!packageManager) {\n        packageManager = await select(\n            \"无法自动检测包管理器，请选择您使用的包管理器：\",\n            [\n                { label: \"pnpm\", value: \"pnpm\" as const },\n                { label: \"npm\", value: \"npm\" as const },\n                { label: \"yarn\", value: \"yarn\" as const },\n            ],\n            \"pnpm\", // 默认选择 pnpm\n        );\n    }\n\n    const workspace = detectWorkspace(rootDir);\n    const hasChangeset = detectChangeset(rootDir);\n    const hasTurbo = detectTurbo(rootDir);\n    const hasNx = detectNx(rootDir);\n    const gitBranch = detectGitBranch();\n\n    const config: Partial<PublishConfig> = {\n        project: {\n            packageManager,\n        },\n        git: {\n            branch: gitBranch || \"main\",\n            tagPrefix: \"v\",\n        },\n        version: {\n            strategy: hasChangeset ? \"changeset\" : \"manual\",\n            syncAll: true,\n            syncWorkspaceDeps: true,\n        },\n        build: {\n            useTurbo: hasTurbo && !hasNx, // 优先使用 Nx\n            useNx: hasNx,\n            turboTasks: hasTurbo && !hasNx ? [\"build\"] : undefined,\n            nxTargets: hasNx ? [\"build\"] : undefined,\n        },\n        workspace: workspace.type\n            ? {\n                  enabled: true,\n                  configPath: workspace.configPath,\n              }\n            : undefined,\n    };\n\n    if (hasChangeset) {\n        const pmCommand =\n            packageManager === \"pnpm\" ? \"pnpm\" : packageManager === \"yarn\" ? \"yarn\" : \"npm\";\n        config.changeset = {\n            enabled: true,\n            versionCommand: `${pmCommand} changeset version`,\n            publishCommand: `${pmCommand} changeset publish`,\n        };\n    }\n\n    return config;\n}\n\n/**\n * 深度合并配置\n */\nfunction deepMerge(\n    target: Record<string, unknown>,\n    source: Record<string, unknown>,\n): Record<string, unknown> {\n    const output = { ...target };\n    if (isObject(target) && isObject(source)) {\n        Object.keys(source).forEach((key) => {\n            const sourceValue = source[key];\n            if (isObject(sourceValue)) {\n                if (!(key in target)) {\n                    Object.assign(output, { [key]: sourceValue });\n                } else {\n                    const targetValue = target[key];\n                    if (isObject(targetValue) && isObject(sourceValue)) {\n                        output[key] = deepMerge(targetValue, sourceValue);\n                    } else {\n                        output[key] = sourceValue;\n                    }\n                }\n            } else {\n                Object.assign(output, { [key]: sourceValue });\n            }\n        });\n    }\n    return output;\n}\n\nfunction isObject(item: unknown): item is Record<string, unknown> {\n    return item !== null && typeof item === \"object\" && !Array.isArray(item);\n}\n\n/**\n * 加载配置文件\n */\nexport async function loadConfig(configPath?: string): Promise<PublishConfig> {\n    const rootDir = process.cwd();\n    let config: Partial<PublishConfig> = {};\n\n    // 1. 零配置自动检测（基础配置）\n    config = deepMerge(config, await autoDetectConfig(rootDir));\n\n    // 2. 从 package.json 加载配置（覆盖自动检测）\n    const packageConfig = loadConfigFromPackageJson(rootDir);\n    if (packageConfig) {\n        config = deepMerge(config, packageConfig);\n    }\n\n    // 3. 查找配置文件（覆盖 package.json）\n    const foundConfigPath = configPath || findConfigFile(rootDir);\n    if (foundConfigPath && existsSync(foundConfigPath)) {\n        try {\n            if (foundConfigPath.endsWith(\".json\")) {\n                const fileConfig = JSON.parse(readFileSync(foundConfigPath, \"utf-8\"));\n                config = deepMerge(config, fileConfig);\n            }\n            // TODO: 支持 .js/.mjs/.ts 配置文件\n        } catch (error) {\n            throw new Error(`无法加载配置文件 ${foundConfigPath}: ${error}`);\n        }\n    }\n\n    return config as PublishConfig;\n}\n","/**\n * NPM 认证检查\n */\n\nimport { execSilent } from \"../utils/exec\";\n\n/**\n * 检查 NPM 认证状态\n * 根据包管理器选择相应的认证检查命令\n */\nexport async function checkNpmAuth(\n    packageManager?: \"npm\" | \"pnpm\" | \"yarn\",\n): Promise<{ username: string; registry: string } | null> {\n    // 根据包管理器选择认证检查命令\n    const whoamiCommand =\n        packageManager === \"pnpm\"\n            ? \"pnpm whoami\"\n            : packageManager === \"yarn\"\n              ? \"yarn whoami\"\n              : \"npm whoami\";\n\n    const username = execSilent(whoamiCommand);\n    if (!username) {\n        return null;\n    }\n\n    // 根据包管理器选择 registry 检查命令\n    const registryCommand =\n        packageManager === \"pnpm\"\n            ? \"pnpm config get registry\"\n            : packageManager === \"yarn\"\n              ? \"yarn config get registry\"\n              : \"npm config get registry\";\n\n    const registry = execSilent(registryCommand) || \"https://registry.npmjs.org/\";\n\n    return {\n        username,\n        registry,\n    };\n}\n","/**\n * Git 状态检查\n */\n\nimport { execSilent, exec } from \"../utils/exec\";\n\n/**\n * 检查当前 Git 分支\n */\nexport function getCurrentBranch(): string | null {\n    return execSilent(\"git branch --show-current\");\n}\n\n/**\n * 检查是否有未提交的更改\n */\nexport function hasUncommittedChanges(): boolean {\n    const status = execSilent(\"git status --porcelain\");\n    return status !== null && status.length > 0;\n}\n\n/**\n * 检查是否有未推送的提交\n */\nexport function hasUnpushedCommits(branch = \"main\"): boolean {\n    execSilent(`git fetch origin ${branch} 2>/dev/null`);\n    const unpushed = execSilent(`git log origin/${branch}..HEAD 2>/dev/null`);\n    return unpushed !== null && unpushed.length > 0;\n}\n\n/**\n * 检查远程分支是否最新\n */\nexport function checkRemoteUpToDate(branch = \"main\"): {\n    isUpToDate: boolean;\n    localCommit: string | null;\n    remoteCommit: string | null;\n} {\n    execSilent(`git fetch origin ${branch} 2>/dev/null`);\n    const localCommit = execSilent(\"git rev-parse HEAD\");\n    const remoteCommit = execSilent(`git rev-parse origin/${branch} 2>/dev/null`);\n\n    return {\n        isUpToDate: !remoteCommit || localCommit === remoteCommit,\n        localCommit,\n        remoteCommit,\n    };\n}\n\n/**\n * 拉取远程更新\n */\nexport function pullRemoteUpdates(branch = \"main\"): void {\n    exec(`git pull origin ${branch} --rebase --no-edit`, { silent: true });\n}\n\n/**\n * 提交版本更新\n * @param version 版本号\n * @param message 提交消息\n * @param includeAllChanges 是否包含所有更改（包括格式化后的文件）\n */\nexport function commitVersionUpdate(\n    version: string,\n    message?: string,\n    includeAllChanges = false,\n): void {\n    const commitMessage = message || `chore: release v${version}\\n\\n[skip ci]`;\n\n    try {\n        if (includeAllChanges) {\n            // 格式化后，添加所有更改的文件\n            exec(\"git add -A\", { silent: true });\n        } else {\n            // 只添加版本相关的文件：根目录 package.json 和所有子包的 package.json\n            // 添加根目录 package.json\n            exec(\"git add package.json\", { silent: true });\n\n            // 使用 find 命令添加所有 packages 目录下的 package.json（包括嵌套目录）\n            // 这样可以确保找到所有嵌套的包，如 packages/@systembug/qingniao/package.json\n            exec(\"find packages -name package.json -type f -exec git add {} +\", { silent: true });\n\n            // 添加 CHANGELOG 和 changeset 文件\n            exec(\"git add CHANGELOG.md .changeset/\", { silent: true });\n        }\n    } catch {\n        // 可能没有需要添加的文件\n    }\n\n    const hasChanges = execSilent(\"git status --porcelain\");\n    if (hasChanges) {\n        exec(`git commit --no-verify -m \"${commitMessage}\"`, { silent: true });\n    }\n}\n\n/**\n * 创建 Git 标签\n */\nexport function createGitTag(version: string, tagPrefix = \"v\"): void {\n    const tag = `${tagPrefix}${version}`;\n    const tagExists = execSilent(`git rev-parse ${tag} 2>/dev/null`);\n\n    if (!tagExists) {\n        exec(`git tag -f -a ${tag} -m \"Release ${tag}\"`, { silent: true });\n    }\n}\n\n/**\n * 推送到远程仓库\n */\nexport function pushToRemote(branch = \"main\", followTags = true): void {\n    exec(`git push origin ${branch}`, { silent: true });\n    if (followTags) {\n        exec(\"git push --follow-tags\", { silent: true });\n    }\n}\n","/**\n * 包管理工具\n */\n\nimport { readFileSync, existsSync, readdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { execSilent } from \"./exec\";\nimport type { PackageInfo } from \"../types\";\n\n/**\n * 读取 package.json\n */\nexport function readPackageJson(path: string): Record<string, unknown> | null {\n    const packageJsonPath = join(path, \"package.json\");\n    if (!existsSync(packageJsonPath)) {\n        return null;\n    }\n\n    try {\n        return JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n    } catch {\n        return null;\n    }\n}\n\n/**\n * 发现所有包（使用 pnpm list，包括私有包）\n */\nexport async function discoverAllPackagesWithPnpm(_rootDir: string): Promise<PackageInfo[]> {\n    try {\n        const output = execSilent(\"pnpm list -r --depth -1 --json\");\n        if (!output) return [];\n\n        const packages: PackageInfo[] = [];\n        const list = JSON.parse(output);\n\n        // pnpm list 返回的是数组或对象，需要处理\n        const processItem = (item: Record<string, unknown>) => {\n            const itemName = typeof item.name === \"string\" ? item.name : undefined;\n            const itemPath = typeof item.path === \"string\" ? item.path : undefined;\n            if (itemName && itemPath) {\n                const pkgJson = readPackageJson(itemPath);\n                if (pkgJson) {\n                    const version = typeof pkgJson.version === \"string\" ? pkgJson.version : \"0.0.0\";\n                    const isPrivate =\n                        typeof pkgJson.private === \"boolean\" ? pkgJson.private : false;\n                    packages.push({\n                        name: itemName,\n                        version,\n                        path: itemPath,\n                        private: isPrivate,\n                    });\n                }\n            }\n        };\n\n        if (Array.isArray(list)) {\n            list.forEach(processItem);\n        } else if (list) {\n            processItem(list);\n        }\n\n        return packages;\n    } catch {\n        return [];\n    }\n}\n\n/**\n * 发现包（使用 pnpm list，仅可发布的包）\n * 同时验证包的发布配置\n */\nexport async function discoverPackagesWithPnpm(rootDir: string): Promise<PackageInfo[]> {\n    const allPackages = await discoverAllPackagesWithPnpm(rootDir);\n    // 过滤掉私有包，并验证发布配置\n    return allPackages.filter((pkg) => {\n        // 首先检查是否为私有包\n        if (pkg.private) {\n            return false;\n        }\n        // 验证发布配置\n        const validation = validatePackageForPublish(pkg.path);\n        return validation.valid;\n    });\n}\n\n/**\n * 发现所有包（使用模式匹配，包括私有包）\n */\nexport async function discoverAllPackagesWithPattern(\n    rootDir: string,\n    patterns: string[],\n): Promise<PackageInfo[]> {\n    const packages: PackageInfo[] = [];\n    const packagesDir = join(rootDir, \"packages\");\n\n    if (!existsSync(packagesDir)) {\n        return [];\n    }\n\n    const dirs = readdirSync(packagesDir, { withFileTypes: true });\n\n    for (const dir of dirs) {\n        if (dir.isDirectory()) {\n            const packagePath = join(packagesDir, dir.name);\n            const pkgJson = readPackageJson(packagePath);\n\n            if (pkgJson) {\n                const pkgName = typeof pkgJson.name === \"string\" ? pkgJson.name : undefined;\n                if (pkgName) {\n                    // 检查是否匹配模式\n                    const matches = patterns.some((pattern) => {\n                        // 简单的 glob 匹配\n                        const regex = new RegExp(\n                            pattern.replace(/\\*/g, \".*\").replace(/\\//g, \"\\\\/\"),\n                        );\n                        return regex.test(pkgName) || regex.test(packagePath);\n                    });\n\n                    if (matches || patterns.length === 0) {\n                        const version =\n                            typeof pkgJson.version === \"string\" ? pkgJson.version : \"0.0.0\";\n                        const isPrivate =\n                            typeof pkgJson.private === \"boolean\" ? pkgJson.private : false;\n                        packages.push({\n                            name: pkgName,\n                            version,\n                            path: packagePath,\n                            private: isPrivate,\n                        });\n                    }\n                }\n            }\n        }\n    }\n\n    return packages;\n}\n\n/**\n * 发现包（使用模式匹配，仅可发布的包）\n * 同时验证包的发布配置\n */\nexport async function discoverPackagesWithPattern(\n    rootDir: string,\n    patterns: string[],\n): Promise<PackageInfo[]> {\n    const allPackages = await discoverAllPackagesWithPattern(rootDir, patterns);\n    // 过滤掉私有包，并验证发布配置\n    return allPackages.filter((pkg) => {\n        // 首先检查是否为私有包\n        if (pkg.private) {\n            return false;\n        }\n        // 验证发布配置\n        const validation = validatePackageForPublish(pkg.path);\n        return validation.valid;\n    });\n}\n\n/**\n * 验证包是否可以发布\n * 检查：\n * 1. 不是私有包\n * 2. 对于 scoped packages，publishConfig.access 必须是 \"public\"\n */\nexport function validatePackageForPublish(pkgPath: string): {\n    valid: boolean;\n    errors: string[];\n    warnings: string[];\n} {\n    const errors: string[] = [];\n    const warnings: string[] = [];\n    const pkgJson = readPackageJson(pkgPath);\n\n    if (!pkgJson) {\n        return {\n            valid: false,\n            errors: [\"无法读取 package.json\"],\n            warnings: [],\n        };\n    }\n\n    // 检查是否为私有包\n    if (pkgJson.private === true) {\n        errors.push(\"包标记为私有 (private: true)\");\n    }\n\n    // 检查 scoped packages 的 publishConfig.access\n    const pkgName = typeof pkgJson.name === \"string\" ? pkgJson.name : undefined;\n    if (pkgName && pkgName.startsWith(\"@\")) {\n        const publishConfig =\n            pkgJson.publishConfig &&\n            typeof pkgJson.publishConfig === \"object\" &&\n            pkgJson.publishConfig !== null\n                ? (pkgJson.publishConfig as Record<string, unknown>)\n                : {};\n        const access = publishConfig.access;\n\n        if (access === undefined || access === null) {\n            warnings.push(\n                `Scoped package \"${pkgJson.name}\" 未设置 publishConfig.access，NPM 默认会使用 \"restricted\"（需要付费）。建议设置为 \"public\"`,\n            );\n        } else if (access !== \"public\") {\n            errors.push(\n                `Scoped package \"${pkgJson.name}\" 的 publishConfig.access 设置为 \"${access}\"，必须是 \"public\" 才能发布`,\n            );\n        }\n    }\n\n    return {\n        valid: errors.length === 0,\n        errors,\n        warnings,\n    };\n}\n","/**\n * 青鸟本地文案翻译（catalog 不共享，locale 解析用 tongyu）\n */\n\nimport { resolveLocale, type SupportedLocale } from \"@systembug/tongyu\";\n\nexport type MessageParams = Record<string, string | number>;\n\nexport type MessageCatalog<TKey extends string> = Record<SupportedLocale, Record<TKey, string>>;\n\nexport interface CreateTranslatorOptions {\n    env?: Record<string, string | undefined>;\n    overrideEnvKeys?: readonly string[];\n    locale?: SupportedLocale;\n}\n\n/** 将 `{key}` 替换为参数值 */\nexport function formatMessage(template: string, params: MessageParams = {}): string {\n    return Object.entries(params).reduce(\n        (message, [key, value]) => message.replaceAll(`{${key}}`, String(value)),\n        template,\n    );\n}\n\n/** 基于 catalog 创建 `t(key, params?)` */\nexport function createTranslator<TKey extends string>(\n    catalog: MessageCatalog<TKey>,\n    options: CreateTranslatorOptions = {},\n): (key: TKey, params?: MessageParams) => string {\n    return (key: TKey, params: MessageParams = {}): string => {\n        const locale =\n            options.locale ??\n            resolveLocale({\n                env: options.env,\n                overrideEnvKeys: options.overrideEnvKeys,\n            });\n\n        return formatMessage(catalog[locale][key], params);\n    };\n}\n\nexport type { SupportedLocale };\n","/**\n * 青鸟用户可见文案（OS locale；翻译在本包，locale 解析用 tongyu）\n */\n\nimport { createTranslator, type MessageCatalog, type SupportedLocale } from \"./i18n/translator.js\";\n\n/** 青鸟专属语言覆盖 env */\nexport const QINGNIAO_LOCALE_ENV = \"QINGNIAO_LANG\";\n\nexport type MessageKey =\n    | \"missingScript\"\n    | \"doctorFixHint\"\n    | \"noChangesetFilesSkip\"\n    | \"releaseFailed\"\n    | \"doctorFailed\"\n    | \"formatCheckMissingScript\"\n    | \"formatCheckFailed\"\n    | \"lintFailed\"\n    | \"typecheckFailed\"\n    | \"testFailed\"\n    | \"formatFailed\"\n    | \"buildPreLintFailed\"\n    | \"rootPackageJsonMissing\"\n    | \"doctorTitle\"\n    | \"doctorFixedCount\"\n    | \"doctorSummary\"\n    | \"doctorConsoleTitle\"\n    | \"doctorConsoleFixed\"\n    | \"npmLoggedIn\"\n    | \"npmRegistry\"\n    | \"npmRegistryHint\"\n    | \"npmNotLoggedIn\"\n    | \"npmLoginHint\"\n    | \"gitNotRepo\"\n    | \"gitBranch\"\n    | \"gitDirty\"\n    | \"gitDirtyHint\"\n    | \"gitClean\"\n    | \"gitUnpushed\"\n    | \"gitUnpushedHint\"\n    | \"workspaceDetected\"\n    | \"workspaceMissing\"\n    | \"packagesNone\"\n    | \"packagesCount\"\n    | \"scriptLintMissing\"\n    | \"scriptLintOk\"\n    | \"scriptFormatMissing\"\n    | \"scriptFormatOk\"\n    | \"scriptFormatCheckMissing\"\n    | \"scriptFormatCheckOk\"\n    | \"scriptTypecheckMissing\"\n    | \"scriptTypecheckOk\"\n    | \"scriptTestMissing\"\n    | \"scriptTestOk\"\n    | \"scriptBuildMissing\"\n    | \"scriptBuildOk\"\n    | \"scriptReleaseMissing\"\n    | \"scriptReleaseOk\"\n    | \"changesetDirOk\"\n    | \"changesetPendingNone\"\n    | \"changesetPendingHint\"\n    | \"changesetPendingOk\"\n    | \"changesetDirMissing\"\n    | \"depChangesetsMissing\"\n    | \"depChangesetsHint\"\n    | \"depChangesetsOk\"\n    | \"configMissing\"\n    | \"configOk\";\n\nconst QINGNIAO_CATALOG: MessageCatalog<MessageKey> = {\n    en: {\n        missingScript:\n            'Missing npm script \"{script}\". Add it to root package.json scripts, or run: qingniao doctor --fix',\n        doctorFixHint: \"qingniao doctor --fix\",\n        noChangesetFilesSkip:\n            \"No pending changeset files; skipping version bump and publishing current versions\",\n        releaseFailed: \"Release failed: {message}\",\n        doctorFailed: \"Doctor failed: {message}\",\n        formatCheckMissingScript: 'Missing \"format:check\" script. Run: qingniao doctor --fix',\n        formatCheckFailed: \"Format check failed\",\n        lintFailed: \"Lint failed\",\n        typecheckFailed: \"TypeScript type check failed\",\n        testFailed: \"Tests failed\",\n        formatFailed: \"Format failed\",\n        buildPreLintFailed: \"Pre-lint build failed for {package}\",\n        rootPackageJsonMissing: \"Root package.json not found\",\n        doctorTitle: \"Qingniao Doctor\",\n        doctorFixedCount: \"Auto-fixed {count} item(s)\",\n        doctorSummary: \"Result: {errors} error(s), {warns} warning(s), {total} check(s)\",\n        doctorConsoleTitle: \"Qingniao Doctor\",\n        doctorConsoleFixed: \"Auto-fixed {count} item(s)\",\n        npmLoggedIn: \"Logged in: {username}\",\n        npmRegistry: \"Current registry: {registry}\",\n        npmRegistryHint: \"Confirm this is the intended registry\",\n        npmNotLoggedIn: \"Not logged in to NPM\",\n        npmLoginHint: \"Run: {pm} login\",\n        gitNotRepo: \"Not inside a git repository\",\n        gitBranch: \"Current branch: {branch}\",\n        gitDirty: \"Uncommitted changes detected\",\n        gitDirtyHint: \"Commit or stash before publishing\",\n        gitClean: \"Working tree clean\",\n        gitUnpushed: \"Unpushed commits detected\",\n        gitUnpushedHint: \"Push before publishing\",\n        workspaceDetected: \"Detected: {type}\",\n        workspaceMissing: \"No workspace configuration detected\",\n        packagesNone: \"No publishable public packages found\",\n        packagesCount: \"Publishable packages: {count}\",\n        scriptLintMissing: 'Missing \"lint\" script',\n        scriptLintOk: \"lint script configured\",\n        scriptFormatMissing: 'Missing \"format\" script',\n        scriptFormatOk: \"format script configured\",\n        scriptFormatCheckMissing: 'Missing \"format:check\" script',\n        scriptFormatCheckOk: \"format:check script configured\",\n        scriptTypecheckMissing: 'Missing \"typecheck\" script',\n        scriptTypecheckOk: \"typecheck script configured\",\n        scriptTestMissing: 'Missing \"test\" script',\n        scriptTestOk: \"test script configured\",\n        scriptBuildMissing: 'Missing \"build\" script',\n        scriptBuildOk: \"build script configured\",\n        scriptReleaseMissing: 'Missing \"{script}\" script',\n        scriptReleaseOk: \"release script configured\",\n        changesetDirOk: \".changeset directory exists\",\n        changesetPendingNone: \"No pending changeset files\",\n        changesetPendingHint: \"Run: pnpm changeset\",\n        changesetPendingOk: \"Pending changesets found\",\n        changesetDirMissing: \"Missing .changeset directory\",\n        depChangesetsMissing: \"@changesets/cli not installed\",\n        depChangesetsHint: \"{pm} add -D @changesets/cli\",\n        depChangesetsOk: \"@changesets/cli installed\",\n        configMissing: \"Missing qingniao.config.json (optional)\",\n        configOk: \"qingniao.config.json exists\",\n    },\n    zh: {\n        missingScript:\n            '缺少 npm 脚本 \"{script}\"。请在根目录 package.json 的 scripts 中添加该命令，或运行: qingniao doctor --fix',\n        doctorFixHint: \"qingniao doctor --fix\",\n        noChangesetFilesSkip: \"未找到 changeset 文件，跳过版本更新，将使用当前版本发布\",\n        releaseFailed: \"发布失败: {message}\",\n        doctorFailed: \"Doctor 失败: {message}\",\n        formatCheckMissingScript: '缺少 \"format:check\" 脚本。请运行: qingniao doctor --fix',\n        formatCheckFailed: \"代码格式检查失败\",\n        lintFailed: \"lint 失败\",\n        typecheckFailed: \"TypeScript 类型检查失败\",\n        testFailed: \"测试失败\",\n        formatFailed: \"格式化代码失败\",\n        buildPreLintFailed: \"构建 {package}（lint 依赖）失败\",\n        rootPackageJsonMissing: \"未找到根目录 package.json\",\n        doctorTitle: \"青鸟 Doctor\",\n        doctorFixedCount: \"已自动修复 {count} 项\",\n        doctorSummary: \"结果: {errors} 错误, {warns} 警告, {total} 项\",\n        doctorConsoleTitle: \"青鸟 Doctor\",\n        doctorConsoleFixed: \"已自动修复 {count} 项\",\n        npmLoggedIn: \"已登录: {username}\",\n        npmRegistry: \"当前 registry: {registry}\",\n        npmRegistryHint: \"确认是否为预期源\",\n        npmNotLoggedIn: \"未登录 NPM\",\n        npmLoginHint: \"运行: {pm} login\",\n        gitNotRepo: \"不在 git 仓库中\",\n        gitBranch: \"当前分支: {branch}\",\n        gitDirty: \"存在未提交更改\",\n        gitDirtyHint: \"发布前请先 commit 或 stash\",\n        gitClean: \"工作区干净\",\n        gitUnpushed: \"存在未推送提交\",\n        gitUnpushedHint: \"发布前请 push\",\n        workspaceDetected: \"已检测: {type}\",\n        workspaceMissing: \"未检测到 workspace 配置\",\n        packagesNone: \"未找到可发布的公共包\",\n        packagesCount: \"可发布包: {count} 个\",\n        scriptLintMissing: '缺少 \"lint\" 脚本',\n        scriptLintOk: \"lint 脚本已配置\",\n        scriptFormatMissing: '缺少 \"format\" 脚本',\n        scriptFormatOk: \"format 脚本已配置\",\n        scriptFormatCheckMissing: '缺少 \"format:check\" 脚本',\n        scriptFormatCheckOk: \"format:check 脚本已配置\",\n        scriptTypecheckMissing: '缺少 \"typecheck\" 脚本',\n        scriptTypecheckOk: \"typecheck 脚本已配置\",\n        scriptTestMissing: '缺少 \"test\" 脚本',\n        scriptTestOk: \"test 脚本已配置\",\n        scriptBuildMissing: '缺少 \"build\" 脚本',\n        scriptBuildOk: \"build 脚本已配置\",\n        scriptReleaseMissing: '缺少 \"{script}\" 脚本',\n        scriptReleaseOk: \"release 脚本已配置\",\n        changesetDirOk: \".changeset 已存在\",\n        changesetPendingNone: \"无待发布 changeset 文件\",\n        changesetPendingHint: \"运行: pnpm changeset\",\n        changesetPendingOk: \"存在待消费 changeset\",\n        changesetDirMissing: \"缺少 .changeset 目录\",\n        depChangesetsMissing: \"未安装 @changesets/cli\",\n        depChangesetsHint: \"{pm} add -D @changesets/cli\",\n        depChangesetsOk: \"@changesets/cli 已安装\",\n        configMissing: \"缺少 qingniao.config.json（可选）\",\n        configOk: \"qingniao.config.json 已存在\",\n    },\n};\n\n/** 青鸟翻译函数（尊重 OS locale） */\nexport const t = createTranslator(QINGNIAO_CATALOG, {\n    overrideEnvKeys: [QINGNIAO_LOCALE_ENV],\n});\n\nexport type { SupportedLocale };\n"],"mappings":"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"}