Skip to content

[Bug]: 插件在 Windows 环境下无法激活 (spawn ENOENT/EINVAL/UNKNOWN) #8

Description

@Luke-Gold

问题描述:
该插件在 Windows 环境下无法激活。在尝试启动 OpenSpec CLI(通常是 .cmd 脚本文件)时,由于 child_process.spawn 缺少 shell: true 参数,导致 Windows 无法正确执行批处理文件,从而抛出 EINVAL、UNKNOWN 或 ENOENT 错误。

复现步骤:

  1. 在 Windows 上全局安装 @fission-ai/openspec。
  2. 在 CodeBuddy/VSCode 中安装此插件。
  3. 插件无法激活,并在日志中显示错误。

错误日志:

[2026-06-10T03:17:52.794Z] [INFO] OpenSpec extension is activating... (locale: zh-cn)
[2026-06-10T03:17:53.086Z] [INFO] [archived] OpenSpec workspace root resolved: d:\Home\Develop\SourceCode\Python\CreateAbility\Zabbix\Zabbix_AI_assistant (folder: Zabbix_AI_assistant)
[2026-06-10T03:17:53.086Z] [INFO] [archived] activate: using workspaceRoot=d:\Home\Develop\SourceCode\Python\CreateAbility\Zabbix\Zabbix_AI_assistant
[2026-06-10T03:17:53.089Z] [ERROR] OpenSpec CLI resolution failed. openspec.cliPath="C:\Users\aliba\AppData\Roaming\npm\openspec.cmd" | process.env.PATH=D:\Home\Develop\DevTools\miniconda3\condabin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;D:\Home\Develop\DevTools\Python3\Scripts\;D:\Home\Develop\DevTools\Python3\;%PyCharm%;D:\Home\Develop\DevTools\Git\cmd;D:\Home\Develop\DevTools\MySQL\MySQL_Server8.0\bin;D:\Home\Develop\DevTools\MVS\2022\BuildTools\VC\Tools\MSVC\14.44.35207\bin\Hostx64\x64;C:\Program Files\Sniffnet\;C:\Program Files (x86)\SquirrelVPN\;C:\Program Files\Docker\Docker\resources\bin;C:\Program Files (x86)\SysinternalsSuite;C:\Program Files\Go\bin;C:\Program Files\nodejs\;D:\Home\Develop\DevTools\Python3\Scripts\;D:\Home\Develop\DevTools\Python3\;C:\Users\aliba\AppData\Local\Microsoft\WindowsApps;D:\Home\Develop\DevTools\PyCharm\bin;;D:\Home\Develop\DevTools\VSCode\bin;C:\Users\aliba\go\bin;C:\Users\aliba\AppData\Roaming\npm;D:\Home\Develop\DevTools\miniconda3\envs\github_py312\Scripts;C:\Users\aliba\AppData\Local\Programs\CodeBuddy CN\bin | process.env.SHELL=<unset> | configured path: failed ("C:\Users\aliba\AppData\Roaming\npm\openspec.cmd") spawn "C:\Users\aliba\AppData\Roaming\npm\openspec.cmd" ENOENT
[2026-06-10T03:17:53.090Z] [ERROR] OpenSpec CLI not available: Configured OpenSpec CLI path is invalid: "C:\Users\aliba\AppData\Roaming\npm\openspec.cmd"
OpenSpecCliResolutionError: Configured OpenSpec CLI path is invalid: "C:\Users\aliba\AppData\Roaming\npm\openspec.cmd"
    at OpenSpecCliResolver.resolve (c:\Users\aliba\.codebuddycn\extensions\randysss.openspec-workflow-0.1.4-universal\src\extension\services\openspecCliResolver.ts:67:13)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
[2026-06-10T03:17:53.148Z] [ERROR] Failed to activate OpenSpec extension: OpenSpec CLI not available
Error: OpenSpec CLI not available
    at DataManager.initialize (c:\Users\aliba\.codebuddycn\extensions\randysss.openspec-workflow-0.1.4-universal\src\extension\services\dataManager.ts:74:13)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at activate (c:\Users\aliba\.codebuddycn\extensions\randysss.openspec-workflow-0.1.4-universal\src\extension\extension.ts:29:5)
    at Bw._activate (file:///c:/Users/aliba/AppData/Local/Programs/CodeBuddy%20CN/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:119:16269)
    at Bw._waitForDepsThenActivate (file:///c:/Users/aliba/AppData/Local/Programs/CodeBuddy%20CN/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:119:16211)
    at Bw._initialize (file:///c:/Users/aliba/AppData/Local/Programs/CodeBuddy%20CN/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:119:15574)

技术分析:

  1. 缺少 shell: true: 在 Windows 上,使用 spawn 执行 .cmd 或 .bat 文件时,必须开启 shell: true 选项,否则无法解析批处理命令。插件目前的实现缺少这一适配。
  2. 缺少文件扩展名自动补全: 在 OpenSpecCliResolver 逻辑中,如果用户未配置路径,插件默认查找 openspec 而非 Windows 下的 openspec.cmd。

建议修复方案:
我已在本地验证了以下修改可以解决此问题:

  1. 修改 src/extension/services/openspecCliResolver.ts:在 spawnAndCollect 方法中,为 spawn 添加 Windows 平台的 shell 支持:
const proc = child_process.spawn(command, args, {
  cwd: this.cwd,
  env: env10,
  shell: process.platform === "win32" // 关键修改
});
  1. 在路径解析逻辑中增加自动补全:在 Windows 下,若检测到路径为空,应优先指向 openspec.cmd:
if (process.platform === "win32" && (!p || p === "openspec")) {
  p = "openspec.cmd";
}

总结:
上述修改能确保插件在 Windows 系统下正确调用 CLI,且不会破坏 Unix/Mac 系统的兼容性。

附:我的修复方案代码片段

为了方便开发者核对,我整理了我在 extension.js 中定位到的关键修复逻辑。如果你在 src/extension/services/openspecCliResolver.ts 中直接修改,逻辑如下:

1. spawnAndCollect 方法中的进程执行修复:
我们需要在 spawn 参数中增加 { shell: process.platform === "win32" },以支持 Windows 下的 .cmd 执行。

// 修改前
const proc = child_process.spawn(command, args, {
  cwd: this.cwd,
  env: env10
});

// 修改后
const proc = child_process.spawn(command, args, {
  cwd: this.cwd,
  env: env10,
  shell: process.platform === "win32" // 核心修复:解决 Windows 下无法运行 .cmd 的问题
});

2. 路径检测的兼容性补全:
在 getConfiguredPath 方法中,自动处理 Windows 下未指定后缀的情况。

// 修改前
let p = (vscode.workspace.getConfiguration("openspec").get("cliPath") ?? "").trim();

// 修改后
let p = (vscode.workspace.getConfiguration("openspec").get("cliPath") ?? "").trim();
if (process.platform === "win32" && (!p || p === "openspec")) {
  p = "openspec.cmd"; // 自动补全后缀
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions