/**
 * Hook 命令构建 — 运行时动态解析 soloforge 可执行路径。
 *
 * 不再硬编码 PATH，而是：
 * 1. 解析当前 node 可执行文件所在目录（如 /opt/homebrew/bin）
 * 2. 解析 soloforge 实际绝对路径（通过 process.argv 或 which）
 * 3. 生成最小化的 PATH 前缀 + soloforge 绝对路径命令
 */
import path from "node:path";
import fs from "node:fs";
import { debug } from "../../engine/core/logger.js";
/** 已解析的 soloforge 可执行路径（单例缓存） */
let _resolvedSoloforgePath;
/**
 * 解析 soloforge 可执行文件的绝对路径。
 *
 * 策略优先级：
 * 1. process.argv[1] — 当前正在执行的脚本路径（最可靠）
 * 2. npm global bin 目录下的 soloforge
 * 3. 回退到 "soloforge"（依赖系统 PATH）
 */
function resolveSoloforgeBin() {
    if (_resolvedSoloforgePath)
        return _resolvedSoloforgePath;
    // 策略 1: 当前进程的 soloforge 入口脚本
    // 验证路径文件名为 soloforge 或 soloforge.js，避免在 vitest 等测试环境中
    // 将 worker 入口（如 tinypool）误判为 soloforge
    const argv1 = process.argv[1];
    if (argv1) {
        const resolved = path.resolve(argv1);
        const base = path.basename(resolved).replace(/\.js$/, "");
        if (fs.existsSync(resolved) && base === "soloforge") {
            _resolvedSoloforgePath = resolved;
            debug("Hook命令", `解析 soloforge 路径 (argv): ${resolved}`);
            return resolved;
        }
    }
    // 策略 2: node 所在目录下查找 soloforge
    const nodeDir = path.dirname(process.execPath);
    const candidates = [
        path.join(nodeDir, "soloforge"),
        path.join(nodeDir, "soloforge.js"),
    ];
    for (const candidate of candidates) {
        if (fs.existsSync(candidate)) {
            _resolvedSoloforgePath = candidate;
            debug("Hook命令", `解析 soloforge 路径 (node bin): ${candidate}`);
            return candidate;
        }
    }
    // 策略 3: 回退到系统 PATH 中的 soloforge
    _resolvedSoloforgePath = "soloforge";
    debug("Hook命令", "回退到系统 PATH 中的 soloforge");
    return "soloforge";
}
/**
 * 构建 hook 子命令字符串。
 *
 * 运行时动态解析路径，不再硬编码 /opt/homebrew/bin 等目录。
 * 生成格式：`env PATH="<nodeBinDir>:$PATH" <soloforgePath> <subcommand>`
 * 如果 soloforge 已在系统 PATH 中，则简化为直接调用。
 *
 * @param subcommand - soloforge 子命令（如 check-write）
 * @returns 可在 IDE hook 中执行的命令字符串
 */
export function hookCommand(subcommand) {
    const nodeBinDir = path.dirname(process.execPath);
    const soloforgeBin = resolveSoloforgeBin();
    // 如果 soloforge 解析为绝对路径，直接用绝对路径调用（无需 PATH 前缀）
    if (path.isAbsolute(soloforgeBin)) {
        // 判断是否需要通过 node 执行（.js 文件）
        if (soloforgeBin.endsWith(".js")) {
            return `env PATH="${nodeBinDir}:$PATH" node "${soloforgeBin}" ${subcommand}`;
        }
        return `env PATH="${nodeBinDir}:$PATH" "${soloforgeBin}" ${subcommand}`;
    }
    // 回退：soloforge 在系统 PATH 中，但仍需确保 node 可被找到
    return `env PATH="${nodeBinDir}:$PATH" soloforge ${subcommand}`;
}
//# sourceMappingURL=hook_command.js.map