codex-skills-mcp 1.0.5 → 1.0.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 +155 -82
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -2
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +41 -17
- package/dist/index.js.map +1 -1
- package/dist/loader/index.d.ts +3 -0
- package/dist/loader/index.d.ts.map +1 -1
- package/dist/loader/index.js +12 -4
- package/dist/loader/index.js.map +1 -1
- package/dist/remote/github.d.ts +10 -2
- package/dist/remote/github.d.ts.map +1 -1
- package/dist/remote/github.js +206 -58
- package/dist/remote/github.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,80 +1,98 @@
|
|
|
1
1
|
# codex-skills-mcp
|
|
2
2
|
|
|
3
|
-
> 🧠 Codex-Skills 技能库的 MCP (Model Context Protocol) Server — 让任意 AI 编程工具都能检索、阅读和使用
|
|
3
|
+
> 🧠 Codex-Skills 技能库的 MCP (Model Context Protocol) Server — 让任意 AI 编程工具都能检索、阅读和使用 180+ 专业技能。
|
|
4
4
|
|
|
5
5
|
## 这是什么
|
|
6
6
|
|
|
7
7
|
一个独立的 MCP Server,为 [codex-skills](https://github.com/Zhan-ZhangZ/codex-skills) 技能库提供标准化的 AI 工具接入协议。
|
|
8
8
|
|
|
9
|
+
- **无需先下载全部技能文件**:启动只拉取轻量清单(约 108KB),技能全文按需加载;
|
|
10
|
+
- **180+ 技能、14 个分类**:技能库由专家在远端持续维护,用户端零操作;
|
|
11
|
+
- **内置国内网络加速**:自动回退链,国内网络免翻墙可用。
|
|
12
|
+
|
|
9
13
|
| 特性 | 说明 |
|
|
10
14
|
|------|------|
|
|
11
15
|
| **6 个 MCP Tools** | search_skills, read_skill, load_skill_file, list_skill_files, list_categories, plan_workflow |
|
|
12
16
|
| **三层渐进加载** | 检索(~500 tokens) → 阅读(~5K tokens) → 深入(按需) |
|
|
13
17
|
| **中文搜索优化** | CJK bigram 分词 + Leading Words 权重 |
|
|
14
18
|
| **零外部 AI 依赖** | 纯关键词搜索,不需要 embedding 模型 |
|
|
15
|
-
| **双传输模式** | stdio(本地)+ HTTP
|
|
19
|
+
| **双传输模式** | stdio(本地)+ HTTP(远程) |
|
|
20
|
+
| **自动网络加速** | GitHub 直连 → jsDelivr → gh-proxy.com → ghfast.top 四级回退 |
|
|
21
|
+
| **增量缓存** | 技能文件按大小比对断点续传,重复使用不重复下载 |
|
|
16
22
|
|
|
17
23
|
## 快速开始
|
|
18
24
|
|
|
19
|
-
### 1.
|
|
25
|
+
### 1. 远程模式(默认,零配置,推荐)
|
|
20
26
|
|
|
21
27
|
```bash
|
|
22
|
-
|
|
23
|
-
npm install
|
|
24
|
-
npm run build
|
|
28
|
+
npx -y codex-skills-mcp@latest
|
|
25
29
|
```
|
|
26
30
|
|
|
27
|
-
|
|
31
|
+
无需安装、无需指定任何路径。启动后自动完成:
|
|
28
32
|
|
|
29
|
-
|
|
33
|
+
1. 从远端技能库拉取清单 `skills_manifest.json`(约 108KB,仅首次);
|
|
34
|
+
2. 建立本地搜索索引(毫秒级);
|
|
35
|
+
3. 技能文件按需下载,缓存在当前目录 `.codex-skills-cache/`。
|
|
30
36
|
|
|
31
|
-
|
|
37
|
+
### 2. 本地模式(可选)
|
|
32
38
|
|
|
33
|
-
|
|
39
|
+
适用于离线开发或使用本地技能库副本:
|
|
34
40
|
|
|
35
|
-
|
|
41
|
+
```bash
|
|
42
|
+
cd codex-skills-mcp
|
|
43
|
+
npm install
|
|
44
|
+
npm run build
|
|
45
|
+
node dist/index.js --skills-dir /path/to/codex-skills
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 3. HTTP 模式(远程客户端)
|
|
36
49
|
|
|
37
50
|
```bash
|
|
51
|
+
# 远程模式:无需 --skills-dir,自动拉取远端技能库
|
|
52
|
+
node dist/index.js --http --port 3456
|
|
53
|
+
|
|
54
|
+
# 本地模式:加 --skills-dir 指定本地技能库
|
|
38
55
|
node dist/index.js --skills-dir /path/to/codex-skills --http --port 3456
|
|
39
56
|
```
|
|
40
57
|
|
|
41
|
-
|
|
42
|
-
```
|
|
43
|
-
[codex-skills-mcp] HTTP server running at http://localhost:3456/mcp
|
|
44
|
-
[codex-skills-mcp] Health check: http://localhost:3456/health
|
|
45
|
-
```
|
|
58
|
+
启动后:
|
|
46
59
|
|
|
47
|
-
|
|
60
|
+
- MCP 端点:`http://localhost:3456/mcp`(POST / GET / DELETE,支持 `mcp-session-id` 会话管理)
|
|
61
|
+
- 健康检查:`http://localhost:3456/health`
|
|
48
62
|
|
|
49
63
|
```bash
|
|
50
|
-
|
|
64
|
+
curl http://localhost:3456/health
|
|
65
|
+
# 预期输出
|
|
66
|
+
{"status":"ok","name":"codex-skills-mcp","version":"1.0.6","skills":181}
|
|
51
67
|
```
|
|
52
68
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
**Step 3:在 ChatGPT 桌面端添加 MCP Server**
|
|
69
|
+
## 客户端配置
|
|
56
70
|
|
|
57
|
-
|
|
58
|
-
2. 找到 **MCP Servers** / **Apps** 区域
|
|
59
|
-
3. 点击 **Add Server**
|
|
60
|
-
4. 填入 URL:`https://xxxx-xxxx.ngrok-free.app/mcp`
|
|
61
|
-
5. 保存,完成
|
|
71
|
+
### Codex / ChatGPT 桌面端(stdio)
|
|
62
72
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
**验证是否正常运行:**
|
|
73
|
+
**方式一:通过 CLI 快速添加(推荐)**
|
|
66
74
|
|
|
67
75
|
```bash
|
|
68
|
-
|
|
69
|
-
|
|
76
|
+
codex mcp add codex-skills -- npx -y codex-skills-mcp@latest
|
|
77
|
+
```
|
|
70
78
|
|
|
71
|
-
|
|
72
|
-
|
|
79
|
+
**方式二:编辑 `~/.codex/config.toml` 添加**
|
|
80
|
+
|
|
81
|
+
```toml
|
|
82
|
+
[mcp_servers.codex-skills]
|
|
83
|
+
command = "npx"
|
|
84
|
+
args = ["-y", "codex-skills-mcp@latest"]
|
|
73
85
|
```
|
|
74
86
|
|
|
75
|
-
|
|
87
|
+
若使用本地技能库副本,可改为:
|
|
76
88
|
|
|
77
|
-
|
|
89
|
+
```toml
|
|
90
|
+
[mcp_servers.codex-skills]
|
|
91
|
+
command = "node"
|
|
92
|
+
args = ["/path/to/codex-skills-mcp/dist/index.js", "--skills-dir", "/path/to/codex-skills"]
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Claude Desktop
|
|
78
96
|
|
|
79
97
|
编辑 `~/Library/Application Support/Claude/claude_desktop_config.json`:
|
|
80
98
|
|
|
@@ -82,20 +100,14 @@ curl http://localhost:3456/health
|
|
|
82
100
|
{
|
|
83
101
|
"mcpServers": {
|
|
84
102
|
"codex-skills": {
|
|
85
|
-
"command": "
|
|
86
|
-
"args": [
|
|
87
|
-
"/path/to/codex-skills-mcp/dist/index.js",
|
|
88
|
-
"--skills-dir",
|
|
89
|
-
"/path/to/codex-skills"
|
|
90
|
-
]
|
|
103
|
+
"command": "npx",
|
|
104
|
+
"args": ["-y", "codex-skills-mcp@latest"]
|
|
91
105
|
}
|
|
92
106
|
}
|
|
93
107
|
}
|
|
94
108
|
```
|
|
95
109
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
#### Cursor
|
|
110
|
+
### Cursor
|
|
99
111
|
|
|
100
112
|
编辑项目根目录 `.cursor/mcp.json`:
|
|
101
113
|
|
|
@@ -103,63 +115,98 @@ curl http://localhost:3456/health
|
|
|
103
115
|
{
|
|
104
116
|
"mcpServers": {
|
|
105
117
|
"codex-skills": {
|
|
106
|
-
"command": "
|
|
107
|
-
"args": [
|
|
108
|
-
"/path/to/codex-skills-mcp/dist/index.js",
|
|
109
|
-
"--skills-dir",
|
|
110
|
-
"/path/to/codex-skills"
|
|
111
|
-
]
|
|
118
|
+
"command": "npx",
|
|
119
|
+
"args": ["-y", "codex-skills-mcp@latest"]
|
|
112
120
|
}
|
|
113
121
|
}
|
|
114
122
|
}
|
|
115
123
|
```
|
|
116
124
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
#### Windsurf / VS Code + Copilot
|
|
125
|
+
### Windsurf / VS Code + Copilot
|
|
120
126
|
|
|
121
127
|
在 MCP 配置中添加同样的 command + args(stdio 模式)。
|
|
122
128
|
|
|
123
|
-
|
|
129
|
+
### 远程 HTTP 客户端
|
|
124
130
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
也可以通过环境变量指定技能库路径:
|
|
131
|
+
如果你的客户端需要以远程 HTTP 地址接入 MCP(例如 ChatGPT 桌面端集成场景):
|
|
128
132
|
|
|
129
133
|
```bash
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
134
|
+
node dist/index.js --http --port 3456
|
|
135
|
+
ngrok http 3456
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
将 `https://xxxx-xxxx.ngrok-free.app/mcp` 填入客户端的 MCP Server URL。
|
|
139
|
+
|
|
140
|
+
> 💡 ngrok 免费版每次重启会更换地址;需要固定地址可使用付费版或其他隧道工具(如 Cloudflare Tunnel)。
|
|
141
|
+
|
|
142
|
+
## 工作原理
|
|
143
|
+
|
|
144
|
+
```mermaid
|
|
145
|
+
flowchart LR
|
|
146
|
+
A["启动 MCP"] --> B["拉取清单 manifest + 建本地索引"]
|
|
147
|
+
B --> C["search_skills 秒出结果"]
|
|
148
|
+
C --> D["read_skill 按需拉取技能全文"]
|
|
149
|
+
D --> E["load_skill_file 按需读脚本/配置"]
|
|
150
|
+
E --> F["Agent 在本机执行"]
|
|
135
151
|
```
|
|
136
152
|
|
|
137
|
-
|
|
153
|
+
| 阶段 | 行为 | 耗时 |
|
|
154
|
+
|------|------|------|
|
|
155
|
+
| 启动 | 拉取/加载清单 + 建索引 | 秒级 |
|
|
156
|
+
| 搜索 | 本地索引关键词打分 | 毫秒级 |
|
|
157
|
+
| 取技能 | 2 次 GitHub API 列出文件 → 并发下载缺失文件 | 首次数秒,之后走缓存 |
|
|
158
|
+
|
|
159
|
+
### 网络加速回退链
|
|
138
160
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
161
|
+
所有远端文件请求按顺序自动回退,无需任何参数:
|
|
162
|
+
|
|
163
|
+
1. **GitHub 官方直连**(3 秒超时);
|
|
164
|
+
2. **jsDelivr CDN**(10 秒超时,国内有节点);
|
|
165
|
+
3. **gh-proxy.com**(10 秒超时);
|
|
166
|
+
4. **ghfast.top**(10 秒超时)。
|
|
167
|
+
|
|
168
|
+
前一个节点失败时自动降级到下一个;全部失败才会报错。
|
|
169
|
+
|
|
170
|
+
### 缓存与增量同步
|
|
171
|
+
|
|
172
|
+
- 清单与技能文件缓存在当前目录 `.codex-skills-cache/`,二次启动秒级完成;
|
|
173
|
+
- 每个技能带 `.codex-skills.tree.json` 标记(文件列表 + 完成状态);
|
|
174
|
+
- 已完整下载的技能直接本地读取,不重复请求远端;
|
|
175
|
+
- 中断的下载支持断点续传:按文件大小比对,只补拉缺失/不完整的文件;
|
|
176
|
+
- 技能文件并发下载,默认 16(可用 `--download-concurrency` 调整);
|
|
177
|
+
- 需要强制同步远端最新内容时,删除 `.codex-skills-cache/` 后重启即可。
|
|
143
178
|
|
|
144
179
|
## MCP Tools
|
|
145
180
|
|
|
146
181
|
### 🔍 search_skills
|
|
147
|
-
|
|
182
|
+
|
|
183
|
+
搜索技能库,Agent 的主入口。
|
|
148
184
|
|
|
149
185
|
```
|
|
150
186
|
input: { query: "前端性能优化", category?: "01_代码工程与架构", limit?: 8 }
|
|
151
|
-
output:
|
|
187
|
+
output: 按相关度排序的技能列表(名称、分类、分数、描述)
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### 📋 list_categories
|
|
191
|
+
|
|
192
|
+
列出所有技能分类和数量。
|
|
193
|
+
|
|
194
|
+
```
|
|
195
|
+
input: {}
|
|
196
|
+
output: 14 个分类 + 各自的技能数量
|
|
152
197
|
```
|
|
153
198
|
|
|
154
199
|
### 📖 read_skill
|
|
155
|
-
|
|
200
|
+
|
|
201
|
+
读取技能的完整指令(SKILL.md)+ 文件结构 + 环境依赖 + 子技能。
|
|
156
202
|
|
|
157
203
|
```
|
|
158
204
|
input: { name: "MediaCrawler" }
|
|
159
|
-
output: { instructions, structure, dependencies }
|
|
205
|
+
output: { instructions, structure, dependencies, sub_skills }
|
|
160
206
|
```
|
|
161
207
|
|
|
162
208
|
### 📂 load_skill_file
|
|
209
|
+
|
|
163
210
|
按需读取技能内的任意文件。
|
|
164
211
|
|
|
165
212
|
```
|
|
@@ -167,23 +214,19 @@ input: { skill_name: "KrillinAI", file_path: "README.md" }
|
|
|
167
214
|
output: { content, size_bytes }
|
|
168
215
|
```
|
|
169
216
|
|
|
217
|
+
> 单文件上限 500KB;二进制文件返回占位说明而非内容;路径穿越会自动拦截。
|
|
218
|
+
|
|
170
219
|
### 🗂️ list_skill_files
|
|
220
|
+
|
|
171
221
|
浏览技能的文件树(不读内容)。
|
|
172
222
|
|
|
173
223
|
```
|
|
174
|
-
input: { skill_name: "remotion-skills", path?: "src", max_depth?:
|
|
224
|
+
input: { skill_name: "remotion-skills", path?: "src", max_depth?: 2 }
|
|
175
225
|
output: 目录树
|
|
176
226
|
```
|
|
177
227
|
|
|
178
|
-
### 📋 list_categories
|
|
179
|
-
列出所有技能分类和数量。
|
|
180
|
-
|
|
181
|
-
```
|
|
182
|
-
input: {}
|
|
183
|
-
output: 14 个分类 + 各自的技能数量
|
|
184
|
-
```
|
|
185
|
-
|
|
186
228
|
### 🔗 plan_workflow
|
|
229
|
+
|
|
187
230
|
给定任务描述,推荐可组合使用的技能。
|
|
188
231
|
|
|
189
232
|
```
|
|
@@ -208,12 +251,42 @@ Agent → load_skill_file("KrillinAI", "README.md")
|
|
|
208
251
|
Agent → 按 SKILL.md 指令执行任务
|
|
209
252
|
```
|
|
210
253
|
|
|
254
|
+
## 配置参考
|
|
255
|
+
|
|
256
|
+
| 参数 | 默认值 | 说明 |
|
|
257
|
+
|------|--------|------|
|
|
258
|
+
| `--skills-dir <path>` | - | 本地技能库目录(指定后进入本地模式) |
|
|
259
|
+
| `--local` | - | 强制本地模式(从 cwd 或 `--skills-dir` 查找清单) |
|
|
260
|
+
| `--github-repo` | `Zhan-ZhangZ/codexprojec` | 远端技能库仓库 |
|
|
261
|
+
| `--github-branch` | `main-lite` | 远端分支 |
|
|
262
|
+
| `--github-path` | `codex-skills` | 技能库在仓库内的目录 |
|
|
263
|
+
| `--github-token` | 自动从 git 凭据 / `GITHUB_TOKEN` 获取 | GitHub API 鉴权 |
|
|
264
|
+
| `--http` | - | 启动 HTTP 模式 |
|
|
265
|
+
| `--port` | `3456` | HTTP 端口 |
|
|
266
|
+
| `--download-concurrency` | `16` | 技能文件并发下载数 |
|
|
267
|
+
| `--cn-mirror` | - | ⚠️ 已废弃(兼容保留):网络加速现为自动回退链,此参数不再生效 |
|
|
268
|
+
|
|
269
|
+
环境变量:`CODEX_SKILLS_DIR`(本地技能库路径)、`GITHUB_TOKEN`、`CODEX_SKILLS_DOWNLOAD_CONCURRENCY`。
|
|
270
|
+
|
|
271
|
+
技能库清单(`skills_manifest.json`)为 JSON 数组,每项包含 `name` / `description` / `category` / `folder` / `relative_path` 五个字段。
|
|
272
|
+
|
|
273
|
+
## 常见问题
|
|
274
|
+
|
|
275
|
+
| 问题 | 处理 |
|
|
276
|
+
|------|------|
|
|
277
|
+
| npx 首次运行较慢 | 首次需下载 npm 包 + 拉取清单,属正常;之后走缓存 |
|
|
278
|
+
| 日志出现 `Network warning` | 当前加速节点失败,自动降级到下一个,可忽略 |
|
|
279
|
+
| 想强制更新技能内容 | 删除 `.codex-skills-cache/` 后重启 |
|
|
280
|
+
| `load_skill_file` 读大文件失败 | 单文件上限 500KB,属保护设计 |
|
|
281
|
+
| GitHub API 限流 | 每个技能仅 2 次 API 调用,已缓存技能不再请求;未登录配额 60 次/小时 |
|
|
282
|
+
| 工具列表里看不到 MCP | 客户端未重启,重启会话即可 |
|
|
283
|
+
|
|
211
284
|
## 技术栈
|
|
212
285
|
|
|
213
286
|
- TypeScript + ESM
|
|
214
287
|
- `@modelcontextprotocol/sdk` v1.12+
|
|
215
|
-
- `express`
|
|
216
|
-
- `zod` 运行时 schema 验证
|
|
288
|
+
- `express` v5(仅 HTTP 模式)
|
|
289
|
+
- `zod` v3 运行时 schema 验证
|
|
217
290
|
- Node.js 18+
|
|
218
291
|
|
|
219
292
|
## License
|
package/dist/config.d.ts
CHANGED
|
@@ -7,6 +7,9 @@ export interface Config {
|
|
|
7
7
|
githubPath: string;
|
|
8
8
|
githubToken?: string;
|
|
9
9
|
useCnMirror: boolean;
|
|
10
|
+
downloadConcurrency: number;
|
|
11
|
+
/** Manifest cache TTL in milliseconds. Default 24 hours. 0 = never refresh. */
|
|
12
|
+
manifestTTL: number;
|
|
10
13
|
}
|
|
11
14
|
/**
|
|
12
15
|
* Parse config from CLI args and env vars.
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,WAAW,EAAE,MAAM,CAAC;CACrB;AAuBD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAoGlD;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,EAAE,CAGlE"}
|
package/dist/config.js
CHANGED
|
@@ -6,7 +6,7 @@ import { execSync } from "node:child_process";
|
|
|
6
6
|
*/
|
|
7
7
|
function getGitGithubToken() {
|
|
8
8
|
try {
|
|
9
|
-
const output = execSync('
|
|
9
|
+
const output = execSync('printf "protocol=https\nhost=github.com\n" | git credential fill', {
|
|
10
10
|
encoding: "utf-8",
|
|
11
11
|
stdio: ["pipe", "pipe", "ignore"]
|
|
12
12
|
});
|
|
@@ -83,6 +83,18 @@ export function parseConfig(args) {
|
|
|
83
83
|
process.exit(1);
|
|
84
84
|
}
|
|
85
85
|
const useCnMirror = args.includes("--cn-mirror");
|
|
86
|
+
// Manifest cache TTL (default: 24 hours). --manifest-ttl <seconds> or 0 to disable.
|
|
87
|
+
const ttlArg = getArg("--manifest-ttl");
|
|
88
|
+
const manifestTTL = ttlArg !== undefined ? parseInt(ttlArg, 10) * 1000 : 24 * 60 * 60 * 1000;
|
|
89
|
+
// Concurrent downloads for skill files (default 16). Configurable via
|
|
90
|
+
// --download-concurrency <n> or CODEX_SKILLS_DOWNLOAD_CONCURRENCY env var.
|
|
91
|
+
const concurrencyArg = getArg("--download-concurrency");
|
|
92
|
+
const concurrencyEnv = process.env.CODEX_SKILLS_DOWNLOAD_CONCURRENCY;
|
|
93
|
+
const downloadConcurrency = parseInt(concurrencyArg || concurrencyEnv || "16", 10);
|
|
94
|
+
if (!Number.isInteger(downloadConcurrency) || downloadConcurrency < 1) {
|
|
95
|
+
console.error("Error: --download-concurrency must be a positive integer");
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
86
98
|
return {
|
|
87
99
|
skillsDir,
|
|
88
100
|
manifestPath,
|
|
@@ -91,7 +103,9 @@ export function parseConfig(args) {
|
|
|
91
103
|
githubBranch,
|
|
92
104
|
githubPath,
|
|
93
105
|
githubToken,
|
|
94
|
-
useCnMirror
|
|
106
|
+
useCnMirror,
|
|
107
|
+
downloadConcurrency,
|
|
108
|
+
manifestTTL
|
|
95
109
|
};
|
|
96
110
|
}
|
|
97
111
|
export function loadManifest(manifestPath) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
* library via the Model Context Protocol (MCP).
|
|
7
7
|
*
|
|
8
8
|
* Supports two transport modes:
|
|
9
|
-
* 1. stdio (default) — for Claude Desktop, Cursor, Windsurf etc.
|
|
10
|
-
* 2. HTTP (--http) — for
|
|
9
|
+
* 1. stdio (default) — for Codex, ChatGPT, Claude Desktop, Cursor, Windsurf etc.
|
|
10
|
+
* 2. HTTP (--http) — for remote clients or Streamable HTTP connections
|
|
11
11
|
*
|
|
12
12
|
* Usage:
|
|
13
13
|
* # stdio mode (default)
|
|
14
14
|
* node dist/index.js --skills-dir /path/to/codex-skills
|
|
15
15
|
*
|
|
16
|
-
* # HTTP mode (for
|
|
16
|
+
* # HTTP mode (for remote connections or HTTP clients)
|
|
17
17
|
* node dist/index.js --skills-dir /path/to/codex-skills --http --port 3456
|
|
18
18
|
*/
|
|
19
19
|
export {};
|
package/dist/index.js
CHANGED
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
* library via the Model Context Protocol (MCP).
|
|
7
7
|
*
|
|
8
8
|
* Supports two transport modes:
|
|
9
|
-
* 1. stdio (default) — for Claude Desktop, Cursor, Windsurf etc.
|
|
10
|
-
* 2. HTTP (--http) — for
|
|
9
|
+
* 1. stdio (default) — for Codex, ChatGPT, Claude Desktop, Cursor, Windsurf etc.
|
|
10
|
+
* 2. HTTP (--http) — for remote clients or Streamable HTTP connections
|
|
11
11
|
*
|
|
12
12
|
* Usage:
|
|
13
13
|
* # stdio mode (default)
|
|
14
14
|
* node dist/index.js --skills-dir /path/to/codex-skills
|
|
15
15
|
*
|
|
16
|
-
* # HTTP mode (for
|
|
16
|
+
* # HTTP mode (for remote connections or HTTP clients)
|
|
17
17
|
* node dist/index.js --skills-dir /path/to/codex-skills --http --port 3456
|
|
18
18
|
*/
|
|
19
19
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
@@ -31,7 +31,7 @@ import { registerPlanWorkflow } from "./tools/plan-workflow.js";
|
|
|
31
31
|
function createServer(searchEngine, loader) {
|
|
32
32
|
const server = new McpServer({
|
|
33
33
|
name: "codex-skills",
|
|
34
|
-
version: "1.0.
|
|
34
|
+
version: "1.0.7",
|
|
35
35
|
});
|
|
36
36
|
registerSearchSkills(server, searchEngine);
|
|
37
37
|
registerListCategories(server, searchEngine);
|
|
@@ -53,28 +53,50 @@ async function startHTTP(searchEngine, loader, port) {
|
|
|
53
53
|
const { default: express } = await import("express");
|
|
54
54
|
const app = express();
|
|
55
55
|
app.use(express.json());
|
|
56
|
-
//
|
|
57
|
-
const
|
|
56
|
+
// Session management with activity tracking for timeout cleanup
|
|
57
|
+
const SESSION_TTL_MS = 30 * 60 * 1000; // 30 minutes idle timeout
|
|
58
|
+
const sessions = new Map();
|
|
59
|
+
/** Touch session activity timestamp */
|
|
60
|
+
function touchSession(sid) {
|
|
61
|
+
const entry = sessions.get(sid);
|
|
62
|
+
if (entry)
|
|
63
|
+
entry.lastActivity = Date.now();
|
|
64
|
+
}
|
|
65
|
+
// Periodic cleanup of idle sessions (every 5 minutes)
|
|
66
|
+
setInterval(() => {
|
|
67
|
+
const now = Date.now();
|
|
68
|
+
for (const [sid, entry] of sessions) {
|
|
69
|
+
if (now - entry.lastActivity > SESSION_TTL_MS) {
|
|
70
|
+
console.error(`[codex-skills-mcp] Evicting idle session: ${sid.substring(0, 8)}...`);
|
|
71
|
+
try {
|
|
72
|
+
entry.transport.close?.();
|
|
73
|
+
}
|
|
74
|
+
catch { /* ignore */ }
|
|
75
|
+
sessions.delete(sid);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}, 5 * 60 * 1000).unref(); // unref so it doesn't prevent process exit
|
|
58
79
|
// MCP endpoint — handles POST (messages) and GET (SSE stream) and DELETE (session close)
|
|
59
80
|
app.post("/mcp", async (req, res) => {
|
|
60
81
|
const sessionId = req.headers["mcp-session-id"];
|
|
61
82
|
let transport;
|
|
62
|
-
if (sessionId &&
|
|
63
|
-
transport =
|
|
83
|
+
if (sessionId && sessions.has(sessionId)) {
|
|
84
|
+
transport = sessions.get(sessionId).transport;
|
|
85
|
+
touchSession(sessionId);
|
|
64
86
|
}
|
|
65
87
|
else {
|
|
66
88
|
// New session
|
|
67
89
|
transport = new StreamableHTTPServerTransport({
|
|
68
90
|
sessionIdGenerator: () => crypto.randomUUID(),
|
|
69
91
|
onsessioninitialized: (sid) => {
|
|
70
|
-
|
|
92
|
+
sessions.set(sid, { transport, lastActivity: Date.now() });
|
|
71
93
|
console.error(`[codex-skills-mcp] New session: ${sid}`);
|
|
72
94
|
},
|
|
73
95
|
});
|
|
74
96
|
transport.onclose = () => {
|
|
75
97
|
const sid = transport.sessionId;
|
|
76
98
|
if (sid)
|
|
77
|
-
|
|
99
|
+
sessions.delete(sid);
|
|
78
100
|
};
|
|
79
101
|
// Each session gets its own server instance
|
|
80
102
|
const server = createServer(searchEngine, loader);
|
|
@@ -85,20 +107,21 @@ async function startHTTP(searchEngine, loader, port) {
|
|
|
85
107
|
// GET endpoint for SSE stream (needed by some clients)
|
|
86
108
|
app.get("/mcp", async (req, res) => {
|
|
87
109
|
const sessionId = req.headers["mcp-session-id"];
|
|
88
|
-
if (!sessionId || !
|
|
110
|
+
if (!sessionId || !sessions.has(sessionId)) {
|
|
89
111
|
res.status(400).json({ error: "Invalid or missing session ID" });
|
|
90
112
|
return;
|
|
91
113
|
}
|
|
92
|
-
|
|
114
|
+
touchSession(sessionId);
|
|
115
|
+
const transport = sessions.get(sessionId).transport;
|
|
93
116
|
await transport.handleRequest(req, res);
|
|
94
117
|
});
|
|
95
118
|
// DELETE endpoint for session cleanup
|
|
96
119
|
app.delete("/mcp", async (req, res) => {
|
|
97
120
|
const sessionId = req.headers["mcp-session-id"];
|
|
98
|
-
if (sessionId &&
|
|
99
|
-
const transport =
|
|
121
|
+
if (sessionId && sessions.has(sessionId)) {
|
|
122
|
+
const transport = sessions.get(sessionId).transport;
|
|
100
123
|
await transport.handleRequest(req, res);
|
|
101
|
-
|
|
124
|
+
sessions.delete(sessionId);
|
|
102
125
|
}
|
|
103
126
|
else {
|
|
104
127
|
res.status(200).end();
|
|
@@ -109,15 +132,16 @@ async function startHTTP(searchEngine, loader, port) {
|
|
|
109
132
|
res.json({
|
|
110
133
|
status: "ok",
|
|
111
134
|
name: "codex-skills-mcp",
|
|
112
|
-
version: "1.0.
|
|
135
|
+
version: "1.0.7",
|
|
113
136
|
skills: searchEngine.getCategories().reduce((s, c) => s + c.skill_count, 0),
|
|
137
|
+
activeSessions: sessions.size,
|
|
114
138
|
});
|
|
115
139
|
});
|
|
116
140
|
console.error("[codex-skills-mcp] 6 tools registered, starting HTTP server...");
|
|
117
141
|
app.listen(port, () => {
|
|
118
142
|
console.error(`[codex-skills-mcp] HTTP server running at http://localhost:${port}/mcp`);
|
|
119
143
|
console.error(`[codex-skills-mcp] Health check: http://localhost:${port}/health`);
|
|
120
|
-
console.error(`[codex-skills-mcp] For
|
|
144
|
+
console.error(`[codex-skills-mcp] For remote clients: use ngrok or similar to expose this endpoint`);
|
|
121
145
|
});
|
|
122
146
|
}
|
|
123
147
|
async function main() {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAEnG,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,SAAS,YAAY,CACnB,YAA+B,EAC/B,MAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,oBAAoB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3C,sBAAsB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC7C,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAChD,qBAAqB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IACpD,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IACrD,oBAAoB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAE3C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,YAA+B,EAC/B,MAAmB;IAEnB,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAElD,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;IAEjF,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;AAC9D,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,YAA+B,EAC/B,MAAmB,EACnB,IAAY;IAEZ,wDAAwD;IACxD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAErD,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/loader/index.d.ts
CHANGED
|
@@ -31,7 +31,10 @@ export declare class SkillLoader {
|
|
|
31
31
|
private config;
|
|
32
32
|
private manifest;
|
|
33
33
|
private skillsDir;
|
|
34
|
+
private _ensureSkillFetched;
|
|
34
35
|
constructor(config: Config, manifest: ManifestEntry[]);
|
|
36
|
+
/** Lazy-load remote module only when needed */
|
|
37
|
+
private ensureRemoteFetched;
|
|
35
38
|
/**
|
|
36
39
|
* Resolve the absolute filesystem path for a skill.
|
|
37
40
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/loader/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/loader/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,UAAU,EAAE,YAAY,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,cAAc,CAAC;IAC1B,YAAY,EAAE,iBAAiB,CAAC;CACjC;AAYD;;GAEG;AACH,qBAAa,WAAW;IAKpB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IALlB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,mBAAmB,CAA0E;gBAG3F,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,aAAa,EAAE;IAKnC,+CAA+C;YACjC,mBAAmB;IAQjC;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM;IAM9C;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAyB/D;;OAEG;IACH,aAAa,CACX,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,aAAa,EACpB,QAAQ,GAAE,MAAU,GACnB,cAAc;IAUjB,OAAO,CAAC,aAAa;IA+CrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAuCrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8C1B;;OAEG;IACG,aAAa,CACjB,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAiDnD;;OAEG;IACG,cAAc,CAClB,KAAK,EAAE,aAAa,EACpB,OAAO,GAAE,MAAW,EACpB,QAAQ,GAAE,MAAU,GACnB,OAAO,CAAC,QAAQ,EAAE,CAAC;CAmBvB"}
|
package/dist/loader/index.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { readFileSync, readdirSync, statSync, existsSync } from "node:fs";
|
|
2
2
|
import { resolve, join, relative, extname } from "node:path";
|
|
3
|
-
import { ensureSkillFetched } from "../remote/github.js";
|
|
4
3
|
// Files/dirs to skip when scanning structure
|
|
5
4
|
const SKIP_NAMES = new Set([
|
|
6
5
|
"node_modules", ".git", ".github", "__pycache__",
|
|
@@ -16,11 +15,20 @@ export class SkillLoader {
|
|
|
16
15
|
config;
|
|
17
16
|
manifest;
|
|
18
17
|
skillsDir;
|
|
18
|
+
_ensureSkillFetched = null;
|
|
19
19
|
constructor(config, manifest) {
|
|
20
20
|
this.config = config;
|
|
21
21
|
this.manifest = manifest;
|
|
22
22
|
this.skillsDir = config.skillsDir;
|
|
23
23
|
}
|
|
24
|
+
/** Lazy-load remote module only when needed */
|
|
25
|
+
async ensureRemoteFetched(entry) {
|
|
26
|
+
if (!this._ensureSkillFetched) {
|
|
27
|
+
const { ensureSkillFetched } = await import("../remote/github.js");
|
|
28
|
+
this._ensureSkillFetched = ensureSkillFetched;
|
|
29
|
+
}
|
|
30
|
+
await this._ensureSkillFetched(this.config, entry);
|
|
31
|
+
}
|
|
24
32
|
/**
|
|
25
33
|
* Resolve the absolute filesystem path for a skill.
|
|
26
34
|
*/
|
|
@@ -34,7 +42,7 @@ export class SkillLoader {
|
|
|
34
42
|
*/
|
|
35
43
|
async readSkill(entry) {
|
|
36
44
|
if (this.config.isRemote) {
|
|
37
|
-
await
|
|
45
|
+
await this.ensureRemoteFetched(entry);
|
|
38
46
|
}
|
|
39
47
|
const skillPath = this.resolveSkillPath(entry);
|
|
40
48
|
// Read SKILL.md
|
|
@@ -188,7 +196,7 @@ export class SkillLoader {
|
|
|
188
196
|
*/
|
|
189
197
|
async loadSkillFile(entry, filePath) {
|
|
190
198
|
if (this.config.isRemote) {
|
|
191
|
-
await
|
|
199
|
+
await this.ensureRemoteFetched(entry);
|
|
192
200
|
}
|
|
193
201
|
const skillPath = this.resolveSkillPath(entry);
|
|
194
202
|
const fullPath = resolve(skillPath, filePath);
|
|
@@ -229,7 +237,7 @@ export class SkillLoader {
|
|
|
229
237
|
*/
|
|
230
238
|
async listSkillFiles(entry, subPath = "", maxDepth = 2) {
|
|
231
239
|
if (this.config.isRemote) {
|
|
232
|
-
await
|
|
240
|
+
await this.ensureRemoteFetched(entry);
|
|
233
241
|
}
|
|
234
242
|
const skillPath = this.resolveSkillPath(entry);
|
|
235
243
|
const targetPath = subPath ? resolve(skillPath, subPath) : skillPath;
|
package/dist/loader/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/loader/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/loader/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiC7D,6CAA6C;AAC7C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa;IAChD,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IACpC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ;CACnC,CAAC,CAAC;AAEH,sDAAsD;AACtD,MAAM,aAAa,GAAG,GAAG,GAAG,IAAI,CAAC;AAEjC;;GAEG;AACH,MAAM,OAAO,WAAW;IAKZ;IACA;IALF,SAAS,CAAS;IAClB,mBAAmB,GAAqE,IAAI,CAAC;IAErG,YACU,MAAc,EACd,QAAyB;QADzB,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAiB;QAEjC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACpC,CAAC;IAED,+CAA+C;IACvC,KAAK,CAAC,mBAAmB,CAAC,KAAoB;QACpD,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC9B,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;YACnE,IAAI,CAAC,mBAAmB,GAAG,kBAAkB,CAAC;QAChD,CAAC;QACD,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,KAAoB;QACnC,qEAAqE;QACrE,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACzD,OAAO,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,KAAoB;QAClC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAE/C,gBAAgB;QAChB,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAChD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,YAAY,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,YAAY,GAAG,0BAA0B,KAAK,CAAC,IAAI,qBAAqB,KAAK,CAAC,WAAW,EAAE,CAAC;QAC9F,CAAC;QAED,iBAAiB;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAEvD,sBAAsB;QACtB,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAExD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,aAAa,CACX,OAAe,EACf,KAAoB,EACpB,WAAmB,CAAC;QAEpB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;QAEvD,kDAAkD;QAClD,MAAM,SAAS,GAAmB,EAAE,CAAC;QACrC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAEhD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IAC1C,CAAC;IAEO,aAAa,CACnB,OAAe,EACf,YAAoB,EACpB,QAAgB;QAEhB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,CAAC;QAEpC,MAAM,KAAK,GAAe,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAE9D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,SAAS;gBACzC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;oBAAE,SAAS;gBAE1E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAE3C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,MAAM,IAAI,GAAa;wBACrB,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,IAAI,EAAE,WAAW;qBAClB,CAAC;oBACF,IAAI,YAAY,GAAG,QAAQ,EAAE,CAAC;wBAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;oBAC3E,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;qBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;oBAC1B,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;wBAChC,KAAK,CAAC,IAAI,CAAC;4BACT,IAAI,EAAE,KAAK,CAAC,IAAI;4BAChB,IAAI,EAAE,MAAM;4BACZ,UAAU,EAAE,IAAI,CAAC,IAAI;yBACtB,CAAC,CAAC;oBACL,CAAC;oBAAC,MAAM,CAAC;wBACP,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBACjD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,aAAa,CACnB,QAAgB,EAChB,WAAmB,EACnB,OAAuB,EACvB,QAAgB,CAAC;QAEjB,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO;QAEtB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAElE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;oBAAE,SAAS;gBACnC,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAEzC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBAE5C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC3B,mDAAmD;oBACnD,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBAClD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;oBAC/D,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;oBAEtE,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;wBAClD,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;wBAChC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;qBAClD,CAAC,CAAC;gBACL,CAAC;gBAED,iBAAiB;gBACjB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,SAAiB;QAC1C,SAAS;QACT,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC;YACpD,OAAO;gBACL,QAAQ,EAAE,QAAQ;gBAClB,eAAe,EAAE,KAAK;gBACtB,aAAa,EAAE,iCAAiC;aACjD,CAAC;QACJ,CAAC;QACD,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;YAClD,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;gBAC3C,OAAO;oBACL,QAAQ,EAAE,QAAQ;oBAClB,eAAe,EAAE,IAAI;oBACrB,aAAa,EAAE,SAAS;iBACzB,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,QAAQ,EAAE,QAAQ;gBAClB,eAAe,EAAE,KAAK;gBACtB,aAAa,EAAE,eAAe;aAC/B,CAAC;QACJ,CAAC;QAED,UAAU;QACV,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YAChD,OAAO;gBACL,QAAQ,EAAE,uBAAuB;gBACjC,eAAe,EAAE,KAAK;gBACtB,aAAa,EAAE,aAAa;aAC7B,CAAC;QACJ,CAAC;QAED,KAAK;QACL,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;YAC1C,OAAO;gBACL,QAAQ,EAAE,IAAI;gBACd,eAAe,EAAE,QAAQ;gBACzB,aAAa,EAAE,iBAAiB;aACjC,CAAC;QACJ,CAAC;QAED,uCAAuC;QACvC,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CACjB,KAAoB,EACpB,QAAgB;QAEhB,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAE9C,mEAAmE;QACnE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAClF,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAChC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,GAAG,aAAa,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,mBAAmB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,aAAa,aAAa,GAAG,IAAI,IAAI,CACrF,CAAC;QACJ,CAAC;QAED,kBAAkB;QAClB,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;YACzB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;YAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;YACjC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK;YAC5B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ;YAC/B,MAAM,EAAE,MAAM,EAAE,OAAO;SACxB,CAAC,CAAC;QAEH,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE,iBAAiB,QAAQ,KAAK,IAAI,CAAC,IAAI,UAAU;gBAC1D,UAAU,EAAE,IAAI,CAAC,IAAI;aACtB,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,KAAoB,EACpB,UAAkB,EAAE,EACpB,WAAmB,CAAC;QAEpB,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAErE,iBAAiB;QACjB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;CACF"}
|
package/dist/remote/github.d.ts
CHANGED
|
@@ -4,11 +4,19 @@ import type { Config, ManifestEntry } from "../config.js";
|
|
|
4
4
|
*/
|
|
5
5
|
export declare function initRemote(config: Config): Promise<void>;
|
|
6
6
|
/**
|
|
7
|
-
* Download the manifest file
|
|
7
|
+
* Download the manifest file, or refresh it if stale (older than config.manifestTTL).
|
|
8
8
|
*/
|
|
9
9
|
export declare function fetchManifest(config: Config): Promise<void>;
|
|
10
10
|
/**
|
|
11
|
-
* Ensure a skill's directory is downloaded and cached
|
|
11
|
+
* Ensure a skill's directory is downloaded and cached.
|
|
12
|
+
*
|
|
13
|
+
* - Listing uses only 2 API calls (parent contents + recursive subtree tree),
|
|
14
|
+
* never the full repository tree, so huge repos stay within GitHub limits.
|
|
15
|
+
* - Downloads run concurrently and skip files already cached with the right size.
|
|
16
|
+
* - A `.codex-skills.tree.json` marker records the file list + completion state,
|
|
17
|
+
* so an interrupted download resumes on the next call instead of being
|
|
18
|
+
* silently treated as complete.
|
|
19
|
+
* - Concurrent calls for the same skill are deduplicated via a promise lock.
|
|
12
20
|
*/
|
|
13
21
|
export declare function ensureSkillFetched(config: Config, entry: ManifestEntry): Promise<void>;
|
|
14
22
|
//# sourceMappingURL=github.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/remote/github.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/remote/github.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAkR1D;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9D;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBjE;AAKD;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAoC5F"}
|
package/dist/remote/github.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { writeFileSync, existsSync, mkdirSync } from "node:fs";
|
|
2
|
-
import { resolve, dirname } from "node:path";
|
|
1
|
+
import { writeFileSync, existsSync, mkdirSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { resolve, dirname, join, basename } from "node:path";
|
|
3
|
+
/** Metadata marker written inside each cached skill directory */
|
|
4
|
+
const TREE_CACHE_FILE = ".codex-skills.tree.json";
|
|
3
5
|
/**
|
|
4
6
|
* Fetch with timeout using AbortController
|
|
5
7
|
*/
|
|
@@ -87,6 +89,120 @@ async function fetchRawWithFallback(config, path) {
|
|
|
87
89
|
}
|
|
88
90
|
throw new Error(`All download nodes failed to fetch ${path}. Network error: ${lastError?.message}\n\n【网络兜底提示】您的网络环境极其恶劣,所有的直连与免翻墙加速节点均已失效。为了保证技能库的稳定拉取,建议您配置科学上网环境。推荐服务:https://a.xn--30rs3b33gl8gq9hj52b.com/#/register?code=4uq59ogs (该服务极具性价比,最便宜每月200G流量一年仅需13.99元)`);
|
|
89
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Build the remote repo path of a skill directory, e.g.
|
|
94
|
+
* "codex-skills/00_全局大管家/12_学术论文与科研图表/nature-skills"
|
|
95
|
+
*/
|
|
96
|
+
function buildSkillRemotePath(config, relPath) {
|
|
97
|
+
let prefix = config.githubPath ? `${config.githubPath}/${relPath}` : relPath;
|
|
98
|
+
prefix = prefix.replace(/^\.\//, "").replace(/^\/+/, "").replace(/\/+$/, "");
|
|
99
|
+
return prefix;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* List a skill's files with exactly 2 GitHub API calls (never the full repo tree):
|
|
103
|
+
* 1. contents(parent dir) -> locate the skill dir and get its tree SHA
|
|
104
|
+
* 2. git/trees/{sha}?recursive=1 -> all blobs of that single skill subtree, with sizes
|
|
105
|
+
*/
|
|
106
|
+
async function fetchSkillTree(config, relPath) {
|
|
107
|
+
const segments = relPath.split("/").filter(Boolean);
|
|
108
|
+
const dirName = segments[segments.length - 1];
|
|
109
|
+
const parentPath = segments.slice(0, -1).join("/");
|
|
110
|
+
const parentRemotePath = buildSkillRemotePath(config, parentPath);
|
|
111
|
+
const apiBase = `https://api.github.com/repos/${config.githubRepo}/`;
|
|
112
|
+
// STEP 1: find the skill directory's tree SHA from its parent listing
|
|
113
|
+
const contentsRes = await fetchWithAuth(`${apiBase}contents/${parentRemotePath}?ref=${config.githubBranch}`, config.githubToken, 10000);
|
|
114
|
+
const contents = (await contentsRes.json());
|
|
115
|
+
if (Array.isArray(contents)) {
|
|
116
|
+
const dir = contents.find((item) => item.name === dirName && item.type === "dir");
|
|
117
|
+
if (!dir || !dir.sha) {
|
|
118
|
+
throw new Error(`Skill directory "${dirName}" not found at "${parentRemotePath}"`);
|
|
119
|
+
}
|
|
120
|
+
// STEP 2: recursive tree of ONLY this skill subtree (small, not truncated)
|
|
121
|
+
const treeRes = await fetchWithAuth(`${apiBase}git/trees/${dir.sha}?recursive=1`, config.githubToken, 30000);
|
|
122
|
+
const tree = (await treeRes.json());
|
|
123
|
+
if (tree.truncated) {
|
|
124
|
+
throw new Error(`Git tree truncated for skill "${dirName}" (too many files)`);
|
|
125
|
+
}
|
|
126
|
+
const files = (tree.tree || [])
|
|
127
|
+
.filter((t) => t.type === "blob" && typeof t.path === "string")
|
|
128
|
+
.map((t) => ({
|
|
129
|
+
path: t.path,
|
|
130
|
+
size: typeof t.size === "number" ? t.size : 0,
|
|
131
|
+
}));
|
|
132
|
+
return { version: 1, files };
|
|
133
|
+
}
|
|
134
|
+
if (contents && contents.type === "file") {
|
|
135
|
+
// Single-file skill: the manifest "directory" is actually one file
|
|
136
|
+
return {
|
|
137
|
+
version: 1,
|
|
138
|
+
files: [{ path: basename(contents.path), size: contents.size ?? 0 }],
|
|
139
|
+
singleFileRemotePath: `${parentRemotePath}/${dirName}`,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
throw new Error(`Unexpected GitHub Contents API response for "${parentRemotePath}": ${contentsRes.status}`);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Run `worker` over `items` with at most `limit` concurrent executions.
|
|
146
|
+
* Collects per-item errors instead of failing fast, so one bad file never
|
|
147
|
+
* aborts an entire skill download.
|
|
148
|
+
*/
|
|
149
|
+
async function runPool(items, limit, worker) {
|
|
150
|
+
const errors = [];
|
|
151
|
+
let next = 0;
|
|
152
|
+
const run = async () => {
|
|
153
|
+
while (next < items.length) {
|
|
154
|
+
const index = next++;
|
|
155
|
+
try {
|
|
156
|
+
await worker(items[index]);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
errors.push(error);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
await Promise.all(Array.from({ length: Math.max(1, Math.min(limit, items.length)) }, run));
|
|
164
|
+
if (errors.length > 0) {
|
|
165
|
+
throw new Error(`${errors.length} of ${items.length} downloads failed. First error: ${errors[0].message}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/** True when the local file already exists with the expected size (resume support) */
|
|
169
|
+
function isFileUpToDate(localPath, expectedSize) {
|
|
170
|
+
try {
|
|
171
|
+
return statSync(localPath).size === expectedSize;
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/** Verify every recorded file exists with the expected size */
|
|
178
|
+
function areFilesUpToDate(tree, skillLocalPath) {
|
|
179
|
+
return tree.files.every((file) => isFileUpToDate(resolve(skillLocalPath, file.path), file.size));
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Download every missing file of a skill, skipping files already cached.
|
|
183
|
+
* Failures throw AFTER the pool finishes so the caller can resume next time.
|
|
184
|
+
*/
|
|
185
|
+
async function downloadMissing(config, relPath, tree, skillLocalPath) {
|
|
186
|
+
if (!tree.files || tree.files.length === 0)
|
|
187
|
+
return;
|
|
188
|
+
const skillRemotePath = buildSkillRemotePath(config, relPath);
|
|
189
|
+
const missing = tree.files.filter((file) => !isFileUpToDate(resolve(skillLocalPath, file.path), file.size));
|
|
190
|
+
if (missing.length === 0)
|
|
191
|
+
return;
|
|
192
|
+
const skillName = basename(skillLocalPath);
|
|
193
|
+
console.error(`[codex-skills-mcp] Fetching ${missing.length}/${tree.files.length} files for skill: ${skillName}...`);
|
|
194
|
+
const startedAt = Date.now();
|
|
195
|
+
const limit = Math.max(1, config.downloadConcurrency);
|
|
196
|
+
await runPool(missing, limit, async (file) => {
|
|
197
|
+
const remotePath = tree.singleFileRemotePath ?? `${skillRemotePath}/${file.path}`;
|
|
198
|
+
const res = await fetchRawWithFallback(config, remotePath);
|
|
199
|
+
const buffer = Buffer.from(await res.arrayBuffer());
|
|
200
|
+
const localFile = resolve(skillLocalPath, file.path);
|
|
201
|
+
mkdirSync(dirname(localFile), { recursive: true });
|
|
202
|
+
writeFileSync(localFile, buffer);
|
|
203
|
+
});
|
|
204
|
+
console.error(`[codex-skills-mcp] Skill ${skillName}: downloaded ${missing.length} files in ${((Date.now() - startedAt) / 1000).toFixed(1)}s`);
|
|
205
|
+
}
|
|
90
206
|
/**
|
|
91
207
|
* Initialize remote caching (just creates the cache dir now)
|
|
92
208
|
*/
|
|
@@ -96,79 +212,111 @@ export async function initRemote(config) {
|
|
|
96
212
|
}
|
|
97
213
|
}
|
|
98
214
|
/**
|
|
99
|
-
* Download the manifest file
|
|
215
|
+
* Download the manifest file, or refresh it if stale (older than config.manifestTTL).
|
|
100
216
|
*/
|
|
101
217
|
export async function fetchManifest(config) {
|
|
102
|
-
if (existsSync(config.manifestPath))
|
|
103
|
-
|
|
218
|
+
if (existsSync(config.manifestPath)) {
|
|
219
|
+
// Check staleness
|
|
220
|
+
if (config.manifestTTL > 0) {
|
|
221
|
+
try {
|
|
222
|
+
const mtime = statSync(config.manifestPath).mtimeMs;
|
|
223
|
+
const age = Date.now() - mtime;
|
|
224
|
+
if (age < config.manifestTTL)
|
|
225
|
+
return; // Still fresh
|
|
226
|
+
console.error(`[codex-skills-mcp] Manifest is ${Math.round(age / 3600000)}h old, refreshing...`);
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
// Can't stat — fall through to re-download
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
return; // TTL=0 means never refresh
|
|
234
|
+
}
|
|
235
|
+
}
|
|
104
236
|
const manifestPath = `${config.githubPath}/skills_manifest.json`;
|
|
105
237
|
console.error(`[codex-skills-mcp] Fetching manifest...`);
|
|
106
238
|
const res = await fetchRawWithFallback(config, manifestPath);
|
|
107
239
|
const text = await res.text();
|
|
108
240
|
writeFileSync(config.manifestPath, text, "utf-8");
|
|
109
241
|
}
|
|
242
|
+
/** Per-skill fetch deduplication: prevents concurrent downloads of the same skill */
|
|
243
|
+
const inflightFetches = new Map();
|
|
110
244
|
/**
|
|
111
|
-
*
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
if (item.type === "file" && item.download_url) {
|
|
121
|
-
files.push({ path: item.path, downloadUrl: item.download_url });
|
|
122
|
-
}
|
|
123
|
-
else if (item.type === "dir") {
|
|
124
|
-
const subFiles = await fetchDirectoryRecursive(config, item.path);
|
|
125
|
-
files.push(...subFiles);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return files;
|
|
129
|
-
}
|
|
130
|
-
catch (error) {
|
|
131
|
-
throw new Error(`Failed to fetch directory from GitHub API: ${error.message}\n\n【网络兜底提示】由于网络封锁,无法连接到 GitHub API。建议您配置科学上网环境:https://a.xn--30rs3b33gl8gq9hj52b.com/#/register?code=4uq59ogs (极具性价比,最便宜每月200G流量一年仅需13.99元)`);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Ensure a skill's directory is downloaded and cached
|
|
245
|
+
* Ensure a skill's directory is downloaded and cached.
|
|
246
|
+
*
|
|
247
|
+
* - Listing uses only 2 API calls (parent contents + recursive subtree tree),
|
|
248
|
+
* never the full repository tree, so huge repos stay within GitHub limits.
|
|
249
|
+
* - Downloads run concurrently and skip files already cached with the right size.
|
|
250
|
+
* - A `.codex-skills.tree.json` marker records the file list + completion state,
|
|
251
|
+
* so an interrupted download resumes on the next call instead of being
|
|
252
|
+
* silently treated as complete.
|
|
253
|
+
* - Concurrent calls for the same skill are deduplicated via a promise lock.
|
|
136
254
|
*/
|
|
137
255
|
export async function ensureSkillFetched(config, entry) {
|
|
138
256
|
const relPath = entry.relative_path.replace(/^\.\//, "");
|
|
139
257
|
const skillLocalPath = resolve(config.skillsDir, relPath);
|
|
140
|
-
|
|
141
|
-
|
|
258
|
+
const cacheFile = join(skillLocalPath, TREE_CACHE_FILE);
|
|
259
|
+
// Fast path: fully downloaded in a previous run (sync check, no lock needed)
|
|
260
|
+
if (existsSync(cacheFile)) {
|
|
261
|
+
try {
|
|
262
|
+
const cached = JSON.parse(readFileSync(cacheFile, "utf-8"));
|
|
263
|
+
if (cached.completedAt && Array.isArray(cached.files)) {
|
|
264
|
+
if (areFilesUpToDate(cached, skillLocalPath)) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
// Corrupted — fall through to locked fetch
|
|
271
|
+
}
|
|
142
272
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
mkdirSync(skillLocalPath, { recursive: true });
|
|
153
|
-
return;
|
|
273
|
+
// Dedup: if another call is already fetching this skill, wait for it
|
|
274
|
+
const existing = inflightFetches.get(relPath);
|
|
275
|
+
if (existing) {
|
|
276
|
+
await existing;
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
const fetchPromise = (async () => {
|
|
280
|
+
try {
|
|
281
|
+
await doFetchSkill(config, entry, relPath, skillLocalPath, cacheFile);
|
|
154
282
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
283
|
+
finally {
|
|
284
|
+
inflightFetches.delete(relPath);
|
|
285
|
+
}
|
|
286
|
+
})();
|
|
287
|
+
inflightFetches.set(relPath, fetchPromise);
|
|
288
|
+
await fetchPromise;
|
|
289
|
+
}
|
|
290
|
+
/** Inner fetch logic, called under dedup lock */
|
|
291
|
+
async function doFetchSkill(config, entry, relPath, skillLocalPath, cacheFile) {
|
|
292
|
+
// Re-check after acquiring lock (another caller may have completed)
|
|
293
|
+
if (existsSync(cacheFile)) {
|
|
294
|
+
try {
|
|
295
|
+
const cached = JSON.parse(readFileSync(cacheFile, "utf-8"));
|
|
296
|
+
if (cached.completedAt && Array.isArray(cached.files)) {
|
|
297
|
+
if (areFilesUpToDate(cached, skillLocalPath)) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
// Some files disappeared — fetch only the gaps
|
|
301
|
+
await downloadMissing(config, relPath, cached, skillLocalPath);
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
if (Array.isArray(cached.files)) {
|
|
305
|
+
// Resume: reuse the cached file list
|
|
306
|
+
await downloadMissing(config, relPath, cached, skillLocalPath);
|
|
307
|
+
writeFileSync(cacheFile, JSON.stringify({ ...cached, completedAt: new Date().toISOString() }, null, 2), "utf-8");
|
|
308
|
+
return;
|
|
160
309
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
//
|
|
164
|
-
const res = await fetchRawWithFallback(config, file.path);
|
|
165
|
-
const buffer = await res.arrayBuffer();
|
|
166
|
-
writeFileSync(localFilePath, Buffer.from(buffer));
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
// Corrupted marker — fall through
|
|
167
313
|
}
|
|
168
314
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
315
|
+
mkdirSync(skillLocalPath, { recursive: true });
|
|
316
|
+
console.error(`[codex-skills-mcp] Listing files for skill: ${entry.name}...`);
|
|
317
|
+
const tree = await fetchSkillTree(config, relPath);
|
|
318
|
+
writeFileSync(cacheFile, JSON.stringify(tree, null, 2), "utf-8");
|
|
319
|
+
await downloadMissing(config, relPath, tree, skillLocalPath);
|
|
320
|
+
writeFileSync(cacheFile, JSON.stringify({ ...tree, completedAt: new Date().toISOString() }, null, 2), "utf-8");
|
|
173
321
|
}
|
|
174
322
|
//# sourceMappingURL=github.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/remote/github.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/remote/github.ts"],"names":[],"mappings":"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"}
|