/** * `remixmate install` / `remixmate uninstall` — 把包内 skills/ 铺进 agent 宿主。 * * 为什么需要一条命令,而不是让站点给出 `cp -R "$(npm root -g)/…/skills/." ~/.claude/skills/`: * * 1. 目标已经不止一个。Claude Code 与 Codex 现在用同一套 SKILL.md 格式 * (Codex 装到 $CODEX_HOME/skills/),手工 cp 的心智成本直接翻倍。 * 2. 拷贝出去的副本没有主人。`npm update -g` 之后包升了级、副本停在旧版; * `npm uninstall -g` 之后副本原地变成孤儿。两种都是静默的 —— 本项目作者机器上 * 就留着一批 5 月建的、指向早已不存在路径的 skill 目录,没有任何东西负责清理。 * * 所以这里的安装是**受管**的:每个宿主的 skills 目录下写一份装机回执 * (.remixmate-install.json),记下版本、来源与这次铺下去的 skill 名单。升级照名单 * 覆盖、卸载照名单删除、doctor 照名单比对版本 —— 三件事都不靠猜目录里哪些是我们的。 * * 刻意不做的两件事: * - 不挂 npm postinstall。`npm i -g` 时往 ~/.claude、~/.codex 写东西太越界, * 且 `--ignore-scripts` 下会静默失效。安装必须是用户显式发起的动作。 * - 不用软链。指向 $(npm root -g) 看着优雅,但 node 版本管理器一切换路径就变, * 全部断掉且极难排查。拷贝 + 回执 + doctor 漂移检查更稳。 */ export declare const INSTALL_VERB = "install"; export declare const UNINSTALL_VERB = "uninstall"; export type HostId = 'claude' | 'codex' | 'workbuddy' | 'codebuddy' | 'trae'; interface Host { id: HostId | 'custom'; label: string; /** skill 的父目录 —— 安装写到 //。 */ skillsDir: string; } /** 已检测到、且**有用户级位置**的宿主。 */ export declare function detectHosts(): Host[]; /** * 检测到了、但只能项目级安装的宿主(当前只有 Trae)。 * * 单独拎出来是为了别把它们**静默**跳过:用户装了 Trae 却在全局 install 的输出里 * 完全看不到它,只会以为这个 CLI 不支持 —— 正是这次 WorkBuddy 的翻车方式。 */ export declare function projectOnlyHosts(): HostId[]; export declare function packageVersion(): string; export declare function installUsage(): void; export declare function uninstallUsage(): void; export declare function runInstall(argv: string[]): number; export declare function runUninstall(argv: string[]): number; export interface InstallState { label: string; skillsDir: string; /** 回执里的版本;null = 该宿主下没有本 CLI 的安装。 */ installedVersion: string | null; /** 当前包的版本,供报告直接引用。 */ currentVersion: string; /** 回执版本与当前包版本不一致。 */ drifted: boolean; } /** * 供 doctor 使用:每个宿主的安装状态。 * * 漂移是这套方案唯一的静默失败模式 —— `npm update -g` 只动包,不动铺出去的副本, * 用户会拿着旧 SKILL.md 打新后端。doctor 是「为什么跑不起来」的统一入口,检查放这里。 */ export declare function installStates(): InstallState[]; export {};