arkts-lsp-proxy 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +74 -13
- package/dist/arkts-client.d.ts +43 -0
- package/dist/arkts-client.d.ts.map +1 -0
- package/dist/arkts-client.js +213 -0
- package/dist/arkts-client.js.map +1 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +14 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp-tools.d.ts +16 -0
- package/dist/mcp-tools.d.ts.map +1 -0
- package/dist/mcp-tools.js +160 -0
- package/dist/mcp-tools.js.map +1 -0
- package/dist/mcp.d.ts +38 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +249 -0
- package/dist/mcp.js.map +1 -0
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +52 -2
- package/dist/proxy.js.map +1 -1
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +5 -1
- package/dist/symbols.js.map +1 -1
- package/package.json +8 -5
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ArkTS LSP Proxy
|
|
2
2
|
|
|
3
|
-
将 DevEco Studio 内置的 ArkTS 语言服务器(ace-server)桥接出来,让 Claude Code 等支持 LSP 的工具获得 ArkTS
|
|
3
|
+
将 DevEco Studio 内置的 ArkTS 语言服务器(ace-server)桥接出来,让 Claude Code 等支持 LSP 的工具获得 ArkTS 语言智能;同时提供 Codex MCP 适配器,让 Codex 通过工具调用使用 ArkTS hover、definition、symbols 和 diagnostics。
|
|
4
4
|
|
|
5
5
|
## 解决什么问题
|
|
6
6
|
|
|
@@ -35,7 +35,21 @@ arkts-lsp-proxy (Node.js 进程)
|
|
|
35
35
|
└── @Component/@State/@Prop 语义理解
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
Codex 侧不使用 Claude Code 的 `.lsp.json` 自动激活模型,而是通过 `arkts-lsp-mcp` 启动 MCP server:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
Codex
|
|
42
|
+
│ MCP stdio (JSON-RPC lines)
|
|
43
|
+
▼
|
|
44
|
+
arkts-lsp-mcp
|
|
45
|
+
├── 轻量工具:project_info / document_symbols / workspace_symbols
|
|
46
|
+
└── LSP-backed 工具:hover / definition / references / signature_help / diagnostics
|
|
47
|
+
│
|
|
48
|
+
▼
|
|
49
|
+
arkts-lsp-proxy → ace-server
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
代理不实现 ArkTS 语义分析,只做启动适配、消息转发、参数注入和必要的 LSP 结果归一化。比如 DevEco ace-server 会把 hover 内容包成私有 JSON 字符串,代理会转换成标准 Markdown hover,方便 Claude Code 或 Codex 直接消费类型信息。DevEco ace-server 未提供的 symbol 能力由 proxy/MCP 做轻量 fallback。
|
|
39
53
|
|
|
40
54
|
## 当前支持的核心能力
|
|
41
55
|
|
|
@@ -47,6 +61,7 @@ arkts-lsp-proxy (Node.js 进程)
|
|
|
47
61
|
- `textDocument/documentSymbol`,基于打开文件文本解析 ArkTS/ArkUI 文件结构
|
|
48
62
|
- `workspace/symbol`,基于项目根轻量扫描 `.ets/.ts/.d.ets/.d.ts`
|
|
49
63
|
- diagnostics,来自 ace-server 的发布诊断
|
|
64
|
+
- Codex MCP tools:`arkts_project_info`、`arkts_document_symbols`、`arkts_workspace_symbols`、`arkts_hover`、`arkts_definition`、`arkts_references`、`arkts_signature_help`、`arkts_diagnostics`
|
|
50
65
|
|
|
51
66
|
## 前置条件
|
|
52
67
|
|
|
@@ -65,6 +80,30 @@ arkts-lsp-proxy (Node.js 进程)
|
|
|
65
80
|
/plugin install arkts-lsp
|
|
66
81
|
```
|
|
67
82
|
|
|
83
|
+
### Codex 插件(MCP)
|
|
84
|
+
|
|
85
|
+
本仓库提供 Codex 插件清单:
|
|
86
|
+
|
|
87
|
+
```text
|
|
88
|
+
.agents/plugins/marketplace.json
|
|
89
|
+
plugins/arkts-codex/
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Codex 插件通过 `.mcp.json` 使用 npm 包里的 `arkts-lsp-mcp`:
|
|
93
|
+
|
|
94
|
+
```json
|
|
95
|
+
{
|
|
96
|
+
"mcpServers": {
|
|
97
|
+
"arkts-lsp": {
|
|
98
|
+
"command": "npx",
|
|
99
|
+
"args": ["-y", "--package", "arkts-lsp-proxy@latest", "arkts-lsp-mcp"]
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
插件同时包含一个很薄的 `arkts` skill,用于提示 Codex 在处理 HarmonyOS / ArkTS / `.ets` 文件时优先调用 ArkTS MCP tools,而不是把 ArkTS 当普通浏览器 TypeScript。
|
|
106
|
+
|
|
68
107
|
### npm 全局安装(手动 CLI 使用)
|
|
69
108
|
|
|
70
109
|
```bash
|
|
@@ -98,6 +137,12 @@ export DEVECO_HOME=/opt/DevEco-Studio
|
|
|
98
137
|
arkts-lsp-proxy --project-root /path/to/harmonyos/project
|
|
99
138
|
```
|
|
100
139
|
|
|
140
|
+
也可以手动启动 Codex MCP server:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
arkts-lsp-mcp
|
|
144
|
+
```
|
|
145
|
+
|
|
101
146
|
当从非鸿蒙目录启动时,默认不会立即校验项目;会等到 LSP 初始化请求到来后根据 `rootUri`/`workspaceFolders` 自动定位鸿蒙项目路径。
|
|
102
147
|
|
|
103
148
|
### Hvigor metadata sync
|
|
@@ -130,7 +175,7 @@ export ARKTS_LSP_SYNC_TIMEOUT_MS=15000
|
|
|
130
175
|
export ARKTS_LSP_METADATA_DEBUG=1
|
|
131
176
|
```
|
|
132
177
|
|
|
133
|
-
开启后,代理会在 stderr 输出注入给 ace-server
|
|
178
|
+
开启后,代理会在 stderr 输出注入给 ace-server 的关键工程信息,包括项目根、`oh_modules`、`oh-package*.json5`、hvigor `dependencyMap`、SDK 路径、SDK 关键子目录、module 配置、`aceLoaderPath`、`sdkJsPath` 和这些路径是否存在。
|
|
134
179
|
|
|
135
180
|
### LSP trace
|
|
136
181
|
|
|
@@ -140,7 +185,7 @@ export ARKTS_LSP_METADATA_DEBUG=1
|
|
|
140
185
|
export ARKTS_LSP_TRACE=1
|
|
141
186
|
```
|
|
142
187
|
|
|
143
|
-
开启后,代理会输出客户端请求/通知的方法名,以及每个请求走的是 `proxy-fallback`、`ace-notification` 还是 `ace-request-forward`。启动时也会输出 `arkts-lsp-proxy` 实际运行版本,便于确认 Claude Code
|
|
188
|
+
开启后,代理会输出客户端请求/通知的方法名,以及每个请求走的是 `proxy-fallback`、`ace-notification` 还是 `ace-request-forward`。启动时也会输出 `arkts-lsp-proxy` 实际运行版本,便于确认 Claude Code 会话是否已经升级到最新版本。对 `workspace/symbol`,trace 会额外输出 query 来源字段、query 长度和返回结果数。
|
|
144
189
|
|
|
145
190
|
## 平台支持
|
|
146
191
|
|
|
@@ -187,18 +232,33 @@ src/
|
|
|
187
232
|
├── hvigor.ts hvigor metadata 状态、sync 策略与后台执行
|
|
188
233
|
├── ace-server.ts ace-server 子进程生命周期管理(onExit 回调)
|
|
189
234
|
├── proxy.ts LSP 消息代理,拦截 initialize 注入参数
|
|
190
|
-
|
|
235
|
+
├── arkts-client.ts Codex MCP 侧复用 proxy 的轻量 LSP client
|
|
236
|
+
├── mcp-tools.ts ArkTS MCP tools 的实现
|
|
237
|
+
├── mcp.ts MCP JSON-RPC 协议处理与 stdio server
|
|
238
|
+
├── mcp-server.ts arkts-lsp-mcp 入口
|
|
239
|
+
└── index.ts arkts-lsp-proxy 入口
|
|
191
240
|
.claude-plugin/
|
|
192
241
|
└── marketplace.json marketplace 清单 + lspServers 配置
|
|
242
|
+
.agents/
|
|
243
|
+
└── plugins/
|
|
244
|
+
└── marketplace.json Codex marketplace 清单
|
|
193
245
|
plugins/
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
246
|
+
├── arkts-lsp/
|
|
247
|
+
│ ├── .claude-plugin/
|
|
248
|
+
│ │ └── plugin.json Claude Code 插件清单
|
|
249
|
+
│ ├── hooks/
|
|
250
|
+
│ │ └── hooks.json SessionStart 自动安装 hook
|
|
251
|
+
│ ├── package.json npm 依赖声明(供 hook 自动安装)
|
|
252
|
+
│ ├── .lsp.json LSP 服务器配置
|
|
253
|
+
│ └── README.md Claude Code 插件文档
|
|
254
|
+
└── arkts-codex/
|
|
255
|
+
├── .codex-plugin/
|
|
256
|
+
│ └── plugin.json Codex 插件清单
|
|
257
|
+
├── .mcp.json MCP server 配置
|
|
258
|
+
├── skills/
|
|
259
|
+
│ └── arkts/
|
|
260
|
+
│ └── SKILL.md Codex 薄 skill
|
|
261
|
+
└── README.md Codex 插件文档
|
|
202
262
|
test/
|
|
203
263
|
├── env.test.ts
|
|
204
264
|
├── project.test.ts
|
|
@@ -214,6 +274,7 @@ test/
|
|
|
214
274
|
- TypeScript
|
|
215
275
|
- `vscode-jsonrpc` — LSP 消息解析与传输
|
|
216
276
|
- `json5` — 解析 `build-profile.json5`
|
|
277
|
+
- MCP stdio JSON-RPC — Codex 工具入口(零新增运行时依赖)
|
|
217
278
|
- Vitest — 测试
|
|
218
279
|
|
|
219
280
|
## License
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type DevEcoEnv } from './env';
|
|
2
|
+
import { type ProxyHandle } from './proxy';
|
|
3
|
+
export interface Position {
|
|
4
|
+
line: number;
|
|
5
|
+
character: number;
|
|
6
|
+
}
|
|
7
|
+
export interface ArktsRequest {
|
|
8
|
+
projectRoot?: string;
|
|
9
|
+
filePath: string;
|
|
10
|
+
position: Position;
|
|
11
|
+
text?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ArktsDiagnosticsRequest {
|
|
14
|
+
projectRoot?: string;
|
|
15
|
+
filePath: string;
|
|
16
|
+
text?: string;
|
|
17
|
+
timeoutMs?: number;
|
|
18
|
+
}
|
|
19
|
+
export type ProxyFactory = (clientIn: NodeJS.ReadableStream, clientOut: NodeJS.WritableStream, env: DevEcoEnv, options: {
|
|
20
|
+
env: DevEcoEnv;
|
|
21
|
+
projectRootHint?: string;
|
|
22
|
+
}) => ProxyHandle;
|
|
23
|
+
export interface ArktsLanguageClientOptions {
|
|
24
|
+
envFinder?: () => DevEcoEnv | null;
|
|
25
|
+
proxyFactory?: ProxyFactory;
|
|
26
|
+
}
|
|
27
|
+
export declare class ArktsLanguageClient {
|
|
28
|
+
private readonly envFinder;
|
|
29
|
+
private readonly proxyFactory;
|
|
30
|
+
private readonly sessions;
|
|
31
|
+
constructor(options?: ArktsLanguageClientOptions);
|
|
32
|
+
hover(request: ArktsRequest): Promise<unknown>;
|
|
33
|
+
definition(request: ArktsRequest): Promise<unknown>;
|
|
34
|
+
references(request: ArktsRequest): Promise<unknown>;
|
|
35
|
+
signatureHelp(request: ArktsRequest): Promise<unknown>;
|
|
36
|
+
diagnostics(request: ArktsDiagnosticsRequest): Promise<unknown[]>;
|
|
37
|
+
dispose(): void;
|
|
38
|
+
private sendPositionRequest;
|
|
39
|
+
private getSession;
|
|
40
|
+
private createSession;
|
|
41
|
+
private ensureDocument;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=arkts-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arkts-client.d.ts","sourceRoot":"","sources":["../src/arkts-client.ts"],"names":[],"mappings":"AAUA,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAGxD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD,MAAM,MAAM,YAAY,GAAG,CACzB,QAAQ,EAAE,MAAM,CAAC,cAAc,EAC/B,SAAS,EAAE,MAAM,CAAC,cAAc,EAChC,GAAG,EAAE,SAAS,EACd,OAAO,EAAE;IAAE,GAAG,EAAE,SAAS,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,KAClD,WAAW,CAAC;AAEjB,MAAM,WAAW,0BAA0B;IACzC,SAAS,CAAC,EAAE,MAAM,SAAS,GAAG,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAmCD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuC;gBAEpD,OAAO,GAAE,0BAA+B;IAK9C,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAI9C,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAInD,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAOnD,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAItD,WAAW,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAuBvE,OAAO,IAAI,IAAI;YAOD,mBAAmB;IAajC,OAAO,CAAC,UAAU;YAcJ,aAAa;YAyDb,cAAc;CAgC7B"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ArktsLanguageClient = void 0;
|
|
37
|
+
const fs = __importStar(require("node:fs"));
|
|
38
|
+
const path = __importStar(require("node:path"));
|
|
39
|
+
const node_stream_1 = require("node:stream");
|
|
40
|
+
const node_url_1 = require("node:url");
|
|
41
|
+
const node_1 = require("vscode-jsonrpc/node");
|
|
42
|
+
const env_1 = require("./env");
|
|
43
|
+
const proxy_1 = require("./proxy");
|
|
44
|
+
const project_1 = require("./project");
|
|
45
|
+
const defaultProxyFactory = (clientIn, clientOut, env, options) => (0, proxy_1.createProxy)(clientIn, clientOut, env, options);
|
|
46
|
+
function resolveProjectRoot(projectRoot, filePath) {
|
|
47
|
+
const candidate = projectRoot ? path.resolve(projectRoot) : path.resolve(filePath);
|
|
48
|
+
const resolved = (0, project_1.findProjectRoot)(candidate);
|
|
49
|
+
if (!resolved) {
|
|
50
|
+
throw new Error(`No ArkTS project root found for ${candidate}`);
|
|
51
|
+
}
|
|
52
|
+
return resolved;
|
|
53
|
+
}
|
|
54
|
+
function readDocumentText(filePath, explicitText) {
|
|
55
|
+
if (typeof explicitText === 'string') {
|
|
56
|
+
return explicitText;
|
|
57
|
+
}
|
|
58
|
+
return fs.readFileSync(filePath, 'utf8');
|
|
59
|
+
}
|
|
60
|
+
class ArktsLanguageClient {
|
|
61
|
+
envFinder;
|
|
62
|
+
proxyFactory;
|
|
63
|
+
sessions = new Map();
|
|
64
|
+
constructor(options = {}) {
|
|
65
|
+
this.envFinder = options.envFinder ?? env_1.findDevEcoEnv;
|
|
66
|
+
this.proxyFactory = options.proxyFactory ?? defaultProxyFactory;
|
|
67
|
+
}
|
|
68
|
+
async hover(request) {
|
|
69
|
+
return this.sendPositionRequest('textDocument/hover', request);
|
|
70
|
+
}
|
|
71
|
+
async definition(request) {
|
|
72
|
+
return this.sendPositionRequest('textDocument/definition', request);
|
|
73
|
+
}
|
|
74
|
+
async references(request) {
|
|
75
|
+
return this.sendPositionRequest('textDocument/references', {
|
|
76
|
+
...request,
|
|
77
|
+
context: { includeDeclaration: true },
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
async signatureHelp(request) {
|
|
81
|
+
return this.sendPositionRequest('textDocument/signatureHelp', request);
|
|
82
|
+
}
|
|
83
|
+
async diagnostics(request) {
|
|
84
|
+
const filePath = path.resolve(request.filePath);
|
|
85
|
+
const projectRoot = resolveProjectRoot(request.projectRoot, filePath);
|
|
86
|
+
const session = await this.getSession(projectRoot);
|
|
87
|
+
const uri = await this.ensureDocument(session, filePath, request.text);
|
|
88
|
+
const existing = session.diagnostics.get(uri);
|
|
89
|
+
if (existing) {
|
|
90
|
+
return existing;
|
|
91
|
+
}
|
|
92
|
+
return new Promise((resolve) => {
|
|
93
|
+
const timeout = setTimeout(() => {
|
|
94
|
+
resolve(session.diagnostics.get(uri) ?? []);
|
|
95
|
+
}, request.timeoutMs ?? 1500);
|
|
96
|
+
const pending = session.pendingDiagnostics.get(uri) ?? [];
|
|
97
|
+
pending.push((diagnostics) => {
|
|
98
|
+
clearTimeout(timeout);
|
|
99
|
+
resolve(diagnostics);
|
|
100
|
+
});
|
|
101
|
+
session.pendingDiagnostics.set(uri, pending);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
dispose() {
|
|
105
|
+
for (const promise of this.sessions.values()) {
|
|
106
|
+
promise.then((session) => session.handle.dispose()).catch(() => undefined);
|
|
107
|
+
}
|
|
108
|
+
this.sessions.clear();
|
|
109
|
+
}
|
|
110
|
+
async sendPositionRequest(method, request) {
|
|
111
|
+
const filePath = path.resolve(request.filePath);
|
|
112
|
+
const projectRoot = resolveProjectRoot(request.projectRoot, filePath);
|
|
113
|
+
const session = await this.getSession(projectRoot);
|
|
114
|
+
const uri = await this.ensureDocument(session, filePath, request.text);
|
|
115
|
+
return session.connection.sendRequest(method, {
|
|
116
|
+
textDocument: { uri },
|
|
117
|
+
position: request.position,
|
|
118
|
+
...(request.context ? { context: request.context } : {}),
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
getSession(projectRoot) {
|
|
122
|
+
const existing = this.sessions.get(projectRoot);
|
|
123
|
+
if (existing) {
|
|
124
|
+
return existing;
|
|
125
|
+
}
|
|
126
|
+
const created = this.createSession(projectRoot).catch((error) => {
|
|
127
|
+
this.sessions.delete(projectRoot);
|
|
128
|
+
throw error;
|
|
129
|
+
});
|
|
130
|
+
this.sessions.set(projectRoot, created);
|
|
131
|
+
return created;
|
|
132
|
+
}
|
|
133
|
+
async createSession(projectRoot) {
|
|
134
|
+
const env = this.envFinder();
|
|
135
|
+
if (!env) {
|
|
136
|
+
throw new Error('DevEco Studio not found. Set DEVECO_HOME or ARKTS_DEVECO_HOME.');
|
|
137
|
+
}
|
|
138
|
+
const clientIn = new node_stream_1.PassThrough();
|
|
139
|
+
const clientOut = new node_stream_1.PassThrough();
|
|
140
|
+
const handle = this.proxyFactory(clientIn, clientOut, env, { env, projectRootHint: projectRoot });
|
|
141
|
+
const connection = (0, node_1.createMessageConnection)(new node_1.StreamMessageReader(clientOut), new node_1.StreamMessageWriter(clientIn));
|
|
142
|
+
const session = {
|
|
143
|
+
projectRoot,
|
|
144
|
+
connection,
|
|
145
|
+
handle,
|
|
146
|
+
documents: new Map(),
|
|
147
|
+
diagnostics: new Map(),
|
|
148
|
+
pendingDiagnostics: new Map(),
|
|
149
|
+
};
|
|
150
|
+
connection.onNotification('textDocument/publishDiagnostics', (params) => {
|
|
151
|
+
const payload = params;
|
|
152
|
+
if (typeof payload.uri !== 'string') {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const diagnostics = Array.isArray(payload.diagnostics) ? payload.diagnostics : [];
|
|
156
|
+
session.diagnostics.set(payload.uri, diagnostics);
|
|
157
|
+
const pending = session.pendingDiagnostics.get(payload.uri) ?? [];
|
|
158
|
+
session.pendingDiagnostics.delete(payload.uri);
|
|
159
|
+
for (const resolve of pending) {
|
|
160
|
+
resolve(diagnostics);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
connection.listen();
|
|
164
|
+
await connection.sendRequest('initialize', {
|
|
165
|
+
processId: process.pid,
|
|
166
|
+
rootUri: (0, node_url_1.pathToFileURL)(projectRoot).toString(),
|
|
167
|
+
workspaceFolders: [
|
|
168
|
+
{
|
|
169
|
+
uri: (0, node_url_1.pathToFileURL)(projectRoot).toString(),
|
|
170
|
+
name: path.basename(projectRoot),
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
capabilities: {
|
|
174
|
+
textDocument: {
|
|
175
|
+
hover: { contentFormat: ['markdown', 'plaintext'] },
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
connection.sendNotification('initialized', {});
|
|
180
|
+
return session;
|
|
181
|
+
}
|
|
182
|
+
async ensureDocument(session, filePath, explicitText) {
|
|
183
|
+
const uri = (0, node_url_1.pathToFileURL)(filePath).toString();
|
|
184
|
+
const text = readDocumentText(filePath, explicitText);
|
|
185
|
+
const opened = session.documents.get(uri);
|
|
186
|
+
if (!opened) {
|
|
187
|
+
session.documents.set(uri, { text, version: 1 });
|
|
188
|
+
session.connection.sendNotification('textDocument/didOpen', {
|
|
189
|
+
textDocument: {
|
|
190
|
+
uri,
|
|
191
|
+
languageId: 'arkts',
|
|
192
|
+
version: 1,
|
|
193
|
+
text,
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
return uri;
|
|
197
|
+
}
|
|
198
|
+
if (opened.text !== text) {
|
|
199
|
+
const next = { text, version: opened.version + 1 };
|
|
200
|
+
session.documents.set(uri, next);
|
|
201
|
+
session.connection.sendNotification('textDocument/didChange', {
|
|
202
|
+
textDocument: {
|
|
203
|
+
uri,
|
|
204
|
+
version: next.version,
|
|
205
|
+
},
|
|
206
|
+
contentChanges: [{ text }],
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
return uri;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
exports.ArktsLanguageClient = ArktsLanguageClient;
|
|
213
|
+
//# sourceMappingURL=arkts-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arkts-client.js","sourceRoot":"","sources":["../src/arkts-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const mcp_1 = require("./mcp");
|
|
5
|
+
const dispose = (0, mcp_1.startMcpServer)();
|
|
6
|
+
process.on('SIGINT', () => {
|
|
7
|
+
dispose();
|
|
8
|
+
process.exit(0);
|
|
9
|
+
});
|
|
10
|
+
process.on('SIGTERM', () => {
|
|
11
|
+
dispose();
|
|
12
|
+
process.exit(0);
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=mcp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";;;AAEA,+BAAuC;AAEvC,MAAM,OAAO,GAAG,IAAA,oBAAc,GAAE,CAAC;AAEjC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,EAAE,CAAC;IACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,OAAO,EAAE,CAAC;IACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ArktsDiagnosticsRequest, type ArktsRequest } from './arkts-client';
|
|
2
|
+
import type { ArktsMcpService } from './mcp';
|
|
3
|
+
interface ArktsLspClientLike {
|
|
4
|
+
hover: (request: ArktsRequest) => Promise<unknown>;
|
|
5
|
+
definition: (request: ArktsRequest) => Promise<unknown>;
|
|
6
|
+
references: (request: ArktsRequest) => Promise<unknown>;
|
|
7
|
+
signatureHelp: (request: ArktsRequest) => Promise<unknown>;
|
|
8
|
+
diagnostics: (request: ArktsDiagnosticsRequest) => Promise<unknown[]>;
|
|
9
|
+
dispose: () => void;
|
|
10
|
+
}
|
|
11
|
+
interface ServiceOptions {
|
|
12
|
+
lspClient?: ArktsLspClientLike;
|
|
13
|
+
}
|
|
14
|
+
export declare function createArktsMcpService(options?: ServiceOptions): ArktsMcpService;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=mcp-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tools.d.ts","sourceRoot":"","sources":["../src/mcp-tools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,uBAAuB,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAItG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAE7C,UAAU,kBAAkB;IAC1B,KAAK,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,UAAU,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,UAAU,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,aAAa,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,WAAW,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACtE,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,UAAU,cAAc;IACtB,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAChC;AAyED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,cAAmB,GAAG,eAAe,CAiEnF"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.createArktsMcpService = createArktsMcpService;
|
|
37
|
+
const fs = __importStar(require("node:fs"));
|
|
38
|
+
const path = __importStar(require("node:path"));
|
|
39
|
+
const node_url_1 = require("node:url");
|
|
40
|
+
const arkts_client_1 = require("./arkts-client");
|
|
41
|
+
const env_1 = require("./env");
|
|
42
|
+
const project_1 = require("./project");
|
|
43
|
+
const symbols_1 = require("./symbols");
|
|
44
|
+
function isPlainObject(value) {
|
|
45
|
+
return typeof value === 'object' && value !== null;
|
|
46
|
+
}
|
|
47
|
+
function getString(args, key) {
|
|
48
|
+
return typeof args[key] === 'string' && args[key].length > 0 ? args[key] : undefined;
|
|
49
|
+
}
|
|
50
|
+
function getNumber(args, key) {
|
|
51
|
+
return typeof args[key] === 'number' && Number.isFinite(args[key]) ? args[key] : undefined;
|
|
52
|
+
}
|
|
53
|
+
function uriToFilePath(uri) {
|
|
54
|
+
return uri.startsWith('file://') ? (0, node_url_1.fileURLToPath)(uri) : uri;
|
|
55
|
+
}
|
|
56
|
+
function resolveRoot(rawRoot, rawStart) {
|
|
57
|
+
const candidate = rawRoot ?? rawStart ?? process.cwd();
|
|
58
|
+
const normalized = candidate.startsWith('file://') ? uriToFilePath(candidate) : candidate;
|
|
59
|
+
const resolved = (0, project_1.findProjectRoot)(path.resolve(normalized));
|
|
60
|
+
if (!resolved) {
|
|
61
|
+
throw new Error(`No ArkTS project root found for ${normalized}`);
|
|
62
|
+
}
|
|
63
|
+
return resolved;
|
|
64
|
+
}
|
|
65
|
+
function readText(args) {
|
|
66
|
+
const text = getString(args, 'text');
|
|
67
|
+
if (text !== undefined) {
|
|
68
|
+
return text;
|
|
69
|
+
}
|
|
70
|
+
const rawFile = getString(args, 'filePath') ?? getString(args, 'uri');
|
|
71
|
+
if (!rawFile) {
|
|
72
|
+
throw new Error('Expected either text, filePath, or uri.');
|
|
73
|
+
}
|
|
74
|
+
return fs.readFileSync(uriToFilePath(rawFile), 'utf8');
|
|
75
|
+
}
|
|
76
|
+
function normalizePosition(args) {
|
|
77
|
+
const position = args.position;
|
|
78
|
+
if (isPlainObject(position)) {
|
|
79
|
+
const line = getNumber(position, 'line');
|
|
80
|
+
const character = getNumber(position, 'character');
|
|
81
|
+
if (line !== undefined && character !== undefined) {
|
|
82
|
+
return { line, character };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const line = getNumber(args, 'line');
|
|
86
|
+
const character = getNumber(args, 'character');
|
|
87
|
+
if (line === undefined || character === undefined) {
|
|
88
|
+
throw new Error('Expected position with line and character.');
|
|
89
|
+
}
|
|
90
|
+
return { line, character };
|
|
91
|
+
}
|
|
92
|
+
function normalizeLspRequest(args) {
|
|
93
|
+
const rawFile = getString(args, 'filePath') ?? getString(args, 'uri');
|
|
94
|
+
if (!rawFile) {
|
|
95
|
+
throw new Error('Expected filePath or uri.');
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
projectRoot: getString(args, 'projectRoot'),
|
|
99
|
+
filePath: uriToFilePath(rawFile),
|
|
100
|
+
position: normalizePosition(args),
|
|
101
|
+
text: getString(args, 'text'),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function createArktsMcpService(options = {}) {
|
|
105
|
+
const lspClient = options.lspClient ?? new arkts_client_1.ArktsLanguageClient();
|
|
106
|
+
return {
|
|
107
|
+
async projectInfo(rawArgs) {
|
|
108
|
+
const args = isPlainObject(rawArgs) ? rawArgs : {};
|
|
109
|
+
const projectRoot = resolveRoot(getString(args, 'projectRoot'), getString(args, 'startPath'));
|
|
110
|
+
const sdkPath = getString(args, 'sdkPath') ?? (0, env_1.findDevEcoEnv)()?.sdkPath;
|
|
111
|
+
if (!sdkPath) {
|
|
112
|
+
throw new Error('DevEco Studio not found. Pass sdkPath or set DEVECO_HOME.');
|
|
113
|
+
}
|
|
114
|
+
const project = (0, project_1.parseProject)(projectRoot, sdkPath);
|
|
115
|
+
if (!project) {
|
|
116
|
+
throw new Error(`Unable to parse ArkTS project at ${projectRoot}`);
|
|
117
|
+
}
|
|
118
|
+
return project;
|
|
119
|
+
},
|
|
120
|
+
async documentSymbols(rawArgs) {
|
|
121
|
+
const args = isPlainObject(rawArgs) ? rawArgs : {};
|
|
122
|
+
return (0, symbols_1.parseDocumentSymbols)(readText(args));
|
|
123
|
+
},
|
|
124
|
+
async workspaceSymbols(rawArgs) {
|
|
125
|
+
const args = isPlainObject(rawArgs) ? rawArgs : {};
|
|
126
|
+
const query = getString(args, 'query') ?? '';
|
|
127
|
+
const projectRoot = resolveRoot(getString(args, 'projectRoot'), getString(args, 'startPath'));
|
|
128
|
+
return (0, symbols_1.parseWorkspaceSymbols)(projectRoot, query, {
|
|
129
|
+
maxFiles: getNumber(args, 'maxFiles'),
|
|
130
|
+
maxResults: getNumber(args, 'maxResults'),
|
|
131
|
+
});
|
|
132
|
+
},
|
|
133
|
+
async hover(rawArgs) {
|
|
134
|
+
return lspClient.hover(normalizeLspRequest(isPlainObject(rawArgs) ? rawArgs : {}));
|
|
135
|
+
},
|
|
136
|
+
async definition(rawArgs) {
|
|
137
|
+
return lspClient.definition(normalizeLspRequest(isPlainObject(rawArgs) ? rawArgs : {}));
|
|
138
|
+
},
|
|
139
|
+
async references(rawArgs) {
|
|
140
|
+
return lspClient.references(normalizeLspRequest(isPlainObject(rawArgs) ? rawArgs : {}));
|
|
141
|
+
},
|
|
142
|
+
async signatureHelp(rawArgs) {
|
|
143
|
+
return lspClient.signatureHelp(normalizeLspRequest(isPlainObject(rawArgs) ? rawArgs : {}));
|
|
144
|
+
},
|
|
145
|
+
async diagnostics(rawArgs) {
|
|
146
|
+
const args = isPlainObject(rawArgs) ? rawArgs : {};
|
|
147
|
+
const request = normalizeLspRequest(args);
|
|
148
|
+
return lspClient.diagnostics({
|
|
149
|
+
projectRoot: request.projectRoot,
|
|
150
|
+
filePath: request.filePath,
|
|
151
|
+
text: request.text,
|
|
152
|
+
timeoutMs: getNumber(args, 'timeoutMs'),
|
|
153
|
+
});
|
|
154
|
+
},
|
|
155
|
+
dispose() {
|
|
156
|
+
lspClient.dispose();
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=mcp-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tools.js","sourceRoot":"","sources":["../src/mcp-tools.ts"],"names":[],"mappings":"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"}
|