diff --git a/README.md b/README.md index d5e814a..c112dae 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,8 @@ pnpm run self-test pnpm run cleanup-history -- --dry-run ``` +如果本机 Node/npm/pnpm 版本不对,先执行 `nvm ls` 查看已安装版本,再用 `nvm use ` 切换到目标版本;不要先扫盘找 `node.exe` 路径。 + ## MCP 客户端配置 把下面配置加入支持 stdio MCP 的客户端配置里: @@ -35,7 +37,11 @@ pnpm run cleanup-history -- --dry-run "mcpServers": { "ktWorkflow": { "command": "node", - "args": ["D:/MyFiles/KT/mcp/ktWorkflow/src/server.mjs"], + "args": [ + "--import", + "file:///D:/MyFiles/KT/mcp/ktWorkflow/node_modules/tsx/dist/loader.mjs", + "D:/MyFiles/KT/mcp/ktWorkflow/src/server.ts" + ], "env": { "KT_WORKSPACE_ROOT": "D:/MyFiles/KT" } @@ -78,8 +84,8 @@ pnpm run cleanup-history -- --dry-run ## 开发说明 - 主入口是 `src/server.ts`,工具入参类型集中在 `src/types.ts`。 -- `src/server.mjs` 只做兼容启动,保留给 MCP 客户端继续使用原来的 `node .../src/server.mjs` 配置。 -- 如果本机默认 `node` 不是 20+,可通过 `KT_WORKFLOW_NODE` 指定 Node 22 路径。 +- MCP 客户端直接通过 `node --import tsx loader` 启动 TS 入口,不再保留旧的 `src/server.mjs`。 +- Node/npm/pnpm 版本异常时优先走 `nvm ls` + `nvm use`,不要用扫盘路径作为第一选择。 ## 使用建议 diff --git a/config/codex.example.json b/config/codex.example.json index 24373b2..36a3b0c 100644 --- a/config/codex.example.json +++ b/config/codex.example.json @@ -2,7 +2,11 @@ "mcpServers": { "ktWorkflow": { "command": "node", - "args": ["D:/MyFiles/KT/mcp/ktWorkflow/src/server.mjs"], + "args": [ + "--import", + "file:///D:/MyFiles/KT/mcp/ktWorkflow/node_modules/tsx/dist/loader.mjs", + "D:/MyFiles/KT/mcp/ktWorkflow/src/server.ts" + ], "env": { "KT_WORKSPACE_ROOT": "D:/MyFiles/KT" } diff --git a/package.json b/package.json index b94a619..29ec1f5 100644 --- a/package.json +++ b/package.json @@ -4,13 +4,10 @@ "private": true, "type": "module", "description": "Reusable MCP workflow tools for the KT workspace.", - "bin": { - "kt-workflow-mcp": "src/server.mjs" - }, "scripts": { - "cleanup-history": "node src/server.mjs --cleanup-history", - "self-test": "node src/server.mjs --self-test", - "start": "node src/server.mjs", + "cleanup-history": "node --import ./node_modules/tsx/dist/loader.mjs src/server.ts --cleanup-history", + "self-test": "node --import ./node_modules/tsx/dist/loader.mjs src/server.ts --self-test", + "start": "node --import ./node_modules/tsx/dist/loader.mjs src/server.ts", "typecheck": "tsc --noEmit" }, "dependencies": { diff --git a/src/server.mjs b/src/server.mjs deleted file mode 100644 index 61eca8d..0000000 --- a/src/server.mjs +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env node -import { spawnSync } from 'node:child_process'; -import { existsSync } from 'node:fs'; -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; - -const dirname = path.dirname(fileURLToPath(import.meta.url)); -const serverEntry = path.join(dirname, 'server.ts'); -const minimumNodeMajor = 20; - -function getNodeMajor() { - return Number.parseInt(process.versions.node.split('.')[0] || '0', 10); -} - -function getNodeBinary() { - if (process.env.KT_WORKFLOW_NODE && existsSync(process.env.KT_WORKFLOW_NODE)) { - return process.env.KT_WORKFLOW_NODE; - } - - if (getNodeMajor() >= minimumNodeMajor) { - return process.execPath; - } - - const candidates = [ - 'C:\\Program Files (x86)\\nvm\\v22.14.0\\node.exe', - 'C:\\Program Files\\nodejs\\node.exe', - ]; - - return candidates.find((candidate) => existsSync(candidate)) || process.execPath; -} - -const result = spawnSync( - getNodeBinary(), - ['--import', 'tsx', serverEntry, ...process.argv.slice(2)], - { - env: process.env, - stdio: 'inherit', - windowsHide: true, - }, -); - -process.exit(result.status ?? 1); diff --git a/src/server.ts b/src/server.ts index d3d688d..4c697b2 100644 --- a/src/server.ts +++ b/src/server.ts @@ -582,7 +582,7 @@ function listHistoryEntries(rootPath: string, preservedNames: Set): Hist name: item.name, path: entryPath, relativePath: toPosix(path.relative(workspaceRoot, entryPath)), - type: item.isDirectory() ? ('directory' as const) : ('file' as const), + type: item.isDirectory() ? ('directory' as const) : ('file' as const), }; }) .sort((a, b) => b.mtimeMs - a.mtimeMs);