codex-skills-mcp 1.3.2 → 1.4.0
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 +61 -18
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +12 -1
- package/dist/config.js.map +1 -1
- package/dist/index.js +26 -14
- package/dist/index.js.map +1 -1
- package/dist/lib/logger.d.ts +36 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +143 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/protocol.d.ts +21 -0
- package/dist/lib/protocol.d.ts.map +1 -0
- package/dist/lib/protocol.js +30 -0
- package/dist/lib/protocol.js.map +1 -0
- package/dist/loader/index.d.ts +11 -0
- package/dist/loader/index.d.ts.map +1 -1
- package/dist/loader/index.js +27 -0
- package/dist/loader/index.js.map +1 -1
- package/dist/remote/github.d.ts +24 -0
- package/dist/remote/github.d.ts.map +1 -1
- package/dist/remote/github.js +91 -14
- package/dist/remote/github.js.map +1 -1
- package/dist/tools/diagnostics.d.ts +6 -0
- package/dist/tools/diagnostics.d.ts.map +1 -0
- package/dist/tools/diagnostics.js +115 -0
- package/dist/tools/diagnostics.js.map +1 -0
- package/dist/tools/list-categories.d.ts.map +1 -1
- package/dist/tools/list-categories.js +4 -3
- package/dist/tools/list-categories.js.map +1 -1
- package/dist/tools/list-skill-files.d.ts.map +1 -1
- package/dist/tools/list-skill-files.js +9 -5
- package/dist/tools/list-skill-files.js.map +1 -1
- package/dist/tools/load-skill-file.d.ts.map +1 -1
- package/dist/tools/load-skill-file.js +8 -4
- package/dist/tools/load-skill-file.js.map +1 -1
- package/dist/tools/plan-workflow.d.ts +2 -1
- package/dist/tools/plan-workflow.d.ts.map +1 -1
- package/dist/tools/plan-workflow.js +23 -16
- package/dist/tools/plan-workflow.js.map +1 -1
- package/dist/tools/read-skill.d.ts.map +1 -1
- package/dist/tools/read-skill.js +43 -7
- package/dist/tools/read-skill.js.map +1 -1
- package/dist/tools/search-skills.d.ts +2 -1
- package/dist/tools/search-skills.d.ts.map +1 -1
- package/dist/tools/search-skills.js +12 -8
- package/dist/tools/search-skills.js.map +1 -1
- package/dist/tools/skill-status.d.ts +5 -0
- package/dist/tools/skill-status.d.ts.map +1 -0
- package/dist/tools/skill-status.js +70 -0
- package/dist/tools/skill-status.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,7 +12,10 @@
|
|
|
12
12
|
|
|
13
13
|
| 特性 | 说明 |
|
|
14
14
|
|------|------|
|
|
15
|
-
| **
|
|
15
|
+
| **8 个 MCP Tools** | search_skills, read_skill, load_skill_file, list_skill_files, list_categories, plan_workflow, skill_status, diagnostics |
|
|
16
|
+
| **Agent 行为合约** | server instructions + 工具描述 + 返回体尾部三层强化同一套 5 步工作流(见 [docs/AGENT-PROTOCOL.md](docs/AGENT-PROTOCOL.md)) |
|
|
17
|
+
| **缓存状态可见** | search/plan 结果带 `[cached]` 徽标;read_skill 返回 `local_path`;skill_status 深度校验完整性 |
|
|
18
|
+
| **活动日志与诊断** | 全部工具调用/下载/错误落 JSONL 日志;diagnostics 一键审计 |
|
|
16
19
|
| **三层渐进加载** | 检索(~500 tokens) → 阅读(~5K tokens) → 深入(按需) |
|
|
17
20
|
| **中文搜索优化** | CJK bigram 分词 + Leading Words 权重 |
|
|
18
21
|
| **零外部 AI 依赖** | 纯关键词搜索,不需要 embedding 模型 |
|
|
@@ -32,7 +35,7 @@ npx -y codex-skills-mcp@latest
|
|
|
32
35
|
|
|
33
36
|
1. 从远端技能库拉取清单 `skills_manifest.json`(约 108KB,仅首次);
|
|
34
37
|
2. 建立本地搜索索引(毫秒级);
|
|
35
|
-
3.
|
|
38
|
+
3. 技能文件按需下载,缓存在 `~/.codex-skills-cache/`(可用 `--cache-dir` / `CODEX_SKILLS_CACHE_DIR` 覆盖)。
|
|
36
39
|
|
|
37
40
|
### 2. 本地模式(可选)
|
|
38
41
|
|
|
@@ -144,10 +147,11 @@ ngrok http 3456
|
|
|
144
147
|
```mermaid
|
|
145
148
|
flowchart LR
|
|
146
149
|
A["启动 MCP"] --> B["拉取清单 manifest + 建本地索引"]
|
|
147
|
-
B --> C["search_skills
|
|
148
|
-
C --> D["read_skill
|
|
149
|
-
D --> E["
|
|
150
|
-
E --> F["
|
|
150
|
+
B --> C["plan_workflow / search_skills<br/>DISCOVER([cached] 徽标)"]
|
|
151
|
+
C --> D["read_skill x N<br/>MATERIALIZE:完整下载+缓存"]
|
|
152
|
+
D --> E["skill_status 校验(可选)"]
|
|
153
|
+
E --> F["按 SKILL.md 从 local_path 执行<br/>load_skill_file 按需补读"]
|
|
154
|
+
F --> G["diagnostics / 汇报"]
|
|
151
155
|
```
|
|
152
156
|
|
|
153
157
|
| 阶段 | 行为 | 耗时 |
|
|
@@ -167,9 +171,26 @@ flowchart LR
|
|
|
167
171
|
|
|
168
172
|
前一个节点失败时自动降级到下一个;全部失败才会报错。
|
|
169
173
|
|
|
174
|
+
### Agent 标准工作流(行为合约)
|
|
175
|
+
|
|
176
|
+
服务端通过 initialize instructions、工具描述、返回体尾部三层向 Agent 强化同一套协议(措辞单点维护于 `src/lib/protocol.ts`):
|
|
177
|
+
|
|
178
|
+
1. **DISCOVER** — `plan_workflow` / `search_skills` 检索;`[cached]` 徽标 = 已在本地,分数相近优先选;
|
|
179
|
+
2. **SELECT** — 选出覆盖任务的最小技能组合;
|
|
180
|
+
3. **MATERIALIZE(必做)** — 对每个选定技能调用 `read_skill`,完整下载到本地并返回 `local_path`;
|
|
181
|
+
4. **EXECUTE** — 严格按 SKILL.md 执行,脚本从 `local_path` 运行,禁止凭通用知识自行替代;
|
|
182
|
+
5. **VERIFY & REPORT** — `skill_status` 校验缓存完整性;`diagnostics` 排障并审计。
|
|
183
|
+
|
|
184
|
+
### 日志与诊断
|
|
185
|
+
|
|
186
|
+
- 活动日志:`~/.codex-skills-cache/logs/mcp-activity-YYYY-MM-DD.jsonl`(按天分文件,保留 14 天,best-effort 不影响主流程);
|
|
187
|
+
- 记录事件:`tool_call` / `tool_result` / `download_skill_start` / `download_skill_complete` / `tool_error` / `server_start`;
|
|
188
|
+
- `diagnostics` 工具返回:近期调用、近期错误、缓存统计(已缓存技能数/体积)、清单新鲜度与配置摘要;
|
|
189
|
+
- 本地模式(`--skills-dir`)不写文件日志,仅镜像到 stderr。
|
|
190
|
+
|
|
170
191
|
### 缓存与增量同步
|
|
171
192
|
|
|
172
|
-
-
|
|
193
|
+
- 清单与技能文件缓存在 `~/.codex-skills-cache/`,二次启动秒级完成;
|
|
173
194
|
- 每个技能带 `.codex-skills.tree.json` 标记(文件列表 + 完成状态);
|
|
174
195
|
- 已完整下载的技能直接本地读取,不重复请求远端;
|
|
175
196
|
- 中断的下载支持断点续传:按文件大小比对,只补拉缺失/不完整的文件;
|
|
@@ -180,7 +201,7 @@ flowchart LR
|
|
|
180
201
|
|
|
181
202
|
### 🔍 search_skills
|
|
182
203
|
|
|
183
|
-
搜索技能库,Agent
|
|
204
|
+
搜索技能库,Agent 的主入口(协议 STEP 1)。结果带 `[cached]` 徽标与"下一步必须 read_skill 物化"的协议尾部。
|
|
184
205
|
|
|
185
206
|
```
|
|
186
207
|
input: { query: "前端性能优化", category?: "01_代码工程与架构", limit?: 8 }
|
|
@@ -198,7 +219,7 @@ output: 14 个分类 + 各自的技能数量
|
|
|
198
219
|
|
|
199
220
|
### 📖 read_skill
|
|
200
221
|
|
|
201
|
-
|
|
222
|
+
物化技能(协议 STEP 3,执行前必调):完整下载技能目录到本地缓存(已缓存则秒回),返回 SKILL.md 指令 + 文件结构 + 依赖 + **Cache & Execution 段(local_path / 完整性 / setup 命令)** + 子技能。
|
|
202
223
|
|
|
203
224
|
```
|
|
204
225
|
input: { name: "MediaCrawler" }
|
|
@@ -227,28 +248,48 @@ output: 目录树
|
|
|
227
248
|
|
|
228
249
|
### 🔗 plan_workflow
|
|
229
250
|
|
|
230
|
-
|
|
251
|
+
给定任务描述,产出可组合技能的**有序执行计划草稿**(带 `[cached]` 徽标),并强制"先 read_skill 全部选定技能再开工"。
|
|
231
252
|
|
|
232
253
|
```
|
|
233
254
|
input: { task_description: "把技术博客做成小红书图文" }
|
|
234
255
|
output: 推荐技能列表 + 分类分组
|
|
235
256
|
```
|
|
236
257
|
|
|
237
|
-
|
|
258
|
+
### ✅ skill_status
|
|
259
|
+
|
|
260
|
+
深度校验一个或多个技能的本地缓存完整性(逐文件大小核对,只读不下载)。
|
|
261
|
+
|
|
262
|
+
``
|
|
263
|
+
input: { names: "KrillinAI, videocut-skills" }
|
|
264
|
+
output: cached/complete/local_path/files_total/files_missing/completed_at
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### 🩺 diagnostics
|
|
268
|
+
|
|
269
|
+
审计与排障:近期工具调用、近期错误(活动日志)、缓存统计、清单新鲜度、配置摘要。
|
|
270
|
+
|
|
271
|
+
``
|
|
272
|
+
input: { include_log?: true, log_lines?: 20 }
|
|
273
|
+
output: Server / Manifest / Local skill cache / Recent errors / Recent tool calls
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
## 使用流程(示例)
|
|
238
277
|
|
|
239
278
|
```
|
|
240
279
|
用户: "帮我把这个视频翻译成中文字幕"
|
|
241
280
|
|
|
242
|
-
Agent →
|
|
243
|
-
|
|
281
|
+
Agent → plan_workflow("把视频翻译成中文字幕") # DISCOVER:拿到组合计划
|
|
282
|
+
Agent → search_skills("视频字幕翻译") # DISCOVER:精确定位
|
|
283
|
+
→ 命中: KrillinAI, videocut-skills, VideoClaw # [cached] 徽标优先
|
|
244
284
|
|
|
245
|
-
Agent → read_skill("KrillinAI")
|
|
246
|
-
→
|
|
285
|
+
Agent → read_skill("KrillinAI") # MATERIALIZE:完整下载
|
|
286
|
+
→ 返回 SKILL.md + local_path + 依赖
|
|
287
|
+
Agent → read_skill("videocut-skills") # 每个选定技能都要物化
|
|
247
288
|
|
|
248
|
-
Agent →
|
|
249
|
-
→ 获取详细配置参数
|
|
289
|
+
Agent → skill_status("KrillinAI, videocut-skills") # VERIFY:确认缓存完整
|
|
250
290
|
|
|
251
|
-
Agent → 按 SKILL.md
|
|
291
|
+
Agent → 按 SKILL.md 从 local_path 执行任务 # EXECUTE:严格遵循指令
|
|
292
|
+
→ 需要补充文件时 load_skill_file(...)
|
|
252
293
|
```
|
|
253
294
|
|
|
254
295
|
## 配置参考
|
|
@@ -275,6 +316,8 @@ Agent → 按 SKILL.md 指令执行任务
|
|
|
275
316
|
|
|
276
317
|
| 问题 | 处理 |
|
|
277
318
|
|------|------|
|
|
319
|
+
| Agent 读了 SKILL.md 却不按指令执行 | v1.4.0 起三层合约强制 5 步协议;仍异常时用 `diagnostics` 审计该 Agent 实际调用序列 |
|
|
320
|
+
| 想看 Agent 到底做了什么 | `diagnostics` 或直接读 `~/.codex-skills-cache/logs/mcp-activity-*.jsonl` |
|
|
278
321
|
| npx 首次运行较慢 | 首次需下载 npm 包 + 拉取清单,属正常;之后走缓存 |
|
|
279
322
|
| 日志出现 `Network warning` | 当前加速节点失败,自动降级到下一个,可忽略 |
|
|
280
323
|
| 想强制更新技能内容 | 删除 `.codex-skills-cache/` 后重启,或设 `--manifest-ttl 60` 让清单自动高频刷新 |
|
package/dist/config.d.ts
CHANGED
|
@@ -10,6 +10,8 @@ export interface Config {
|
|
|
10
10
|
downloadConcurrency: number;
|
|
11
11
|
/** Manifest cache TTL in milliseconds. Default 24 hours. 0 = never refresh. */
|
|
12
12
|
manifestTTL: number;
|
|
13
|
+
/** Base download timeout for skill files in milliseconds. Default: 30000 (30s). */
|
|
14
|
+
downloadTimeout: number;
|
|
13
15
|
}
|
|
14
16
|
/**
|
|
15
17
|
* 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":"AAKA,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;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,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;IACpB,mFAAmF;IACnF,eAAe,EAAE,MAAM,CAAC;CACzB;AAuBD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAsHlD;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;IAEtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,EAAE,CAGlE"}
|
package/dist/config.js
CHANGED
|
@@ -102,6 +102,16 @@ export function parseConfig(args) {
|
|
|
102
102
|
console.error("Error: --download-concurrency must be a positive integer");
|
|
103
103
|
process.exit(1);
|
|
104
104
|
}
|
|
105
|
+
// Base download timeout for skill files (default 30 seconds). Configurable via
|
|
106
|
+
// --download-timeout <seconds> or CODEX_SKILLS_DOWNLOAD_TIMEOUT env var.
|
|
107
|
+
const timeoutArg = getArg("--download-timeout");
|
|
108
|
+
const timeoutEnv = process.env.CODEX_SKILLS_DOWNLOAD_TIMEOUT;
|
|
109
|
+
const downloadTimeoutSeconds = parseInt(timeoutArg || timeoutEnv || "30", 10);
|
|
110
|
+
if (!Number.isInteger(downloadTimeoutSeconds) || downloadTimeoutSeconds < 1) {
|
|
111
|
+
console.error("Error: --download-timeout must be a positive integer");
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
const downloadTimeout = downloadTimeoutSeconds * 1000;
|
|
105
115
|
return {
|
|
106
116
|
skillsDir,
|
|
107
117
|
manifestPath,
|
|
@@ -112,7 +122,8 @@ export function parseConfig(args) {
|
|
|
112
122
|
githubToken,
|
|
113
123
|
useCnMirror,
|
|
114
124
|
downloadConcurrency,
|
|
115
|
-
manifestTTL
|
|
125
|
+
manifestTTL,
|
|
126
|
+
downloadTimeout
|
|
116
127
|
};
|
|
117
128
|
}
|
|
118
129
|
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,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,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.js
CHANGED
|
@@ -23,37 +23,45 @@ import { createRequire } from "node:module";
|
|
|
23
23
|
import { parseConfig, loadManifest } from "./config.js";
|
|
24
24
|
import { SkillSearchEngine } from "./search/index.js";
|
|
25
25
|
import { SkillLoader } from "./loader/index.js";
|
|
26
|
+
import { SERVER_INSTRUCTIONS } from "./lib/protocol.js";
|
|
27
|
+
import { initLogger, logEvent } from "./lib/logger.js";
|
|
26
28
|
import { registerSearchSkills } from "./tools/search-skills.js";
|
|
27
29
|
import { registerListCategories } from "./tools/list-categories.js";
|
|
28
30
|
import { registerReadSkill } from "./tools/read-skill.js";
|
|
29
31
|
import { registerLoadSkillFile } from "./tools/load-skill-file.js";
|
|
30
32
|
import { registerListSkillFiles } from "./tools/list-skill-files.js";
|
|
31
33
|
import { registerPlanWorkflow } from "./tools/plan-workflow.js";
|
|
34
|
+
import { registerSkillStatus } from "./tools/skill-status.js";
|
|
35
|
+
import { registerDiagnostics } from "./tools/diagnostics.js";
|
|
32
36
|
// Single source of truth for the version: read package.json instead of
|
|
33
37
|
// hardcoding it here, so releasing a new version only requires one bump.
|
|
34
38
|
const require = createRequire(import.meta.url);
|
|
35
39
|
const PKG_VERSION = require("../package.json").version;
|
|
36
|
-
function createServer(searchEngine, loader) {
|
|
37
|
-
const server = new McpServer({
|
|
38
|
-
|
|
39
|
-
|
|
40
|
+
function createServer(config, searchEngine, loader) {
|
|
41
|
+
const server = new McpServer({ name: "codex-skills", version: PKG_VERSION }, {
|
|
42
|
+
// The agent-facing behavioral contract (docs/AGENT-PROTOCOL.md) is
|
|
43
|
+
// returned to clients in the initialize result and reinforced in every
|
|
44
|
+
// tool description and result footer.
|
|
45
|
+
instructions: SERVER_INSTRUCTIONS,
|
|
40
46
|
});
|
|
41
|
-
registerSearchSkills(server, searchEngine);
|
|
47
|
+
registerSearchSkills(server, searchEngine, loader);
|
|
42
48
|
registerListCategories(server, searchEngine);
|
|
43
49
|
registerReadSkill(server, searchEngine, loader);
|
|
44
50
|
registerLoadSkillFile(server, searchEngine, loader);
|
|
45
51
|
registerListSkillFiles(server, searchEngine, loader);
|
|
46
|
-
registerPlanWorkflow(server, searchEngine);
|
|
52
|
+
registerPlanWorkflow(server, searchEngine, loader);
|
|
53
|
+
registerSkillStatus(server, searchEngine, loader);
|
|
54
|
+
registerDiagnostics(server, config, searchEngine, loader, PKG_VERSION);
|
|
47
55
|
return server;
|
|
48
56
|
}
|
|
49
|
-
async function startStdio(searchEngine, loader) {
|
|
50
|
-
const server = createServer(searchEngine, loader);
|
|
51
|
-
console.error("[codex-skills-mcp]
|
|
57
|
+
async function startStdio(config, searchEngine, loader) {
|
|
58
|
+
const server = createServer(config, searchEngine, loader);
|
|
59
|
+
console.error("[codex-skills-mcp] 8 tools registered, starting stdio server...");
|
|
52
60
|
const transport = new StdioServerTransport();
|
|
53
61
|
await server.connect(transport);
|
|
54
62
|
console.error("[codex-skills-mcp] Server running on stdio");
|
|
55
63
|
}
|
|
56
|
-
async function startHTTP(searchEngine, loader, port) {
|
|
64
|
+
async function startHTTP(config, searchEngine, loader, port) {
|
|
57
65
|
// Dynamic import to avoid loading express in stdio mode
|
|
58
66
|
const { default: express } = await import("express");
|
|
59
67
|
const app = express();
|
|
@@ -104,7 +112,7 @@ async function startHTTP(searchEngine, loader, port) {
|
|
|
104
112
|
sessions.delete(sid);
|
|
105
113
|
};
|
|
106
114
|
// Each session gets its own server instance
|
|
107
|
-
const server = createServer(searchEngine, loader);
|
|
115
|
+
const server = createServer(config, searchEngine, loader);
|
|
108
116
|
await server.connect(transport);
|
|
109
117
|
}
|
|
110
118
|
await transport.handleRequest(req, res, req.body);
|
|
@@ -142,7 +150,7 @@ async function startHTTP(searchEngine, loader, port) {
|
|
|
142
150
|
activeSessions: sessions.size,
|
|
143
151
|
});
|
|
144
152
|
});
|
|
145
|
-
console.error("[codex-skills-mcp]
|
|
153
|
+
console.error("[codex-skills-mcp] 8 tools registered, starting HTTP server...");
|
|
146
154
|
app.listen(port, () => {
|
|
147
155
|
console.error(`[codex-skills-mcp] HTTP server running at http://localhost:${port}/mcp`);
|
|
148
156
|
console.error(`[codex-skills-mcp] Health check: http://localhost:${port}/health`);
|
|
@@ -154,6 +162,10 @@ async function main() {
|
|
|
154
162
|
// Parse configuration
|
|
155
163
|
const config = parseConfig(args);
|
|
156
164
|
if (config.isRemote) {
|
|
165
|
+
// Activity log lives under <cacheDir>/logs (remote mode only, so local
|
|
166
|
+
// skill libraries are never polluted). See docs/IMPROVEMENT-PLAN.md §7.
|
|
167
|
+
initLogger(config.skillsDir);
|
|
168
|
+
logEvent("info", "server_start", { detail: `v${PKG_VERSION} remote mode` });
|
|
157
169
|
const { initRemote, fetchManifest } = await import("./remote/github.js");
|
|
158
170
|
console.error("[codex-skills-mcp] Initializing remote GitHub fetching...");
|
|
159
171
|
await initRemote(config);
|
|
@@ -176,10 +188,10 @@ async function main() {
|
|
|
176
188
|
// Parse port
|
|
177
189
|
const portIdx = args.indexOf("--port");
|
|
178
190
|
const port = portIdx !== -1 && args[portIdx + 1] ? parseInt(args[portIdx + 1], 10) : 3456;
|
|
179
|
-
await startHTTP(searchEngine, loader, port);
|
|
191
|
+
await startHTTP(config, searchEngine, loader, port);
|
|
180
192
|
}
|
|
181
193
|
else {
|
|
182
|
-
await startStdio(searchEngine, loader);
|
|
194
|
+
await startStdio(config, searchEngine, loader);
|
|
183
195
|
}
|
|
184
196
|
}
|
|
185
197
|
main().catch((err) => {
|
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;AACnG,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export type LogLevel = "info" | "warn" | "error";
|
|
2
|
+
export interface LogEvent {
|
|
3
|
+
ts: string;
|
|
4
|
+
level: LogLevel;
|
|
5
|
+
event: string;
|
|
6
|
+
tool?: string;
|
|
7
|
+
skill?: string;
|
|
8
|
+
duration_ms?: number;
|
|
9
|
+
ok?: boolean;
|
|
10
|
+
detail?: string;
|
|
11
|
+
error?: string;
|
|
12
|
+
}
|
|
13
|
+
/** Enable file logging under <cacheDir>/logs. Safe to call once at startup. */
|
|
14
|
+
export declare function initLogger(cacheDir: string): void;
|
|
15
|
+
/** True when file logging is active (used by diagnostics output). */
|
|
16
|
+
export declare function loggerActive(): boolean;
|
|
17
|
+
/** Log dir path (for diagnostics output). */
|
|
18
|
+
export declare function logDirPath(): string | null;
|
|
19
|
+
/** Append one event. Mirrors to stderr; never throws. */
|
|
20
|
+
export declare function logEvent(level: LogLevel, event: string, fields?: Omit<LogEvent, "ts" | "level" | "event">): void;
|
|
21
|
+
/**
|
|
22
|
+
* Read recent events across log files (newest first), optionally filtered by
|
|
23
|
+
* level and/or event type. Returns at most `limit` entries. Never throws.
|
|
24
|
+
*/
|
|
25
|
+
export declare function readRecentEvents(options?: {
|
|
26
|
+
limit?: number;
|
|
27
|
+
level?: LogLevel;
|
|
28
|
+
event?: string;
|
|
29
|
+
}): LogEvent[];
|
|
30
|
+
/**
|
|
31
|
+
* Wrap a tool handler with call/result/error logging. Handlers that return
|
|
32
|
+
* error-text instead of throwing should additionally call logEvent themselves
|
|
33
|
+
* in their catch block (see tools/*).
|
|
34
|
+
*/
|
|
35
|
+
export declare function withToolLogging<R>(tool: string, argSummary: Record<string, unknown>, fn: () => Promise<R>): Promise<R>;
|
|
36
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AASD,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAOjD;AAED,qEAAqE;AACrE,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,6CAA6C;AAC7C,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAE1C;AAgBD,yDAAyD;AACzD,wBAAgB,QAAQ,CACtB,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,OAAO,GAAG,OAAO,CAAM,GACpD,IAAI,CA2BN;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,QAAQ,EAAE,CAiC/G;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAgBZ"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Best-effort JSONL activity logger.
|
|
3
|
+
*
|
|
4
|
+
* - File per day: <cacheDir>/logs/mcp-activity-YYYY-MM-DD.jsonl
|
|
5
|
+
* - Retention: last 14 files swept at most once per day per process.
|
|
6
|
+
* - NEVER throws: every fs operation is wrapped; logging must not break tools.
|
|
7
|
+
* - Key events are mirrored to stderr for local debugging (MCP-safe: stderr,
|
|
8
|
+
* never stdout).
|
|
9
|
+
*/
|
|
10
|
+
import { appendFileSync, mkdirSync, readdirSync, readFileSync, unlinkSync } from "node:fs";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
const LOG_FILE_PREFIX = "mcp-activity-";
|
|
13
|
+
const RETENTION_FILES = 14;
|
|
14
|
+
/** Active log directory; null = file logging disabled (e.g. local mode). */
|
|
15
|
+
let logDir = null;
|
|
16
|
+
let lastSweep = 0;
|
|
17
|
+
/** Enable file logging under <cacheDir>/logs. Safe to call once at startup. */
|
|
18
|
+
export function initLogger(cacheDir) {
|
|
19
|
+
try {
|
|
20
|
+
logDir = join(cacheDir, "logs");
|
|
21
|
+
mkdirSync(logDir, { recursive: true });
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
logDir = null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** True when file logging is active (used by diagnostics output). */
|
|
28
|
+
export function loggerActive() {
|
|
29
|
+
return logDir !== null;
|
|
30
|
+
}
|
|
31
|
+
/** Log dir path (for diagnostics output). */
|
|
32
|
+
export function logDirPath() {
|
|
33
|
+
return logDir;
|
|
34
|
+
}
|
|
35
|
+
function sweep() {
|
|
36
|
+
if (!logDir)
|
|
37
|
+
return;
|
|
38
|
+
try {
|
|
39
|
+
const files = readdirSync(logDir)
|
|
40
|
+
.filter((f) => f.startsWith(LOG_FILE_PREFIX) && f.endsWith(".jsonl"))
|
|
41
|
+
.sort();
|
|
42
|
+
while (files.length > RETENTION_FILES) {
|
|
43
|
+
unlinkSync(join(logDir, files.shift()));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// best-effort
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Append one event. Mirrors to stderr; never throws. */
|
|
51
|
+
export function logEvent(level, event, fields = {}) {
|
|
52
|
+
const entry = { ts: new Date().toISOString(), level, event, ...fields };
|
|
53
|
+
const mirror = [
|
|
54
|
+
`[codex-skills-mcp] ${level} ${event}`,
|
|
55
|
+
fields.tool ? ` tool=${fields.tool}` : "",
|
|
56
|
+
fields.skill ? ` skill=${fields.skill}` : "",
|
|
57
|
+
fields.error ? ` error=${fields.error}` : "",
|
|
58
|
+
].join("");
|
|
59
|
+
console.error(mirror);
|
|
60
|
+
if (!logDir)
|
|
61
|
+
return;
|
|
62
|
+
try {
|
|
63
|
+
const day = entry.ts.slice(0, 10);
|
|
64
|
+
appendFileSync(join(logDir, `${LOG_FILE_PREFIX}${day}.jsonl`), JSON.stringify(entry) + "\n", "utf-8");
|
|
65
|
+
const now = Date.now();
|
|
66
|
+
if (now - lastSweep > 24 * 3600 * 1000) {
|
|
67
|
+
lastSweep = now;
|
|
68
|
+
sweep();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// best-effort: ignore disk errors entirely
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Read recent events across log files (newest first), optionally filtered by
|
|
77
|
+
* level and/or event type. Returns at most `limit` entries. Never throws.
|
|
78
|
+
*/
|
|
79
|
+
export function readRecentEvents(options = {}) {
|
|
80
|
+
const { limit = 20, level, event } = options;
|
|
81
|
+
if (!logDir || limit <= 0)
|
|
82
|
+
return [];
|
|
83
|
+
const out = [];
|
|
84
|
+
try {
|
|
85
|
+
const files = readdirSync(logDir)
|
|
86
|
+
.filter((f) => f.startsWith(LOG_FILE_PREFIX) && f.endsWith(".jsonl"))
|
|
87
|
+
.sort()
|
|
88
|
+
.reverse();
|
|
89
|
+
outer: for (const file of files) {
|
|
90
|
+
let lines;
|
|
91
|
+
try {
|
|
92
|
+
lines = readFileSync(join(logDir, file), "utf-8").split("\n").filter(Boolean);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
98
|
+
let parsed;
|
|
99
|
+
try {
|
|
100
|
+
parsed = JSON.parse(lines[i]);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (level && parsed.level !== level)
|
|
106
|
+
continue;
|
|
107
|
+
if (event && parsed.event !== event)
|
|
108
|
+
continue;
|
|
109
|
+
out.push(parsed);
|
|
110
|
+
if (out.length >= limit)
|
|
111
|
+
break outer;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// best-effort
|
|
117
|
+
}
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Wrap a tool handler with call/result/error logging. Handlers that return
|
|
122
|
+
* error-text instead of throwing should additionally call logEvent themselves
|
|
123
|
+
* in their catch block (see tools/*).
|
|
124
|
+
*/
|
|
125
|
+
export async function withToolLogging(tool, argSummary, fn) {
|
|
126
|
+
const startedAt = Date.now();
|
|
127
|
+
logEvent("info", "tool_call", { tool, detail: JSON.stringify(argSummary) });
|
|
128
|
+
try {
|
|
129
|
+
const result = await fn();
|
|
130
|
+
logEvent("info", "tool_result", { tool, ok: true, duration_ms: Date.now() - startedAt });
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
logEvent("error", "tool_result", {
|
|
135
|
+
tool,
|
|
136
|
+
ok: false,
|
|
137
|
+
duration_ms: Date.now() - startedAt,
|
|
138
|
+
error: err instanceof Error ? err.message : String(err),
|
|
139
|
+
});
|
|
140
|
+
throw err;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent protocol texts — the single source of truth for the behavioral
|
|
3
|
+
* contract enforced across three surfaces: server `instructions`, tool
|
|
4
|
+
* descriptions, and tool-result footers. Keep the wording consistent here so
|
|
5
|
+
* every surface reinforces the same 5-step protocol (docs/AGENT-PROTOCOL.md).
|
|
6
|
+
*/
|
|
7
|
+
/** Server-level instructions returned in the MCP initialize result. */
|
|
8
|
+
export declare const SERVER_INSTRUCTIONS = "Codex-Skills: 190+ expert skills fetched on demand \u2014 no pre-install needed. Daily use progressively caches skills locally.\n\nMANDATORY 5-step protocol for any task a skill could help with:\n1. DISCOVER \u2014 plan_workflow(task) and/or search_skills(query). \"[cached]\" means the skill is already on local disk; prefer cached skills when scores are close.\n2. SELECT \u2014 choose the smallest set of skills that together cover the task.\n3. MATERIALIZE \u2014 call read_skill(name) for EVERY selected skill BEFORE starting work. Each call downloads the COMPLETE skill (SKILL.md, scripts, configs, references) into the local cache and returns the instructions plus local_path. Never skip or partial-skip this step.\n4. EXECUTE \u2014 follow each loaded SKILL.md verbatim and run its scripts from local_path (run its Setup command first if one is listed). NEVER improvise a substitute for a loaded skill. load_skill_file is only for reading extra files.\n5. VERIFY & REPORT \u2014 skill_status(names) confirms cache completeness; report which skills you used. On failures, use diagnostics.\n\nForbidden anti-patterns: reading SKILL.md and then doing the task from general knowledge; starting before every selected skill is materialized; rewriting a loaded skill's logic yourself.";
|
|
9
|
+
/** search_skills result footer. */
|
|
10
|
+
export declare const FOOTER_SEARCH = "\u25B6 PROTOCOL STEP 3 (required): call read_skill(name) for EVERY skill you select \u2014 each call downloads the complete skill to local disk (cached skills return instantly). Do NOT start the task until all selected skills are loaded; then execute strictly per each SKILL.md.";
|
|
11
|
+
/** plan_workflow result footer. */
|
|
12
|
+
export declare const FOOTER_PLAN = "\u25B6 PROTOCOL STEP 3 (required): call read_skill for EVERY skill in your final plan before starting \u2014 each call downloads the complete skill to local disk (cached skills return instantly). Then execute in the planned order, strictly following each SKILL.md, and report which skills you used.";
|
|
13
|
+
/** read_skill result footer (after the Cache & Execution section). */
|
|
14
|
+
export declare const FOOTER_READ = "\u25B6 PROTOCOL STEP 4: Execute the task by following the Instructions above exactly \u2014 run scripts from local_path. Do NOT improvise a substitute for this skill. Use load_skill_file only when you need additional files.";
|
|
15
|
+
/** skill_status result footer. */
|
|
16
|
+
export declare const FOOTER_STATUS = "\u25B6 If all selected skills are complete, proceed to EXECUTE from each local_path. Incomplete skills: re-call read_skill to resume the download.";
|
|
17
|
+
/** diagnostics result footer. */
|
|
18
|
+
export declare const FOOTER_DIAGNOSTICS = "\u25B6 Fix the reported errors (network failures are often transient \u2014 retry read_skill), then resume the protocol at the failed step.";
|
|
19
|
+
/** Cached badge used in search/plan results. */
|
|
20
|
+
export declare const CACHED_BADGE = "[cached]";
|
|
21
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/lib/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,0wCAS2J,CAAC;AAE5L,mCAAmC;AACnC,eAAO,MAAM,aAAa,2RAAiR,CAAC;AAE5S,mCAAmC;AACnC,eAAO,MAAM,WAAW,+SAAqS,CAAC;AAE9T,sEAAsE;AACtE,eAAO,MAAM,WAAW,oOAA0N,CAAC;AAEnP,kCAAkC;AAClC,eAAO,MAAM,aAAa,uJAAkJ,CAAC;AAE7K,iCAAiC;AACjC,eAAO,MAAM,kBAAkB,gJAAsI,CAAC;AAEtK,gDAAgD;AAChD,eAAO,MAAM,YAAY,aAAa,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent protocol texts — the single source of truth for the behavioral
|
|
3
|
+
* contract enforced across three surfaces: server `instructions`, tool
|
|
4
|
+
* descriptions, and tool-result footers. Keep the wording consistent here so
|
|
5
|
+
* every surface reinforces the same 5-step protocol (docs/AGENT-PROTOCOL.md).
|
|
6
|
+
*/
|
|
7
|
+
/** Server-level instructions returned in the MCP initialize result. */
|
|
8
|
+
export const SERVER_INSTRUCTIONS = `Codex-Skills: 190+ expert skills fetched on demand — no pre-install needed. Daily use progressively caches skills locally.
|
|
9
|
+
|
|
10
|
+
MANDATORY 5-step protocol for any task a skill could help with:
|
|
11
|
+
1. DISCOVER — plan_workflow(task) and/or search_skills(query). "[cached]" means the skill is already on local disk; prefer cached skills when scores are close.
|
|
12
|
+
2. SELECT — choose the smallest set of skills that together cover the task.
|
|
13
|
+
3. MATERIALIZE — call read_skill(name) for EVERY selected skill BEFORE starting work. Each call downloads the COMPLETE skill (SKILL.md, scripts, configs, references) into the local cache and returns the instructions plus local_path. Never skip or partial-skip this step.
|
|
14
|
+
4. EXECUTE — follow each loaded SKILL.md verbatim and run its scripts from local_path (run its Setup command first if one is listed). NEVER improvise a substitute for a loaded skill. load_skill_file is only for reading extra files.
|
|
15
|
+
5. VERIFY & REPORT — skill_status(names) confirms cache completeness; report which skills you used. On failures, use diagnostics.
|
|
16
|
+
|
|
17
|
+
Forbidden anti-patterns: reading SKILL.md and then doing the task from general knowledge; starting before every selected skill is materialized; rewriting a loaded skill's logic yourself.`;
|
|
18
|
+
/** search_skills result footer. */
|
|
19
|
+
export const FOOTER_SEARCH = `▶ PROTOCOL STEP 3 (required): call read_skill(name) for EVERY skill you select — each call downloads the complete skill to local disk (cached skills return instantly). Do NOT start the task until all selected skills are loaded; then execute strictly per each SKILL.md.`;
|
|
20
|
+
/** plan_workflow result footer. */
|
|
21
|
+
export const FOOTER_PLAN = `▶ PROTOCOL STEP 3 (required): call read_skill for EVERY skill in your final plan before starting — each call downloads the complete skill to local disk (cached skills return instantly). Then execute in the planned order, strictly following each SKILL.md, and report which skills you used.`;
|
|
22
|
+
/** read_skill result footer (after the Cache & Execution section). */
|
|
23
|
+
export const FOOTER_READ = `▶ PROTOCOL STEP 4: Execute the task by following the Instructions above exactly — run scripts from local_path. Do NOT improvise a substitute for this skill. Use load_skill_file only when you need additional files.`;
|
|
24
|
+
/** skill_status result footer. */
|
|
25
|
+
export const FOOTER_STATUS = `▶ If all selected skills are complete, proceed to EXECUTE from each local_path. Incomplete skills: re-call read_skill to resume the download.`;
|
|
26
|
+
/** diagnostics result footer. */
|
|
27
|
+
export const FOOTER_DIAGNOSTICS = `▶ Fix the reported errors (network failures are often transient — retry read_skill), then resume the protocol at the failed step.`;
|
|
28
|
+
/** Cached badge used in search/plan results. */
|
|
29
|
+
export const CACHED_BADGE = "[cached]";
|
|
30
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/lib/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,uEAAuE;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;2LASwJ,CAAC;AAE5L,mCAAmC;AACnC,MAAM,CAAC,MAAM,aAAa,GAAG,8QAA8Q,CAAC;AAE5S,mCAAmC;AACnC,MAAM,CAAC,MAAM,WAAW,GAAG,kSAAkS,CAAC;AAE9T,sEAAsE;AACtE,MAAM,CAAC,MAAM,WAAW,GAAG,uNAAuN,CAAC;AAEnP,kCAAkC;AAClC,MAAM,CAAC,MAAM,aAAa,GAAG,+IAA+I,CAAC;AAE7K,iCAAiC;AACjC,MAAM,CAAC,MAAM,kBAAkB,GAAG,mIAAmI,CAAC;AAEtK,gDAAgD;AAChD,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC"}
|
package/dist/loader/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ManifestEntry, Config } from "../config.js";
|
|
2
2
|
import type { ProgressCallback } from "../remote/github.js";
|
|
3
|
+
import { type SkillCacheState } from "../remote/github.js";
|
|
3
4
|
export interface SkillStructure {
|
|
4
5
|
files: FileNode[];
|
|
5
6
|
sub_skills: SubSkillInfo[];
|
|
@@ -68,5 +69,15 @@ export declare class SkillLoader {
|
|
|
68
69
|
* List files in a subdirectory of a skill.
|
|
69
70
|
*/
|
|
70
71
|
listSkillFiles(entry: ManifestEntry, subPath?: string, maxDepth?: number): Promise<FileNode[]>;
|
|
72
|
+
/**
|
|
73
|
+
* Deep cache-state check for one skill. Read-only: never triggers a
|
|
74
|
+
* download. In local mode every skill is on disk by definition.
|
|
75
|
+
*/
|
|
76
|
+
cacheState(entry: ManifestEntry): SkillCacheState;
|
|
77
|
+
/**
|
|
78
|
+
* Light cache check (marker + completedAt only) for [cached] badges in
|
|
79
|
+
* search results. In local mode always true.
|
|
80
|
+
*/
|
|
81
|
+
isCached(entry: ManifestEntry): boolean;
|
|
71
82
|
}
|
|
72
83
|
//# sourceMappingURL=index.d.ts.map
|