@wenyan-md/mcp 1.0.7 → 1.0.9
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 +88 -118
- package/dist/index.js +32 -9
- package/dist/types/utils.d.ts +1 -0
- package/dist/utils.js +27 -0
- package/package.json +9 -8
package/README.md
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
|
+
<img alt = "logo" src="https://media.githubusercontent.com/media/caol64/wenyan-mcp/main/data/wenyan-mcp.png" />
|
|
3
|
+
</div>
|
|
2
4
|
|
|
3
5
|
# 文颜 MCP Server
|
|
4
6
|
|
|
@@ -8,94 +10,70 @@
|
|
|
8
10
|
[](https://hub.docker.com/r/caol64/wenyan-mcp)
|
|
9
11
|
[](https://github.com/caol64/wenyan-mcp)
|
|
10
12
|
|
|
11
|
-
|
|
13
|
+
## 简介
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
**文颜(Wenyan)** 是一款多平台 Markdown 排版与发布工具,支持将 Markdown 一键转换并发布至:
|
|
14
16
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
* [嵌入版本](https://github.com/caol64/wenyan-core) - 将文颜的核心功能嵌入 Node 或者 Web 项目
|
|
17
|
+
- 微信公众号
|
|
18
|
+
- 知乎
|
|
19
|
+
- 今日头条
|
|
20
|
+
- 以及其它内容平台(持续扩展中)
|
|
20
21
|
|
|
21
|
-
|
|
22
|
+
文颜的目标是:**让写作者专注内容,而不是排版和平台适配**。
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
本仓库是 **文颜的 MCP Server 版本**,基于模型上下文协议(Model Context Protocol),旨在让 AI 助手(如 Claude Desktop)具备自动排版和发布公众号文章的能力。
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
## 文颜的不同版本
|
|
26
27
|
|
|
27
|
-
|
|
28
|
+
文颜目前提供多种形态,覆盖不同使用场景:
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
- [macOS App Store 版](https://github.com/caol64/wenyan) - MAC 桌面应用
|
|
31
|
+
- [跨平台桌面版](https://github.com/caol64/wenyan-pc) - Windows/Linux
|
|
32
|
+
- [CLI 版本](https://github.com/caol64/wenyan-cli) - 命令行 / CI 自动化发布
|
|
33
|
+
- 👉 [MCP 版本](https://github.com/caol64/wenyan-mcp) - 本项目
|
|
34
|
+
- [核心库](https://github.com/caol64/wenyan-core) - 嵌入 Node / Web 项目
|
|
30
35
|
|
|
31
|
-
|
|
32
|
-
- 使用内置主题对 Markdown 内容排版
|
|
33
|
-
- 发布文章到微信公众号草稿箱
|
|
34
|
-
- 自动上传本地或网络图片
|
|
36
|
+
## 功能特性
|
|
35
37
|
|
|
36
|
-
|
|
38
|
+
- 列出并选择支持的文章主题
|
|
39
|
+
- 使用内置主题对 Markdown 内容排版
|
|
40
|
+
- 自动处理并上传图片(本地 / 网络)
|
|
41
|
+
- 一键发布文章到微信公众号草稿箱
|
|
42
|
+
- **与 AI 深度集成**:[让 AI 帮你管理公众号的排版和发布](https://babyno.top/posts/2025/06/let-ai-help-you-manage-your-gzh-layout-and-publishing/)
|
|
37
43
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
文颜采用了多个开源的 Typora 主题,在此向各位作者表示感谢:
|
|
44
|
+
<video src="https://github.com/user-attachments/assets/2c355f76-f313-48a7-9c31-f0f69e5ec207"></video>
|
|
41
45
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
- [Pie](https://github.com/kevinzhao2233/typora-theme-pie)
|
|
46
|
-
- [Maize](https://github.com/BEATREE/typora-maize-theme)
|
|
47
|
-
- [Purple](https://github.com/hliu202/typora-purple-theme)
|
|
48
|
-
- [物理猫-薄荷](https://github.com/sumruler/typora-theme-phycat)
|
|
49
|
-
|
|
50
|
-
## 使用方式
|
|
46
|
+
> [!TIP]
|
|
47
|
+
>
|
|
48
|
+
> 如果与 AI 集成遇到问题,可以参考 [test/list.js](./test/list.js) 和 [test/publish.js](./test/publish.js) 中的完整调用示例。
|
|
51
49
|
|
|
52
|
-
|
|
50
|
+
## 主题效果预览
|
|
53
51
|
|
|
54
|
-
|
|
55
|
-
npm install -g @wenyan-md/mcp
|
|
56
|
-
```
|
|
52
|
+
👉 [内置主题预览](https://yuzhi.tech/docs/wenyan/theme)
|
|
57
53
|
|
|
58
|
-
|
|
54
|
+
文颜内置并适配了多个优秀的 Typora 主题,在此感谢原作者:
|
|
59
55
|
|
|
60
|
-
|
|
56
|
+
- [Orange Heart](https://github.com/evgo2017/typora-theme-orange-heart)
|
|
57
|
+
- [Rainbow](https://github.com/thezbm/typora-theme-rainbow)
|
|
58
|
+
- [Lapis](https://github.com/YiNNx/typora-theme-lapis)
|
|
59
|
+
- [Pie](https://github.com/kevinzhao2233/typora-theme-pie)
|
|
60
|
+
- [Maize](https://github.com/BEATREE/typora-maize-theme)
|
|
61
|
+
- [Purple](https://github.com/hliu202/typora-purple-theme)
|
|
62
|
+
- [物理猫-薄荷](https://github.com/sumruler/typora-theme-phycat)
|
|
61
63
|
|
|
62
|
-
|
|
63
|
-
{
|
|
64
|
-
"mcpServers": {
|
|
65
|
-
"wenyan-mcp": {
|
|
66
|
-
"name": "公众号助手",
|
|
67
|
-
"command": "wenyan-mcp",
|
|
68
|
-
"env": {
|
|
69
|
-
"WECHAT_APP_ID": "your_app_id",
|
|
70
|
-
"WECHAT_APP_SECRET": "your_app_secret"
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
> 说明:
|
|
78
|
-
>
|
|
79
|
-
> * `WECHAT_APP_ID` 微信公众号平台的 App ID
|
|
80
|
-
> * `WECHAT_APP_SECRET` 微信平台的 App Secret
|
|
81
|
-
|
|
82
|
-
---
|
|
64
|
+
## 安装与集成
|
|
83
65
|
|
|
84
|
-
|
|
66
|
+
文颜 MCP Server 支持多种运行方式,请根据你的环境选择。
|
|
85
67
|
|
|
86
|
-
|
|
68
|
+
### 方式一:npm 安装(推荐)
|
|
87
69
|
|
|
88
|
-
|
|
70
|
+
直接安装到本地:
|
|
89
71
|
|
|
90
72
|
```bash
|
|
91
|
-
|
|
92
|
-
cd wenyan-mcp
|
|
93
|
-
|
|
94
|
-
npm install
|
|
95
|
-
npx tsc -b
|
|
73
|
+
npm install -g @wenyan-md/mcp
|
|
96
74
|
```
|
|
97
75
|
|
|
98
|
-
|
|
76
|
+
**配置 MCP Client(如 Claude Desktop):**
|
|
99
77
|
|
|
100
78
|
在你的 MCP 配置文件中加入以下内容:
|
|
101
79
|
|
|
@@ -104,10 +82,7 @@ npx tsc -b
|
|
|
104
82
|
"mcpServers": {
|
|
105
83
|
"wenyan-mcp": {
|
|
106
84
|
"name": "公众号助手",
|
|
107
|
-
"command": "
|
|
108
|
-
"args": [
|
|
109
|
-
"Your/path/to/wenyan-mcp/dist/index.js"
|
|
110
|
-
],
|
|
85
|
+
"command": "wenyan-mcp",
|
|
111
86
|
"env": {
|
|
112
87
|
"WECHAT_APP_ID": "your_app_id",
|
|
113
88
|
"WECHAT_APP_SECRET": "your_app_secret"
|
|
@@ -117,34 +92,17 @@ npx tsc -b
|
|
|
117
92
|
}
|
|
118
93
|
```
|
|
119
94
|
|
|
120
|
-
|
|
121
|
-
>
|
|
122
|
-
> * `WECHAT_APP_ID` 微信公众号平台的 App ID
|
|
123
|
-
> * `WECHAT_APP_SECRET` 微信平台的 App Secret
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
### 方式三:使用 Docker 运行(推荐)
|
|
95
|
+
### 方式二:Docker 运行(推荐)
|
|
128
96
|
|
|
129
|
-
|
|
97
|
+
适合部署到服务器环境,或希望环境隔离的用户。
|
|
130
98
|
|
|
131
|
-
|
|
99
|
+
**拉取镜像:**
|
|
132
100
|
|
|
133
101
|
```bash
|
|
134
102
|
docker pull caol64/wenyan-mcp
|
|
135
103
|
```
|
|
136
104
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
```bash
|
|
140
|
-
docker build -t wenyan-mcp .
|
|
141
|
-
# 国内用户可以指定`npm`镜像源。
|
|
142
|
-
docker build --build-arg NPM_REGISTRY=https://mirrors.cloud.tencent.com/npm/ -t wenyan-mcp .
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
#### 与 MCP Client 集成
|
|
146
|
-
|
|
147
|
-
在你的 MCP 配置文件中加入以下内容:
|
|
105
|
+
**配置 MCP Client:**
|
|
148
106
|
|
|
149
107
|
```json
|
|
150
108
|
{
|
|
@@ -156,53 +114,63 @@ docker build --build-arg NPM_REGISTRY=https://mirrors.cloud.tencent.com/npm/ -t
|
|
|
156
114
|
"run",
|
|
157
115
|
"--rm",
|
|
158
116
|
"-i",
|
|
159
|
-
"-v", "/your/host/
|
|
117
|
+
"-v", "/your/host/file/path:/mnt/host-downloads",
|
|
160
118
|
"-e", "WECHAT_APP_ID=your_app_id",
|
|
161
119
|
"-e", "WECHAT_APP_SECRET=your_app_secret",
|
|
162
|
-
"-e", "
|
|
163
|
-
"wenyan-mcp"
|
|
120
|
+
"-e", "HOST_FILE_PATH=/your/host/file/path",
|
|
121
|
+
"caol64/wenyan-mcp"
|
|
164
122
|
]
|
|
165
123
|
}
|
|
166
124
|
}
|
|
167
125
|
}
|
|
168
126
|
```
|
|
169
127
|
|
|
170
|
-
>
|
|
128
|
+
> **Docker 配置特别说明:**
|
|
171
129
|
>
|
|
172
|
-
> * `-v`
|
|
173
|
-
> *
|
|
174
|
-
> *
|
|
175
|
-
> * `WECHAT_APP_SECRET` 微信平台的 App Secret
|
|
176
|
-
> * `HOST_IMAGE_PATH` 宿主机图片目录
|
|
130
|
+
> * **挂载目录 (`-v`)**:必须将宿主机的文件/图片目录挂载到容器内的 `/mnt/host-downloads`。
|
|
131
|
+
> * **环境变量 (`HOST_FILE_PATH`)**:必须与宿主机挂载的文件/图片目录路径保持一致。
|
|
132
|
+
> * **原理**:你的 Markdown 文件/文章内所引用的本地图片应放置在该目录中,Docker 会自动将其映射,使容器能够读取并上传。
|
|
177
133
|
|
|
178
|
-
##
|
|
134
|
+
## 环境变量说明
|
|
135
|
+
|
|
136
|
+
无论使用哪种方式,都需要配置以下环境变量以连接微信公众号平台:
|
|
179
137
|
|
|
180
|
-
|
|
181
|
-
|
|
138
|
+
- `WECHAT_APP_ID`:微信公众号平台的 App ID
|
|
139
|
+
- `WECHAT_APP_SECRET`:微信公众号平台的 App Secret
|
|
182
140
|
|
|
183
|
-
##
|
|
141
|
+
## Markdown Frontmatter 说明(必读)
|
|
184
142
|
|
|
185
|
-
|
|
143
|
+
为了正确上传文章,每篇 Markdown 顶部需要包含 frontmatter:
|
|
186
144
|
|
|
187
145
|
```md
|
|
188
146
|
---
|
|
189
147
|
title: 在本地跑一个大语言模型(2) - 给模型提供外部知识库
|
|
190
|
-
cover: /Users/
|
|
148
|
+
cover: /Users/xxx/image.jpg
|
|
191
149
|
---
|
|
192
150
|
```
|
|
193
151
|
|
|
194
|
-
|
|
195
|
-
* `cover` 是文章封面,支持本地路径和网络图片:
|
|
152
|
+
字段说明:
|
|
196
153
|
|
|
197
|
-
|
|
198
|
-
|
|
154
|
+
- `title` 文章标题(必填)
|
|
155
|
+
- `cover` 文章封面
|
|
156
|
+
- 本地路径或网络图片
|
|
157
|
+
- 如果正文有至少一张图片,可省略,此时将使用其中一张作为封面
|
|
158
|
+
- 如果正文无图片,则必须提供 cover
|
|
199
159
|
|
|
200
160
|
## 关于图片自动上传
|
|
201
161
|
|
|
202
|
-
|
|
162
|
+
支持以下图片来源:
|
|
163
|
+
|
|
164
|
+
- 本地路径(如:`/Users/lei/Downloads/result_image.jpg`)
|
|
165
|
+
- 网络路径(如:`https://example.com/image.jpg`)
|
|
203
166
|
|
|
204
|
-
|
|
205
|
-
|
|
167
|
+
## 微信公众号 IP 白名单
|
|
168
|
+
|
|
169
|
+
> [!IMPORTANT]
|
|
170
|
+
>
|
|
171
|
+
> 请确保运行文颜 MCP Server 的机器 IP 已加入微信公众号后台的 IP 白名单,否则上传接口将调用失败。
|
|
172
|
+
|
|
173
|
+
配置说明文档:[https://yuzhi.tech/docs/wenyan/upload](https://yuzhi.tech/docs/wenyan/upload)
|
|
206
174
|
|
|
207
175
|
## 示例文章格式
|
|
208
176
|
|
|
@@ -223,15 +191,15 @@ cover: /Users/lei/Downloads/result_image.jpg
|
|
|
223
191
|
|
|
224
192
|
## 如何调试
|
|
225
193
|
|
|
226
|
-
|
|
194
|
+
推荐使用官方 Inspector 进行调试:
|
|
227
195
|
|
|
228
|
-
```
|
|
229
|
-
npx @modelcontextprotocol/inspector
|
|
196
|
+
```bash
|
|
197
|
+
npx @modelcontextprotocol/inspector <command>
|
|
230
198
|
```
|
|
231
199
|
|
|
232
200
|
启动成功出现类似提示:
|
|
233
201
|
|
|
234
|
-
```
|
|
202
|
+
```bash
|
|
235
203
|
🔗 Open inspector with token pre-filled:
|
|
236
204
|
http://localhost:6274/?MCP_PROXY_AUTH_TOKEN=761c05058aa4f84ad02280e62d7a7e52ec0430d00c4c7a61492cca59f9eac299
|
|
237
205
|
(Auto-open is disabled when authentication is enabled)
|
|
@@ -251,7 +219,9 @@ npx @modelcontextprotocol/inspector
|
|
|
251
219
|
|
|
252
220
|
## 赞助
|
|
253
221
|
|
|
254
|
-
|
|
222
|
+
如果你觉得文颜对你有帮助,可以给我家猫咪买点罐头 ❤️
|
|
223
|
+
|
|
224
|
+
[https://yuzhi.tech/sponsor](https://yuzhi.tech/sponsor)
|
|
255
225
|
|
|
256
226
|
## License
|
|
257
227
|
|
package/dist/index.js
CHANGED
|
@@ -9,10 +9,13 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
11
11
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
12
|
-
import { CallToolRequestSchema, ListToolsRequestSchema
|
|
12
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
13
13
|
import { getGzhContent } from "@wenyan-md/core/wrapper";
|
|
14
14
|
import { publishToDraft } from "@wenyan-md/core/publish";
|
|
15
15
|
import { themes } from "@wenyan-md/core/theme";
|
|
16
|
+
import { getNormalizeFilePath } from "./utils.js";
|
|
17
|
+
import fs from "node:fs/promises";
|
|
18
|
+
import path from "node:path";
|
|
16
19
|
/**
|
|
17
20
|
* Create an MCP server with capabilities for resources (to list/read notes),
|
|
18
21
|
* tools (to create new notes), and prompts (to summarize notes).
|
|
@@ -43,14 +46,18 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
43
46
|
properties: {
|
|
44
47
|
content: {
|
|
45
48
|
type: "string",
|
|
46
|
-
description: "The
|
|
49
|
+
description: "The Markdown text to publish. REQUIRED if 'file' is not provided. Preserves frontmatter if present.",
|
|
50
|
+
},
|
|
51
|
+
file: {
|
|
52
|
+
type: "string",
|
|
53
|
+
description: "The path to the Markdown file (absolute or relative). REQUIRED if 'content' is not provided.",
|
|
47
54
|
},
|
|
48
55
|
theme_id: {
|
|
49
56
|
type: "string",
|
|
50
57
|
description: "ID of the theme to use (e.g., default, orangeheart, rainbow, lapis, pie, maize, purple, phycat).",
|
|
51
58
|
},
|
|
52
59
|
},
|
|
53
|
-
required: ["content"],
|
|
60
|
+
anyOf: [{ required: ["content"] }, { required: ["file"] }],
|
|
54
61
|
},
|
|
55
62
|
},
|
|
56
63
|
{
|
|
@@ -58,7 +65,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
58
65
|
description: "List the themes compatible with the 'publish_article' tool to publish an article to '微信公众号'.",
|
|
59
66
|
inputSchema: {
|
|
60
67
|
type: "object",
|
|
61
|
-
properties: {}
|
|
68
|
+
properties: {},
|
|
62
69
|
},
|
|
63
70
|
},
|
|
64
71
|
],
|
|
@@ -74,12 +81,28 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
74
81
|
// level: "debug",
|
|
75
82
|
// data: JSON.stringify(request.params.arguments),
|
|
76
83
|
// });
|
|
77
|
-
|
|
84
|
+
let content = String(request.params.arguments?.content || "");
|
|
85
|
+
const file = String(request.params.arguments?.file || "");
|
|
78
86
|
const themeId = String(request.params.arguments?.theme_id || "");
|
|
87
|
+
let absoluteDirPath = undefined;
|
|
88
|
+
if (!content && file) {
|
|
89
|
+
const normalizePath = getNormalizeFilePath(file);
|
|
90
|
+
content = await fs.readFile(normalizePath, "utf-8");
|
|
91
|
+
absoluteDirPath = path.dirname(normalizePath);
|
|
92
|
+
}
|
|
93
|
+
if (!content) {
|
|
94
|
+
throw new Error("Missing content to publish");
|
|
95
|
+
}
|
|
79
96
|
const gzhContent = await getGzhContent(content, themeId, "solarized-light", true, true);
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
97
|
+
if (!gzhContent.title) {
|
|
98
|
+
throw new Error("未能找到文章标题");
|
|
99
|
+
}
|
|
100
|
+
if (!gzhContent.cover) {
|
|
101
|
+
throw new Error("未能找到文章封面");
|
|
102
|
+
}
|
|
103
|
+
const response = await publishToDraft(gzhContent.title, gzhContent.content, gzhContent.cover, {
|
|
104
|
+
relativePath: absoluteDirPath,
|
|
105
|
+
});
|
|
83
106
|
return {
|
|
84
107
|
content: [
|
|
85
108
|
{
|
|
@@ -95,7 +118,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
95
118
|
text: JSON.stringify({
|
|
96
119
|
id: theme.id,
|
|
97
120
|
name: theme.name,
|
|
98
|
-
description: theme.description
|
|
121
|
+
description: theme.description,
|
|
99
122
|
}),
|
|
100
123
|
}));
|
|
101
124
|
return {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getNormalizeFilePath(inputPath: string): string;
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
/**
|
|
3
|
+
* 路径标准化工具函数
|
|
4
|
+
* 将 Windows 的反斜杠 \ 转换为正斜杠 /,并去除末尾斜杠
|
|
5
|
+
* 目的:在 Linux 容器内也能正确处理 Windows 路径字符串
|
|
6
|
+
*/
|
|
7
|
+
function normalizePath(p) {
|
|
8
|
+
return p.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
9
|
+
}
|
|
10
|
+
export function getNormalizeFilePath(inputPath) {
|
|
11
|
+
const isContainer = !!process.env.CONTAINERIZED;
|
|
12
|
+
if (isContainer) {
|
|
13
|
+
const hostFilePath = normalizePath(process.env.HOST_FILE_PATH || "");
|
|
14
|
+
const containerFilePath = normalizePath(process.env.CONTAINER_FILE_PATH || "/mnt/host-downloads");
|
|
15
|
+
let relativePart = normalizePath(inputPath);
|
|
16
|
+
if (relativePart.startsWith(hostFilePath)) {
|
|
17
|
+
relativePart = relativePart.slice(hostFilePath.length);
|
|
18
|
+
}
|
|
19
|
+
if (!relativePart.startsWith("/")) {
|
|
20
|
+
relativePart = "/" + relativePart;
|
|
21
|
+
}
|
|
22
|
+
return containerFilePath + relativePart;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
return path.resolve(inputPath);
|
|
26
|
+
}
|
|
27
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wenyan-md/mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"description": "MCP server for Wenyan, a Markdown formatting tool that allows AI assistants to apply elegant built-in themes and publish articles directly to 微信公众号.",
|
|
5
5
|
"author": "Lei <caol64@gmail.com> (https://github.com/caol64)",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -31,18 +31,19 @@
|
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@modelcontextprotocol/sdk": "0.6.0",
|
|
34
|
-
"@wenyan-md/core": "^1.0.
|
|
34
|
+
"@wenyan-md/core": "^1.0.17"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@types/node": "^
|
|
38
|
-
"
|
|
39
|
-
"
|
|
37
|
+
"@types/node": "^24.3.0",
|
|
38
|
+
"dotenv-cli": "^10.0.0",
|
|
39
|
+
"openai": "^6.16.0",
|
|
40
|
+
"typescript": "^5.9.2"
|
|
40
41
|
},
|
|
41
42
|
"scripts": {
|
|
42
43
|
"build": "tsc",
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"test": "
|
|
44
|
+
"inspector": "pnpm build && dotenv -e .env.test -- node ./run-inspector.js",
|
|
45
|
+
"test:list": "pnpm build && dotenv -e .env.test -- node ./test/list.js",
|
|
46
|
+
"test:publish": "pnpm build && dotenv -e .env.test -- node ./test/publish.js",
|
|
46
47
|
"upgrade:core": "pnpm update @wenyan-md/core"
|
|
47
48
|
}
|
|
48
49
|
}
|