@xiaou66/vite-plugin-vue-mcp-next 0.0.1

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.
@@ -0,0 +1,410 @@
1
+ import { ViteDevServer, Plugin } from 'vite';
2
+ import { Hookable } from 'hookable';
3
+
4
+ /**
5
+ * 提供固定容量的内存缓存。
6
+ *
7
+ * Console 和 Network 都是持续增长的数据源,使用环形缓存可以保证开发服务器长时间运行时
8
+ * 内存占用仍然可控,同时保留最近的调试上下文。
9
+ */
10
+ interface RingBuffer<T> {
11
+ /** 写入一条新记录,超过容量时会丢弃最早记录。 */
12
+ push(value: T): void;
13
+ /** 返回按时间顺序排列的缓存快照,避免调用方直接修改内部数组。 */
14
+ all(): T[];
15
+ /** 清空缓存,适合 MCP clear 类工具使用。 */
16
+ clear(): void;
17
+ }
18
+
19
+ /**
20
+ * 插件对外暴露的主配置入口。
21
+ *
22
+ * 这些选项会同时影响 Vite 注入、MCP 服务、CDP 连接和运行时采集策略,
23
+ * 因此集中在一个顶层接口里,便于使用者在 `vite.config.ts` 中一次性理解调试边界。
24
+ */
25
+ interface VueMcpNextOptions {
26
+ /** MCP 服务挂载路径,默认 `/__mcp`,用于避开业务路由并延续参考项目接入方式。 */
27
+ readonly mcpPath?: string;
28
+ /** MCP 服务打印和 Cursor 配置中使用的 host,默认 `localhost` 以限制本机开发访问。 */
29
+ readonly host?: string;
30
+ /** 是否在 Vite 启动日志中打印 MCP 地址,默认开启方便开发者复制到 MCP 客户端。 */
31
+ readonly printUrl?: boolean;
32
+ /** 是否写入 Cursor MCP 配置;只在 `.cursor` 已存在时生效,避免擅自创建编辑器配置目录。 */
33
+ readonly updateCursorMcpJson?: boolean | CursorMcpConfig;
34
+ /** 是否写入常见 AI 客户端的项目级 MCP 配置,默认启用 Cursor、Codex、Claude Code 和 Trae。 */
35
+ readonly mcpClients?: McpClientConfigOptions;
36
+ /** 非 HTML 入口的运行时脚本注入点,用于兼容不直接使用 `index.html` 的项目。 */
37
+ readonly appendTo?: string | RegExp;
38
+ /** 通用 DevTools 能力配置;Vue 专属能力不受该配置影响,始终走 Vue Runtime Bridge。 */
39
+ readonly runtime?: RuntimeOptions;
40
+ /** CDP 连接配置;插件只连接已有端点,不负责启动浏览器进程。 */
41
+ readonly cdp?: CdpOptions;
42
+ /** Network 采集配置;请求体、响应体和 header 可能敏感,因此独立配置采集边界。 */
43
+ readonly network?: NetworkOptions;
44
+ /** DOM 输出限制;页面 DOM 可能巨大,必须默认裁剪以适配 MCP 上下文。 */
45
+ readonly dom?: DomOptions;
46
+ /** Console 日志缓存限制;日志是持续增长数据源,必须防止内存无界增长。 */
47
+ readonly console?: ConsoleOptions;
48
+ }
49
+ /**
50
+ * Cursor MCP 配置写入策略。
51
+ *
52
+ * 该配置只负责本地开发体验,不应强行修改未启用 Cursor 的项目。
53
+ */
54
+ interface CursorMcpConfig {
55
+ /** 是否启用 Cursor 配置写入,适合团队项目显式关闭自动改配置。 */
56
+ readonly enabled: boolean;
57
+ /** Cursor 展示的 MCP 服务名,用于同一项目存在多个 MCP 服务时避免冲突。 */
58
+ readonly serverName?: string;
59
+ }
60
+ /**
61
+ * MCP 客户端项目级配置写入策略。
62
+ *
63
+ * 多个 AI 客户端使用不同配置文件,但都指向同一个开发态 MCP 地址;
64
+ * 集中配置可以避免为每个客户端暴露一组重复选项。
65
+ */
66
+ interface McpClientConfigOptions {
67
+ /** 是否写入 Cursor 的 `.cursor/mcp.json`,适合 Cursor 用户开箱即用。 */
68
+ readonly cursor?: boolean;
69
+ /** 是否写入 Codex 的 `.codex/config.toml`,适合 Codex 项目级 MCP 配置。 */
70
+ readonly codex?: boolean;
71
+ /** 是否写入 Claude Code 的 `.mcp.json`,采用官方项目级 MCP 配置入口。 */
72
+ readonly claudeCode?: boolean;
73
+ /** 是否写入 Trae 的 `.trae/mcp.json`,与 Trae 项目级 MCP 文档保持一致。 */
74
+ readonly trae?: boolean;
75
+ /** MCP 客户端中展示的服务名,同一项目存在多个 MCP 服务时用于避免冲突。 */
76
+ readonly serverName?: string;
77
+ }
78
+ /**
79
+ * 通用 DevTools 能力的运行模式。
80
+ *
81
+ * 这里控制 DOM、Console、Evaluate 等浏览器通用能力的优先通道;
82
+ * Vue 组件、Router、Pinia 始终走 Vue Runtime Bridge。
83
+ */
84
+ interface RuntimeOptions {
85
+ /** `auto` 表示 CDP 可用时优先使用 CDP,否则回退到页面 Hook。 */
86
+ readonly mode?: RuntimeMode;
87
+ /** 控制台执行是高风险能力,需要独立开关避免默认暴露任意脚本执行入口。 */
88
+ readonly evaluate?: EvaluateOptions;
89
+ }
90
+ /** 通用 DevTools 能力的数据源选择策略,用于在 CDP 和页面 Hook 之间明确边界。 */
91
+ type RuntimeMode = 'auto' | 'cdp' | 'hook';
92
+ /**
93
+ * 控制台脚本执行配置。
94
+ *
95
+ * 该能力可以读取和修改页面状态,因此默认关闭,必须由用户显式启用。
96
+ */
97
+ interface EvaluateOptions {
98
+ /** 是否允许 MCP 客户端执行页面脚本,默认关闭以保护页面状态。 */
99
+ readonly enabled?: boolean;
100
+ /** 单次脚本执行超时时间,用于避免长任务阻塞 MCP 响应。 */
101
+ readonly timeoutMs?: number;
102
+ }
103
+ /**
104
+ * CDP 连接配置。
105
+ *
106
+ * 只连接用户提供的调试端点,可以避免跨平台 Chrome 启动和进程管理问题。
107
+ */
108
+ interface CdpOptions {
109
+ /** Chrome remote debugging 的 HTTP 地址,用于自动发现 WebSocket target。 */
110
+ readonly browserUrl?: string;
111
+ /** 已知 CDP WebSocket endpoint,适合由外部工具或宿主直接传入。 */
112
+ readonly wsEndpoint?: string;
113
+ /** 页面 target 匹配规则,用于多页面或多 tab 场景下绑定正确调试目标。 */
114
+ readonly targetUrlPattern?: string | RegExp;
115
+ }
116
+ /**
117
+ * Network 采集配置。
118
+ *
119
+ * Network 数据可能包含敏感参数和响应体,必须配置缓存、截断和脱敏策略。
120
+ */
121
+ interface NetworkOptions {
122
+ /** `auto` 表示 CDP 可用时使用 CDP,否则回退到 fetch/XHR Hook。 */
123
+ readonly mode?: NetworkMode;
124
+ /** 最大缓存条数,用于避免长时间开发会话无限占用内存。 */
125
+ readonly maxRecords?: number;
126
+ /** 是否采集请求体,调试接口参数时有用,但可能包含敏感数据。 */
127
+ readonly captureRequestBody?: boolean;
128
+ /** 是否采集响应体,调试接口返回值时有用,但必须配合 `maxBodySize` 截断。 */
129
+ readonly captureResponseBody?: boolean;
130
+ /** 请求体和响应体的最大采集长度,避免大文件响应污染 MCP 上下文。 */
131
+ readonly maxBodySize?: number;
132
+ /** 需要脱敏的 header 名称,默认覆盖认证和 Cookie 相关字段。 */
133
+ readonly maskHeaders?: string[];
134
+ }
135
+ /** Network 采集通道选择策略,用于在 CDP、Hook 和关闭采集之间保持显式选择。 */
136
+ type NetworkMode = 'auto' | 'cdp' | 'hook' | 'off';
137
+ /**
138
+ * DOM 输出限制。
139
+ *
140
+ * DOM 树可能非常大,默认限制能保证 AI 获取结构信息而不是被大量无关节点淹没。
141
+ */
142
+ interface DomOptions {
143
+ /** 最大 DOM 深度,适合控制复杂组件页面的递归输出成本。 */
144
+ readonly maxDepth?: number;
145
+ /** 最大节点数量,防止一次调用返回整页巨量节点。 */
146
+ readonly maxNodes?: number;
147
+ /** 单个文本节点最大长度,保留定位信息但避免长文本占满上下文。 */
148
+ readonly maxTextLength?: number;
149
+ }
150
+ /**
151
+ * Console 日志缓存限制。
152
+ *
153
+ * 日志会持续增长,因此需要固定上限以保证开发服务器长时间运行仍可控。
154
+ */
155
+ interface ConsoleOptions {
156
+ /** 最大日志条数,超过后按先进先出策略丢弃旧日志。 */
157
+ readonly maxRecords?: number;
158
+ }
159
+ /**
160
+ * 解析后的插件配置。
161
+ *
162
+ * 内部模块只读取该类型,避免每个模块重复处理可选配置和默认值。
163
+ */
164
+ interface ResolvedVueMcpNextOptions {
165
+ /** 已解析 MCP 路径,内部路由挂载只能使用该值。 */
166
+ readonly mcpPath: string;
167
+ /** 已解析 host,用于日志输出和编辑器配置写入。 */
168
+ readonly host: string;
169
+ /** 是否打印 MCP 地址,内部不再读取用户原始配置。 */
170
+ readonly printUrl: boolean;
171
+ /** 已规范化 Cursor 配置,boolean 输入会在 mergeOptions 中转换成对象。 */
172
+ readonly updateCursorMcpJson: Required<CursorMcpConfig>;
173
+ /** 已规范化的多客户端 MCP 配置写入策略,内部写入器只读取该对象。 */
174
+ readonly mcpClients: Required<McpClientConfigOptions>;
175
+ /** 非 HTML 入口注入点,未配置时 HTML 注入路径生效。 */
176
+ readonly appendTo?: string | RegExp;
177
+ /** 已补齐默认值的通用 DevTools 配置。 */
178
+ readonly runtime: Required<RuntimeOptions> & {
179
+ readonly evaluate: Required<EvaluateOptions>;
180
+ };
181
+ /** 已补齐默认值的 CDP 配置,字段可能为空但对象必须存在。 */
182
+ readonly cdp: CdpOptions;
183
+ /** 已补齐默认值的 Network 配置。 */
184
+ readonly network: Required<NetworkOptions>;
185
+ /** 已补齐默认值的 DOM 输出限制。 */
186
+ readonly dom: Required<DomOptions>;
187
+ /** 已补齐默认值的 Console 缓存限制。 */
188
+ readonly console: Required<ConsoleOptions>;
189
+ }
190
+ /**
191
+ * MCP 可选择的页面目标。
192
+ *
193
+ * 同一路径可能被多个浏览器 tab、iframe 或 CDP target 同时打开,
194
+ * 因此页面选择不能只依赖 URL,必须使用稳定的 pageId。
195
+ */
196
+ interface PageTarget {
197
+ /** 页面唯一标识,用于让 MCP 工具在多实例页面中稳定选择目标。 */
198
+ readonly pageId: string;
199
+ /** 页面来源,用于解释该页面当前能使用 runtime 能力还是 CDP 能力。 */
200
+ readonly source: 'runtime' | 'cdp';
201
+ /** 当前页面 URL,用于展示和与 CDP target 做关联匹配。 */
202
+ readonly url: string;
203
+ /** URL pathname,用于把 Vite 多入口页面以更短路径展示给用户。 */
204
+ readonly pathname: string;
205
+ /** 页面标题,用于 AI 和用户在多个相似 URL 中识别目标页面。 */
206
+ readonly title?: string;
207
+ /** 对应的 Vite HTML 入口或 appendTo 入口,用于说明页面来自哪个开发入口。 */
208
+ readonly entry?: string;
209
+ /** 页面是否仍可调试,用于避免 MCP 对已断开的页面继续执行操作。 */
210
+ readonly connected: boolean;
211
+ }
212
+ /**
213
+ * 页面 Console 和运行时异常的统一记录。
214
+ *
215
+ * CDP 与页面 Hook 返回的日志格式不同,统一结构可以让 MCP 工具不关心采集来源。
216
+ */
217
+ interface ConsoleRecord {
218
+ /** 日志唯一标识,用于分页、清理或后续定位单条日志。 */
219
+ readonly id: string;
220
+ /** 日志所属页面,避免多页面开发时把不同 tab 的输出混在一起。 */
221
+ readonly pageId: string;
222
+ /** 日志来源,用于说明该记录来自 CDP 事件还是页面 Hook 缓存。 */
223
+ readonly source: 'cdp' | 'hook';
224
+ /** 日志级别,用于 MCP 工具按 error/warn 等常见调试维度过滤。 */
225
+ readonly level: 'log' | 'info' | 'warn' | 'error' | 'debug';
226
+ /** 面向 AI 的主要文本内容,避免每次都解析复杂 args。 */
227
+ readonly message: string;
228
+ /** 原始参数快照,用于需要还原对象日志时提供结构化信息。 */
229
+ readonly args?: unknown[];
230
+ /** 错误堆栈,用于定位运行时异常的来源文件和调用链。 */
231
+ readonly stack?: string;
232
+ /** 记录时间戳,用于还原日志与网络请求、用户操作之间的先后关系。 */
233
+ readonly timestamp: number;
234
+ }
235
+ /**
236
+ * 页面网络请求的统一记录。
237
+ *
238
+ * CDP 和 Hook 能采集到的字段不同,但 MCP 工具需要用同一种结构回答
239
+ * “请求了什么、参数是什么、响应是什么”。
240
+ */
241
+ interface NetworkRecord {
242
+ /** 请求唯一标识,用于从列表摘要进一步查询请求详情。 */
243
+ readonly id: string;
244
+ /** 请求所属页面,避免多页面并行调试时网络记录互相污染。 */
245
+ readonly pageId: string;
246
+ /** 采集来源,用于区分完整 CDP Network 数据和 fetch/XHR Hook 数据。 */
247
+ readonly source: 'cdp' | 'hook';
248
+ /** 请求 URL,用于回答“请求了哪个接口”并支持按 URL 过滤。 */
249
+ readonly url: string;
250
+ /** HTTP 方法,用于区分 GET/POST 等接口语义。 */
251
+ readonly method: string;
252
+ /** 请求头快照,调试鉴权、content-type 和代理问题时需要查看。 */
253
+ readonly requestHeaders?: Record<string, string>;
254
+ /** URL query 参数,单独拆出是为了让 AI 不必从 URL 字符串中再次解析。 */
255
+ readonly requestQuery?: Record<string, string | string[]>;
256
+ /** 请求体,调试提交参数时需要;采集时必须受脱敏和大小限制约束。 */
257
+ readonly requestBody?: unknown;
258
+ /** 响应状态码,用于快速判断请求成功、失败或重定向。 */
259
+ readonly status?: number;
260
+ /** 响应头快照,用于调试缓存、跨域和内容类型问题。 */
261
+ readonly responseHeaders?: Record<string, string>;
262
+ /** 响应体,调试接口返回值时需要;过大时必须截断并标记。 */
263
+ readonly responseBody?: unknown;
264
+ /** 请求失败原因,用于表达网络错误、取消、跨域失败等非正常响应。 */
265
+ readonly error?: string;
266
+ /** 请求开始时间,用于按时间线还原页面行为。 */
267
+ readonly startedAt: number;
268
+ /** 请求结束时间,用于和 startedAt 共同计算耗时。 */
269
+ readonly endedAt?: number;
270
+ /** 请求耗时,直接提供给 AI 做慢请求判断,避免每次重复计算。 */
271
+ readonly durationMs?: number;
272
+ }
273
+ /**
274
+ * 页面目标注册表。
275
+ *
276
+ * MCP 工具需要稳定选择目标页面,而同一路径可能被多个 tab 同时打开,
277
+ * 因此这里使用 pageId 做主键,不使用 URL 做唯一标识。
278
+ */
279
+ interface PageTargetRegistry {
280
+ /** 新增或更新页面目标,适合 runtime 重连和 CDP target 刷新场景。 */
281
+ upsert(target: PageTarget): void;
282
+ /** 获取单个页面目标,工具调用解析 pageId 时使用。 */
283
+ get(pageId: string): PageTarget | undefined;
284
+ /** 返回所有页面目标快照,避免调用方修改内部 Map。 */
285
+ list(): PageTarget[];
286
+ /** 标记页面断开,保留记录可以帮助用户理解刚才的页面为什么不可操作。 */
287
+ disconnect(pageId: string): void;
288
+ }
289
+ /**
290
+ * 插件内部共享上下文。
291
+ *
292
+ * 所有 MCP 工具都通过该上下文访问页面、日志和网络缓存,避免不同工具维护各自状态。
293
+ */
294
+ interface VueMcpNextContext {
295
+ /** 解析后的安全配置,所有内部模块只能读取该配置,不能再次直接读取用户原始配置。 */
296
+ readonly options: ResolvedVueMcpNextOptions;
297
+ /** 当前 Vite 开发服务器实例,只有 serve 模式下 MCP 路由和 runtime 注入才需要它。 */
298
+ readonly server?: ViteDevServer;
299
+ /** 跨 RPC 请求的事件总线,用于复用参考项目的事件回传模型。 */
300
+ readonly hooks: Hookable;
301
+ /** Vue Runtime Bridge 的服务端 RPC 代理,Vue 专属工具通过它请求浏览器页面返回组件语义数据。 */
302
+ rpcServer?: VueRuntimeRpc;
303
+ /** 页面目标注册表,负责多页面和 CDP target 的统一选择。 */
304
+ readonly pages: PageTargetRegistry;
305
+ /** Console 日志缓存,给 MCP 日志工具提供最近的调试上下文。 */
306
+ readonly consoleRecords: RingBuffer<ConsoleRecord>;
307
+ /** Network 请求缓存,给 MCP Network 工具提供摘要和详情。 */
308
+ readonly networkRecords: RingBuffer<NetworkRecord>;
309
+ /** 可选 CDP 生命周期控制器,用于纯 CDP target 被发现后启动 Console 和 Network 监听。 */
310
+ cdpLifecycle?: CdpLifecycleController;
311
+ }
312
+ /**
313
+ * CDP 生命周期控制器。
314
+ *
315
+ * Console 和 Network 需要持续监听,不能像 DOM/Evaluate 那样每次调用后立刻断开,
316
+ * 因此控制器挂在上下文里,让页面发现工具也能为纯 CDP target 启动监听。
317
+ */
318
+ interface CdpLifecycleController {
319
+ /** 页面连接或 CDP target 被发现后尝试启动对应 CDP 监听。 */
320
+ connectPage(target: PageTarget): Promise<void>;
321
+ /** 关闭所有已建立的 CDP 连接,避免开发服务器退出后残留调试连接。 */
322
+ closeAll(): Promise<void>;
323
+ }
324
+ /**
325
+ * 浏览器 Runtime Bridge 暴露给服务端的 Vue 调试 RPC。
326
+ *
327
+ * Vue 专属能力必须走运行时通道,因为 CDP 不理解组件、Router 和 Pinia 的应用层语义。
328
+ */
329
+ interface VueRuntimeRpc {
330
+ /** 读取页面 DOM 快照,用于无 CDP 配置时提供 Hook fallback。 */
331
+ getDomTree(options: {
332
+ event: string;
333
+ maxDepth: number;
334
+ maxNodes: number;
335
+ maxTextLength: number;
336
+ }): void | Promise<void>;
337
+ /** 回传 DOM 快照,使用事件名隔离并发 MCP 请求。 */
338
+ onDomTreeUpdated(event: string, data: unknown): void;
339
+ /** 按 selector 查询页面 DOM,用于无 CDP 配置时定位具体元素。 */
340
+ queryDom(options: {
341
+ event: string;
342
+ selector: string;
343
+ limit: number;
344
+ }): void | Promise<void>;
345
+ /** 回传 selector 查询结果。 */
346
+ onDomQueryUpdated(event: string, data: unknown): void;
347
+ /** 执行已授权的页面表达式,用于无 CDP 配置时提供控制台测试能力。 */
348
+ evaluateScript(options: {
349
+ event: string;
350
+ expression: string;
351
+ awaitPromise?: boolean;
352
+ timeoutMs: number;
353
+ }): void | Promise<void>;
354
+ /** 回传页面表达式执行结果。 */
355
+ onEvaluateScriptUpdated(event: string, data: unknown): void;
356
+ /** 读取 Vue component inspector tree,用于 `get_component_tree` 工具。 */
357
+ getInspectorTree(options: {
358
+ event: string;
359
+ componentName?: string;
360
+ }): void | Promise<void>;
361
+ /** 回传 component tree,使用事件名可以让并发 MCP 请求互不干扰。 */
362
+ onInspectorTreeUpdated(event: string, data: unknown): void;
363
+ /** 读取指定组件状态,用于定位 props、setup、data 等 Vue 状态。 */
364
+ getInspectorState(options: {
365
+ event: string;
366
+ componentName: string;
367
+ }): void | Promise<void>;
368
+ /** 回传组件状态。 */
369
+ onInspectorStateUpdated(event: string, data: unknown): void;
370
+ /** 修改组件状态,只用于开发态调试。 */
371
+ editComponentState(options: {
372
+ componentName: string;
373
+ path: string[];
374
+ value: string;
375
+ valueType: string;
376
+ }): void | Promise<void>;
377
+ /** 高亮组件,帮助用户在页面中确认 AI 选择的组件。 */
378
+ highlightComponent(options: {
379
+ componentName: string;
380
+ }): void | Promise<void>;
381
+ /** 获取 Vue Router 信息。 */
382
+ getRouterInfo(options: {
383
+ event: string;
384
+ }): void;
385
+ /** 回传 Vue Router 信息。 */
386
+ onRouterInfoUpdated(event: string, data: unknown): void;
387
+ /** 获取 Pinia store tree。 */
388
+ getPiniaTree(options: {
389
+ event: string;
390
+ }): void | Promise<void>;
391
+ /** 回传 Pinia store tree。 */
392
+ onPiniaTreeUpdated(event: string, data: unknown): void;
393
+ /** 获取指定 Pinia store state。 */
394
+ getPiniaState(options: {
395
+ event: string;
396
+ storeName: string;
397
+ }): void | Promise<void>;
398
+ /** 回传 Pinia store state。 */
399
+ onPiniaInfoUpdated(event: string, data: unknown): void;
400
+ }
401
+
402
+ /**
403
+ * 创建 vite-plugin-vue-mcp-next 插件。
404
+ *
405
+ * 这里只编排 Vite 生命周期,把 MCP、Runtime、CDP 等细节交给独立模块,
406
+ * 避免插件入口随着能力增加而变成难以测试的大文件。
407
+ */
408
+ declare function vueMcpNext(userOptions?: VueMcpNextOptions): Plugin;
409
+
410
+ export { type CdpOptions, type ConsoleOptions, type ConsoleRecord, type CursorMcpConfig, type DomOptions, type EvaluateOptions, type McpClientConfigOptions, type NetworkOptions, type NetworkRecord, type PageTarget, type ResolvedVueMcpNextOptions, type RuntimeMode, type RuntimeOptions, type VueMcpNextContext, type VueMcpNextOptions, vueMcpNext as default, vueMcpNext };